Ciao a tutti
provo a spiegarmi meglio: il database con cui lavoro è sqlite3, nella TAB1 ho una anagrafica con i campi :
IDsocio (Primary Key),Nome,Cognome,Indirizzo,Mail,Telefono.... ect
In TAB2 ho i seguenti campi:
IDsocio, anno, quota
in pratica creo una relazione "uno a molti" attraverso IDsocio, quindi in TAB2 posso avere n° record per un singolo IDsocio.
Public Sub GridView1_Click()
Dim rssoci As Result
Dim sql As String
Dim iRow As String
Dim id As Integer
Mod_conn.db_apro
iRow = GridView1.Row
sql = "SELECT * FROM soci" ' ordino la griglia
rssoci = Mod_Conn.$conn.Exec(sql)
If iRow <> -1 Then
id = GridView1[iRow, 0].Text
rssoci.MoveTo(id - 1)
TextBox1.Text = rssoci[0] ' idsoci
label1.Text = rssoci[2] 'nome
label2.text = rssoci[3] 'tipo
label3.Text = rssoci[4] 'telefono
label4.Text = rssoci[5] 'cellulare
label5.Text = rssoci[6] 'mail
label6.Text = rssoci[7] 'titolo
Endif
Mod_Conn.$conn.Close
grid_quote
End
Public Sub grid_quote()
Dim rsquote As Result
Dim sql As String
Dim i As Integer
GridView2.Clear 'pulisce griglia
Mod_Conn.db_apro
sql = "SELECT * FROM quote WHERE idsoci = '" & TextBox1.Text & "' "
rsquote = Mod_Conn.$conn.Exec(sql)
If rsquote.Available = True Then ' controlla se la query ha dato dei risultati in caso affermativo procede alla visualizzazione
'altrimenti visualizza messaggio di errore
GridView2.Mode = Select.multiple
GridView2.Columns.Count = 2 'imposta il numero di colonne della GridView1
GridView2.Rows.Count = rsquote.Count 'imposta il numero di record in base al numero di risultati presenti
i = 0
For Each rsquote 'inizio del ciclo
GridView2[i, 0].Text = rsquote!Anno
GridView2[i, 1].Text = Format$(rsquote!Importo, "$$0.#0") 'scrime il 1° valore nella griglia
Inc i 'aumenta di uno la variabile i in tal modo al prossimo ciclo si scrivera il record sucessivo
Next
Else ' nel caso hres non contenga risultati
GridView2.Columns.Count = 1
GridView2.Rows.Count = 1
GridView2[0, 0].Text = "Nessun dato" 'viene visualizzata la scritta "nessun dato"
Endif
Mod_Conn.$conn.Close
End
Con questo codice popolo la GridView2 per ogni record, ad ogni evento Click di GridView1, la domanda era come posso eliminare o modificare un record visualizzato in GridView2 quando in TAB2 ho per IDsoci ho più record con lo stesso valore, oppure lo stesso anno? ovvero come posso identificare il record selezionato in GridView2? Devo per forza creare una chiave primaria anche in TAB2? questa soluzione la vorrei evitare.
Belin come è tardi notte ;D ;D
@ Gianluigi
Ho letto la tua più che corretta riflessione ed ho rivisto le note di naderit riguardo ai contenuti delle due tabelle componenti il suo DB.
Non ho notato anomalie pratiche. La relazione fra le due tabelle esiste e si chiama IDsocio, le altre colonne delle suddette tabelle contengono dati non duplicati. L'unica cosa che manca è la primary Key nella Tab2, ma siccome la lettura di una tabella di DB in SQLite avviene con una formula tecnica che non richiede necessariamente la presenza di una primary key ( Es. preso dal mio programma: RecMovgg = ApriDB.DBConnection.EXEC("SELECT * FROM movimgg WHERE DtCoMovgg = '" & iDataCont & "' ORDER BY DtSolMovgg, OraSolMovgg") dove DtCoMovgg non é primary key della mia tabella movimgg, il problema della primary key nella TAB2 di naderit non sorge proprio.
In vero la primary key della sua Tab2 dovrebbe essere costituito dall'insieme dei due campi: IDsocio e anno, proprio per rispondere al corretto concetto dell'univocità della primary key. Considera inoltre che le due Tabelle, secondo quanto ho capito, non dispongono di alcuna chiave di indirizzamento, ma soltanto di un legame relazionale costituito dal campo IDsocio, perciò la gestione del DB non comporterà alcun problema pratico di accesso.
Secondo me può proseguire tranquillo, senza alcun timore di malfunzionamento gestionale del DB.
Vorrei solo aggiungere un consiglio a naderit. Modificare la sua stringa di preparazione alla lettura della Tab1 così:
sql = "SELECT * FROM soci ORDER BY IDsocio" ' ordino la griglia
rssoci = Mod_Conn.$conn.Exec(sql)
solamente allo scopo di evitare un elenco disordinato di soci, qualora la colonna IDsocio potesse contenere codici non tutti crescenti.
:ciao:
@ Gianluigi,
ti ringrazio per il complimento , ma, se non l'hai dimenticato, forse non sai che fsurfing è un maestro, infatti mi ha insegnato a muovermi in SQLite.
A parte ciò non vorrei averti dato l'impressione di non avere apprezzato il tuo intervento. Ho solo approfitttao per mettere in chiaro alcuni aspetti, però SQLite non è un ambiente DB raffinato. Io inizialmente mi ero molto preoccupato sull'individuazione esatta delle primary key, considerando anche chiavi composte da più colonne, poi, quando ho capito che in effetti potevo gestirmi i criteri di relazionalità nelle istruzioni SELECT, ho deciso di assegnare il ruolo di chiave primaria ad un non necessario codice progressivo di numero di record, il cui compito è esclusivamente quello di sapere in ogni momento quante righe costituiscono ciascuna tabella del mio DB.
Quindi, scusami se ho dato l'impressione di apprezzare negativamente il tuo intervento. Tutti gli interventi sono costruttivi perché aiutano ad analizzare e considerare meglio nel dettaglio il problema posto dall'autore della discussione. Così come una discussione non serve solamente ad aiutare l'autore del post d'apertura, ma anche chi interviene successivamente.
Detto questo, vorrei cogliere l'ccasione per dare a naderit un'altra dritta: non è necessario definire la colonna relazionale fra due tabelle del DB lo stesso nome, nel suo caso 'IDsocio', perché tale criterio comporta un'ulteriore specificazione referenziale della tabella di appartenenza di ciascuna delle colonne interessate in certe query.
Nel caso di utilizzo di query che impegnino, per es. sia la TAB1 che la TAB2, asrebbe necessario specificare a quale tabella si riferisce il codice 'IDsocio':
sql = "SELECT * FROM soci, quote ORDER BY soci.IDsocio, quote.IDsocio, anno"
. Diventa più semplice, per es. scrivere IDsocioT1, IDsocioT2, per distinguere quello interno alla Tab1 da quello interno alla Tab2.
:ciao: