Italian community of Lazarus and Free Pascal
Programmazione => Databases => Topic aperto da: Diego1981 - Gennaio 04, 2014, 10:03:46 am
-
Ciao ragazzi e buon anno a tutti
ho una dbedit in cui inserire una data (editmask settato in questo modo: !99/99/9999;1;_) e ovviamente collegata ad un datasource.
Quando la dbedit perde il focus ho creato una procedura per verificare il corretto inserimento della data, più precisamente nell'evento OnExit ma prima che l'evento intervenga mi viene restituito l'errore 'EconvertError' con messaggio: 'invalid date' da parte del db(Mysql). Leggendo qua e la su internet suggeriscono di provare di intervenire sull'evento OnUpdateRecord della ZTable ma quando attivo la procedura e compilo mi restituisce questo errore 'udatamodule.pas(47,36) Error: Duplicate identifier "UpdateAction"'.
Sperando di essere stato abbastanza chiaro vi ringrazio in anticipo per i suggerimenti
-
ciao, credo che più che l'OnExit del TDbEdit dovresti fare le tue verifiche in... OnValidate del TField.
-
Grazie del suggerimento, verifico immediatamente ;D
-
Ciao nomorelogic
grazie del suggerimento,
ho provato come hai detto tu, agendo sull' Onvalidate del tField ma niente, l'evento interviene sempre dopo l'errore.
Dimenticavo, giuso per tornare al mio primo post, sai anche perchè l'evento OnUpdateRecord della ZTable restituisce l'errore " Error: Duplicate identifier "UpdateAction"' in fase di compilazione?.
Altri suggerimenti? :-\
-
purtroppo non conosco bene zeos, se nessuno ti risponde qua potresti provare a chiedere aiuto sul forum di zeos
-
Diego ... hai un pezzo di codice da poter provare a compilare?
Stilgar
-
'udatamodule.pas(47,36) Error: Duplicate identifier "UpdateAction"'.
mi viene da pensare che tu debba dirgli di compilare in modalità "delphi" ...
Stilgar
-
Grazie a tutti delle veloci risposte
Ciao Stilgar, il problema è che non so dove metterlo il codice che dovrei scrivere e quindi non saprei cosa scriverti perchè ho semplicemente collegato un DBEdit al Datasource (campo che nel db mysql è di tipo DATE) che a sua volta è collegato alla ztable zeos che a sua volta è collegata alla zconnection sempre zeos.
il dbedit ha la mask settata (!99/99/9999;1;_ )
non riesco a capire quale evento utilizzare per prevenire l'intevento del db nel caso in cui la data sia sbagliata.
comunque penso che il codice da scrivere sarebbe questo:
MA DOVE??? :-X :-X :-X ;D ;D ;D
var
data: TDate;
begin
//verifico il corretto inserimento della data
try
data:= StrToDate(dbedit.Text);
except
ShowMessage('data errata');
end;
end;
ancora grazie
Diego
-
Dimenticavo
comincia a frullarmi in testa di intercettare tasto per tasto :'( (onkeypress)
ma credo sia una scelta orribile :'( :'(
ciao e grazie
-
Pian e ben ...
Impariamo a leggere cosa dicono i messaggi d'errore. ;)
Qui è il compilatore che ti incazza, non il tuo programma :D
Ti sta dicendo che il nome UpdateAction è già in uso. UpdateAction, così a naso, ma dovrei vedere il compilatore in azione per esserne sicuro, trova 2 metodi con lo stesso nome... Come è possibile? Zeos ha tutto compilabile in lazarus ... altrimenti non lo userei :D
Altra cosa, solo per capirmi meglio io che sono duro di comprendonio.
Cosa intendi con "attivo la procedura e compilo"?
Stilger
-
UDataModule è un tuo file ... non mi ricordo di file di Zeos che abbiano quel nome ;)
Ma vista la mia età .. possibile che stia iniziando a perder colpi la testa :D
Stilgar
-
Ciao Stilgar
si Udatamodule è il nome del mio datamodule e fin qui tutto ok,
infatti la cosa strana del dell'errore è che non faccio altro che usare la procedura automatica ,ovvero faccio doppio click nella cartella eventi della table zeos e lazarus genera:
procedure TForm.ZTableUpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
end;
dopo avere fatto questo premo F9 e mando in esecuzione il programma (che prima viene compilato , intendevo questo, però io sono sicuramente un neofita e magari sbaglio termini, quindi correggimi pure cosi imparo) ;)
successivamente
ERRORE che già conosci
se tolgo quella procedura che ti ho scritto sopra tutto ritorna a funzionare
grazie
-
"var UpdateAction" è un candidato alla soluzione.
Hai qualche altra variabile/oggetto/metodo che si chiama in quel modo?
Stilgar
-
è la stessa cosa che ho pensato io.....ma non ho proprio nulla che abbia un nome anche lontanamente simile...azz ;D
ops
dimenticanza mia .. (quando ti diceve che sono neofita ;D)
il compilatore mi da anche questa indicazione
"Hint: Identifier already defined in unit CLASSES at line 1759"
-
Prova a mettere in testa al file {$MODE DELPHI}{$H+}
Dimmi se ti da ancora problemi.
Stilgar
-
azz.... cominci ad andare sul complicato (almeno per me)
comunque l'ho inserito cosi:
unit UdataModule;
//{$mode objfpc}{$H+}
{$MODE DELPHI}{$H+}
interface
ecc......
e compila senza problemi ma......(purtroppo c'è anche il ma) :o
il messaggio "invalid date" di tipo "econvert "interviene ancora prima dell'evento OnUpdateRecord :'( :'( :'( :'( :'( :'( :'(
Cavoli ma che evento devo usare per controllare che sto santissima data sia corretta prima che la dbedit perda il focus ;) ;)
grazie
-
Bon il problema di compilazione è stato risolto?
Ora abbiamo un problema a runtime?
Si incavola qualche routine di controllo?
Stilgar
EDIT:
Intendevo dire che abbiamo fatto un passo avanti.
-
Santa polenta ..
(!99/99/9999;1;_ )
E' questo il pattern di mask che usi?
Secondo me provi ad inserire una data del tipo 1/ 1/2014 e si incavola il StrToDate...
Stilgar
-
Prova (!99/99/9999;0;_ )
Stilgar
-
provato ma nulla
tieni presente che ho collegato il dbedit al dasource e nel datafiel del dbedit ho selezionato il campo tipo date collegato al DB ...quindi non faccio nessuna operazione di conversione a livello di scrittura di codice.
una domanda:
ho fatto passare tutti gli eventi possibli nella ztable (OnUpdateRecord, OnPostError, eccc,...) semplicemente mettendo un showmessage('alt') in modo da fermare il programma e ho inserito dei break point per vedere se intervenisse qualche cosa...
non interviene nulla...forse sto guardando la ztable ma devo guardare altrove?? booo :o
grazie
dimenticavo
a runtime quando la dbedit per il focus (e magari ho inserito 44/44/4444) il debugger interviene dicendo" il progetto "XXXXXXX" ha sollevato un eccezione di classe "EconvertError" con messaggio Invalid date" .
at address 4505F3
-
Si nella conversione.
Metti il break point lì.
Stilgar
-
penso di non avere capito
dov'è che che posso verificare la conversione? se non c'è codice che lo converta?
dove posso metterlo il breack point?
grazie
-
chiami una StrToDate?
quella conversione si rompe ...
Stilgar
-
non ho bisogno visto che la dbedit lavora direttamente col mapo del db
avevo scritto questa procedura come esempio per verificare il corretto inserimento della data ma non ho ancora idea in quale evento metterla visto che ogni tentativo fatto è stato inutile, interviene sempre prima il messaggio di errore che ormai conosci ehehe ;D ;D ;D
var
data: TDate;
begin
//verifico il corretto inserimento della data
try
data:= StrToDate(dbedit.Text);
except
ShowMessage('data errata');
end;
end;
-
SQLite o altro db?
Stilgar
-
mysql
-
Usa il Logger di Zeos .. (TZSQLMonitor)
Solo per scrupolo.
Attiva tutti i trigger e metti il Break point dentro il metodo di gestione del log.
Non serve che tu faccia scrivere nulla, ma Zeos dovrebbe inviarti tutte le notifiche di quello che sta facendo.
Vediamo a che punto si incastra.
Stilgar
-
Qui il 3d sta diventando la treccani :D
Se alleghi il progetto e 2 script in croce per la creazione del db e vediamo cosa si riesce a fare ;)
MySQL l'ho già installato :D
Stilgar
-
Stilgar ci siamo...... ;D
ho seguito il tuo consiglio di verificare con il logger e ho visto che il dbedit non comunicava con il db quando perdeva il focus
quindi l'evento corretto è OnSetTex del campo nella ztable
dopo tre pagine di post ce l'abbiamo fatta
grazie
-
oook
Stilgar
-
grazie
diego