Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    137

    [Delphi 5] MonthCalendar + query

    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.

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    137
    ps: ovviamente la variabile Stringa e Stringa2 nell'ultimo esempio rappresentano il contenuto di due TEdit:

    Stringa2 := Edit2.Text;

    Scusate l'imprecisione.

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Se fossi in te, aggiusterei subito il tuo codice facendo uso dei parametri all'interno della query SQL.

    Il meccanismo è semplice:
    codice:
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    137
    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?

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

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

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    137
    Di seguito riporto il codice, senza l'uso dei parametri (visto che non mi funzionanvano), per il problema sulla password:
    codice:
     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.





  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Si potrebbe ottimizzare il tutto scrivendo qualcosa di simile:
    codice:
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

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

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

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    137
    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,

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    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!
    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.