* * * *

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

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

Inserisci il nome utente, la password e la durata della sessione.

51 Visitatori, 1 Utente
 

Autore Topic: [RISOLTO]ZEOSLib, visualizzazione di TDateTime da DB MS Access  (Letto 4851 volte)

giacomarko

  • Full Member
  • ***
  • Post: 107
  • Karma: +6/-0
[RISOLTO]ZEOSLib, visualizzazione di TDateTime da DB MS Access
« il: 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
« Ultima modifica: Gennaio 30, 2023, 10:43:21 am da giacomarko »
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
« Risposta #1 il: 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?f=33&t=2818&p=13439
« Ultima modifica: Gennaio 24, 2023, 09:14:01 am da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

giacomarko

  • Full Member
  • ***
  • Post: 107
  • Karma: +6/-0
Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
« Risposta #2 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
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1398
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
« Risposta #3 il: 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

giacomarko

  • Full Member
  • ***
  • Post: 107
  • Karma: +6/-0
Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
« Risposta #4 il: 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
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

giacomarko

  • Full Member
  • ***
  • Post: 107
  • Karma: +6/-0
Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
« Risposta #5 il: 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
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

giacomarko

  • Full Member
  • ***
  • Post: 107
  • Karma: +6/-0
Re:ZEOSLib, visualizzazione di TDateTime da DB MS Access
« Risposta #6 il: 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.
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1398
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:[RISOLTO]ZEOSLib, visualizzazione di TDateTime da DB MS Access
« Risposta #7 il: 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
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

giacomarko

  • Full Member
  • ***
  • Post: 107
  • Karma: +6/-0
Re:[RISOLTO]ZEOSLib, visualizzazione di TDateTime da DB MS Access
« Risposta #8 il: 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.
« Ultima modifica: Gennaio 30, 2023, 07:48:42 pm da giacomarko »
SO: W11
Release Lazarus: 3.0 del 2023.12.17 win32/win64
Versione FPC: 3.2.2
DB: MySQL 5.0, MSAccess

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19173
  • Topic in totale: 2287
  • Online Today: 102
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 1
Guests: 51
Total: 52

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.