Newsgroup: it.comp.lang.vo-clipper
Titolo: Finalmente MySql

Ciao a tutti.
Naturalmente finalmente per me.
Bene. Ho scaricato il file relativo al programma di Enio su DEV. L'ho fatto
funzionare. Con SqlManager ho importato tutti i file di un mio programma,
creando 15 tabelle. Ho convertito un mio programma per aprire i file sql.
Per fortuna avevo una funzione che mi apriva il file passondogli una
sctringa contenente il nome del file, ed in questa funzione ho cambiato il
modo di apertura.
Premesso tutto questo non ho ancora potuto lanciare il programma per vedere
tutte le modifiche da fare perchè dovrò modificare/cancellare tutte le
chiamate a oTab:SetOrder(nOrdine) in quanto mi da errore.
Domande:
1) Esistono file indici in tabelle sql o bisogna solo utilizzare  by order
nome per ordinarla per nome? Se si come si creano?
2) oTab := SqlSelect{"select * from Fatture order by
numfattura",SysObject():oRemoteDS}. Se voglio cambiare l'ordine, per esempio
sul nome del destinatario della fattura, come fare?
3) La oTab:seek(numFat)  posso continuare ad usarla?
4) Quali file distribuire ai clienti finali? (Sia di VO che MySql)
5) E' distribuibile gratuitamente o bisogna acquistare delle licenze per
installare i file di MySql?
6) So che Danilo ha creato una libreria per interfacciare direttamente gli
archivi senza passare attraverso ODBC, Come acquistarla?
Per ora mi fermo in quanto ho fatto un tema. Ma ho bisogno di aiuto per
andare avanti in questo campo. Finora ho fatto tutto con file Dbf e non mi
posso lamentare anche con file di circa 800.000 record.
Grazie a tutti coloro che avranno la pazienza di leggermi e darmi qualche
delucidazione.
Ciao.

 ha scritto nel messaggio
news:2dMic.141116$rM4.5...@news4.tin.it...



