Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Picavbg - 17 Dicembre 2008, 17:26:40

Titolo: primi approcci con sqlite3
Inserito da: Picavbg - 17 Dicembre 2008, 17:26:40
Mentre cerco notizie sulla gestione di un DB-sqlite3, partendo dalla sua creazione, cerco di appuntare sulla carta i passi da inserire all'interno di un programma. Una delle prime curiosità che ho cercato di esaudire é quella di dovere gestire un DB già strutturato o di strutturarlo nel programma stesso (logicamente solo la prima volta). Ho visto, attraverso i post relativi ed attraverso programmini di prova messi a disposizione dai più esperti che é possibile creare un DB durante l'esecuzione del codice gambas e questo mi fa molto piacere (penso che knoda non me ne vorrà). Certo un programma che legge e aggiorna una o più tabelle di un DB predefinito con Knoda o con altro strunmento compatiubile con sqlite3 risulta più veloce da mettere a punto, ma non mi permetterebbe di fare esperienza anche in fase di creazione. ;-)

Nei post che ho guardato ho fatto attenzione all'individuazione del DB in HD e non ho trovato descritto in maniera elementare la dichiarazione  del path completo fino alla directory che contiene il DB; esempiio:
Citazione

' Gambas class file
PUBLIC $hconn1 AS Connection
PUBLIC $hconn2 AS Connection


PUBLIC SUB Button1_Click()
    DIM $hConn AS Connection
    DIM sName AS String ' nome del database
   
    $hConn = NEW Connection ' inizializza una nuova connessione
 
    sName = "esempio.db"    ' imposto i parametri di connessione

    WITH $hConn
      .Type = "sqlite3"       'tipo di database
      .Host = User.Home        percorso del database       °°° ??? °°°
    END WITH
..........
END

Mi sono permesso di ripotrtare qualche riga di codica dal programmino di prova che molto cortesemente mi ha fornito fsurfing, e spero di non provocare il suo disappunto per questo, allo scopo di soffermarmi sulla riga ".Host" della funzione Widh. Infatti quando leggo
Codice: [Seleziona]

 .Host = User.Home  

non capisco  in quale directory sia ubicato il DB, o perlomeno, penso che sia nella directoy home dell'utente.

Supponiamo invece che il DB sia in una directory diversa dalla Home_user; per Es.:
Citazione

home -> Utente_x -> gambas -> progetti -> progetto1 -> esempio.db


Potrebbe inoltre il DB trovarsi nella stessa directory di ProVaGambas (il programma che dovrà gestirlo) oppure essere in una directory diversa.
Ecco, restando a quello che ho capito, io scriverei:
Codice: [Seleziona]

 .Host = home.Utente_x.gambas.progetti.progetto1  

 :uhm:
Non é che non mi fidi di me stesso, ma non mi pare che somigli all'esempio di partenza di fsurfing, nemmeno nella sua parte iniziale.

Dico bene?
 :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: fsurfing - 17 Dicembre 2008, 18:35:15
+ o - ci sei

tra parentesi sto scrivendo una piccola guida per i "primi passi" con i db sqlite
lo postata in questo post guida sqlite incompleta (http://www.gambas-it.org/gmbs/modules/newbb/viewtopic.php?topic_id=378&start=10).

in linea di massima :

sName = "esempio.db"  indica il nome del database e non il percorso
.Host = User.Home     indica invece il percorso

in realta potresti omettere .host se nel nome inserisci il percorso completo

Citazione
.Host = User.Home


in questo caso il db sarà posizionato nella home dell' utente

Citazione
Potrebbe inoltre il DB trovarsi nella stessa directory di ProVaGambas (il programma che dovrà gestirlo) oppure essere in una directory diversa. Ecco, restando a quello che ho capito, io scriverei:


in linea di massima ti sconsiglio di memorizzare il db nella stessa directory del programma, questo perchè se mai dovessi creare un eseguibile del tuo programma il db verrebbe inglobato all' interno dell' binario aumentandone la dimensione ma soprattuto non riusciresti ad accedervi.

se invece lo vuoi posizionare comunque nella directory di programma basta che imposti il nome con sname e non metti nulla come host
se il db invece è in una cartella all' interno della cartella di programma (ad esempio nella cartella dati) imposterai .host= "dati"


Citazione
.Host = home.Utente_x.gambas.progetti.progetto1


questa scrittura non ha senso al limite sarebbe così:

.Host = home.Utente_x & "/gambas/progetti/progetto1"

spero di esere comprensibile :)

buon lavoro

ciao ciao
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 17 Dicembre 2008, 23:02:32
Citazione

fsurfing ha scritto:
+ o - ci sei

tra parentesi sto scrivendo una piccola guida per i "primi passi" con i db sqlite
lo postata in questo post guida sqlite incompleta (http://www.gambas-it.org/gmbs/modules/newbb/viewtopic.php?topic_id=378&start=10).

...bla...bla...bla...


Citazione
.Host = home.Utente_x.gambas.progetti.progetto1

questa scrittura non ha senso al limite sarebbe così:
Codice: [Seleziona]

.Host = home.Utente_x & "/gambas/progetti/progetto1"



Grazie per la segnalazione della guida: andrò a consultarla.

su: <<.Host = home.Utente_x & "/gambas/progetti/progetto1">>, penso di avere capito ed ho anche capito che ho avuto ragione a non fidarmi del mio naso (é grosso ma non riconosce l'odore dell'arrosto che sta andando a fumo  :-)  :-) ). Sei stato di grande aiuto. Grazieeee!!
Ora posso provare; credo di avere le idee un pò più chiare. Ti farò sapere.
:-D

Ciao.
Titolo: Re: primi approcci con sqlite3
Inserito da: fsurfing - 17 Dicembre 2008, 23:10:03
scusa ho fatto un errore

Citazione
.Host = home.Utente_x & "/gambas/progetti/progetto1"


e così :


.host=user.home &  "/gambas/progetti/progetto1"


oppure :

.host="/home/utente_x/gambas/progetti/progetto1"


a seconda che tu voglia dare un percorso relativo (che ti permette di usare il file su qualsiasi pc indipendentemente  dal nome della home) oppure fisso ( in questo caso funzionera solo sul tuo pc )
Titolo: Re: primi approcci con sqlite3
Inserito da: leo72 - 18 Dicembre 2008, 06:43:10
Oppure la cosa più semplice è mettere il DB nella cartella dove risiede il programma ed usare come indirizzo .host = Application.Path.
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 20 Dicembre 2008, 19:10:00
Citazione

