Autore Topic: vista  (Letto 1304 volte)

Offline player

  • Gamberetto
  • *
  • Post: 14
    • Mostra profilo
vista
« il: 17 Aprile 2013, 22:59:13 »
salve a tutti.
premetto che sono alle prime armi con la programmazione. sto leggendo "A beginner's guide to Gambas" e ho cercato un po' in giro ma non sono riuscito a trovare, o probabilmente a non capire quanto mi è passato sotto gli occhi, un esempio scritto dove sono riportate le linee di codice della parte di programma che gestisce una tabella - VISTA - dove i campi da gestire e visualizzare non sono prefissati ma selezionabili di volta in volta da un filtro e provengono da una query di più tabelle presenti nel database (Postgresql). da quanto letto mi sembra che non sia gestibile con DataSource e DataBrowser.
Confido in un vostro aiuto, grazie.

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: vista
« Risposta #1 il: 18 Aprile 2013, 13:04:34 »
io interrogherei il DB direttamente in SQL e poi gestirei i dati estratti nel modo preferito ....

Dim $Con As New Connection
Dim $Result As Result
Dim $Command As String
 
  $Con.close()                    ' Close the connection
  $Con.Type = "MySQL"             ' Type of connection
  $Con.Host = FMain.DB_server_IP        ' Name of the server
  $Con.Login = FMain.DB_server_DBuser   ' User's name for the connection
  $Con.Port = FMain.DB_server_Port      ' Port to use in the connection, usually 3306
  $Con.Name = FMain.DB_server_DBname    ' Name of the database we want to use
  $Con.Password = FMain.DB_server_DBpass ' User's password
 
  Try  $Con.Open()
  If Error Then
     message.Error("tentativo di connessione al server non riuscito", "OK")
     $con.close
    Return
  Endif
 
  If Label_id.Text = "" Then  'aggiunta NUOVO programma
    Try     $Con.Begin()
    If Error Then
      message.Error("aggiornamento di 'Programs' non riuscito", "OK")
      Return
          Else
            $Result = $con.Create("Programs")
            $Result!Program_name = TextBox_Programma.Text
            $Result!tags = TextArea_Taglist.Text
            $Result!classificazione_registro = ComboBox_Classificazione_programmi.Text
            $Result!Nationality = ComboBox_Nazionalita.Text
            $Result!Autoprodotto = CheckBox_Autoproduzione.Value
            $Result!rated = ComboBox_Rating.Index
            $Result.Update()
            $con.Commit()
    Endif
   
    Else  'siamo in fase di editing
      Try
    $Con.Begin()
    If Error Then
      message.Error("aggiornamento di 'Programs' non riuscito", "OK")
      Return
          Else
            '$Result = $con.Create("Programs")
            $Result = $con.Edit("Programs", "id = &1", Label_id.Text)
            $Result!Program_name = TextBox_Programma.Text
            $Result!tags = TextArea_Taglist.Text
            $Result!classificazione_registro = ComboBox_Classificazione_programmi.Text
            $Result!Nationality = ComboBox_Nazionalita.Text
            $Result!Autoprodotto = CBool(CheckBox_Autoproduzione.Value)
            $Result!rated = CInt(ComboBox_Rating.Index)
            $Result.Update()
            $con.Commit()
    Endif



.... ovviamente per fare una o piu' select:
$Command="select * from tabella where campo = 'valore' "

 Result = $Con.Exec($Command)

un po' a tira' via ho fatto copia e incolla dal mio codice :D
se corri, morirai stanco (motto degli sniper)

Offline player

  • Gamberetto
  • *
  • Post: 14
    • Mostra profilo
