Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Mario - 30 Maggio 2008, 16:04:19

Titolo: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 30 Maggio 2008, 16:04:19
Ehilà! :-)

Come ho detto altrove io lavoro moltissimo con l'RPG, linguaggio dato per morto almeno un centinaio di volte, e invece ancora vivo e vitale grazie alla marea di sviluppatori che gravitano intorno a mamma IBM.
La logica della programmazione RPG è diversa da quella orientata a oggetti o eventi di altri linguaggi come il nostro Gambas, e devo dire che spesso ho delle difficoltà a capire la logica di funzionamento di alcune parti.
Ad esempio la gestione dei Data Base, che proprio non riesco a comprendere.
Vorrei proporre a chi meglio di me conosce Gambas di vedere se riusciamo a fare un parallelo con l'RPG, così magari riesco a capire meglio come si fa.
E poi è sempre cultura generale, no? :-)

Allora: in RPG per utilizzare un file all'interno di un programma, ci si deve muovere in questo modo:
si dichiara il file all'inizio del programma in apposite schede (F) dove si dice il nome del file, l'uso che se ne fa, se l'accesso è sequenziale o random, che chiave usare, il tipo di file (disco, video, stampante o speciale) e altre caratteristiche.
Una volta fatto questo, nel programma è possibile accedere al file utilizzando alcuni codici operativi molto semplici nel costrutto, ma molto potenti nel risultato che si può ottenere.
Ad esempio, diciamo che ho un file che si chiama ANACL00F che contiene l'anagrafico clienti, con chiave sul codice cliente (campo CDCLI), alfanumerico di sei caratteri.
Se voglio accedere al record del cliente "ABC001", mi basta scrivere nell'area di calcolo la seguente istruzione

"ABC001"   CHAIN   ANACL00F

Se il record esiste, nell'istruzione immediatamente successiva alla CHAIN ho il tracciato record completo del file riempito con il valore dei vari campi del record che mi interessa.
Se non lo trova, posso controllare l'errore con la BIF (built in function) %FOUND.

Sto cercando di capire come fare questa cosa con Gambas, ma non riesco a entrare nella logica.
Sono riuscito a capire come collegarmi al DB di mysql dove ci sono i file che mi interessano, ma non ho capito in che modo posso leggere i dati e metterli nei campi che mi interessano.
Purtroppo non ho mai usato oggetti come le Tabelview o i Datarecord se non molto blandamente con Access, che però fa parecchia roba da solo...

Ho scaricato l'esempio nel topic segnalatomi da Pixel, ma purtroppo è come capire l'elettronica guardando il circuito stampato di una radio (esagero, ma è tanto per dire :-) )

Mi scuso per la prolissità, ma sono convinto che capire sulle differenze sia molto importante :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: md9327 - 30 Maggio 2008, 18:48:47
Ciao,

hai iniziato un bellissimo discorso su un sistema molto antico, e devo dire che hai iniziato bene.

Il problema, però, credo sia alla fonte, ovvero alla mancanza di esperienza su sistemi più moderni; perdonami, non voglio dire che sei ignorante, ma ho intravisto dalle tue parole che hai molta conoscenza sui sistemi cui parli, e su cui ho fatto le ossa in qualche modo anche io, avendo una certa età (anzi, come si dice... un'età certa...).
Il sistema cui parli si riferisce a procedure di archiviazione in modalità sequenziale, che ora non si usano più, soppiantate da motori di database evoluti (DBMS o RDBMS), con cui l'applicazione colloquia tramite un linguaggio standard: SQL.
A parte windoz, su linux sono molto popolari i seguenti motori: PostgreSQL, MySQL, FireBird, Sqlite, ecc.
La maggioranza di questi motori sono in definitiva dei server a se stanti, ovvero applicazioni che gestisco e controllano in maniera più o meno proprietaria i dati che gli vengono forniti, e che mantengono in formati più o meno diversi.
L'accesso ai dati avviene tramite accesso al server, e a mezzo un linguaggio comune, la cui sintassi è più o meno standard (almeno nelle basi).
Ti consiglio di cercare in internet la documentazione relativa allo standard SQL-92 !

In Gambas, come peraltro con altri linguaggi di programmazione, sono presenti delle librerie, ovvero codice precompilato, che mettono a disposizione funzioni utili a semplificare la comunicazione con questi server. In Gambas, queste librerie presentano un struttura comune, a prescindere da quale database (server) ci si collega. Ovviamente i parametri di connessione, e le tipologie dei dati, possono essere diverse tra loro, e quindi è opportuno che il programmatore sappia cosa stà facendo...

Spero che, per il momento, questo ti abbia un pò chiarito il concetto, sperando  di aver compreso bene il senso delle tue richieste.

A disposizione!
Ciao
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 30 Maggio 2008, 19:11:28
md9327, non mi offendo affatto :-)
L'essere ignorante è sempre lo stato di partenza, il vero errore è restarci :-D

In effetti l'RPG è iniziato ben più di una trentina di anni fa, per cui è decisamente vecchio, ma è anche vero che per il tipo di applicazioni che di solito realizzo io è "quello giusto" :-)
L'SQL lo conosco piuttosto bene, perché è possibile "annegarlo" dentro l'RPG, e poi lo uso moltissimo per le normali manutenzioni. Anche mySql lo conosco perché lo usano moltissimo sulle macchine server di molti miei clienti.

Il problema, come vedi, non è tanto la conoscenza dei vari mattoni che mi permettono di leggere un record, ma come legarli tra di loro, in che ordine. E soprattutto cosa capita quando lancio un certo comando.
Ti faccio un esempio: ho visto che per collegarsi con un data base qualsiasi si usa l'oggetto "connect", che ha una serie di proprietà che permettono di dire il tipo di collegamento, il nome del data base, l'utente e la password.
Questo è estremamente chiaro, specialmente quando si arriva al fatidico

dbDataBase.Open()

che è di una chiarezza meravigliosa.
Ma qui comincio ad avere confusione: ho visto che c'è una proprietà che si chiama .Tables che mi restituisce l'elenco dei file (tabelle in linguaggio SQL)) contenuto nel Data Base... ma io voglio accedere a un solo file? Perché non trovo la proprietà per leggere quei dati?
Ho capito che devo lanciare un comando tipo "Select campo1, campo2, campo3 from tabella-che-mi-interessa" e che questo mi genera un flusso di record (da 0 a infiniti... :-))... ma non ho capito "come" leggere i dati reperiti e questo perché mi sfugge la logica che sta dietro a oggetti di tipo "result".
Sono sicuro che una volta capita la logica, la realizzazione di un'applicazione diventa veramente un divertimento, proprio perché non si perde tempo sulle cose "semplici"...
Conto di arrivarci ;-)

C'è una cosa purtroppo che mi frena: la conoscenza di un altro linguaggio.
Può sembrare assurdo ma sarebbe più facile non saperne nulla di informatica e di programmazione, perché partendo da zero si "lavora meglio".
Cambiare logica di ragionamento è molto difficile :-)

Comunque grazie a te e a tutti quelli che accetteranno la sfida di spiegarmi :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 30 Maggio 2008, 19:15:08
Scusa, ho visto che ho dimenticato una cosa importante: io ho cominciato mille volte a studiare i linguaggi orientati agli oggetti, ma, giuro, non ho mai capito esattamente l'utilità di questo approccio. Ovviamente non perché non siano utili, ma perché nel mio "mondo" fatto di stampe bolle e fatture, data entry e poco altro, l'"oggetto" serve a poco...
Però... chissà che un giorno non riesca a realizzare un pacchetto completo in Gambas che si interfaccia direttamente con l'AS/400 :-D
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: fsurfing - 30 Maggio 2008, 22:14:25
Citazione

