Programma di esempio DYNASET.PRT |
; DYNASET
;
; Programma per Proteus
;
; (C) 2003 Simone Zanella Productions
;
; Questo programma mostra un esempio di recordset di tipo Dynaset, ottenuto attraverso una query
; su Sql Server. Il codice estrae tutti i clienti (CFANAGRA) i cui documenti di vendita (DOC) hanno
; nelle righe (DOCRIGHE) un particolare articolo; i nomi dei clienti corrispondenti sono
; salvati in un file di testo, dove ogni campo č separato dall'altro dal carattere "|" (pipe).
#!proteus -z -j
!include "daodefs.prt"
; Alloca il database e apre il DSN "AZIENDA"
DBHandle = DAODBNEW()
Res = DAODBOPEN(DBHandle, "AZIENDA", 0, 0, "DSN=AZIENDA;")
IF EQ(Res, -1)
; Errore
StampaErrori(DBHANDLE)
ABORT 1
FI
; Alloca due recordset
RSHandle = DAORSNEW(DBHandle)
RSH2 = DAORSNEW(DBHandle)
; Cerca le vendite degli articoli: 5-129002-00, 5-111105-90, 5-112105-90
Query = "SELECT * FROM CFANAGRA INNER JOIN (DOC INNER JOIN DOCRIGHE ON " \
"DOCRIGHE.IDDOC = DOC.IDDOC) ON DOC.CLIFOR = CFANAGRA.CLIFOR WHERE DOC.TIPODOC = 'FATTURA' AND CFANAGRA.TIPOCLIFOR = 'CLIENTE' " \
"AND (ARTICOLO = '5-129002-00' OR ARTICOLO = '5-111105-90' OR ARTICOLO = '5-112105-90') " \
"ORDER BY CFANAGRA.CLIFOR DESC, DOC.DTADOC DESC"
; Apre il file con i risultati, azzerando e sovrascrivendo eventuali file omonimi esistenti
H = FOPEN("CLIENTI.TXT", 28)
; Apre la query sul primo recordset (tipo Dynaset)
Res = DAORSOPEN(RSHandle, DAOCOpenDynaset, Query, 0)
IF EQ(Res, -1)
; Errore
StampaErrori(DBHANDLE)
ABORT 1
FI
N = 0
; Se abbiamo almeno un record..
IF NOT(AND(DAORSATTRIB(RSHandle, DAORSATTISBOF), DAORSATTRIB(RSHandle, DAORSATTISEOF)))
; Scorre tutto il recordset
DAORSMOVEFIRST(RSHandle)
WHILE NOT(DAORSEOF(RSHandle))
; Cerca nell'anagrafica articoli il corrispondente articolo trovato
Res = DAORSOPEN(RSH2, DAOCOpenDynaset, \
"SELECT * FROM ARTICOLI WHERE ARTICOLO = '" DAORSGETFIELDVAL(RSHandle, "ARTICOLO") "'", 0)
; Trascrive: ragione sociale, indirizzo, cap, cittā, provincia, stato,
; data vendita, articolo e descrizione articolo
FWRITELN(H, \
STRTRAN(STRTRAN(DAORSGETFIELDVAL(RSHandle, "RAGSOC") " |" \
DAORSGETFIELDVAL(RSHandle, "INDIRIZZO") " |" \
DAORSGETFIELDVAL(RSHandle, "CAP") " |" \
DAORSGETFIELDVAL(RSHandle, "CITTA") " |" \
DAORSGETFIELDVAL(RSHandle, "PROVINCIA") " |" \
DAORSGETFIELDVAL(RSHandle, "STATO") " |" \
TOKEN(DAORSGETFIELDVAL(RSHandle, "DOCRIGHE.DtaDoc"), 1, " ") " |" \
DAORSGETFIELDVAL(RSHandle, "ARTICOLO") " |" \
DAORSGETFIELDVAL(RSH2, "DESCRI"), CHR(13), " "), CHR(10), " ") )
DAORSCLOSE(RSH2)
DAORSMOVENEXT(RSHandle)
INC(@N)
LOOP
FI
; Stampa il numero di record trovati
CONSOLELN "Trovate: " N " registrazioni"
; Chiude il recordset principale ed il file dei risultati
DAORSCLOSE(RSHandle)
FCLOSE(H)
; Libera i recordset; libera e chiude il database
DAORSFREE(RSHandle)
DAORSFREE(RSH2)
DAODBCLOSE(DBHandle)
DAODBFREE(DBHandle)
ABORT 0
FUNCTION StampaErrori(dbhandle)
; Stampa tutti gli errori DAO avvenuti in seguito all'ultima operazione
numerr = DAOERRCOUNT(dbhandle)
FOR x = 1 TO numerr
CONSOLELN "Errore " x ":"
CONSOLELN " Codice : " DAOGETERRORNUM(dbhandle, x)
CONSOLELN " Descrizione: " DAOGETERRORDESC(dbhandle, x)
CONSOLELN " Sorgente : " DAOGETERRORSRC(dbhandle, x)
CONSOLELN ""
NEXT
RETURN