leo72 ha scritto:
Oppure la cosa più semplice è mettere il DB nella cartella dove risiede il programma ed usare come indirizzo .host = Application.Path.


Ho letto solo oggi, a fine prova, il tuo consilgio, ma farò un'ulteriore prova per la messa punto pratico-logica di questo primo approccio di programma.

Ecco quello che sono riuscito a fare:
Codice: [Seleziona]

  PUBLIC DB_Connection AS Connection


PUBLIC SUB _new()
 
END

PUBLIC SUB Form_Open()
  DIM DB_Connection AS NEW Connection   'inizializza la nuova connessione
  DIM Esito AS Result
  DIM DBname AS String  'Nome del Database
  DIM DB_path AS String 'Percorso di ricerca del Database ContabFam.db
 
  DBname = "Archivio.db"  'imposto i parametri di connessione
  DB_path = User.Home & "/Gambas/Gambas_Progetti/Progetto1/Proget1_DB"
 
  WITH DB_Connection
    .Type = "sqlite3"
    .Host = DB_path
    .Login = ""
    .Password = ""
  END WITH

  DB_Connection.Open    'Tento l'apertura del DB, se presente
  IF NOT DB_Connection.Databases.Exist(DBname) THEN   'verifica che il DB non esista
            SELECT Message.ERROR("Attenzione! ->  archivio '" & DBname & "' NON TROVATO", "Creare DB ex novo", "Uscita dal programma")
                      CASE 1
                          DB_Connection.Databases.Add(DBname)         'crea il DB
                          DB_Connection.CLOSE               'chiude il DB
                          Message.Info("DB '" & DBname & "' Creato - FINE PROVA ")
                      CASE 2
                          Message.Info("hai premuto il pulsante: Uscita dal programma - FINE PROVA")
            END SELECT
            QUIT    'Esce dal programma
  ELSE  
          Message.Info("Il DB" & DBname & "ESISTE GIÀ - FINE PROVA")
          DB_Connection.CLOSE               'chiude il DB
          QUIT  'Esce dal programma
  ENDIF
END

 :-D

Ho faticato un pò per cominciare ad assorbire la nuova mentalità, ma penso di essere sulla buona strada.

Nella verifica della presenza o meno del DB, dopo la " DB_Connection.Open", ho preferito gestitre come eccezionale la condizione di "NOT Exist", in quanto, dopo averlo creato la prima volta per tutte le altre innumerevoli volte di utilizzo, me lo ritroverò bello e presente; pertanto probabilmente l'esecuzione é leggermente più veloce e la lettura del codice diventa più scorrevole ai miei occhi.

Ora riprovo modificando il path e se tutto si rende autodinamico, come spero, posso benissimo passare alla definizione della prima tabella.

Grazie per la collaborazione e, se non ci dovessimo risentire prima del 25-dic.,
Buooon Naataalee a tutti!!!    :pint:
 :ciao:  :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 22 Dicembre 2008, 14:41:31
La prova della creazione di una tabella dentro il DB appena nato funzionerebbe se non avessi bisogno di definire una primary key distribuita su tre campi. Leggendo però il "A Beginner's Guide to Gambas" apprendo quanto segue:
Citazione
PrimaryKey will return or set the primary key of the table.The primary key is a string array containing the name of each primary key field.  System will return a TRUE value if the database is a system database. Type returns or sets the type of a table. This property is unique to MySQL and is only used with MySQL databases.
:uhm:

Per maggiore chiarezza: ho eseguioto i seguenti passi:
Codice: [Seleziona]

DIM sql AS String
DIM sqltable AS Result
................
WITH
 DB_Connection
   .Name = DBname
   .OPEN    'Riapro il DB
END WITH
                       
sql = "CREATE TABLE 'TabPro1'  ("
sql = sql & " 'Datagg' CHAR(8) DEFAULT NULL PRIMARY KEY, "  
SQL = SQL & " 'NuProgg' INTEGER PRIMARY KEY,"          
SQL = SQL & " 'CoVogg' CHAR(8) DEFAULT not NULL PRIMARY KEY,"          
SQL = SQL & " 'Descrgg' VARCHAR(100) DEFAULT NULL,"
SQL = SQL & " 'Impgg' FLOAT DEFAULT not NULL);"
sqltable = DB_Connection.Exec(sql)


L'esecuzione mi ha fornito il seguente errore:
Citazione
Query failed. SQL error or m issing databse


Ho provato a limitare la primary key ad un solo elemento di tabella e la tabella é stata creata con successo.

La mia soluzione pratica sarebbe quella di creare un campo primary key comprendente tutti i campi assegnati come primary key nell'esempio appena riportato, però penso che avrei difficoltà successivamente nelle ricerche parziali.