Ma qui comincio ad avere confusione: ho visto che c'è una proprietà che si chiama .Tables che mi restituisce l'elenco dei file (tabelle in linguaggio SQL)) contenuto nel Data Base... ma io voglio accedere a un solo file? Perché non trovo la proprietà per leggere quei dati?
Ho capito che devo lanciare un comando tipo "Select campo1, campo2, campo3 from tabella-che-mi-interessa" e che questo mi genera un flusso di record (da 0 a infiniti... )... ma non ho capito "come" leggere i dati reperiti e questo perché mi sfugge la logica che sta dietro a oggetti di tipo "result".


facciamo un esempio:

abbiamo un bd con una tabella clienti con i campi : nome  indirizzo telefono


dobbiano cercare il nome relativo ad un dato telefono



Codice: [Seleziona]


dim numero as integer
dim hdata as result
dim $hconn as connection
dim sql as string


....conessione al db (questa la sai già)


sql="SELECT * from clienti where telefono=" & numero
hdata=$hconn.exec(sql)


' a questo punto nel result hdata abbiamo tutti i campi contenenti il numero 'cercato inquesto caso probabilmente uno solo
'vogliamo quindi visualizzare in nome del cliente in una textbox e l' indirizzo 'in un altra possiamo fare:

if hdata.available then
   hdata.movefirst
   textbox1.text=hdata!nome
   textbox2.text=hdata!indirizzo
end if

$hconn.close


' se invece vogliamo avere tutti i nomi che iniziano  per "m" e visualizzarli in una listbox facciamo:


dim sNomecliente as string
dim hdata as result
dim $hconn as connection
dim sql as string



sNomecliente="m"

sql="SELECT * from clienti where nome like'" & sNomecliente & "%'"
hdata=$hconn.exec(sql)

' a questo punto poniamo i risultati in una listbox

for each hdata

   listbox1.add(hdata!nome)

next

$hconn.close



è più o meno chiaro?
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 31 Maggio 2008, 09:40:36
E' chiarissimo, porca miseria!
Praticamente il contenuto di hdata dipende dall'operazione sql che ci abbiamo fatto dentro, giusto?
Ragazzi, avete una birra pagata! :-D
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 31 Maggio 2008, 15:32:41
Provo a fare un altro parallelo, così vediamo se ho capito :-)

Nella programmazione SQL esiste un costrutto chiamato cursore, che viene usato per contenere il risultato di un'operazione SQL.
Se prendiamo come esempio la base dati suggerita da fsurfing, potremmo avere un comando come questo

Codice: [Seleziona]
declare hData cursor for select SELECT * from clienti where telefono = :numero


dopodiché si lancia un semplice

Codice: [Seleziona]
open hData


A questo punto si possono usare comandi come FETCH per leggere (un record per volta) i risultati dentro hData.
Ci ho preso, vero? :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 31 Maggio 2008, 17:20:58
Eh eh, che cariiiiiino! :-)

Per adesso ho fatto una cosa relativamente scema: scrivo in un campo il codice che mi interessa, premo un tasto, mi collego al DB, piglio il record e metto la ragione sociale in un campo a video
E FUNZIONA!! :-D

Il prossimo passo sarà quello di simulare i Subfile del sistema AS/400 con le varie GridView, DataSource e tutto il resto :-)

Grazie a tutti!
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: fsurfing - 31 Maggio 2008, 17:41:58
sono contento di esserti stato utile.

Citazione


A questo punto si possono usare comandi come FETCH per leggere (un record per volta) i risultati dentro hData.
Ci ho preso, vero?


per leggere i dati uno alla volta puoi fare semplicementte un hdata.movenext
per andare avanti

hdata.movefirst    >>>>>>>>>>>>>>>><<  ti porta al primo record
hdta.movelast >>>>>>>>>>>>>>>>> ti porta all' ultimo record
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 31 Maggio 2008, 18:18:45
Sì, li ho visti.
Sono simili ai codici operativi RPG:
READ (leggi successivo)
READP (leggi precedente)
READE (leggi successivo con stessa chiave)
READPE (leggi precedente con stessa chiave)

E anche il movefirst e movelast corrispondono a

SETLL (set lover record)
SETGT (set greater record)

