Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Delphi 6: semplice problematica qry

    Ciao a tutti,
    non riesco a capire una cosa, vi posto il seguente codice e mi dite se c'è qualcosa che non va:
    codice:
            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 è:

    codice:
    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.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    ciao,

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

    prova cosi:
    codice:
            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

  3. #3
    E già, mi son proprio dimenticato tutto!!!
    Grazie mille.
    Se ho altre difficoltà scrivo nuovamente.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    chiaramente suppongo che che il field codiceabarre sia dichiarato come unique, altrimenti potresti avere come resoultset piu di 1 record

  5. #5
    Il campo codice a barre lo compilo io e non si può ripetere.

  6. #6
    Altro problema:
    sto cercando di fare un calcolo ma non riesco a risolvere:
    codice:
    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    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

  8. #8
    Ok, ho risolto così:
    codice:
    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?

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    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

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.