Penso tuttavia che dalla stesura della guida Gambas ad oggi, anche Sqlite sia cresciuto, per cui potrebbe esere che si possa gestire ormai una primary key costituita dal concatenamento dei campi che la compongono, per cui esiste già una soluzione che nei post del Forum non ho trovato (o non sono stato capace di trovare). :-(

Spero tanto che la Vostra esperienza conoscitiva mi possa illuminare. Grazie ancora e rinnovati Auguri di Buon Natale! :ciao:  :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: leo72 - 22 Dicembre 2008, 15:36:15
Ho provato ad eseguire la tua query direttamente dentro una sessione di SQLite e questo è stato l'errore riportato:
Citazione
SQL error: table "TabPro1" has more than one primary key

Deduco quindi che SQLite non tratti più di 1 chiave primaria.

Ma perché ti servono 3 chiavi primarie? Non puoi fare con una sola chiave e poi filtrare i risultati con le query?
Titolo: Re: primi approcci con sqlite3
Inserito da: md9327 - 22 Dicembre 2008, 16:10:33
La sintassi mi pare errata, dato che la Primary Key deve essere unica, nel senso che questa è un indice particolare ma, al contrario dei normali indici, se c'è ce nè solo una.
Quando si tratta di indici (o ciavi primarie) su più campi, è buona norma usare per la loro creazione la specifica sintassi, che è normalmente a parte della definizione dei singoli campi; un esempio, ma dipende dal motore db, potrebbe essere:

CONSTRAINT table_pk(campo1, campo2,...) AS PRIMARY KEY

La dichiarazione fatta sul singolo campo, potrebbe essere valida se questo è l'unico campo che compone la chiave primaria; in caso contrario ci sarebbero problemi anche per capire qual'è l'ordine dei campi della chiave (che potrebbe anche non corrispondere all'ordine con cui sono definiti i campi nella creazione della tabella.
Poi, lo scopo principale delle chiavi primarie è quello di definire una regola per non incorrere in duplicazioni di record.
Nel caso occorrano diversi ordinamenti dei dati, allora si possono usare i normali indici.

Purtroppo, e anche questo problema me lo conferma, SQLite non esegue controlli approfonditi sui comandi sql, permettendo di salvare informazioni incongruenti. La cosa bella è che poi se ne accorge in fase d'uso, emettendo un messaggio di quel tipo... ma cavolo, me l'hai permesso, ora non lo capisci?
Come avevo già scritto in altre discussioni, anche il capire che tipo di campo vuoi costruire in una tabella è demandato ad una logica, a dir poco, grossolana; come descritto nella doc ufficiale di SQLite, il motore gestisce solo 4 (quattro) tipi di dato (nella versione 3, mentre nella 2 era solo 1... stringa...), e la ticologia del campo viene definita andando a vedere se all'interno del nometipo ci sono stringhe del tipo: *CHAR*, *INT*, *DATE*, *BLOB*, ecc. Anche le dimensioni sono predefinite per tipo, e quelle dichiarate nella sintassi "CREATE..." vengono ignorate.

Le mie non sono critiche a SQLite, ma solo un modo per dire di fare attenzione a come si usa questo motore; ovviamente picavbg, essendo alle prima armi, non ne è a conoscenza, per cui ho ritenuto avvertire anche lui dei problemi a cui và incontro.
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 23 Dicembre 2008, 00:20:34
Citazione

md9327 ha scritto:
La sintassi mi pare errata, dato che la Primary Key deve essere unica, nel senso che questa è un indice particolare ma, al contrario dei normali indici, se c'è ce nè solo una.
Quando si tratta di indici (o ciavi primarie) su più campi, è buona norma usare per la loro creazione la specifica sintassi, che è normalmente a parte della definizione dei singoli campi; un esempio, ma dipende dal motore db, potrebbe essere:

CONSTRAINT table_pk(campo1, campo2,...) AS PRIMARY KEY


Si, é vero che i campi elementari di tabella formanti, tutti insieme, la chiave primaria possono essere distribuiti in maniera non sequenziale nella struttura della tabella. Ricordo benissimo quando anni fa ho studiato i comandi sql per la gestione dei data base. Solo che poi non mai potuto mettere in pratica quanto studiato, perché poco dopo i miei impegni professionali sono cambiati. A parte codesta mia riflessione, sto conoscendo ora sqlite3 ed anche se devo convenire di avere ragionato poco sulla costruzione dell'insieme di campi che deve costituire l'unica chiave primaria della tabella, non ho capito, leggendo la guida SQLite nel sito "http://www.sqlite.org/lang.html", che dovevo usare la funzione "constraint table". :oops:
Come al solito la descrizione della guida nella solita lingua inglese mi ha sferrato uno dei suoi tiri mancini.

Grazie per il suggerimento; credo di avere capito.
 :ciao:  :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: md9327 - 23 Dicembre 2008, 18:51:22
Per un supporto morale, ti dico che anche la documentazione sqlite, lascia un pò a desiderare...

Ad ogni modo, credo tu debba partire dai principi base della sintassi sql (nella fattispecie specifiche SQL-92), e poi andare ad analizzare le particolari applicazioni di questa sintassi da parte dei vari dbms.
SQLite ne adotta solo una piccola parte, e non completamente.
PostgreSQL adotta lo standard alla lettera, con aggiunte di alcune funzionalità utili, sviluppate da contributori vari; questo un pò per seguire le orme di Oracle che, a mio avviso, è il massimo (ma è commerciale!).
MySQL lo adotta quasi completamente, ma il suo scopo, a quanto pare, è quello di orientarsi più sulla velocità e per gli ambienti web (vedi CMS); già prima non era completamente open-source, ma ora che se l'è comprato la SUN, non sò come andrà a finire (sicuramente usufrirà del supporto di una grande azienda...).

In ambiente Linux, non esistono altri motori di database degni di nota, oltre quelli che ho menzionato.
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 24 Dicembre 2008, 14:48:22
Citazione

md9327 ha scritto:
... credo tu debba partire dai principi base della sintassi sql (nella fattispecie specifiche SQL-92), e poi andare ad analizzare le particolari applicazioni di questa sintassi da parte dei vari dbms.


Debbo essere sincero: non ho guardato subito le specifiche SQL-92, perché prima ho voluto fare ancora una prova: ho guardato con molta attenzione il non facile schema grafico-intuitivo presente in "www.sqlite.org" per la costruzione del comando SQL "CREATE TABLE" ed ho tracsritto su carta i segmenti dell'istruzione necessaria per la creazione della mia prima tabella. Ho così, passo dopo passo, verificato la sintassi scritta nel programma ed ho ottenuto alla fine il seguente codice gambas:
Codice: [Seleziona]

DIM sql AS String 'serve per eseguire i comandi sul DB
DIM sqltable AS Result
................
sql = "CREATE TABLE 'Movimgg' ("
sql = sql & " 'DtMovvgg' CHAR(8),"
SQL = SQL & " 'NuProMovvgg' INTEGER,"          
SQL = SQL & " 'CoVocMovvgg' CHAR(8),"          
SQL = SQL & " 'DescrMovvgg' VARCHAR(100) DEFAULT NULL,"
SQL = SQL & " 'MValMovvgg' CHAR(1) DEFAULT NULL,"        
SQL = SQL & " 'ImpMovvgg' FLOAT DEFAULT NULL,"
SQL = SQL & " 'BenefMovvgg' CHAR(1) DEFAULT NULL,"
SQL = SQL & "  PRIMARY KEY ("
SQL = SQL & " 'DtMovvgg',"       'primo campo della primary key
SQL = SQL & " 'NuProMovvgg',"    'secondo campo della primary key"
SQL = SQL & " 'CoVocMovvgg'"     'terzo campo della primary key    
SQL = SQL & " ));"                                        
sqltable = DB_Connection.Exec(sql)
Message.Info("Tabella 'movimgg'  Creata - FINE PROVA ")

Ho  mandato in seecuzione il programma e finalmente ho potuto leggere il mio Messaggio di "Fine Prova", Non ho potuto fare a meno di  :evviva:

E visto che siamo arrivati alla vigilia di Natale, per me é stato un grandissimo regalo di "Babbo Natale  Gambas+SQLite3".

Ho voluto riportare il codice solamente perché possa essere d'aiuto a chi dovesse avere la mia stessa necessità ed, utilizzando i post come documentazione di supporto, possa arrivare molto comodamente alla soluzione.

Dimenticavo: ho aperto il DB con Knoda ed ho potuto riscontrare l'effettiva esistenza della tabella con tutti i campi, però devo ancora approfondirne la conoscenza per potere ottenere la vista della sua struttura.

Grazie per il sostegno. Buon Natale a tutti.
 :pint:  :ciao:  :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: md9327 - 27 Dicembre 2008, 11:43:08
Buon Natale anche a te e ai tuoi cari!

Comunque, c'è una cosina che non mi suona nel tuo codice, ovvero la definizione della PRIMARY KEY; nella dichiarazione hai inserito una serie di valori stringa costanti, ma la definizione vuole uno o più nomi di campo.
Spero tu sappia cos'è un indice, nel qual caso la chiave primaria intendila come tale, nel senso che questa implica la creazione di un normale indice, ma con le opzioni "Unique" e "Not Null" attive. In più, queste opzioni, non possono essere alterate, e questo di norma viene controllato dal motore del db.
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 29 Dicembre 2008, 15:23:50
Citazione

md9327 ha scritto:
c'è una cosina che non mi suona nel tuo codice, ovvero la definizione della PRIMARY KEY; nella dichiarazione hai inserito una serie di valori stringa costanti, ma la definizione vuole uno o più nomi di campo.


Mi dispiace dirti di non aver compreso quello che vuoi dire, anche perché le stringhe a cui probabilmente ti riferisci servono a formare il comando SQL con cui GAMBAS costruisce la tabella DB la cui PRIMARY KEY é segnatamente riportata con l'elencazione dei nomi campo in coda a tutti i nomi dei campi tabella dove, invece, é riportata a fianco di ciascun campo la struttura del campo stesso, pertanto:
Citazione

Codice: [Seleziona]

sql = sql & " 'DtMovvgg' CHAR(8),"
SQL = SQL & " 'NuProMovvgg' INTEGER,"          
SQL = SQL & " 'CoVocMovvgg' CHAR(8),"          
SQL = SQL & " 'DescrMovvgg' VARCHAR(100) DEFAULT NULL,"
SQL = SQL & " 'MValMovvgg' CHAR(1) DEFAULT NULL,"        
SQL = SQL & " 'ImpMovvgg' FLOAT DEFAULT NULL,"
SQL = SQL & " 'BenefMovvgg' CHAR(1) DEFAULT NULL,"

é l'elenco dei campi costituenti la tabella, mentre:

Codice: [Seleziona]

SQL = SQL & "  PRIMARY KEY ("
SQL = SQL & " 'DtMovvgg',"       'primo campo della primary key
SQL = SQL & " 'NuProMovvgg',"    'secondo campo della primary key"
SQL = SQL & " 'CoVocMovvgg'"     'terzo campo della primary key    
SQL = SQL & " )

costituiscono  la referenza ai nomi dei campi che cumulativamente formano la PRIMARY KEY, sempre nello stesso comando SQL che inizia con :

sql = "CREATE TABLE 'Movimgg' ("

e finisce con:

...........);"  