La differenza con questi ultimi due è che non viene letto il record, ma il sistema si limita a posizionarsi "prima" del primo  oppure "dopo" l'ultimo, in modo che facendo una READ o una READP venga letto il primo o l'ultimo :)
La comodità è che SETLL e SETGT permettono di indicare la chiave del file, in modo da posizionarsi prima del primo record con quella chiave, oppure dopo l'ultimo record: in questo caso ultimo caso, usando un READPE, si ottiene l'ultimo record, come con il MoveLast :)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: md9327 - 31 Maggio 2008, 18:23:32
Per contribuire a quello che ha scritto fsurfing, la lettura dei singoli campi può essere effettuata anche così:

Codice: [Seleziona]

if hdata.available then
   hdata.movefirst
   'textbox1.text=hdata!nome
   'textbox2.text=hdata!indirizzo
   textbox1.text=hdata["nome"]
   textbox2.text=hdata["indirizzo"]
end if


ovvero, si fà riferimento al nome della chiave dell'array (o Collection, se vogliamo precisare...).
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 31 Maggio 2008, 20:25:08
Interessante il secondo metodo, che mi pare sia "esteticamente" più in linea con il resto del codice :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: fsurfing - 31 Maggio 2008, 20:52:36
la cosa più interessante del secondo metodo è che all'interno delle parentesi quadre puoi porre una variabile che indica il nome della collection, utili per programmi "generali" in  cui il nome delle varie collection non è conosciuto a priori ma viene ricavato direttamente dal codice
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 01 Giugno 2008, 09:52:28
Una cosa tipo "for each", giusto? :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 02 Giugno 2008, 10:53:04
Ok, adesso vorrei fare un passo avanti :-)

Sto pasticciando da qualche ora con i DataSource, che mi sa che sono un'altra cosa "diversa" dall'RPG, e infatti non ci sto capendo molto :-)

Ho notato che il DataSource funziona come contenitore, e che all'interno di un DS viene "disegnato" un oggetto che permetta di manipolare i dati, come un DataBrowser.
Le GirdView invece ho notato che negli esempi sono utilizzate da sole.
Ho provato a girare e anche a leggere gli esempi, ma non ci ho capito molto... neanche il manuale è molto chiaro.
Provo a dire cosa ho capito e voi mi dite se e dove ho sbagliato: i DataSource funzionano come dei contenitori temporanei di dati, da caricare con le informazioni provenienti dai DataBase. Una volta caricata una DS, i dati sono disponibili al DataBrowser e al DataControl eventualmente "inglobati" nel DS...

Uhm, confuso, vero? :-)

Comunque quello che proprio non mi entra in testa è come inserire i dati del DataBase nel DataSource...
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: fsurfing - 02 Giugno 2008, 14:03:52
il funzionamento di questi componenti è di una semplicità estrema

ma effettivamente il loro utilizzo non è spiegato molto bene dal manuale

il datasource si connette automaticamente alla connessione del db bisogna solo passargli il nome della tabella del db

ovvero  se effettuiamo una connessione al nostro db con il metodo classico

Codice: [Seleziona]


 sName = "nome_del_db"

  WITH $hConn1
    .Type = "sqlite3"
    .Host = User.Home
    .Login = ""
    .Password = ""
  END WITH

  $hConn1.Name = sName
  $hConn1.Open    

  WAIT

   DataSource1.Table = "nome_della_tavola"

 


a questo punto il nostro datasourse  e già funzionante

per far funzionare dataview e databrowser basterà fornire loro l' elenco dei nomi delle colonne da visualizzare


Codice: [Seleziona]
 DataView1.Columns = ["nome_colonna1", "nome_colonna2", "nome_colonna3"]



volendo si possono definire le dimensioni delle colonne e il titolo con

Codice: [Seleziona]

 WITH DataView1.GridView
           .Columns[0].Text = "titolo_colonna1"
           .Columns[0].Width = 100
           .Columns[1].Text = "titolo_colonna2"
           .Columns[1].Width = 100
           .Columns[2].Text = "titolo_colonna3"
           .Columns[2].Width = 100
 END WITH
 



