* * * *

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.
Aprile 16, 2024, 08:23:30 am

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

67 Visitatori, 1 Utente
 

Autore Topic: Campo database di tipo date con data vuota (blank)  (Letto 6324 volte)

PeppeC

  • Newbie
  • *
  • Post: 18
  • Karma: +0/-0
Campo database di tipo date con data vuota (blank)
« il: Dicembre 11, 2018, 10:24:25 pm »
Ciao a tutti, sono l'ultimo iscritto al gruppo e mio primo post...
Vorrei sapere come fare a mostrare correttamente un campo di tipo data (datetime) in un DBGRID, perchè quando il campo data non ha nessun valore, viene mostrata una fantomatica data 30/12/99 o 30/12/1899 a seconda della maschera impostata nella proprietà DisplayFormat.
Grazie.
« Ultima modifica: Dicembre 11, 2018, 10:36:04 pm da PeppeC »
Peppe Cintura

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Campo database di tipo date con data vuota (blank)
« Risposta #1 il: Dicembre 11, 2018, 11:56:27 pm »
credo che ti convenga usare l'evento OnGetText dei TDateField

tipo:

Codice: [Seleziona]
uses ... dateutils ...

if Sender.IsNull then
  aText:=DateTimeToStr(DateTimeToUnix(0));

in questo caso viene mostrata una data tipo 00/00/0000, ma se vuoi puoi passare una stringa vuota


Codice: [Seleziona]
if Sender.IsNull then
  aText:='';
Imagination is more important than knowledge (A.Einstein)

schumi

  • Full Member
  • ***
  • Post: 219
  • Karma: +1/-0
Re:Campo database di tipo date con data vuota (blank)
« Risposta #2 il: Dicembre 12, 2018, 08:58:52 am »
sono incappato nello stesso problema anch'io avendo esperienza su FoxPro.
io ho optato per non usare il null ma la data 01/01/1900 come data "vuota", poi nelle griglie imposti la regola per sbiancare la cella.
Lo faccio anche in FoxPro con database diversi dai dbf fox

PeppeC

  • Newbie
  • *
  • Post: 18
  • Karma: +0/-0
Re:Campo database di tipo date con data vuota (blank)
« Risposta #3 il: Dicembre 12, 2018, 06:48:39 pm »
vi ringrazio per le risposte, dalle quali ho capito solo qual'è l'idea di cosa fare, ma non ho ancora capito come e dove realizzare il tutto. Potreste essere più chiari?
Grazie.
Peppe Cintura

PeppeC

  • Newbie
  • *
  • Post: 18
  • Karma: +0/-0
Re:Campo database di tipo date con data vuota (blank)
« Risposta #4 il: Dicembre 13, 2018, 07:57:34 am »
aggiornamento...
ho trovato come impostare l'evento onGetText e combinando i due suggerimenti, sia di numerologic che di shumi, sbianco la data solo se uguale a 31/12/1899, mi viene comunque sbiancata tutta la colonna.
Ho verificato che quando la data non è vuota il valore non viene toccato.
Perchè? dove sbaglio?
Help me please.
Peppe Cintura

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Campo database di tipo date con data vuota (blank)
« Risposta #5 il: Dicembre 13, 2018, 08:27:59 am »
potresti postare il codice relativo a onGetText e quello dove sbianchi la colonna?
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Campo database di tipo date con data vuota (blank)
« Risposta #6 il: Dicembre 13, 2018, 09:26:46 am »
Cosa intendi per sbiancare?
Basta restituire una stringa vuota....
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

schumi

  • Full Member
  • ***
  • Post: 219
  • Karma: +1/-0
Re:Campo database di tipo date con data vuota (blank)
« Risposta #7 il: Dicembre 13, 2018, 09:56:03 am »
magari è una schifezza di sistema, però in una form con un bel griglione usavo PrepareCanvas per mettere grassetto o sfondo colorato in base al dato.
potresti colorare di bianco il carattere che diventerebbe "invisibile".

if condizione then begin
with (Sender As TDBGrid) do
  begin
    Canvas.Font.Color:=clRed; // qua metti lo stesso colore dello sfondo
  end; // with
end ; // IF 

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Campo database di tipo date con data vuota (blank)
« Risposta #8 il: Dicembre 13, 2018, 12:05:20 pm »
bisogna vedere cosa vale "condizione", devi filtrare anche per il contenuto del record
Imagination is more important than knowledge (A.Einstein)

PeppeC

  • Newbie
  • *
  • Post: 18
  • Karma: +0/-0
Re:Campo database di tipo date con data vuota (blank)
« Risposta #9 il: Dicembre 13, 2018, 12:55:04 pm »
ecco parte della procedura
...
procedure TFORM1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
    if column.FieldName = 'MiaData' and column.Field.Value='30/12/1899' then
            Column.Field.OnGetText:=@DBGrid1OnGetText;
   
end;
...
...
procedure TFORM1.DBGrid1OnGetText(Sender: TField; var aText: string;  DisplayText: Boolean);
begin
    aText:='';
end;

Ho provato a spostare tutto su Canvas al posto di DrawCell, ma stesso risultato.
Peppe Cintura

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Campo database di tipo date con data vuota (blank)
« Risposta #10 il: Dicembre 13, 2018, 01:00:56 pm »
na ... è un pelino sbagliata la logica :)
Mettiamo in fila i bit:Il OnGetText è "statico".Quindi:
Codice: [Seleziona]
      MiaDataField.OnGetText:=@DBGrid1OnGetText;
Lo devi piazzare nel dataset e non nel render della cella.
Poi dentro il gestore della trasformazione metti il controllo che più ti è comodo
Codice: [Seleziona]
procedure TFORM1.DBGrid1OnGetText(Sender: TField; var aText: string;  DisplayText: Boolean);
begin  Sender.isNull or Sender.FieldValue='30/12/1899' then     aText:='';  else   aText := ... formattazione della data come preferisci farla vedere ....
end;




Prova questo approccio:)
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

PeppeC

  • Newbie
  • *
  • Post: 18
  • Karma: +0/-0
Re:Campo database di tipo date con data vuota (blank)
« Risposta #11 il: Dicembre 13, 2018, 06:33:26 pm »
Ok grazie a tutti, risolto! che fatica però...
Evidenzio che al livello del DataSet la data vuota ha un valore '00:00:00' quindi è solo successivamente che viene attribuito il valore '31/12/1899'. Forse per somigliare a quanto fatto da Delphi? mah!
Che senso può avere mostrare sempre e comunque una data che senso non ha?
Comunque aver capito questo passaggio sarà utilissimo anche per altro che ho già in testa. Ancora grazie.
Devo fare qualcosa per segnalare che il caso è chiuso?
« Ultima modifica: Dicembre 13, 2018, 07:37:23 pm da PeppeC »
Peppe Cintura

PeppeC

  • Newbie
  • *
  • Post: 18
  • Karma: +0/-0
Re:Campo database di tipo date con data vuota (blank)
« Risposta #12 il: Dicembre 13, 2018, 09:19:22 pm »



na ... è un pelino sbagliata la logica :)
Mettiamo in fila i bit:Il OnGetText è "statico".Quindi:
Codice: [Seleziona]
      MiaDataField.OnGetText:=@DBGrid1OnGetText;
Lo devi piazzare nel dataset e non nel render della cella.
Poi dentro il gestore della trasformazione metti il controllo che più ti è comodo
Codice: [Seleziona]
procedure TFORM1.DBGrid1OnGetText(Sender: TField; var aText: string;  DisplayText: Boolean);
begin  Sender.isNull or Sender.FieldValue='30/12/1899' then     aText:='';  else   aText := ... formattazione della data come preferisci farla vedere ....
end;
segnalo a Stilgar che non ero lontano dalla 1^ idea che avevo postato e che fra l'altro non è strettamente necessario  agire al livello del DataSet, perchè anche in DrawColumnCell funziona lo stesso e senza cambiare una virgola.
Questo è quanto immesso al livello della DBGrid e sono convinto che esiste una soluzione più semplice:
Codice: [Seleziona]
procedure TFORM1.DBGRID1DRAWCOLUMNCELL(SENDER: TOBJECT; const RECT: TRECT;
  DATACOL: INTEGER; COLUMN: TCOLUMN; STATE: TGRIDDRAWSTATE);
begin
          if column.Field.DataType=ftDate then
           column.Field.OnGetText:=@NullDateToBlank;
END;
Peppe Cintura

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Campo database di tipo date con data vuota (blank)
« Risposta #13 il: Dicembre 13, 2018, 10:10:56 pm »
1) sono contento che tu abbia risolto.
2) andare in fase di render a cambiare per ogni riga visibile  della griglia ad ogni update grafico, non lo considero un modo efficiente di usare il tempo cpu. Poi son gusti. Esagui 10 istruzioni di troppo ad ogni ciclo di update. Ripeto son gusti 😉. Già al primo giro hai messo il gestore corretto. Tanto vale farlo una volta solo. Magari a design  time. Quindi nel load dei metadati della form lo applichi e non ci pensi più 😊
3) in informatica esistono almeno 3 soluzioni allo stesso problema. Si seglie a seconda di vari parametri. Uno su tutti:che funzioni 😉
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Campo database di tipo date con data vuota (blank)
« Risposta #14 il: Dicembre 14, 2018, 12:28:22 am »
scusate l'ingresso a gamba tesa :)

un TField è la sorgente del dato, il dato stesso
un TDataSource è il distributore dei dati forniti dal TField
una DbGrid il destinatario del dato che gli viene distribuito dal TDataSource

spesso per ogni tabella (e quindi per ogni campo della tabella) si prevede un solo form con all'interno dei data-control e quindi formattare direttamente dentro alla TDbGrid è anche una soluzione equivalente alle altre.

Mal il DataSource ci ricorda che un campo può essere distribuito a molti db-controls: se mettiamo nella stessa form dove c'è la griglia con il campo data anche un TDbEdit ed un TDbLabel collegati allo stesso campo data allora si vede subito che c'è un problema. Il problema è che la griglia modifica la visualizzazione del DbEdit e della DbLabel oppure
solamente la griglia mostrerà la data "sbiancata", il DbEdit e la DbLabel mostreranno il valore "sporco".

Questo per dire che un DbControl forse non dovrebbe assegnare un puntatore all'evento di un TField in base ad una sua condizione in quanto modificherebbe la visualizzazione di altri DbControl.
In questo caso è ok: c'è solo un DbGrid e la cosa gira e la soluzione è decisamente valida.

Però tenere a mente questo schema penso sia comunque importante in quanto i programmi spesso evolvono ;)




« Ultima modifica: Dicembre 14, 2018, 12:30:26 am da nomorelogic »
Imagination is more important than knowledge (A.Einstein)

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18769
  • Topic in totale: 2232
  • Online Today: 80
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 1
Guests: 67
Total: 68

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.