L'esecuzione del programma poi non mi ha dato errore e la tabella é stata formata bene. Può darsi che la sintassi di Gambas preveda anche un 'altro tipo di struttura del comando SQL necessario a costruire una tabella. Io mi sono attenuto a quanto letto  in http://www.sqlite.org/lang.html.

Non ho potuto continuare le mie prove perché sto tentando di portare tutto il codice relativo alla costruzione del DB e di tutte le sue tabelle in una classe esterna a "FMain.class", da richiamare solo la prima volta che mando in esecuzione il programma e non ci riesco; le mie conoscenze in merito alle classi, ai moduli ed ai metodi sono veramente scarse e, non trovando una guida esplicativa in italiano che illustri elementarmente come riconoscere l'una dall'altra e come scriverne esattamente il codice per richianmare ora l'una, ora l'atra, in special modo la classe, sto incontrando grosse difficoltà, anche seguendo gli esempi nei programmi di prova trovati nel Forum.

Tornando al comando SQL di partenza, se ritieni che debbo correggere qualcosa nel codice scritto, sono qui pronto a sentire i tuoi consigli. :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: md9327 - 29 Dicembre 2008, 19:16:07
In effetti mi hanno confuso gli strani nomi che hai dato alle colonne, che ho scambiato per stringhe... :-)

No, il codice, dopo uno sguardo più attento, è corretto.

Per gli oggetti e le classi, ho scritto qualcosa nel Wiki...

Buon anno!!!
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 08 Gennaio 2009, 16:49:08
Speravo che col nuovo anno potessi avere la gradita sorpesa di vedere funzionare nel mio primo programma Gambas la classe che ho pensato di creatre per la costruzione del DB e delle sute tabelle.  :-)

Scherzi a parte, ho cercato sia nel wiki, sia nella guida "A beginner's guide to gambas", una soluzione al mio problema che riassumo qui di seguito.

Il codice che ho scritto esegue all'avvio, nella "FMain.class" l'accesso al DB correlato per accertarne la presenza e nel caso in cui il DB non venga trovato (condizione che si può verificare ordinariamente solo alla prima esecuzione del programma), arriva il problema da risolvere, cioè il tentativo di creare una nuova classe per la formazione del DB e la costruzione della struttura tabellare necassaria a contenere i dati da immettere.

Purtroppo non riesco a capire come scrivere il codice necessario perché, nelle casistiche che sono riuscito a trovare nel Forum, non esiste un esempio calzante con la soluzione da me pensata. :cry:

Ho quindi eseguito diverse prove, ma tutte hanno prodotto esito negativo già in fase di runtime. L'ultima prova fatta é:
Citazione

All'interno della FMain.class:
Codice: [Seleziona]

PUBLIC SUB Form_Open()
  DIM DB_Connection AS NEW Connection   'inizializza la nuova connessione
  DIM DBname AS String  'Nome del Database
  DIM DB_path AS String 'Percorso di ricerca
.....................
.....................
.....................
 DB_Connection.Open    'Tento l'apertura del DB
 IF DB_Connection.Databases.Exist(DBname) THEN   'verifica l'esistenza del DB
          Message.Info("Il DB '" & DBname & "' ESISTE GIÀ - FINE PROVA")
          DB_Connection.CLOSE               'chiude il DB
          QUIT  'Esce dal programma
  ELSE
          SELECT Message.ERROR("Attenzione! ->  archivio '" & DBname & "' NON TROVATO", "Creare DB ex novo", "Uscita dal programma")
                 CASE 1
                        DIM CreDB AS NEW Class()    'creazione della classe di costruzione del Databse e delle sue Tabelle dati
                        CreDB AS ScriviDB  
                 CASE 2      
                        Message.Info("hai premuto il pulsante: Uscita dal programma - FINE PROVA")
          END SELECT
          QUIT    'Esce dal programma
  ENDIF
.....................
.....................
END

Dopo avere cliccato col tasto dx del mouse sull'iconcina "Classi >> Nuovo"
ho riportato nella ScriviDB.class il codice già testato con successo precedentemente per la creazione del DB e della costruzione della sua prima tabella.

A questo punto ho tentato l'esecuzione del propgramma, ottenendo la seguente rispostaccia:
Citazione

Unexpectecd DIM alla linea 2 in ScriviDB.class


 :-?
E' come se mancasse una definizione come prima riga della classe appena creata. Francamente non ci capisco niente. Non sto a riportare tutte le rpove fatte; sarebbe troopo lungo e fuorviante. Già il ricordo di avere quasi festeggiato il 2009 immersdo nella ricerca del "Guasto di ... classe>" mi fa venire la tremarella. :freddo:  :-)
Potreste aiutarmi a superare questo mio livello di ignoranza?
  :ciao:  :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: fsurfing - 08 Gennaio 2009, 19:27:09
posta il codice della classe
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 08 Gennaio 2009, 23:19:37
Citazione

fsurfing ha scritto:
posta il codice della classe


Come vuoi, ma come ho indicato nella mia precedente comunicazione ho solo sua traferito nella classe il codice relativo alla definizione del DB e della prima tabella.
Citazione

DIM sql AS String 'serve per eseguire i comandi sul DB
DIM sqltable AS Result
DIM DB_Connection AS NEW Connection  
DIM DBname AS String  'Nome del Database

Message.Info("Complimenti!!! - Sei entrato nella classe di creazione del DB e delle sue Tabelle")

DB_Connection.Databases.Add(DBname)         'crea il DB
DB_Connection.CLOSE               'chiude il DB
Message.Info("DB '" & DBname & "' Creato - Ora creo Tabella 'movimgg' ")
WITH
    DB_Connection
    .Name = DBname
    .OPEN    'Riapro il DB
END WITH
                       
sql = "CREATE TABLE 'Movimgg'  ("
sql = sql & " 'PrimChi1' CHAR(8),"        'DtMovvgg (Data-Movimento-giornaliero) é la prima parte della chiave primaria
SQL = SQL & " 'PrimChi2' INTEGER,"          
SQL = SQL & " 'PrimChi3' CHAR(8),"          
SQL = SQL & " 'Descr' VARCHAR(100) DEFAULT NULL,"
SQL = SQL & " 'TipoValuta' CHAR(1) DEFAULT NULL,"        'Valuta monetaria circolante
SQL = SQL & " 'Imp' FLOAT DEFAULT NULL,"
SQL = SQL & " 'Benef' CHAR(1) DEFAULT NULL,"
SQL = SQL & "  PRIMARY KEY ("                            'collegamento dei campi componenti la primary key
SQL = SQL & " 'PrimChi1',"                                'primo campo della primary key
SQL = SQL & " 'PrimChi2',"                             'secondo campo della primary key"
SQL = SQL & " 'PrimChi3'"                              'terzo campo della primary key    
SQL = SQL & " ));"                                        
sqltable = DB_Connection.Exec(sql)
Message.Info("Tabella 'Movimgg'  Creata - FINE PROVA ")

Grazie, Ciao.
Titolo: Re: primi approcci con sqlite3
Inserito da: md9327 - 09 Gennaio 2009, 10:47:06
Domande:
a) Sei sicuro di aver postato tutto del file? Il testo che hai inviato dovrebbe essere incluso in un metodo di classe, oppure in una funzione di un modulo (magari la Main()).
b) La riga di errore a quale riga effettiva corrisponde?
c) Controlla se la prima riga del file (classe e modulo) abbia una nota di definizione "'Gambas ecc."; questa prima riga non và mai tolta!

Suggerimenti:
1) invece di "SQL = SQL &", scrivi "SQL &="; è lo stesso, ma più leggibile e scrivi meno... :-)
2) onde evitare situazioni appese: è giusto che tu chiuda preventivamente il db prima di riaprirlo, ma non puoi sapere se è stato veramente aperto o meno; nel qual caso potresti avere un errore che ti manda in crash il programma. Prova a inserire un "TRY db.Close()"; la TRY, in caso di errore, ti trappola l'errore e ti permette di continuare con il codice.
3) In realtà, l'array Databases dell'oggetto DB, ha senso solo nel caso di database relazionali del tipo PostgreSQL, MySQL, ecc., che gestiscono più database all'interno di ina stessa sessione; nel caso di SQLite, ha meno senso, anche perchè non credo che questo database possa supportare più db in conteporanea nello stesso file.
4) Perchè l'utilizzo della sintassi "DIM CreDB AS NEW Class()", mentre puoi utilizzare "DIM CreDB AS NEW ScriviDB"?
5) Il metodo "Exec()" può ritornarti un oggetto nullo, quindi conviene testarlo prima di utilizzarlo
6) Non è detto che il DB può essere trovato solo all'inizio del programma, e se qualcosa ti cancella il file sotto il naso? Riguardo ad un db server, questo può cadere per tantissime ragioni, per cui la cosa sarebbe meglio controllarla...
7) Il comando QUIT può essere usato per terminare bruscamente un programma, ma sarebbe buona norma non utilizzarlo; questo comando non rilascia correttamente le risorse, e può provocare una serie di anomalie a posteriori... (è un consiglio...)
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 10 Gennaio 2009, 23:41:15
Citazione

md9327 ha scritto:
Citazione

Domande:
a) Sei sicuro di aver postato tutto del file? Il testo che hai inviato dovrebbe essere incluso in un metodo di classe, oppure in una funzione di un modulo (magari la Main()).
b) La riga di errore a quale riga effettiva corrisponde?
c) Controlla se la prima riga del file (classe e modulo) abbia una nota di definizione "'Gambas ecc."; questa prima riga non và mai tolta!


Risposte:
a) No, per contenere l'impegno di chi mi voglia aiutare, ho riportato solo le righe interesanti nella "FMain.cla22, mentre della "ScriviDB.class" non ho ho riportato alcuna riga perché non ho aggiunto alcuna nuova istruzione .
b) la riga di riferimento dell'errore é la prima della "CreaDBContab.Class".
c) Sia la "FMain.class" che la "ScriviDB.Class" contengono la riga di commento "' Gambas class file"


Citazione

Suggerimenti:
1) invece di "SQL = SQL &", scrivi "SQL &="; è lo stesso, ma più leggibile e scrivi meno... :-)
2) onde evitare situazioni appese: è giusto che tu chiuda preventivamente il db prima di riaprirlo, ma non puoi sapere se è stato veramente aperto o meno; nel qual caso potresti avere un errore che ti manda in crash il programma. Prova a inserire un "TRY db.Close()"; la TRY, in caso di errore, ti trappola l'errore e ti permette di continuare con il codice.
3) In realtà, l'array Databases dell'oggetto DB, ha senso solo nel caso di database relazionali del tipo PostgreSQL, MySQL, ecc., che gestiscono più database all'interno di ina stessa sessione; nel caso di SQLite, ha meno senso, anche perchè non credo che questo database possa supportare più db in conteporanea nello stesso file.
4) Perchè l'utilizzo della sintassi "DIM CreDB AS NEW Class()", mentre puoi utilizzare "DIM CreDB AS NEW ScriviDB"?
5) Il metodo "Exec()" può ritornarti un oggetto nullo, quindi conviene testarlo prima di utilizzarlo
6) Non è detto che il DB può essere trovato solo all'inizio del programma, e se qualcosa ti cancella il file sotto il naso? Riguardo ad un db server, questo può cadere per tantissime ragioni, per cui la cosa sarebbe meglio controllarla...
7) Il comando QUIT può essere usato per terminare bruscamente un programma, ma sarebbe buona norma non utilizzarlo; questo comando non rilascia correttamente le risorse, e può provocare una serie di anomalie a posteriori... (è un consiglio...)


Risposta a "Suggerimenti":
Ti ringrazio per i preziosi consigli, solo che da neofita ho difficoltà a comprenderli tutti; riprendo solo quelli che ho capito meno o non ho capito per niente:
3) Se l'ho fatto non mi sono reso conto di avere costruito un array Database. :-o  E' tutta colpa del mio stato di neofita. Infatti non devo realizzare un array di detto tipo.
5) Testare il metodo "Exec()" -->  ???
6) Il progetto che vorrei realizzare girerrà solo su pc stand-alone, quindi il DB, una volta generato, non dovrebbe correre rischi di ...magia nera  :-).
7) Il comando QUIT é quello che sono riuscito a trovare poter uscire dal progetto. In V.B. utilizzavo il comando "END", ma ho provato ad utilizzarlo in Gambas e produce un errore.
 Ho capito: QUIT é insicura; allora cosa usare per uscire e chiudere l'applicazione in maniera non traumatica?


Mi sono reso conto che a questo punto della discussione sono abbastanza malconcio  :duro: , figuriamoci alla fine, ...se mai ne uscirò! :-)

In questo momento mi sento come paralizzato e non riesco a formulare più alcuna ipotesi risoluitiva, se non quella di abbandonare la creazione di una nuova classe per la definizione del DB occorrente. Però dal punto di vista della mia crescita formativa in Gambas farei un passo da gamb...ero.;-)
 :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: leo72 - 11 Gennaio 2009, 06:42:07
1)
scusate se mi intrometto.... ma questo codice:
Codice: [Seleziona]

CASE 1
  DIM CreDB AS NEW Class

è errato. Come riporta la documentazione di Gambas:
Citazione

All DIM declarations must be in the FUNCTION or SUB before the first executable command.

Non puoi dichiarare una variabile/oggetto/altro in mezzo alle istruzioni ed ai comandi: lo devi fare tutto in cima alla procedura/funzione, prima della prima istruzione.

Probabilmente la DIM a cui si riferisce Gambas è proprio quella.

2)
Per chiudere un programma si dovrebbe usare l'evento Close() affinché Gambas avvii la gestione della chiusura tramite la Sub Form_Close(), dove puoi mettere del codice tuo. Per invocarlo basta invocare ME.Close da un qualsiasi punto del form/class che si vuole chiudere.
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 11 Gennaio 2009, 23:45:05
Citazione

leo72 ha scritto:
 Come riporta la documentazione di Gambas:
Citazione

All DIM declarations must be in the FUNCTION or SUB before the first executable command.


Mi dispiace avere incomodato la comunità per aiutarmi a conoscere Gambas, perché mi rendo conto di avere cominciatoo ad approcciarmi con codesto linguaggio nel modo meno semplice, ma ormai ho cominciato. Ho capito ed ho anch'io avuto il dubbio, nell'usarla, che la dichiarazione della variabile nel bel mezzo del codice potesse dare fastidio; però visto che nella mia idea la classe dinamica potesse essere creata al momento del bisogno e che si creasse con una "Dim variabile as new ...", ho immaginato che potesse anadare ugualmente bene la sua dichiarazione nel corso dell'esecuzione del programma.

Non essendo così, mi sembra necessario allora fissare dei paletti importanti per capire il resto:
1)una classe dinamica non viene creata al momento della sua dichiarazione;
2)essa viene creata solo quando viene referenziata;
3)viene richiamata per l'esecuzione del codice in essa contenuto subito dopo la sua creazione, cioè sempre quando viene referenziata.
4)All'interno della classe dinamica occorre  scrivere il codice dentro una funzione o una”Private Sub” per ottenerne l'esecuzione;
5)Terminata l'esecuzione del passo di funzione o Sub utilizzato, il programma riprende a svolgeresi con l'istruzione successiva a quella di referenza della classe dinamica.
Es,:
Codice: [Seleziona]

PUBLIC SUB Form_Open() 'Nella Fmain.Class
DIM CreDB AS ScriviDB
......................................
......................................
CreDB = NEW ScriviDB 'momento di creaziione della classe dinamica e
                                dell'esecuzione del codice in essa contenuto

if Esito = si      'istruzione da cui riprende il programma dopo l'esecuzione
                    delle istruzioni contenmute nella classe riferenziata alla
                    riga prcedente
..............................
else
Message.ERROR("Attenzione! ->  operazione fallita”)
ENDIF

Ho capito?

Se non ho capito occorrerebbe una spiegazione dettagliata in merito, semprecché si possa fare all'interno di una discussione! :roll:

 :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: md9327 - 12 Gennaio 2009, 01:17:48
In effetti, la definizione delle variabili, segue la logica usata nei linguaggi tipo il C (non C++), che deve essere fatta all'inizio di una classe (o funzione), e mai in mezzo al codice operativo.

Riguardo ai punti di domanda:

1) la dichiarazione non è, di per sè, la creazione effettiva di una variabile (o oggetto, è lo stesso...), a meno che non venga usata la sintassi:
Codice: [Seleziona]

DIM var1 AS NEW Object[]

in questo caso, la parola NEW, oltre a dire all'interprete che tipo di variabile verrà trattata all'interno della funzione, ne viene creata pure un'istanza ovvero, verrà creata veramente, occupando un'effettiva area di memoria.

2) la referenziazione di una variabile di tipo base (es. Integer) avviene proprio durante la sua dichiarazione con DIM, e impostata ad un valore di default, dipendente dal tipo di variabile (es. Integer=0, Boolean=FALSE, ecc.); per gli oggetti il comportamento è un pò diverso, dato che questi sono componenti complessi, per cui è necessario crearli in memoria, prima di utilizzarli. Se mentre la creazione di un riferimento ad un oggetto istanziato può corrispondere ad un valore NULL (magari perchè cancellato, oppure azzerato da programma), se si prova a utilizzare una variabile oggetto, anche se dichiarata, senza averla istanziata, si avrà un errore, e il programma andrà in crash.

3) l'esecuzione del codice di oggetto non viene eseguito alla creazione dello stesso, a eccezione di alcuni metodi che, se inseriti nel codice, verranno applicati secondo la loro natura, come ad esempio il metodo "_new()". Una descrizione di questi metodi l'ho inserita nel wiki qualche tempo fà, dagli un'occhiata.

4) il concetto di PUBLIC e PRIVATE, come per STATIC, PROPERTY, e anche READ, penso di averlo descritto un pò nel wiki, per cui prima dagli un'occhiata, poi magari se hai dubbi, cercherò di dissolverli.

5) l'esecuzione del codice avviene in maniera sequenziale all'interno di una stessa funzione (o procedura), ma la logica di come vengono chiamate le funzioni, o i metodi e gli eventi di una classe, dipende dal tipo di programma che stai costruendo. Ti faccio un esempio...
In qualsiasi linguaggio, esistono due macro gruppi di classi: procedurali e di interfaccia. Il primo gruppo comprende tutte quelle metodologie e logiche, che non necessitano di un supporto o di un colloquio con l'utente; il secondo gruppo, invece , comprende tutti quegli oggetti che interagiscono con l'utente (mouse, tastiera, ecc.), oppure ad eventi particolari (es. un timer). Per quest'ultimo gruppo, quindi, sono previste funzionalità adatte all'intercettazione di questi eventi, che richiamano di norma un particolare metodo, dipendentemente dalla tipologia dell'evento stesso; è ovvio pensare che, per un click del mouse, il metodo che ne riceve la chiamata, sappia a quale posizione dello schermo è stato effettuato il click (x,y), per cui alla funzione che viene chiamata verranno passate le coordinate del click.

Per ora mi fermo qui...

Se hai dubbi, il forum è qui apposta... :-)
Titolo: Re: primi approcci con sqlite3
Inserito da: leo72 - 12 Gennaio 2009, 12:20:07
Quando istanzi una nuova classe con NEW l'unica porzione di codice di quella classe che viene eseguita è quella contenuta nella sub "_new()" della classe stessa, che contiene appunto il codice che deve essere eseguito durante la sua creazione (es.: inizializzazione di variabili interne alla classe, ecc...). Il resto del codice viene eseguito solo quando viene chiamato dall'esterno, ad esempio invocando un metodo della classe stessa: MiaClasse.Funzione().
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 12 Gennaio 2009, 23:07:33
Grazie per il grande aiuto. Ho capito, almeno così credo. Ho rivisto un pò tutto come mi avete suggeritio ed ho modificato di conseguenza il mio codice, sia portando la Dim incriminata all'inizio della "FMain.class, sia costruendo una "Public Sub_new() nella nuova classe. Ho riordinato le istrruzioni inserendole opportunamente nel programma e finalmente la sua esecuzione prosegue con successo e senza errori.:1birra:

Mi resta ancora un dubbio sull'occupazione di memoria da parte della classe dinamica, una volta svolto il suo compito. Mi spiego meglio:
La classe dinamica si forma nel momento in cui viene referenziata e va ad occupare la quantità di memoria che le necessita. Dopo che le istruzioni in essa contenute ha terminato il suo lavoro. AS questo punto, per liberare la porzione  di memoria che detta classe dinamica ("ScriviDB.Class") ha impegnato, é necessario che lo faccia tramite codice oppure, una volta concluso il suo lavoro, viene automaticamente liberata anche la porzione di memoria impegnata?

Spero di essere stato chiaro.  :ciao:  :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: leo72 - 12 Gennaio 2009, 23:40:53
Gambas gestisce automaticamente la memoria rilasciando quella occupata da oggetti non più referenziati in maniera automatica. Quindi non devi preoccuparti di farlo tu: ci pensa l'interprete stesso a "fare pulizia".
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 04 Febbraio 2009, 00:06:14
31-gen-2009

Dopo avere creato il mio primo DB sqlite3 e le prime due tabelle, mi trovo a dovere leggere una delle tabelle per ottenere da essa la data da caricare nelle combobox Giorno, Mese, Anno. Però la prima volta che il programma va in esecuzione il DB non contiene ancora tabelle valorizzate. Dovendo riconoscere se la tabella é vuota avrei bisogno di potere interrogare la condizione “and”  di BOF, EOF. In VB potevo utilizzare l'istruzione:
Citazione

IF “Nome-DB.Nome-Tabella.BOF AND Nome-DB.Nome-Tabella.EOF THEN


In Gambas ho cercato qualche strumento simile ma non ne ho trovato (o non ne sono stato capace).
:roll:
Mi sono comportato così
Citazione

Codice: [Seleziona]

PRIVATE $DataCont AS String
PRIVATE DB_Connection AS NEW Connection  
PRIVATE DBname AS String  'Nome del Database'''
PRIVATE DB_path AS String 'Percorso di ricerca del Database ContabFam.db
PRIVATE sql AS String                  'serve per eseguire i comandi sul DB
PRIVATE NomeRec AS Result

DB_Connection
      .Type = "sqlite3"
      .Host = DB_path
      .Name = DBname
      .OPEN    'Apro il DB
      .Login = ""
      .Password = ""
  END WITH