dovrebbe essere tutto

comunque ti posto un programmino di prova che ho realizzato tempo fa per provare questi componenti
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 02 Giugno 2008, 18:35:35
Uh, in effetti è molto semplice :-)

IL file che hai postato l'ho visto in un'altra discussione e l'ho già letto, anche se ci ho capito (per ora) poco; in ogni caso grazie per avermelo segnalato, sicuramente quando ne capirò di più sarà molto meglio :-)

Adesso ho modificato il programma che sto facendo secondo le indicazioni, ma mi sa che c'è ancora qualcosa che non va, perché quando lo lancio mi dice "no current connection". Ho provato a metterlo in debug una riga per volta, e me le esegue tutte, fino a quando non deve riemettere il video dove si trova la DataView che ho inglobato nel DataSource...

provo a mettere il codice che sto usando, vediamo se qualche esperto riesce a vedere l'errore :-)

Codice: [Seleziona]
PUBLIC SUB btClienti_Click()
  DIM dbInterventi AS NEW Connection
  DIM pos AS Integer
  DIM hDati AS Result
  DIM sql AS String
  DIM file AS String = "Clienti"
       
  'Collegamento al Data Base
    dbInterventi.Close()
   
    WITH dbInterventi
    .type = "mysql"
    .host = "localhost"
    .User = "root"
    .Name = "Interventi"
    END WITH
   
   
    TRY dbInterventi.OPEN()
    IF ERROR THEN Message.Error("Impossibile aprire la base dati")
    IF ERROR THEN ME.Close
   
    'Controllo che ci sia la tabella clienti  
    IF NOT dbInterventi.Tables.Exist(file) THEN Message.Error("Il file " & file & " non esiste...")

  'Carico i dati nel risultato
  sql = "Select Codice, RagioneSociale from Clienti"
  hDati = dbInterventi.exec(sql)

  'Carico i dati nel Data Source
  dsDati.Table = file
 
  'Carico i dati nel DataBrowser
  dbDati.Columns = ["Codice", "RagioneSociale"]
 
  WITH dbDati.GridView
    .Columns[0].text = "Cliente"
    .Columns[0].Width = 20
    .Columns[1].text = "Ragione Sociale"
    .Columns[1].Width = 100
    END WITH
 
  dbDati.Show

END


Non sono sicurissimo sul .Show finale, non credo serva effettivamente... ma l'errore me lo da comunque :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 02 Giugno 2008, 18:37:18
Dimenticavo: ho usato una variabile per il nome del file, perché vorrei fare una funzione comune per reperire i dati dei tre file principali (Clienti, Progetti e Interventi), in modo da avere una sola gestione :-)
Ma comunque, mettendo il nome in chiaro o usando la variabile, non cambia nulla ...
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: fsurfing - 02 Giugno 2008, 19:12:29
Citazione
non va, perché quando lo lancio mi dice "no current connection



devi  dichiarare l' oggetto connection come public
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 02 Giugno 2008, 20:32:41
Ah, provo subito, grazie :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 02 Giugno 2008, 20:40:42
Che emozione: funziona! :-)
Adesso gioco :-D
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 03 Giugno 2008, 11:52:06
Eh eh, divertente :-)

La cosa bella è che man mano che si va avanti, si scoprono cose nuove :-)
Dunque adesso ho due nuovi dubbi:

1) Utilizzando il sistema che mi hai detto tu, fsurfer, leggo i dati dl file così come sono. Non mi è chiaro in che modo leggere i dati risultanti dall'esecuzione dell'SQL.
2) Non ho capito in che modo "vuotare" il Datasource, in modo da ricaricarlo con i nuovi dati in caso di aggiornamento o di ripetizione della lettura :-)

