Newsgroup: it.comp.lang.delphi
Titolo: Parametro DATE su TADOQuery con AcCESS

Scusate la banalità della domanda ma sono oramai 2 gg che tento
inutilmente di passare un parametro ad una adoquery su access ed ogni
volta mi ritorna
"Data type mismatch... blah blah"
Ho provato anche con ParamValues ma nisba
//----------------------------------------------------------------------------
function TDM01.GetPrezzo(const AcdMin: string; const AdtRic: TDate;
  var AimPub, AimRif, AdtVar: double): boolean;
begin
  with ADOQueryProntuario do
  begin
    AimPub := 0;
    AimRif := 0;
    AdtVar := 0;
    ADOQueryProntuario.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' +
                                          DM01.PathProntuario +
';Mode=Read;Persist Security Info=False';
    if Active then Close;
    SQL.Clear;
    SQL.Add('SELECT PRZEURO, PRZRIMBEURO, DATA');
    SQL.Add('FROM PRONTUARIOUNICO');
    SQL.Add('WHERE CDMIN = :CDMIN1');
    SQL.Add(' AND  DATA = ');
    SQL.Add('(');
    SQL.Add('  SELECT MAX(DATA)');
    SQL.Add('  FROM PRONTUARIOUNICO');
    SQL.Add('  WHERE CDMIN  = :CDMIN2');
    SQL.Add('   AND  DATA  <= :DATA1');
    SQL.Add(')');
    Parameters.ParamByName('CDMIN1').Value   := AcdMin;
    Parameters.ParamByName('CDMIN2').Value   := AcdMin;
    Parameters.ParamByName('DATA1').Value    := AdtRic;
    result := OpenADOQuery(ADOQueryProntuario);
    if (result) and (not ADOQueryProntuario.EOF) then
    begin
      AimPub := FieldByName('PRZEURO').AsFloat;
      AimRif := FieldByName('PRZRIMBEURO').AsFloat;
      AdtVar := FieldByName('DATA').AsFloat;
    end;
  end;
end;
//----------------------------------------------------------------------------
Qualcuno di voi saprebbe indicarmi la strada ?
Massimo

Ho provato anche con ParamValues ma nisba
Verifica nell'object inspector che il tipo di dato del tuo parametro sia
ftDateTime.
Ciao
"E il googlar m'e' dolce in questo mar...".
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

ftDateTime.
Scusa non ho visto che la query la passi runtime: in questo caso devi
circoscrivere le date con il carattere "#" come in questo esempio:
SELECT Cognome FROM Registro
WHERE (((Registro.DataNascita)=#01/01/1950#));
La tua data quindi *non* la dovrai passare come parametro nell' sql, ma come
*stringa*. (FormatDateTime('dd/mm/yyyy', TuaData.AsDateTime))
Fammi sapere, ciao


 Fammi sapere, ciao
Io la vorrei passare come parametro per il fatto che devo richiamare
la query circa 5000/6000 volte, se riesco a passare come parametro
faccio il prepare e passo solo i paramatri velocizzando il processo di
molto
Massimo

molto
Daccordo, ma tu hai provato a mettere il datatype del parametro a ftDateTime
come ti avevo suggerito ?? Se non fai prima le prove per i consigli che ti do'
io non posso perdere sempre tempo ad ogni post che fai sul ng. ;-)
Io l'ho riprodotto per scrupolo, e a me funziona.
Ho messo una adoquery, l'ho connessa ad un db1 creato apposta, ho aggiunto una
tabella nuova e l'ho popolata con diversi record aventi un campo stringa e uno
data. Ho messo un bottone e un monthcalendar, e al click del bottone scateno
il turbo... ehm scateno la query ed essa mi ritorna il record puntato dalla
data! Prova e fammi sapere !!!
Questa e' la rappresentazione DFM della query:
  object ADOQuery1: TADOQuery
    Connection = ADOConnection1
    CursorLocation = clUseServer
    Parameters = <
      item
        Name = '[MiaData]'
        Attributes = [paNullable]
        DataType = ftDateTime
        NumericScale = 255
        Precision = 255
        Size = 510
      end>
    SQL.Strings = (
      'SELECT Tabella1.testo, Tabella1.data'
      'FROM Tabella1'
      'WHERE (((Tabella1.data)=[MiaData]));'
      '')
    Left = 184
    Top = 62
  end
Con questo codice verifico l'esito della query:
procedure TForm1.Button1Click(Sender: TObject);
begin
   ADOQuery1.Close;
   ADOQuery1.Parameters.ParamByName('[MiaData]').Value := MonthCalendar1.Date;
   ADOQuery1.Open;
   if ADOQuery1.RecordCount > 0 then MessageDlg('ok', mtInformation, [mbOK],
0)
   else MessageDlg('ko', mtError, [mbOK], 0);
end;
Ciao


 io non posso perdere sempre tempo ad ogni post che fai sul ng. ;-)
Ti ringrazio dei consigli ora proverò, non sapendo come fare per
utilizzare i parametri creati a design-time ho avuto delle difficoltà;
ripeto: grazie ma non fare il prezioso, poichè se avessi risposto in
maniera esauriente come in questo esempio non ti avrei disturbato
ancora.

Grazie e Ciao
Massimo

ancora.
Scusami per il modo in cui mi sono espresso: ho riletto a distanza il mio post
e mi sono accorto di aver usato un tono assolutamente non conforme alla mia
persona, ero spazientito per altri motivi.
Ciao!