DB_Connection.Begin
  NomeRec = DB_Connection.Edit("GGAperte")  'collega il campo di memoria NopmeTab alla Tabella GGAperte in modalità lettura record
 $DataCont = NomeRec!DtCoGGAp  'carico in memoria il contenuto dell'elemento Data-contabile della 1^ riga della tabella "GGAperte"
   IF $DataCont = "" THEN
       Message.Info("Tabella  'GGAperte' -->  V U O T A")
  ENDIF        



Però così facendo l'esecuzione di:
Codice: [Seleziona]

$DataCont = NomeRec!DtCoGGAp


Ricevo l'errore:
Citazione

Reult is not available


 :-?  
Devo trovare un'altra soluzione, ma quale? Potete aiutarmi?
 :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 04 Febbraio 2009, 09:40:22
Chiedo scusa per la precipitata formulazione della mia richiesta di soccorso, ma l'ora gtarda mi ha annebbiato la mente  e... . Poi la notte ha portato consiglio ed ho modificato il codice aggiungendo l'istruzione "TRY", ottenendo il seguente spezzone di di codice:
Citazione

Codice: [Seleziona]

TRY $DataCont = NomeRec!DtCoGGAp  
  IF ERROR THEN
      Message.Info("Errore in Tabella  'GGAperte' --> " & Error.Text & " (" & Error.Code & ")")
  ENDIF


 A questo punto, eseguendo il programma ho potuto leggere il mio messaggio:
Citazione

Errore in Tabella  'GGAperte' --> Result is not available (-1)

 :-)

Ecco, ora ho il preoblema di decifrare il codice di errore ottenuto. Dove posso trovare un elenco esplicativo dei codici di errore? Grazie ancora.

 :-)    :ciao:  :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: md9327 - 04 Febbraio 2009, 14:38:54
L'errore in questione è causato dal fatto che è stato ritornato un oggetto Result vuoto dall'esecuzione della query.

Inoltre un mio consiglio: l'uso dei comandi TRY/CATCH è meglio usarle in cui può verificarsi un errore non previsto, e non per catturare errori conosciuti, a meno di una scelta in condizioni particolari. Per ritornare al tuo esempio, il ritorno da una query può ritornare: un oggetto vuoto o nullo (il tuo caso), un errore di connessione (es. la caduta del server). In questi casi sarebbe meglio inserire dei controlli a codice (es. con un IF). E' comunque valido l'inserimento della trappola CATCH alla fine del metodo.

Riguardo le funzionalità EOF/BOF, l'oggetto Result ti offre metodi alternativi; essendo questo un oggetto molto simile ad un array, puoi testare il numero di record che contiene (sempre se non null), ed eseguire un loop di lettura, oppure usare il costrutto:
Codice: [Seleziona]

FOR EACH oResult
NEXT

che esegue lo spostamento del puntatore interno all'oggetto, in modo da ritornarti un record per ogni loop, fino al completamento di tutti gli elementi, senza provocare errori. Il controllo del metodo Result.Count ti ritorna l'esatto numero di record caricati dal database.
Titolo: Re: primi approcci con sqlite3
Inserito da: leo72 - 04 Febbraio 2009, 23:48:23
Un sistema molto semplice per verificare che una tabella contenga dati e/o alcuni tipi di dati è di utilizzare la proprietà Available dell'oggetto Result, che serve proprio a verificare se il record è esistente. Il tuo test potrebbe essere riscritto così:
Codice: [Seleziona]

NomeRec = DB_Connection.Edit("GGAperte")
IF NOT NomeRec.Available THEN
  Message.Warning("Tabella vuota")
ELSE
  NopmeTab alla Tabella GGAperte in modalità lettura record
  $DataCont = NomeRec!DtCoGGAp
ENDIF
Titolo: Re: primi approcci con sqlite3
Inserito da: Picavbg - 05 Febbraio 2009, 00:10:40
Citazione

md9327 ha scritto:
Riguardo le funzionalità EOF/BOF, l'oggetto Result ti offre metodi alternativi; ...................................
Il controllo del metodo Result.Count ti ritorna l'esatto numero di record caricati dal database.


Citazione

leo72 ha scritto:
Un sistema molto semplice per verificare che una tabella contenga dati e/o alcuni tipi di dati è di utilizzare la proprietà Available dell'oggetto Result, che serve proprio a verificare se il record è esistente. Il tuo test potrebbe essere riscritto così:

NomeRec = DB_Connection.Edit("GGAperte")
IF NOT NomeRec.Available THEN
  Message.Warning("Tabella vuota")
ELSE
  NopmeTab alla Tabella GGAperte in modalità lettura record
  $DataCont = NomeRec!DtCoGGAp
ENDIF


Vi ringrazio tantissimo per i vostri consigli. Ho capito che essendo Gambas assai malleabile nell'uso di istruzioni che permettonio di arrivare allo stesso risultato, basta applicare al proprio programma quell'insieme di codice più congeniale al modo di scrivere e del programmatore. Ho letto il suggerimento di leo72 dopo avere ragionato sul suggerimento di md9327 ed hoadottato la seguente soluzione:
Codice: [Seleziona]

DB_Connection.Begin
  NomeRec = DB_Connection.edit("GGAperte")  
  n_NumElem = NomeRec.Count     'estrae il n° di record presenti nella tabella GGAperte
  'Message.Info("La Tabella  'GGAperte' contiene n°" & n_NumElem & " righe")
 IF n_NumElem = 0 THEN
       Message.Info("Tabella  'GGAperte' -->  V U O T A" )
  ELSE
      $DataCont = NomeRec!DtCoGGAp  'carico in memoria il contenuto
 ENDIF    
:-D
  :ciao:  :ciao:
Titolo: Re: primi approcci con sqlite3
Inserito da: leo72 - 05 Febbraio 2009, 11:13:48
Ricorda, Gambas è un linguaggio in cui non esiste un solo modo per fare una cosa. Ne esistono tanti, ognuno sceglie quello che più gli piace o che conosce.
Il tuo controllo potrebbe anche diventare:
Codice: [Seleziona]

IF NomeRec.Count = 0 THEN
  Message.Info("Tabella  'GGAperte' -->  V U O T A" )
ELSE
  $DataCont = NomeRec!DtCoGGAp  carico in memoria il contenuto
ENDIF

senza dover assegnare il valore di NomeRec.Count ad una variabile temporanea.
Questo per confermare quanto da me detto sopra.