Scusa se approfitto, ma quando me ricapita? :-D
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: fsurfing - 03 Giugno 2008, 19:42:51
questi due aspetti ti confesso non li ho mai presi in esame purtroppo. :-(
però se ho tempo faccio delle prove
ciao ciao
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: fsurfing - 03 Giugno 2008, 21:26:53
dau file di guida sembra che datasource si connetta solo all' oggetto connection

percui per visualizzare i dati di un sql potresti creare un db temporaneo ( magari in sqlite3 per velocizzare) e collegare il datasorce a tale db

datasurce.refresch dovrebbe riuscire ad riaggiornare i dati
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 04 Giugno 2008, 08:39:04
Grazie, appena posso faccio qualche prova...

Apro una minuscola parentesi: non mi intendo di VB ma ieri mi è capitato tra le mani un libro che parla delle macro di Office, e ho visto che il VBA ha costrutti molto simili a quelli di Gambas (o viceversa, fate voi :-) )
Va a finire che imparando Gambas imparo anche VB :-D
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: g.paolo - 04 Giugno 2008, 08:55:32
@overhill
Negli ultimi anni ho sempre lavorato con VBA e confermo che le similitudini con Gambas sono notevoli.
L'unico aspetto che mi ha messo in difficoltà all'inizio con Gambas, è stato il concetto di variabili "globali", che in Gambas non esiste.
In VBA potevi dichiarare variabili pubbliche in un modulo iniziale e queste potevano essere chiamate senza riferimento al modulo stesso in qualsiasi punto del programma, mentre in Gambas serve sempre riferirsi ad una variabile esterna con il costrutto modulo.variabile.
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 04 Giugno 2008, 11:35:04
Ah, infatti mi stavo chiedendo come collegarsi a una variabile non dichiarata internamente, e mi sembrava che la dichiarazione "public" non fosse così "pubblica"... :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 06 Giugno 2008, 20:29:11
Bene, andando avanti con la gestione del mio progetto, ho finalmente capito (parola grossa) come aggiornare i dati del mio data base. Devo dire che è addirittura più versatile dell'RPG, ma anche in questo caso la logica è (molto vagamente) simile.
In ogni caso mi sono scontrato con un problema che sinceramente non capisco: nel video ci sono due spinbox per la gestione del campo Tariffa e Pagamento.
I valori riesco a scriverli correttamente nel file, ma poi non riesco a riportarli dentro le spinbox quando rileggo i dati.
Ho visto che la proprietà .text della spinbox è di sola lettura, e quindi lavoro su "value".
Nel file ho dei dati nulli, quindi ho fatto un piccolo controllo come questo:

 
Codice: [Seleziona]
SELECT CASE Val(hData!Tariffa)
        CASE NULL
         Tariffa.Value = Tariffa.MinValue
        CASE ELSE  
          Tariffa.Value = Val(hData!Tariffa)    
      END SELECT


A me pare giusto, ma pare che il controllo non funzioni mai, perché nella spinbox trovo sempre il valore minimo (25 euro, economico, no?)
Dove cavolo sto sbagliando? :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 06 Giugno 2008, 20:34:53
Già che ci siamo vi faccio un'altra domanda: nella form i campi hanno lo stesso nome dei campi del file, per semplicità.
Ho capito come leggere l'elenco dei campi con un campo di tipo ResultFIelds (o quello che è), ma mi sono scontrato con un problemino.
Il mio obiettivo era di fare un loop per mettere ogni campo in quello che si chiama allo stesso modo nel form, una cosa del tipo

Codice: [Seleziona]

FOR EACH campo IN rDati.Fields
  Campo.text = rDati!Campo
  NEXT


Ma quando lo eseguo mi dice, ovviamente, che il campo CAMPO non ha una proprietà TEXT... anzi, non esiste proprio!
QUindi il problema è la possibilità di usare un CAMPO il cui nome sia contenuto in un altro CAMPO... sempre che si possa fare, ovviamente :-)

Ovviamente viceversa per quando scrivo sul file...
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: g.paolo - 06 Giugno 2008, 22:14:17
Il comando
Codice: [Seleziona]
Campo.text = rDati!Campo  

non brilla di chiarezza direi.
Io preferisco di gran lunga assegnare i nomi delle textbox ad esempio, anteponendo sempre la natura dell'oggetto, così una textbox contenente il nominativo diverrà "tb_nominativo", così almeno non faccio confusione.