Ciao Danilo.
Ho già scaricato tutto e sono già al lavoro. Ho parecchie difficoltà e
principalmente nelle Seek.
Quando in un ciclo di elaborazione tabella (già risultato di una query), si
chiama una funzione passandogli come parametro un codice da ricercare su
un'altra tabella, prendere dei dati da questa tabella, elaborarli e
ritornare un array di valori. Usando la SQLTable:seek(#Codice,Var),
l'elaborazione diventa lentissima.
Allego un pezzo di codice della funzione.
FUNCTION Ri_Ana(_x AS STRING ,_mpr AS STRING,_tic AS STRING) AS LOGIC
LOCAL _fl AS LOGIC
SysObject():oTab_Ana:OrderBy("Cod_Ana")
SysObject():oTab_Ana:seek(#Cod_Ana,_x)
SysObject():aMatStringa := {Space(28),0.0,0.0,0.0,' ',0.0}
IF ! SysObject():oTab_Ana:EoF
  SysObject():aMatStringa[5]:=SysObject():oTab_Ana:ormone
  IF SysObject():oTab_Ana:cos_usl > 0 .and. _mpr = 'M'
    SysObject():aMatStringa[1]:=SysObject():oTab_Ana:des_ana
    SysObject():aMatStringa[2]:=SysObject():oTab_Ana:cos_usl
...
...
...
    endif
endif
return _Fl
Premetto che utilizzo VO 2.6, MySql 4.0.18, un PC con processore intel P4 a
2600 Mhz e 512 Mega di ram.
Come fare? non riesco ad andare avanti.
I vari oTab:SetOrder li ho trasformati in oTab:OrderBy("Codice") in unione
oTab:Where ecc. ecc. Dove sbaglio?


Purtroppo le classi per SQL di VO sono fatte a pene di segugio, questo è il
motivo che ci ha spinto a sviluppare DevoXmysql. Scarica SQLManager e vedi
la differenza di risposta.
Puoi anche scricare la versione demo con limite a 10 record per tabella.
Danilo Giuliani

Beh... in effetti con le librerie di Danilo è tutta un 'altra cosa, però a
suo tempo mi cimentai a realizzare una piccola applicazione usando le classi
SQL di VO... non male direi, a parte la relativa lentezza dovuta al "collo
di bottiglia" di ODBC.  E' simpatico e stimolante poter realizzare
applicazioni che prendono i dati da tabelle di Database ACCESS(so) e tabelle
di ORACLE, creano report con REport pro e fanno elaborazioni memorizzando i
risultati in tabelle MySQL che vengono visualizzate in pagine Web scritte in
VO utilizzando le librerie (molto belle !) TAG IT in corredo a VO 2.6 (e
2.7)
Ciao a tutti
Enio

 ha scritto nel messaggio
news:4Mwkc.173457$rM4.7...@news4.tin.it...

Ciao Enio.
Lavoro co VO2.6.
Ho modificato un programma di gestione laboratorio analisi in MySQL con ODBC
e classi VO. Va tutto relativamente bene ma mi lascia perplesso un fatto.
dopo avere aperto una tabella, applicato la where per esempio sul mese di
gennaio circa 1346 records su 28000 circa risultante, effettuo un ciclo che
per ogni record, mi calcola il costo per analisi.
In Vo2.6 e file dbf, 2 secondi in MySQL 60 secondi. Sicuramente non va bene.
Forse sbaglio qualcosa. il programma è il seguente:
DataInizio  := aDati[1]
DataFine := aDati[2]
SELF:MatStampa := {}
SysObject():oTab_Ana:OrderBy("Cod_Ana")
SELF:oAna01:OrderBy("Year(Data)","Month(Data)","Usl","Ticket")
SELF:oAna01:Where("Data>='"+MyDtoS(DataInizio)+"' and
Data<='"+MyDtoS(DataFine)+"'")
SELF:oAna01:Execute()
AltD()
WHILE ! SELF:oAna01:EOF //.and. Year(SELF:oAna01:Data)=Year(DataInizio)
.and. Month(SELF:oAna01:Data)=Month(DataInizio)
 _usl:=SELF:oAna01:usl
 _ticket:=SELF:oAna01:ticket
 WHILE ! SELF:oAna01:EOF //.and. Year(SELF:oAna01:Data)=Year(DataInizio)
.and. Month(SELF:oAna01:Data)=Month(DataInizio)
  IF Val(DToS(SELF:oAna01:data)) >= Val(DToS(DataInizio)) .and.;
       Val(DToS(SELF:oAna01:data)) <= Val(DToS(DataFine)) .and.;
      Month(SELF:oAna01:data)=Month(DataInizio)
   IF SELF:oAna01:t_mpr=='M'
    tot_usl := 0.0
    tot_tic := 0.0
    tot_orm := 0.0
    Imp_Pri := 0.0
    prelievi:=SELF:oAna01:n_pre
    FOR zz := 1 UPTO 24
     _var := SELF:oAna01:FIELDGET('C'+StrZero(zz,2))
     IF Empty(_var)
      EXIT
     ELSE
      SysObject():aMatStringa :=
Ri_Ana(_var,SELF:oAna01:t_mpr,SELF:oAna01:ticket)
      IF SysObject():aMatStringa[7]
       tot_usl += SysObject():aMatStringa[2]
       tot_tic += SysObject():aMatStringa[3]
       tot_orm += SysObject():aMatStringa[4]
       Imp_Pri += SysObject():aMatStringa[6]
       AAdd(aMat,{SysObject():aMatStringa[1],' '})
      ENDIF
     ENDIF
    NEXT
 ......
......
FUNCTION Ri_Ana(_x AS STRING ,_mpr AS STRING,_tic AS STRING) AS ARRAY
LOCAL aMat AS ARRAY
SysObject():oTab_Ana:seek(#Cod_Ana,_x)
aMat := {Space(28),0.0,0.0,0.0,' ',0.0,FALSE}
IF ! SysObject():oTab_Ana:EoF
  aMat[5]:=SysObject():oTab_Ana:ormone
  IF SysObject():oTab_Ana:cos_usl > 0 .and. _mpr = 'M'
    aMat[1]:=SysObject():oTab_Ana:des_ana
    aMat[2]:=SysObject():oTab_Ana:cos_usl
    aMat[7] := TRUE //_fl:=TRUE
    IF _mpr=='M' .and. _tic=='N' .and. SysObject():oTab_Ana:cos_usl!=0
      IF SysObject():oTab_Ana:ormone=='S'
        aMat[4]:=SysObject():oTab_Ana:cos_usl
       ELSE
        aMat[3]:=SysObject():oTab_Ana:cos_usl
      END
    END
  ELSEIF (_mpr=='M' .and. _tic=='N' .and. SysObject():oTab_Ana:cos_usl = 0)
.or. _Mpr == 'P'
     aMat[6]:=SysObject():oTab_Ana:Cos_Pri
    aMat[7] := TRUE //_fl:=TRUE
  END
END
RETURN aMat
Probabilmente sbaglio qualcosa, Ma dove?
Grazie.

 ha scritto nel messaggio
news:CfLkc.128215$hc5.5...@news3.tin.it...



Scusa Danilo. Forse non capisco.
Io devo scorrre tutti i record della tabella risultante dove devo leggere il
codice analisi, il tipo di prestazione (Mutuato/Privato) ed il tipo di
esenzione, aprire la tabella Analisi e prendermi il costo dell'analisi in
funzione dei parametri passati.
Io non vedo altra soluzione che scorrere la tabella. Se vi è un'altra sarò
ben felice di apprenderla.
Ciao.

 ben felice di apprenderla.
Devi fare una join tra la tabella delle Prestazioni e quella delle
Analisi. Qualcosa tipo
SELECT * FROM Prestazioni, Analisi WHERE Prestazioni.CodAna =
Analisi.Codice AND Prestazioni.Tipo = Analisi.TipoPres AND
Prestazioni.Esezione = Analisi.Esenzione
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

La tabella prestazioni contiene 24 campi Cod_Ana, chiamati C01, C02 ..C24 di
tipo carattere (C01 "C" 3) dove posso inserire il codice di 24 analisi per
record.


Uhm... temo che tu (o chi per te) abbia sbagliato il progetto del
database. Le 24 analisi dovevano essere 24 records non 24 campi.
Comunque, vediamo un po'... potresti utilizzare delle subselect (sempre
che MySQL le supporti, mi sembra che fino ad un po' di tempo fa non le
supportasse ma forse ora la cosa è cambiata) ma temo che con 24
subselect la query diventi mostruosamente grossa e lenta. Potresti fare,
invece, 24 select diverse parametrizzate in un loop che fa variare il
numero del campo, ottenendo quindi i 24 prezzi in 24 join (in 24
iterazioni del loop). Scusami, non ti sto aiutando come vorrei ma forse
non mi è chiara la struttura del database.


 database. Le 24 analisi dovevano essere 24 records non 24 campi.
Il programma gira da circa 15 anni, prima in dos, col Clipper 5.2e e file
NTX  e poi, nel 1998 è migrato sotto windows con V.O. 2.0 e file Cdx molto
più flessibili e veloci.
Capirai che ho dovuto fare i conti con memoria, capacità di disco e velocità
di esecuzione che diventava sempre minore all'aumentare dei records. Questo
file, in un anno di lavoro diventa 13.537 records con un'occupazione su
disco di 4, 9 MBytes. Lo stesso, non considerando i 24 campi dell'originale
C01,T01,P01.... C24,T24,P24 ma trasportando solo i campi pieni, il file così
ottenuto è di 84.033 records ed un'occupazione di 11,7 MBytes. Tenendo conto
che poi vi è un altro archivio con i valori degli esami di circa 300.000
records all'anno per un'occupazione di 22 Mega circa, capirai come, in
termini di velocità di accesso ed occupazione di risorse questa mi è
sembrata la migliore soluzione. E tuttora il programma, ricompilato con VO
2.6 e ReportPro 2.11 gira che è una meraviglia da macchine con ancora W95 a
macchine con W2000 ed XP, senza mai darmi problemi.
Comunque resta sempre il fatto che lavorando con DBF due secondi con MySql
60 secondi.
Altra cosa: è vero che con la select puoi fare miracoli nella
visualizzazione finale della tabella, ma spesso la tabella risultatnte deve
essere elaborata  e fare dei calcoli in funzione di un valore presente in un
determinato campo e poi , secondo me, il ciclo While dovrebbe essere più
veloce in quanto non devo verificare con IF o altre condizioni in quanto la
tabella risultante è già filtrata e quindi basta un While ! oTab:Eof;
Elaborazione del record; oTab:Skip(); Enddo. Mi sembra che, almeno per me
MySql può aspettare. Avevo previsto di andare al prossimo convegno di
Danilo, ma .... comunque è possibile che sbaglio io non avendo ancora capito
il meccanismo delle Query. Io continuo a sbatterci la testa.
EMG, Ti ringrazio di quello che hai detto, tanto più che sei quasi l'unico a
cercare di darmi delle risposte malgrado tu, come me, preferisci i mitici,
veloci e gratuiti file Dbf che ne puoi fare quasi quello che vuoi anche in
rete (locale).

 rete (locale).
Di niente. Solo vorrei precisare che non è che io preferisca i DBF. Ogni
situazione ha il suo strumento corretto. Ad esempio, sarei un pazzo se
usassi un sistema file sharing su Internet. Ma bisogna anche accettare
il fatto di dover strutturare le proprie applicazioni in modo diverso.
Magari un domani, se la velocità di connessione ad Internet diventerà
come quella di accesso ad un hard disk allora si potrà applicare
nuovamente il file sharing anche in quell'ambiente (se prima MS e
compagnia non ci avrà privato del diritto di essere programmatori...).
