Autore Topic: Utilizzo di DB: differenze con RPG  (Letto 7512 volte)

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Utilizzo di DB: differenze con RPG
« il: 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 :-)
Saluti a tutti

Mario

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Utilizzo di DB: differenze con RPG
« Risposta #1 il: 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

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Utilizzo di DB: differenze con RPG
« Risposta #2 il: 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 :-)
Saluti a tutti

Mario

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Utilizzo di DB: differenze con RPG
« Risposta #3 il: 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
Saluti a tutti

Mario

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Utilizzo di DB: differenze con RPG
« Risposta #4 il: 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?

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Utilizzo di DB: differenze con RPG
« Risposta #5 il: 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
Saluti a tutti

Mario

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Utilizzo di DB: differenze con RPG
« Risposta #6 il: 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? :-)
Saluti a tutti

Mario

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Utilizzo di DB: differenze con RPG
« Risposta #7 il: 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!
Saluti a tutti

Mario

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Utilizzo di DB: differenze con RPG
« Risposta #8 il: 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

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Utilizzo di DB: differenze con RPG
« Risposta #9 il: 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 :)
Saluti a tutti

Mario

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Utilizzo di DB: differenze con RPG
« Risposta #10 il: 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...).

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Utilizzo di DB: differenze con RPG
« Risposta #11 il: 31 Maggio 2008, 20:25:08 »
Interessante il secondo metodo, che mi pare sia "esteticamente" più in linea con il resto del codice :-)
Saluti a tutti

Mario

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Utilizzo di DB: differenze con RPG
« Risposta #12 il: 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

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Utilizzo di DB: differenze con RPG
« Risposta #13 il: 01 Giugno 2008, 09:52:28 »
Una cosa tipo "for each", giusto? :-)
Saluti a tutti

Mario

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: Utilizzo di DB: differenze con RPG
« Risposta #14 il: 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...
Saluti a tutti

Mario