Riassumendo in pratica, ciò che vuoi ottenere è la selezione di un cliente in base al nome (o altro campo significativo); selezionato il cliente, l'ID associato viene copiato direttamente nel campo relativo di una tabella associata ("Abbonamenti", giusto?).
Credo che tu stia cercando di implementare quello che genericamente si chiama Lookup.
Esistono già dei controlli visuali Delphi in grado di gestire questo tipo di situazione; puoi aggiungere campi di Lookup anche alle tabelle posizionate sul tuo form. Suppongo che tu stia usando il BDE per accedere al database.
Ad ogni modo, puoi provare questa soluzione. Nel form degli Abbonamenti aggiungi un componente Table collegato alla tabella Clienti e il relativo componente DataSource. Per la selezione del cliente, disponi sul form il controllo TDBLookupComboBox (lo trovi nella pagina "Data Controls" della Palette). Ora devi impostare le relazioni in modo adeguato. Imposta la proprietà ListSource al componente DataSource collegato alla tabella dei Clienti: questa è la tabella dalla quale verranno prelevati i valori da visualizzare nel controllo ComboBox. Imposta la proprietà ListField per indicare il campo da cui prelevare i valori (nel tuo caso, presumo sia "Nome" o qualcosa del genere). Questo controllo visualizzerà valori dalla tabella dei Clienti, ma dobbiamo utilizzarlo per modificare quella degli Abbonamenti, quindi devi impostare la proprietà DataSource al componente omonimo associato alla tabella Abbonamenti. La proprietà DataField va impostata con il campo della tabella Abbonamenti che intendi completare attraverso questo controllo visuale (nel tuo caso, presumo sarà qualcosa del tipo "IDCliente"). Riepilogando, hai istruito il controllo affinchè visualizzi e modifichi l'ID del cliente della tabella Abbonamenti visualizzando però i nomi di tali clienti al posto dell'ID, prelevando i dati dal campo "Nome" della tabella Clienti. Ti manca solo un passaggio: indicare al controllo quale campo della tabella Clienti deve essere confrontato con il campo "IDCliente" di Abbonamenti per completare la relazione; per fare ciò, imposta la proprietà KeyField al campo della tabella Clienti che contiene l'ID.
Sono consapevole di aver creato un bel po' di confusione, poichè è più facile da fare che da spiegare. Riassumendo:
- DataSource: ABBONAMENTI
- DataField: ABBONAMENTI.IdCliente
- ListSource: CLIENTI
- KeyField: CLIENTI.Id
- ListField: CLIENTI.Nome
Credo che sia il metodo più pulito in assoluto per completare i campi di tabelle correlate attraverso una chiave primaria identificativa senza complicarsi la vita con form esterni o altro.
Può sembrare complesso all'inizio, ma quando avrai appreso il concetto, credo che adotterai questa soluzione.
Good luck!![]()

Rispondi quotando