Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

TDD o Test-Driven Development
immagine docker per lavorare con lazarus e free pascal
Indice
Installare lazarus su mac osx sierra
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non)
Advanced Record Syntax: un esempio pratico
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
DB concetti fondamentali e DBGrid
Advanced Record Syntax
DB concetti fondamentali e ZeosLib
DB concetti fondamentali e connessioni standard
guida all'installazione di fpc trunk da subversion in linux gentoo
Creare un server multithread
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Free Pascal e Lazarus sul Raspberry Pi
fpcup: installazioni parallele di lazarus e fpc
Ubuntu - aggiornare free pascal e lazarus
Come interfacciare periferica twain
Lazarus 1.0
Aspetto retrò (Cmd Line)
Disporre le finestre in un blocco unico (come Delphi)
Zeos ... dietro le quinte (prima parte)
Lavorare con file in formato JSON con Lazarus
Overload di operatori
Dataset virtuale
Linux + Zeos + Firebird
Pascal Script
La gestione degli errori in Lazarus
Indy 10 - Invio email con allegati
Brute force
Le permutazioni
Da DataSource a Excel
StatusBar - aggirare l'errore variabile duplicata
Visualizzare un file Html esterno
Evidenziare voci TreeView
Toolbar
Direttiva $macro
Indy gestiore server FTP lato Client
TImage su Form e Panel
PopUpMenu sotto Pulsante (TSpeedButton)
Conversione numerica
Proprietà
Funzioni a parametri variabili
Overload di funzioni
Liste e puntatori
Conferma di chiusura di un applicazione
Il file: questo sconosciuto
UIB: Unified Interbase
System Tray con Lazarus
Intercettare tasti premuti
LazReport, PDF ed immagini
Lazarus e la crittografia
Ampliare Lazarus
Generare controlli RUN-TIME
TTreeview e Menu
TTreeView
Utilizzare Unità esterne
Lavorare con le directory
Realizzare programmi multilingua
Codice di attivazione
File INI
Esempio lista in pascal
Stabilire il sistema operativo
Recuperare codice HTML da pagina web
Trascinare un file nel programma
Mandare mail con Lazarus
Welcome to Italian community of Lazarus and Free Pascal. Please login or sign up.

Recenti

How To

Utenti
Stats
  • Messaggi totali: 20.582
  • Totale discussioni: 2.471
  • Online today: 310
  • Online ever: 5.949 (Luglio 30, 2026, 09:49:59 PM)
Utenti online
5 Visitatori, 1 Utente

[RISOLTO]ZEOSLib, visualizzazione di TDateTime da DB MS Access

Aperto da giacomarko, Gennaio 23, 2023, 09:25:00 PM

Discussione precedente - Discussione successiva

giacomarko

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
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

nomorelogic

#1
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?f=33&t=2818&p=13439
Imagination is more important than knowledge (A.Einstein)

giacomarko

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
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

DragoRosso

Citazione di: giacomarko il 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

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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

giacomarko

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
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

giacomarko

Citazione di: DragoRosso il Gennaio 24, 2023, 04:46:52 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
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

giacomarko

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.
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

DragoRosso

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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

giacomarko

#8
Si chiaro,

Access ha solo DateTime per tutto, mentre Zeos si aspetta un Date, un Time e un Timestamp.
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.