Re: vista
« Risposta #2 il: 24 Aprile 2013, 00:53:38 »
mi scuso di non averti ringraziato subito allegfede per il soccorso prestato. Ho perso tempo per cercare di capire quanto indicato andando a rilleggermi quanto mi era possibile ma purtroppo non ne sono venuto a capo. come già detto sono alle prime armi e ahimè ( e ahivoi) mi è difficile seguire quanto suggerito. Spero di imparare presto almeno le basi. Se avete suggerimenti di dove posso trovare della manualistica in merito, ringrazio. Penso di aver pascolato molte praterie in internet ma non riesco a trovare spiegazioni semplici e soddisfacenti. Probabilmente sono IO a non capire. Tornando al problema quanto suggerito mi da una idea opposta a quello che credevo di aver capito, nel senso che mi aspettavo che Result contenesse il risultato della query e mi aspetterei (variabile = Result) non (Result = qualcosa).
A questo punto è palese che non mi è ben chiaro cos'è e cosa contiene Result a fine query, e come gestirlo successivamente.
Probabilmente non ho chiarito bene che 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 (come ci penserò).
pensavo anchio di gestirla in SQL e poi usare DataSource e Data Browser per visualizzarla e gestirla ma non sono riuscito ad andare oltre il pensiero. :-[


Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: vista
« Risposta #3 il: 24 Aprile 2013, 06:06:46 »
Guardati la guida gamas e sqlite in area download, si parla di sqlite, ma lo puoi trssferire semlicemente  ad altri dbb

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: vista
« Risposta #4 il: 24 Aprile 2013, 13:34:35 »
mi scuso di non averti ringraziato subito allegfede per il soccorso prestato. Ho perso tempo per cercare di capire quanto indicato andando a rilleggermi quanto mi era possibile ma purtroppo non ne sono venuto a capo. come già detto sono alle prime armi e ahimè ( e ahivoi) mi è difficile seguire quanto suggerito. Spero di imparare presto almeno le basi. Se avete suggerimenti di dove posso trovare della manualistica in merito, ringrazio. Penso di aver pascolato molte praterie in internet ma non riesco a trovare spiegazioni semplici e soddisfacenti. Probabilmente sono IO a non capire. Tornando al problema quanto suggerito mi da una idea opposta a quello che credevo di aver capito, nel senso che mi aspettavo che Result contenesse il risultato della query e mi aspetterei (variabile = Result) non (Result = qualcosa).
A questo punto è palese che non mi è ben chiaro cos'è e cosa contiene Result a fine query, e come gestirlo successivamente.
Probabilmente non ho chiarito bene che 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 (come ci penserò).
pensavo anchio di gestirla in SQL e poi usare DataSource e Data Browser per visualizzarla e gestirla ma non sono riuscito ad andare oltre il pensiero. :-[



no scusami tu' .. ti ho incollato un pezzo di codice in cui IO modifico O creo un record in un DB .... tu devi leggere ....

in quel caso dovrai dare un comando tipo $command="select * from tabella where campo = 'valore'

poi un $result=$comando.execute   (mi sembra ma sono su una macchina windows ....)

e i valori dei campi dei recordi li leggi con:

for each $result
 variabile1=$result!campo1
 variabile2=$result!campo2
 etc
next
se corri, morirai stanco (motto degli sniper)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: vista
« Risposta #5 il: 25 Aprile 2013, 18:30:24 »
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.
Codice: [Seleziona]
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
 :ciao:
:ciao:

Offline player

  • Gamberetto
  • *
  • Post: 14
    • Mostra profilo
Re: vista
« Risposta #6 il: 15 Maggio 2013, 21:58:40 »
viste le vostre risposte e riletto quanto in mio possesso credo di aver capito che l'unica via per riempire una tabella, qualunque sia la quantità di dati da gestire, sia quella di utilizzare un ciclo che legge dato per dato quanto in  $Result e gestire  Tabella nr. riga , nr colonna  (al posto di variabile 1, variabile 2) della tabella da riempire. (non DataSource e DataBrowser che invece gestiscono una tabella già riempita e su database)
Visto che i dati da visualizzare non sono fissi, ma gestiti da un filtro precedente (che sicuramente sarà l'argomento futuro :-[), dovrò gestire la costruzione della tabella in funzione dei campi e relative tabelle risultato del filtro. Se ho capito bene in $Result [$Result!nome] trovo anche il nome dei campi (titolo colonna) oltre che i loro dati, ma non mi è chiaro come gestirli per visualizzarli appunto come titolo della colonna della tabella da visualizzare.
Chiedo la gentilezza, che a voi non manca, di accompagnare la risposta possibilmente, come già avete fatto, con almeno qualche riga di codice di esempio.
GRAZIE. 

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: vista
« Risposta #7 il: 20 Maggio 2013, 23:22:13 »
@ 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:
Codice: gambas [Seleziona]
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 è:
Codice: gambas [Seleziona]
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:
« Ultima modifica: 20 Maggio 2013, 23:39:36 da Picavbg »
:ciao:

Offline player

  • Gamberetto
  • *
  • Post: 14
    • Mostra profilo
Re: vista
« Risposta #8 il: 22 Maggio 2013, 22:06:14 »
Non devi / dovete scusarvi, sono IO che devo ringraziavi per il tempo che mi dedicate. E vista l'invidia che mi suscitate nel leggervi in giro per il forum mi sa che sono Io quello che sta troppo lontano dal computer.
Tornando a noi ti confermo che hai capito alla perfezione quello che voglio fare. Quello che cercavo di più però è quanto hai riassunto nel "---bla---bla---bla---" anche se il modo di estrarre i dati da te descritto mi fa capire che il mio era errato. voglio ricapitolare un' attimo e cercare di spiegare meglio la "risposta" che cerco.
ricordandovi la mia ignoranza in generale e nel contesto (sicuramente sono duro IO a capire ma non ho trovato in giro precise e semplici spiegazioni) di come "funziona" Result, quali dati ci trovo dentro e come gestirlo,
non credo infatti che quello che ho capito sia esattamente quello o tutto quello che fa. E con questo arriviamo alla tua giusta osservazione in merito al nome delle colonne. Ovviamente li devo sapere in quanto parte della query, quello che non so è se sono gestibili dal Result e se in questo caso sia più facile gestirli in questa fase o meno. Comunque sia rimane sempre il mio interrogativo: Come gestire il nome delle colonne inserite nella query per inserirli come nome colonna nella Tabella da visualizzare? Anche perché non sono fissi ma derivanti dalla filtrazione variabile delle colonne che voglio visualizzare (probabilmente il filtro sarà il prossimo SOS ;D). Dal tuo codice, tornando al Result, i dati raccolti con la query in RecQuery li salvi subito richiamando CompilaRigaTableView, devo presumere che non si possa prima fare tutto il For Each "appendendo" tutti i dati nel Result e poi gestirli, ma sempre salvarli in un modo o nell'alto ad ogni giro. In CompilaRiga.... credo ci debba essere un doppio ciclo di incrementazione - nomeTable riga / colonna - che mi crea la visualizzazione dei dati nella tabella. Alla luce delle mie confuse conoscenze quello che cerco è una spiegazione accompagnata da qualche riga di programma dove viene costruita la tableview da visualizzare (credo siano sufficienti 3 colonne e 2 righe come esempio ;D)   
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: vista
« Risposta #9 il: 23 Maggio 2013, 09:30:45 »
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
 
Codice: gambas [Seleziona]
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:
Codice: gambas [Seleziona]
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:
:ciao:

Offline player

  • Gamberetto
  • *
  • Post: 14
    • Mostra profilo
Re: vista
« Risposta #10 il: 23 Maggio 2013, 13:42:47 »
Io penso che non si può dare in mano una chiave inglese ad una persona e pretendere che impari senza alcuna nozione ad aggiustare un'auto.
per le nozioni ci sono i libri (e i professori per arricchire e/o spiegare quello che i libri non dicono).
Di manuali Gambas ho trovato e riletto solamente "A Begginers's Guide to Gambas" poi ho cercato e stampato montagne di pagine dalle incursioni nei siti internet questo forum compreso.
Tante cose sono riuscito a capirle altre ( IO SONO UNO DURO DI COMPRENDONIO, PURTROPPO, sarà l'eta?) meno.
Probabilmente l'inesperienza di programmazione mi porta a sbagliare l'approccio d'inizio, dove mi piacerebbe avere un'idea di quello che voglio fare e sovrapporre un' idea di cosa scrivere per avere il risultato, poi certamente sono già messi a bilancio centinaia di errori ma mi piace avere almeno il canovaccio prima di iniziare a sporcarsi le mani.
l'esperienza che mi farò mi porterà certo a cambiare in futuro il modus operandi.
Le tante cose lette non mi spiegato appunto l'inserimento dei nomi colonna nella costruzione di una tabella view, per il riempimento dei dati invece mi ero già espresso come credo vada fatto volevo solo verificare se erano giuste o se i "GRANDI"  hanno idee geniali ;D.
Non mi tiro indietro a studiare e riuscire a capire da solo come funziona Gambas, già dall'inizio infatti ho chiesto di indicarmi dove posso trovare manualistica. Adesso vado a leggermi quanto da te suggerito. Se avete altri manuali od altro da suggerirmi, anche per l'impostazione del programma stesso (componenti, librerie ecc.. TUTTO FA GAMBAS  :)) ringrazio sin da ora. il copiare pezzi di programma ed usarli senza capire cosa fanno non mi stimola anche se danno il risultato sperato, comunque vado a cercarmeli ed a studiarmeli cercando in giro le eventuali spiegazioni dei passaggi che non mi saranno chiari.
Ringrazio per tutto l'aiuto fornito e spero, ma senza fretta, che il prossimo post sia per comunicarvi di aver risolto.
:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: vista
« Risposta #11 il: 23 Maggio 2013, 15:35:04 »
il copiare pezzi di programma ed usarli senza capire cosa fanno non mi stimola
Hai ragione, ma non mi pare di averti detto di copiare pezzi di programma. Se ho fatto capire così, me ne dispiace e ti chiedo scusa. Copiare pezzi di prgramma senza capire cosa faccia il codice copiato è la stessa cosa che fornire codice prefabbricato direttamente in un post di risposta.
Il riferimento che ti ho dato dovrebbe servire a leggere per capire e se non dovesse risultare chiaro qualche passo, sono pronto per discuterlo e chiarirne il concetto, oppure, se dovessi trovare che andrebbe modificato o corretto, approfitterò per migliorare quanto già scritto, anche se funzionante.

Non voglio creare confusione, ma solo per allargare l'eventuale curiosità, la griglia che gestisco nella Form02 del mio programma viene caricata su misura, col numero di righe che, riga dopo riga, necessitano per l'accoglimento di tutti i dati trattati da visualizzare. Delle righe inserite si possono prelevare, una riga alla volta, tutte quelle che occorrono per modificarle e reinserirle nella griglia oppure per eliminarle definitivamente. Ad ogni richiesta di prelevamento riga, viene effettuato il ricompattamento automatico delle righe rimaste visibili nella griglia. Naturalmente ciò non avviene in unico passo di programma ma in posizioni diverse, in funzione delle necessità operative dell'utente.

Vista la tua buona volontà, buono studio, ma affianca allo studio la pratica. Se hai già immaginato cosa vuoi ottenere, comincia a disegnare una Form con gli oggetti che ti serviranno per la gestione e la manipolazione dei dati da trattare. Scrivi, se non l'hai già fatto la FMain.Class del programma e gli object.Event dei controlli grafici che andrai a porre dentro la FMain.Form

Se ho detto troppo, scusami ... non lo farò più.  ;D
 :ciao:
:ciao: