Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: giacomarko - Gennaio 23, 2023, 09:25:00 pm

Titolo: [RISOLTO]ZEOSLib, visualizzazione di TDateTime da DB MS Access
Inserito da: giacomarko - Gennaio 23, 2023, 09:25:00 pm
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

Codice: [Seleziona]
   // 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
Titolo: Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
Inserito da: nomorelogic - Gennaio 24, 2023, 09:10:52 am
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:
Codice: [Seleziona]
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)
Titolo: Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
Inserito da: giacomarko - Gennaio 24, 2023, 01:23:09 pm
Può essere un problema di Zeos, e certo MS Access non aiuta in quanto l'unico tipo di dato relativo al tempo è TDateTime, che poi si differenzia in visualizzazione nelle varie forme, da un certo punto di vista l'anomalia la si vede anche con il controllo SQLDB.

Quello però che mi fà specie di Zeos (e anche un pò incaz...re), è che d'accordo non "capisce" il tipo di dato corretto, ma il fatto che neanche DisplayFormat sortisce effetto, mentre su SQLDB funziona e di fatto visualizza il dato seguendo la maschera che gli si passa come formato,

Perchè Zeos non fà una piega ?
il metodo DisplayFormat viene eseguito sul DBGrid direttamente ...  ???

posso creare una tabella con tutti i tipi di dati, su diversi DB, e poi vediamo cosa succede, anche se non penso aiuti in qualche modo a capire ne il perchè, e ne a come aggirare il problema.

M
Titolo: Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
Inserito da: DragoRosso - Gennaio 24, 2023, 04:46:52 pm
Può essere un problema di Zeos, e certo MS Access non aiuta in quanto l'unico tipo di dato relativo al tempo è TDateTime, che poi si differenzia in visualizzazione nelle varie forme, da un certo punto di vista l'anomalia la si vede anche con il controllo SQLDB.

Quello però che mi fà specie di Zeos (e anche un pò incaz...re), è che d'accordo non "capisce" il tipo di dato corretto, ma il fatto che neanche DisplayFormat sortisce effetto, mentre su SQLDB funziona e di fatto visualizza il dato seguendo la maschera che gli si passa come formato,

Perchè Zeos non fà una piega ?
il metodo DisplayFormat viene eseguito sul DBGrid direttamente ...  ???

posso creare una tabella con tutti i tipi di dati, su diversi DB, e poi vediamo cosa succede, anche se non penso aiuti in qualche modo a capire ne il perchè, e ne a come aggirare il problema.

M

Il problema potrebbe essere la specializzazione di Zeos, in poche parole in database di Access (ODBC o ADO) è stato modificato come accesso da diversi anni, tanto è vero che il supporto ODBC installato nel SO è stato interrotto anni fà (occorre installare un pacchetto gratuito fornito sempre da Microsoft per consentire l'accesso ad Access da programmi esterni a quelli di Microsoft stessa). Se ne è parlato in un altro post sempre in questo forum.

D'altronde Access non è proprio un database largamente usato negli ultimi 10 anni .....

Ciao
Titolo: Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
Inserito da: giacomarko - Gennaio 24, 2023, 08:26:37 pm
Ok ci sta,

Access avrà i suoi difetti... secondo me anche uno o due pregi... non di più però... :)

ma questo può spiegare il motivo della "incerta" interpretazione dei dati letti da Zeos,
ma non spiega perché il metodo DisplayFormat che agisce su DBGrid, non sortisce nessun effetto, almeno io non capisco

m
Titolo: Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
Inserito da: giacomarko - Gennaio 25, 2023, 01:10:41 pm
.... Access (ODBC o ADO) è stato modificato come accesso da diversi anni, tanto è vero che il supporto ODBC installato nel SO è stato interrotto anni fà (occorre installare un pacchetto gratuito fornito sempre da Microsoft per consentire l'accesso ad Access da programmi esterni a quelli di Microsoft stessa). Se ne è parlato in un altro post sempre in questo forum.

D'altronde Access non è proprio un database largamente usato negli ultimi 10 anni .....

Ciao

Infatti, ora sto usando il provider Microsoft.ACE.OLEDB.12.0 e pare funzioni tutto, a parte questo strano comportamento della DBGrid sul typeTDateTime
Titolo: Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
Inserito da: giacomarko - Gennaio 30, 2023, 10:42:23 am
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:
Codice: [Seleziona]
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
Codice: [Seleziona]
...
    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.
Titolo: Re:[RISOLTO]ZEOSLib, visualizzazione di TDateTime da DB MS Access
Inserito da: DragoRosso - Gennaio 30, 2023, 12:34:41 pm
Questo che hai descritto è legato alla specializzazione di ZEOS: in ACCESS non esiste un campo "misto", esiste o il DATE o il TIME (almeno come ultima documentazione Microsoft).

In entrambi i casi il dato effettivo come osservavi tu è effettivamente sempre un TDateTime (ossia un double).
Ma ZEOS si rifà alla orginale interpretazione ossia i due dati specifici DATE e TIME.

Quello che manca è la personalizzazione della visualizzazione in ZEOS (e questo è un bug di ZEOS), cosa che invece è documentata in ACCESS e può essere applicata ad entrambi i dati (cioè posso visualizzare un campo DATE anche con i dati orari).

Facendo la modifica hai risolto il bug di ZOES, puoi anche inviarlo al forum dedicato a ZEOS come "correzione" di bug.

Ciao
Titolo: Re:[RISOLTO]ZEOSLib, visualizzazione di TDateTime da DB MS Access
Inserito da: giacomarko - Gennaio 30, 2023, 07:45:42 pm
Si chiaro,

Access ha solo DateTime per tutto, mentre Zeos si aspetta un Date, un Time e un Timestamp.