PDA

Visualizza la versione completa : [Delphi 5] MonthCalendar + query


zephyr
07-03-2005, 15:22
Ciao a tutti,

il mio problema è questo: io debbo caricare da un database paradox, gli utenti presenti in un dato giorno. Questo l'ottengo tramite la gestione del click del mouse su un componente MonthCalendar di Delphi. In queso modo recupererei gli utenti dalla fino alla data cliccata:

...
Query1.SQL.Add('... AND DataPresenza <= ' + DateToStr(Giorni.Date));
Query1.Open;
...

ove Giorni è il nome del mio MonthCalendar.
La domanda è questa: perchè quando clicco su un giorno futuro a quello attuale di almeno 6/7 giorni mi dà un errore "Type Mismatch in expression" quando invece se clicco in altre date (quindi quelle passate o quelle subito successive a quella attuale) non mi dà l'errore e funziona correttamente?

Ho avuto un problema simile anche nella gestione di una passwrod d'accesso e l'ho aggirato utilizzando l'approccio via tabelle e non via query al database anche se non ho capito ancora perchè me lo desse:

codice non funzionante:
with Query1 do begin
Close;
with SQL do begin
Clear;
// Add('SELECT * FROM tb_pippo WHERE Username='''+Edit1.Text+''' AND Password='''+Edit2.Text+'''');
Add('SELECT * FROM tb_pippo WHERE Username='''+stringa1+'''');
//Add(' AND Password='''+stringa2+'''');
end;
Open;
First;
while not Eof do begin
trov:=True;
Next;
end;
Close;
end;

codice fatto funzionare:
if DataModule1.Table1.FieldByName('Username').Value = stringa1 then
if DataModule1.Table1.FieldByName('Password').Value = stringa2 then
trov := True;


Qualcuno mi può aiutare per entrambi i casi?

Grazie.

zephyr
07-03-2005, 15:24
ps: ovviamente la variabile Stringa e Stringa2 nell'ultimo esempio rappresentano il contenuto di due TEdit:

Stringa2 := Edit2.Text;

Scusate l'imprecisione.

alka
07-03-2005, 16:06
Se fossi in te, aggiusterei subito il tuo codice facendo uso dei parametri all'interno della query SQL.

Il meccanismo è semplice:


Query1.SQL.Add('... AND DataPresenza <= :DATALIMITE');
Query1.ParamByName('DATALIMITE').AsDateTime := Giorni.Date;
Query1.Open;

In questo modo, introduci un parametro all'interno della query che puoi impostare comodamente in un secondo momento usando una delle proprietà di accesso AsXXX, evitando parecchi errori e soprattutto non sottoponendo la tua applicazione a rischi di "sql injection".

Osserva i cambiamenti e scrivi di nuovo se non riesci a risolvere i problemi.

Ciao!

zephyr
09-03-2005, 09:22
Ho provato utilizzando i parametri ma non funziona ugualmente.
Infatti il problema della data è rimasto e quello sulla password anche.
L'errore di quest'ultimo è "Invalid use of keybord, Token Password = ".
Però in entrambi i casi vedo che la query è corretta ovvero tira sù i parametri in maniera opprtuna.


altre idee?

alka
09-03-2005, 10:37
Originariamente inviato da zephyr
Ho provato utilizzando i parametri ma non funziona ugualmente.
[...]

Dovresti fornire qualche indicazione in più...qual è il codice attuale? qual è la struttura del tuo database? di che tipo sono i campi che interessano il problema?

zephyr
09-03-2005, 12:48
Di seguito riporto il codice, senza l'uso dei parametri (visto che non mi funzionanvano), per il problema sulla password:


trov := False;
stringa1 := Edit1.Text;
stringa2 := Edit2.Text;
with Query1 do begin
Close;
with SQL do begin
Clear;
// Add('SELECT * FROM tb_pippo WHERE Username='''+Edit1.Text+''' AND Password='''+Edit2.Text+'''');
Add('SELECT * FROM tb_pippo WHERE Username='''+stringa1+'''');
Add(' AND Password='''+stringa2+'''');
end;
Open;
First;
while not Eof do begin
trov:=True;
Next;
end;
Close;
end;


il problema me lo dà solo sul campo password.
il database è paradox e nella tabella i campi sono A lunghi 15, la chiave è un campo "id" autoincrement.


per l'altro problema purtroppo non riesco a riportare il codice in quanto non l'ho a disposizione su questa postazione. Comunque il problema me lo dava su un campo di tipo DATE in un database paradox su una tabella con chiave doppia rappresentata da un "id" autoincrement e da un altro id, "id_utente" di tipo numeric.




:bhò: :bhò:

alka
09-03-2005, 13:20
Si potrebbe ottimizzare il tutto scrivendo qualcosa di simile:


if Query.Active then
Query.Close;
Query.SQL.Text := 'SELECT * FROM nometabella WHERE (USERNAME = :USERNAME) AND (PASSWORD = :PASSWORD)';
Query.ParamByName('USERNAME').AsString := UserNameEdit.Text;
Query.ParamByName('PASSWORD').AsString := PasswordEdit.Text;
Query.Open;
UserFound := not Query.Eof;
Query.Close;

La query viene chiusa, se necessario; si imposta il testo SQL includendo i parametri che verranno assegnati subito dopo; si provvede ad aprire (eseguire) la query e, nel caso siano presenti record, si imposta l'apposito "flag" e si conclude con la chiusura della query.

In realtà, avrebbe più senso eseguire un conteggio dei record piuttosto che selezionare tutti i campi e verificare se la tabella contiene record (che potrebbero essere molti e non sono necessari).

Ciao! :ciauz:

alka
09-03-2005, 13:22
Originariamente inviato da zephyr
Comunque il problema me lo dava su un campo di tipo DATE in un database paradox su una tabella con chiave doppia rappresentata da un "id" autoincrement e da un altro id, "id_utente" di tipo numeric.

Se non erro, il tipo NUMERIC è a virgola mobile: non credo sia proprio un campo adatto alla formazione di una chiave primaria. :stordita:

zephyr
09-03-2005, 13:31
Grazie mille per tutti i tuoi aiuti Alka ma mi dà lo stesso problema di "Invalid use of keyword" a capo "Token Password =" a capo "Line 1" mettendo pari pari il suggerimento che mi hai dato.
sai il perchè?

per il numeric ci guardo più avanti però se ti venisse inmente qualcosa fammelo sapere.


Ciao, :dhò:

alka
09-03-2005, 13:35
Originariamente inviato da zephyr
Grazie mille per tutti i tuoi aiuti Alka ma mi dà lo stesso problema di "Invalid use of keyword" a capo "Token Password =" a capo "Line 1" mettendo pari pari il suggerimento che mi hai dato.
sai il perchè?

No, perchè non posti qui il codice che hai modificato, pertanto non posso verificare se è esattamente "pari pari". :)


Originariamente inviato da zephyr
per il numeric ci guardo più avanti però se ti venisse inmente qualcosa fammelo sapere.

L'unico suggerimento che posso darti è...evitare di utilizzare un campo a virgola mobile. Usa un campo intero.

Ciao! :ciauz:

Loading