Ecco un esempio di assegnazione alle textbox sul form dei valori dei campi di un record:
Codice: [Seleziona]

WITH connessione
  .Name = Avvio.nomeDB
  .Type = "sqlite3"
  .Open
  .Begin
      criterio = "id=&1"
      parametro = avvio.posizione
      Risultato = .Edit("agenti", criterio, parametro) '
      Tb_Id.Text = risultato!id    
      tb_nick.text = risultato!nick
      Tb_nominativo.Text = risultato!nominativo
      Tb_cellulare.Text = risultato!cellulare
      Tb_passw.Text = risultato!passw
  .Commit
  END WITH
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: md9327 - 07 Giugno 2008, 02:44:10
Per fare il giochetto delle assegnazioni campo->controllo, puoi utilizzare un array di oggetti, che ti crei inizialmente all'apertura della forma (o la sua creazione... vedi metodo "_new()"), per coi riempirlo con i riferimenti ai controlli della form.

Se dai un'occhiata alla classe "Object" di gambas, e ai suoi metodi, ti accorgerai che puoi giocarci per capire cosa stai trattando al momento (quale oggetto, il tipo, il nome ecc.) e quindi, se implementato a dovere, riesci a tirarci fuori cose molto interessanti come, appunto, il giochetto che vuoi fare. :-P

Per quanto riguarda il mancato popolamento della spinbox, vedo che hai inserito un controllo su valori null. Sei sicuro che la lettura non restituisca proprio null?
E poi, un consiglio, se usi sqlite come database, ti faccio notare che per lui non esiste il concetto di null vero e proprio; al suo posto è fattibile che ti ritorni una stringa vuota, che puoi controllare anche con la funzione gambas "IsNull(var)". Inoltre, per continuare sul concetto sqlite, su cui ho scritto alcune note su questo sito e in altre discussioni, questo database non tratta le tipologie dei campi definite nella tabella come tali, ma gestisce tutto sempre e comunque come stringhe, per cui è possibile si verifichino errori se non opportunamente controllati dalla procedura (o programma...).
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 07 Giugno 2008, 11:05:30
Proverò a fare qualche giochetto con le array, anche se non ho capito tanto il discorso del "riferimento"... :-)

Non uso Sqlite, anche se mi state incuriosendo perché ne parlate tutti.
Preferisco mySql, ma solo perché il mio interesse è in qualcosa di portabile e mi pare che questo DB sia parecchio diffuso
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 07 Giugno 2008, 11:07:49
@darth: il codice che ho messo è solo un esempio. Anche io preferisco mettere un prefisso che mi faccia capire su cosa sto lavorando :-)
Interessante il codice che hai messo
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 08 Giugno 2008, 18:41:47
Uff... niente da fare, non riesco a impostare il valore della spinbox con il campo contenuto del database: continua a dirmi che il valore atteso è "integer"ma che riceve "null"
Ho provato a controllare il null, ma in questo caso si limita a eseguire sempre quel ramo del codice.
Provo a farvi vedere cosa ho scritto:

Codice: [Seleziona]

sql = "Select * from Clienti where Codice = " & Right(tvMenu.Current.Key, 6)
hData = db.Exec(sql)

    Codice.Text = hData!Codice
    RagioneSociale.Text = hData!RagioneSociale
    Indirizzo.Text = hData!Indirizzo
    Localita.Text = hData!Localita
    CAP.text = hData!CAP
    Provincia.text = hData!Provincia
    CodiceFiscale.text = hData!CodiceFiscale
    PartitaIva.text = hData!PartitaIva
    sb_Tariffa.Value = Val(hData!Tariffa)
    sb_Pagamento.Value = Val(hData!Pagamento)


