il risultato finale che mi aspetto è una visualizzazione di una tabella (Vista) formata dai dati estratti diciamo da tre TABELLE del database. (A, B, C) che ovviamente hanno i campi (A1, A2, A3 - B4, B5, B6 - C7, C8, C9) e i dati campo (A1a, A1b,..A2a,...C9a, C9b,..) con la possibilità di filtrare prima della query quali campi e dati visualizzare
Non conosco Postgresql, ma ho utilizzato recentemente in sqlite3 query di tipo Vista, tramite una Join su più tabelle appartenente allo stesso DB.
RecQuery = DB_Connection.Exec("SELECT * FROM TabA, TabB, TabC WHERE TabA.A1 = '" & iNum1 & "' AND TabB.B1 < '" & iNum2 & "' AND TabA.A2 = TabB.B2 AND TabA.A3 = TabB.B3 AND TabA.A1 = TabC.C1 ORDER BY TabC.C1, TabB.B1, TabB.B2,TabB.B3 ")
L'esempio riportato sopra è riferito a tabelle che hanno nomi campi diversi. Qualora uno o più nomi campo si ripetano pari pari in almeno due delle tabelle da trattare, occorrerà una diversa impostazione della query stessa. Non riporto qui l'esempio, ma, qualora ne fossi interessato, potrai scoprirlo qui (http://www.gambas-it.org/smf/index.php?topic=2526.msg26860#msg26860)
:ciao:
@ player:
Scusa se rispondo con qualche giorno di ritardo, ma sono stato fuori casa per qualche giorno ed ho letto soltanto l'ultimo tuo post.
Vediamo se ho capito quello che vorresti fare:
Da alcune tabelle del tuo DB vorresti leggere con un'unica query di tipo join i dati contenuti nei campi di record-tabella e visualizziarli, per es., dentro una TableView. Dalla letturta vorresti ricavare, oltre che i dati, anche i nomi delle singole colonne della tabella-query che costruirai per leggere il contenuto del DB. Potere fare tutto ciò automaticamente sarebbe bellissimo, ma non è purtroppo proprio così, perchè il formato sql di accesso ai DB accede alle colonne di una tabella di DB attraverso i nomi forniti nella riga sql.exec che ricerca nei nomi attribuiti in fase di creazione di ciascuna tabella di DB. Ciò significa che il nome campo(o colonna, chiamalo come vuoi) $Result!nome lo devi fornire tu, esattamente uguale a quello contenuto nella tabella d'origine del DB. In mancanza di tale corrispondenza, viene segnalato, durante l'esecuzione del programma, un errore formale sull'istruzione DbConn.Exec.
Utilizzando la struttura DB SQlite3 (conosco solo quella), supponiamo di avere creato un DB con due sole tabelle:
dim sql as string
sql = "CREATE TABLE Tabella1"
sql = sql & "('idTabella1' INTEGER PRIMARY KEY AUTOINCREMENT,"
sql = sql & " 'Campo1T1' INTEGER,"
sql = sql & " 'Campo2T1' INTEGER,"
sql = sql & " 'Campo3T1' CHAR(1) DEFAULT NULL,"
sql = sql & " 'Campo4T1' FLOAT,"
sql = sql & " 'Campo5T1' VARCHAR(100) DEFAULT NULL"
sql = sql & " );"
ApriDB.DB_Connection.Exec(sql)
sql = "CREATE TABLE '" & $Tabella2 & "'"
sql = sql & "('idTabella2' INTEGER PRIMARY KEY AUTOINCREMENT,"
sql = sql & " 'Campo1T2' INTEGER,"
sql = sql & " 'Campo2T2' VARCHAR(50) DEFAULT NULL,"
sql = sql & " 'Campo3T2' CHAR(1) DEFAULT NULL,"
sql = sql & " 'Campo4T2' INTEGER"
sql = sql & " );"
ApriDB.DB_Connection.Exec(sql)
Supponiamo ora di dover leggere il contenuto di: Campo1T1, Campo3T1, Campo2T2, Campo3T2. La query occorrente è:
Dim RecQuery As Result
RecQuery = ApriDB.DB_Connection.Exec("SELECT * FROM Tabella1,Tabella2 WHERE Tabella1.Campo1T1 = Tabella1.Campo1T2 ORDER BY Tabella1.idTabella1 ")
For Each RecQuery
CompilaRigaTableView
Next
Public Sub CompilaRigaTableView
' ---bla---bla---bla--- Gruppo di istruzioni occorrenti per la compilazione delle righe di TableView
END
Fammi sapere se ho capito e se l'esempio riportato sopra sia calzante alle tue necessità.
:ciao:
Non so se hai letto discussioni in cui si ragiona sulla efficacia della minestra pronta, ma in programmazione, come in altri settori della vita sociale e personale, si cresce veramente imparando dagli esperimenti personalòi, anche attraverso suggerimenti da parte dei più esperti. Con questo non sto dicendo che, se dovesse occorrere citare del codice pronto, non lo esporrò, ma semplicemente che è più stimolante e formativo in esperienza se vai a lavorare sul codice da scrivere, anche rilevandolo da programmi già pronti nellìArea di Download o nella sezione del Forum "Programmi degli utenti". Per esempio, relativamente alla compilazione delle celle di una TableView o GridiView, puoi andare a spulciarti il mio programma "ContabFam" dalla sezione "Programmi degli utenti" del Forum. Io utilizzo moltissimo l'oggetto GridView per la visualizzazione dei dati in trattamento. Un utilizzo di riempimento lo trovi in Form02.class, nella Sub _new dove, oltre all'impostazione della larghezza delle colonne, compilo anche la riga di testata della griglia.
Accennato a questo, mi pare che per ora sia importante capire il funzionamento della classe "Result". La spiegazione relativa la trovi nella Documentazione ufficiali di Gambas alla quale puoi accedere dall'Ide di Gambas con F1 -->Componenti 3.0 --> DB - Database access component --> Result.
In termini di praticità, posso dirtio che funziona come un'area d'appoggio dei record in lettura/scrittura. Il programmatore utente la tocca con mano nella fase di lettura prelevandovi i dati contenuti nell'ultimo record query letto
RecMovgg = ApriDB.DB_Connection.EXEC("SELECT * FROM movimgg WHERE DtCoMovgg = '" & iDataCont & "' ORDER BY DtSolMovgg, OraSolMovgg")
If RecMovgg.Available Then
For Each RecMovgg
iNupro = RecMovgg!NuProMovvgg
Next
endif
In particolare, l'istruzione i_nupro = RecMovgg!NuProMovvgg trasferisce nella variabile iNupro il contenuto numerico del campo di record RecMovgg!NuProMovvgg (cioè: NomerRecord!NomeCampo).
Diversanmente quando si inserisce un record nuovo dentro una tabella di DB, occorre indicare i campi di record nella loro esatta sequanza interna alla tabella:
ApriDB.DB_Connection.EXEC("INSERT INTO movimgg VALUES(" & iId & ", '" & Int(Val($_RgTbDump[0])) & ", '" & Date(Val($_RgTbDump[1])) & "', '" & $_RgTbDump[2] & ", '" & $_RgTbDump[3] & ", '" & fImport & "', '" & $_RgTbDump[5] & "')")
Intanto, buon lavoro.
:D :ciao: