Buona sera,
sto incontrando difficoltà nel formattare correttamente l'output dati su una normalissima DBGrid, (DisplayFormat) in pratica il mio test è il seguente:
il test è composto da una form con due DBGrid che si collegano ad un DB MS Access, il classico demo "Northwind.mdb",
-> la prima DBGrid si collega utilizzando TZConnection (Zeoslib) via ADO e legge i dati con TZQuery
-> la seconda si collega utilizzando TODBCConnection (SQLDB) e legge i dati con TSQLQuery
chiaramente entrambe interrogano con una query select identica, e sulla stessa tabella. :) a questo punto eseguo e noto che:
-> la prima DBGrid collegata via Zeos, non mostra la formatazione € per i tipo dati valuta e che i due DateTime mostrano solo la data e non data e ora
-> la seconda via (SQLDB) mostra correttamente sia il campo valuta che il DateTime completo.
(pic DBGrid_as_is.jpg)
a questo punto in modo brutale, applico il formato da visualizzare su entrambe le griglie, con il formato valuta solo su quella Zeos
// Zeoslib
DBGrid.Columns[2].DisplayFormat:='###,###.00 €';
DBGrid.Columns[3].DisplayFormat:='dd/mm/yyyy';
DBGrid.Columns[3].Alignment:=taRightJustify;
DBGrid.Columns[4].DisplayFormat:='hh:m:ss';
DBGrid.Columns[4].Alignment:=taRightJustify;
// TODBCConnection
DBGrid1.Columns[3].DisplayFormat:='dd/mm/yyyy';
DBGrid1.Columns[3].Alignment:=taRightJustify;
DBGrid1.Columns[4].DisplayFormat:='hh:mm:ss';
DBGrid1.Columns[4].Alignment:=taRightJustify;
risultato :
-> sulla prima nulla è cambiato nel campo valuta, il campo data è ok e il campo time segna 0
-> sulla seconda tutto a posto
(pic DBGrid_DisplayFormat.jpg)
ora, uno potrebbe anche dire "be, usiamo TODBCConnection e morta lì...", ma a parte il non capire perchè... non mi dispiacerebbe utilizzare Zeos, se non altro perchè le connessioni disponibili sono tante e belle che pronte.
Qualcuno di voi è incappato in questa scocciatura ?
Marco
ciao
Non ho esperienze con Access, ma ho notato che zeoslib ha alcune piccole differenze a seconda del db a cui ci si connette.
Ad esempio con postgres, se in una select si usa un alias per un campo
esempio:
select campo1 as CampoA from ...
e con Zeoslib si richiedono i metadati di quella query, il nome della colonna è nullo (ma per fortuna si riesce a recuperare da un'altra parte).
Mi viene da pensare se il problema di zeoslib sia con access.
Sarebbe da provare con un DBMS diverso (in cui effettuare la stessa query) per vedere se si hanno gli stessi risultati.
nomorelogic
Edit:
ho trovato questo thread di cui riporto 2 link, forse ti può essere utile
https://zeoslib.sourceforge.io/viewtopic.php?t=23289 (https://zeoslib.sourceforge.io/viewtopic.php?t=23289)
https://zeoslib.sourceforge.io/viewtopic.php?f=33&t=2818&p=13439 (https://zeoslib.sourceforge.io/viewtopic.php?f=33&t=2818&p=13439)
Alla fine sono riuscito a risolvere, anche grazie a quanto trovato in vari forum dedicati a Zeos, posto la soluzione giusto per non lasciare il thread aperto.
Il problema di visualizzazione è dovuto in parte a come MS Access definisce il tipo Data e a come Zeos lo interpreta nel protocollo ADO,
in breve :
in MS Access il dato "Data" e "Time" sono definiti sempre come TDateTime, la visualizzazione poi cambia in funzione del formato applicato.
in Zeos il dato "Data" è di tipo DATA e "Time" è TIME, di conseguenza la lettura del dato è mancante della parte decimale, per questo vengono poi rappresentati nel DBGrid come Data solamente e come Time "00:00:00"
Per risolvere è necessario modificare il file ZDBCADOUtils nella cartella di Zeos, sostituendo il tipo stDate con stDateTime, in questo modo:
function ConvertAdoToSqlType(FieldType: SmallInt): TZSQLType;
begin
case FieldType of
...
adDate : Result := stTimestamp; // stDate; <--- DOESN'T WORK AS EXPECTED
...
Fatto questo e dopo aver ricompilato il componente, il DBGrid mostrerà correttamente il DateTime, a questo punto, sarà possibile chiamare per la/e colonna/e interessata il metodo DisplayFormat
...
DBGrid.Columns[2].DisplayFormat := 'dd/mm/yyyy';
DBGrid.Columns[2].Alignment := taRightJustify;
DBGrid.Columns[3].DisplayFormat := 'hh:m:ss';
DBGrid.Columns[3].Alignment := taRightJustify;
...
per ottenere la visualizzazione corretta.