Quello che non capisco è perché il secondo campo, che è anche una spinbox, non mi dà errore...
Nel database mysql, i due campi sono configurati come decimali e "not null", quindi quel "null" proprio non lo capisco...
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 09 Giugno 2008, 09:21:24
Ho provato cambiando il tipo di elemento da Spinbox a campo semplice, e (ovviamente) funziona benissimo...
Per adesso lo lascio così, prima o poi capirò...
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: md9327 - 09 Giugno 2008, 16:53:01
Tanto per dire... per caso il valore contiene decimali ?

La SpinBox non accetta decimali, solo valori interi. Inoltre controlla le proprietà di minimo e massimo.
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 09 Giugno 2008, 20:01:01
Uhm... il valore contiene decimali, ma sono sempre a zero... probabilmente è questo il motivo, però anche l'altro campo (Trasferta) contiene decimali, per cui mi sembra strano...
Comunque ho risolto usando il campo normale, e va benissimo :-)
Adesso ho altri problemi, ma poco per volta il pargolo sta venendo alla luce :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 12 Giugno 2008, 14:36:15
Allora, ho provato a seguire gli esempi che mi avete dato, ma evidentemente ho qualche lacuna di base. Penso sia meglio capire bene, altrimenti potrò solo continuare a fare le cose copiando e senza capire :-)

Dunque, vi spiego dove sono arrivato e cosa vorrei fare.
Sono riuscito a preparare il programma per la gestione dei Clienti e dei Progetti, legati tra di loro, con i vari frame che appaiono e scompaiono abbastanza senza problemi.
Adesso vorrei fare il passo successivo, e preparare un pannello concepito in questo modo:
nella parte superiore un elenco dei dati già presenti nel file "Interventi";
nella parte sottostante i vari campi dei file.
All'inizio vorrei vedere tutti i record del file sopra, e sotto i campi vuoti.
Se scrivo dei dati sotto, premendo "aggiungi" i dati (dopo il controllo) devono andare nel DB, e quindi questo deve essere aggiornato e ricaricato.
Se faccio doppio clic su una riga in alto, i dati devono essere portati sotto, pronti per la modifica.

Forse è un sistema poco "bello", ma è un metodo abbastanza standard su AS/400 e mi piacerebbe (per ora) utilizzare questo sistema.

Quello che veramente non riesco a comprendere è l'uso dei DataSource e degli altri oggetti relativi alla manipolazione dei dati (DataBrowser, GridView, e compagnia bella).

Grazie a tutti :-)
Titolo: Re: Utilizzo di DB: differenze con RPG
Inserito da: Mario - 12 Giugno 2008, 16:27:34
Uhm, dopo qualche simpatica bestemmia (tanto ormai il posto in paradiso me lo sono giocato...) sono venuto a capo di qualche cosa.
Innanzi tutto, la gerarchia datasource > databrowser si imposta con il "disegno" dell'interfaccia, e questo è abbastanza facile.
Una volta aperta la connessione con conn.open, è sufficiente indicare al datasource il nome della tabella (presente nel data base appena aperto) alla quale si desidera fare riferimento, con il comando
Codice: [Seleziona]

datasource.table = "Interventi"

A questo punto, indicando nel Databrowser le colonne da visualizzare (non ho capito come fare per vedere tutte le colonne, ma ci arrivo prima o poi), queste si vedono automagicamente :-)
Codice: [Seleziona]

databrowser.columns = ["DataIntervento", "Progetto", "TempoImpiegato"]


Bene, a questo punto funziona abbastanza bene e velocemente.
Ho anche cominciato a capire come funzionano i campi "datacontrol", e mi sembrano furbi e comodi.

Ma ho un altro problemino: il campo "progetto" vorrei inserirlo in una combobox, e ho visto che ne esiste un tipo proprio fatta per questo caso, che si chiama "datacombo".
Ma come faccio a metterci dentro l'elenco dei dati validi? Ho provato con la codifica normale, ma non funzia...
Un altro campo è di tipo checkbox (si/no, o booleano).
Come faccio a metterlo in un datacontrol?

Altra cosetta, piccola: se il file è vuoto, è normale che il programma vada in errore?

Quante domande, eh?
Però come vedete riesco anche ad arrangiarmi :-)