PDA

Visualizza la versione completa : [DELPHI] Query parametrica, conteggio di record e arrotondamenti


pegaso22
18-05-2006, 18:17
Ciao a tutti,
non riesco a capire una cosa, vi posto il seguente codice e mi dite se c'è qualcosa che non va:


DataModule1.Q_incrementapunti.Params[0].AsString := Edit2.Text;
if DataModule1.Q_incrementapunti.RecordCount > 0 then
begin
MessageDlg('Trovato.', mtwarning, [mbok], 0);
end
else
begin
MessageDlg('Non trovato.', mtwarning, [mbok], 0);
end;
end;


La qry di Q_incrementapunti è:



select * from clienti where (Codiceabarre) like :cerca1


Ora non capisco perchè recordcount ha sempre valore zero quando la stringa che inserisco in edit2.text è un valore presente in un campo Codiceabarre nella tabella clienti; essendo presente recordcount dovrebbe avere valore 1 o no?
Probabilmente sto sbagliando qualcosa io!!
Che ne dite?

Sono un pò arrugginito con delphi e non riesco a capire l'errore.

Fatemi sapere.
Grazie mille.

123delphi321
18-05-2006, 18:24
ciao,

credo che il problema è che non effettui la open della query.

prova cosi:


DataModule1.Q_incrementapunti.Close;
// DataModule1.Q_incrementapunti.Params[0].AsString := Edit2.Text;
DataModule1.Q_incrementapunti.ParamByName('Cercal' ).AsString := Edit2.Text;
DataModule1.Q_incrementapunti.Open;
if DataModule1.Q_incrementapunti.RecordCount > 0 then
begin
MessageDlg('Trovato.', mtwarning, [mbok], 0);
end
else
begin
MessageDlg('Non trovato.', mtwarning, [mbok], 0);
end;
end;


per una maggiore chiarezza di lettura io suggerirei di passare i parametri tramite parambyname.

ciao

pegaso22
18-05-2006, 18:26
E già, mi son proprio dimenticato tutto!!!
Grazie mille.
Se ho altre difficoltà scrivo nuovamente.

123delphi321
18-05-2006, 18:32
chiaramente suppongo che che il field codiceabarre sia dichiarato come unique, altrimenti potresti avere come resoultset piu di 1 record

pegaso22
18-05-2006, 18:34
Il campo codice a barre lo compilo io e non si può ripetere.

pegaso22
18-05-2006, 18:52
Altro problema:
sto cercando di fare un calcolo ma non riesco a risolvere:


punti := StrToFloat(F_incrementopunti.Edit1.Text) / DataModule1.T_valorepuntiValore.value;


dove punti è dichiarato Extended, edit1 è un campo di testo (con all'interno numeri anche decimali). Questo calcolo che dall'esempio che sto provando dovrebbe essere: 12/2 mi da cifre stranissime.

Cosa sto sbagliando?
Strtofloat come converte?
A me servirebbe trasformare la stringa edit1 in un numero con la virgola per poter fare il calcolo.

Fammi sapere.
Grazie mille.

123delphi321
18-05-2006, 19:09
in passato ho avuto problemi simili, e mi e' stato consigliato di utilizzare il tipo dato currency.

il tipo float e' un campo a virgola mobile che comporta differenze di arrotondamento.

prova anche ad usare il debugger

pegaso22
18-05-2006, 19:13
Ok, ho risolto così:


punti := FloatToStr(round(StrToCurr(F_incrementopunti.Edit1 .Text) / DataModule1.T_valorepuntiValore.value));

dichiarando punti come string.
Ora un altro piccolo problema, dovrei arrotondare il risultato sempre per difetto. Con round ho visto che arrotonda per difetto se i valori dopo la virgola sono inferiori a 0,5 mentre se sono superiori arrotonda per eccesso.
C'è una funzione che fa questo o devo impostare dei calcoli io in base ai numeri decimali?

123delphi321
18-05-2006, 19:24
cioe??? vuoi arrotondare sempre a 0 ?

se e' cosi prendi solo la parte intera del numero

Round(12.75) = 13
Trunc(12.75) = 12
Int(12.75) = 12
Frac(12.75) = 0.75

alka
18-05-2006, 20:37
Originariamente inviato da pegaso22
Ora non capisco perchè recordcount
Non usare la proprietà RecordCount perché potrebbe non essere attendibile a seconda della libreria utilizzata per l'accesso ai dati e alla modalità con cui tali dati vengono reperiti: usa un and logico tra le proprietà Bof ed Eof per determinare se ti trovi contemporaneamente all'inizio e alla fine del recordset (che quindi è vuoto) oppure usa IsEmpty.


Originariamente inviato da pegaso22
sto cercando di fare un calcolo ma non riesco a risolvere: [...]
dove punti è dichiarato Extended, edit1 è un campo di testo (con all'interno numeri anche decimali). Questo calcolo che dall'esempio che sto provando dovrebbe essere: 12/2 mi da cifre stranissime.
Il problema non è nella conversione di StrToFloat, ma è intrinseca nel tipo di dato che utilizzi, Extended, che analogamente a tutti i tipi di dati a virgola mobile è influenzato da un errore di precisione; il valore che ottieni, quindi, avrà sempre un numero elevato di decimali poiché così vengono rappresentati i valori. Ti interessa principalmente visualizzare il numero correttamente, e per fare ciò è sufficiente che tu applichi una formattazione (FormatFloat quando devi mostrare il numero a video convertendolo in stringa, selezionando quante cifre decimali vuoi vedere, separatori di decimali e migliaia e così via.


Originariamente inviato da pegaso22
Ora un altro piccolo problema, dovrei arrotondare il risultato sempre per difetto. Con round ho visto che arrotonda per difetto se i valori dopo la virgola sono inferiori a 0,5 mentre se sono superiori arrotonda per eccesso.
C'è una funzione che fa questo o devo impostare dei calcoli io in base ai numeri decimali?

No, la funzione Round (in tutti i linguaggi in cui ne esiste una analoga) arrotonda usando il "Banker's Rounding": è l'algoritmo di arrotondamento che distribuisce statisticamente l'errore quando si ha a che fare con valori intermedi, come accade quando è necessario, per fare un semplice esempio, arrotondare all'intero valori come 0,5, 1,5, 2,5 e così via.
La funzione Round, in questo caso, arrotonda al valore pari più vicino, quindi il risultato degli arrotondamenti applicati agli interi è il seguente:

0,0 --> 0
0,5 --> 0
1,0 --> 1
1,5 --> 2
2,0 --> 2
2,5 --> 2
3,0 --> 3
3,5 --> 4
4,0 --> 4
4,5 --> 4
5,0 --> 5
...

Per arrotondamenti particolari anche con valori decimali, esiste la funzione SimpleRoundTo; consulta eventualmente le istruzioni per l'uso nella Guida.

Ciao! :ciauz:

Loading