Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error en consulta sql con parametro (https://www.clubdelphi.com/foros/showthread.php?t=64663)

Lizette 14-04-2009 00:42:20

Error en consulta sql con parametro
 
Hola compañeros, tengo la siguiente consulta sql:

Código Delphi [-]

  hr:=TimeToStr(time());
  hrs:=copy(hr,1,2);
  min:=copy(hr,4,2);
  mer:=copy(hr,10,4);
  minu:=StrToInt(min);
  min:=IntToStr(minu);
  hor:=hrs+':'+min+' '+mer;

with QueryRec do begin
 If active then close;
 SQL.Clear;
 SQL.Add('Select Hora, Evento');
 SQL.Add('From Recordatorios');
 SQL.Add('Where Hora < ho');
 SQL.Add('Order By Hora asc');
 Parameters.ParamByName('ho').Value:=hor;
 Open;
end; //with

Aquí el caso es que le mando como parametro hor que contiene la hora actual despreciando los segundos, y me marca error precisamente en ese parametro.. :confused:

Saludos y espero me puedan ayudar a identificar el problema..

roman 14-04-2009 01:38:44

En la consulta SQL, debes poner dos puntos antes del parámetro

Código SQL [-]
Where Hora < :ho

// Saludos

Lizette 14-04-2009 03:39:16

Mmm ya le puse los dos puntos, pero me sigue marcando error: QueryRec:Parameter 'ho' not found

Delphius 14-04-2009 05:11:12

Hola Lizette,
¿Que motor de base de datos utilizas?

¿Que tipo de dato es el campo Hora?
Esto te lo pregunto por el código que expones antes de armar la consulta. Hay una ensalada de variables y al final haces conversiones a mi modo de ver innecesarias.

Si estás empleando los componentes ADO, lo cual parece ser así debido a la propiedad Parameters (característica de los ADO) es recomendable que se le indique el tipo de datos y no simplemente el valor:

Parameters.ParamByName().Value := ...
Parameters.ParamByName().DataType := ...

Quizá algo de ésto tenga que ver con que no encuentra al parámetro... ¿Seguro/a que estableciste los dos puntos antes y no después?

EDITO:
¿La propiedad ParamCheck está en true o en false? Si es False... prueba en ponerla a true.

Saludos,

Lizette 14-04-2009 05:49:12

Hola Delphius,

Uso como motor de bd MySQL, el campo hora, es varchar (string), el parametro es string.

Mmmm y el valor Parameters.ParamByName().DataType := ' ' que valores acepta??

Los dos puntos ya le cale, a ponerselos antes y despues y me da el mismo error.

La propiedad ParamCheck está en true..

La verdad no se en que este el error, ya que al parecer la consulta es correcta.

Delphius 14-04-2009 06:04:38

Cita:

Empezado por Lizette (Mensaje 344850)
Hola Delphius,

Uso como motor de bd MySQL, el campo hora, es varchar (string), el parametro es string.

Iba a decirte que antes de pasar a armar la consulta que mostraras el valor de hor con un showMessage() para ver si el formato generado es el esperado por el motor para el campo... pero si dices que es string no creo que sea el problema.

Aunque tengo mis reservas sobre si es mejor contar con un formato string para almacenar una hora...

Cita:

Empezado por Lizette (Mensaje 344850)
Mmmm y el valor Parameters.ParamByName().DataType := ' ' que valores acepta??

No es por ser malo pero con un F1 eso se resuelve fácilmente. De la ayuda de Delphi:

Cita:

Indicates the type of value the parameter represents.

property DataType: TDataType;

Description

Set DataType to reflect the data type of the value the parameter represents. The default value of DataType is ftUnknown.

Read DataType to discover the type of data that was assigned to the parameter. Each possible value of DataType corresponds to a type of table field.

ADOStoredProc1.Parameters.Items[0].DataType := ftString;
Cita:

Indicates the type of a parameter.

Unit

AdoDb

type TDataType = TFieldType;

Description

TDataType represents a field type when it is applied to a parameter.
Cita:

TFieldType is a set of values that parallel the data types of fields in tables.

Unit

DB

type TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd);
Entonces, ¿que valores acepta? cualquiera de esa lista;)... yo optaría por un ftstring;).

Cita:

Empezado por Lizette (Mensaje 344850)
Los dos puntos ya le cale, a ponerselos antes y despues y me da el mismo error.

La propiedad ParamCheck está en true..

La verdad no se en que este el error, ya que al parecer la consulta es correcta.

Pues si los dos puntos están bien ubicados no debería ser problema... ya me dejas sin ideas...

A ver... ¿podrías mostrar con un showMessage() la consulta generada antes de ejecutarla?

Quizá hay por allí algún caracter escurridizo o que se quiere colar en la fiesta... tal vez si le tomamos una "fotito" se asoma y se deja ver (los coleros siempren se prenden para la foto:D)

Saludos,

Lizette 14-04-2009 07:23:30

Bien gracias por la ayuda ;) revisare bien eso..

Saludos

Lizette 14-04-2009 07:40:44

Como con la consulta no pude, no me quedo más que buscar opciones jeje, a lo cual hice lo siguiente:

Código Delphi [-]

  fecha:=DateToStr(date());
  dia:=(copy(fecha,1,2));
  mes:=(copy(fecha,4,2));
  ano:=(copy(fecha,7,4));
  ff:=ano+'-'+mes+'-'+dia;

 ADOTable1.Open;
 while ADOTable1.Eof<>True do
 begin
  if(ADOTable1.FieldValues['Fecha']=ff)then
  begin
    hora:=StrToTime(ADOTable1.FieldValues['Hora']);
    hr:=TimeToStr(time());
    hrs:=copy(hr,1,2);
    min:=copy(hr,4,2);
    mer:=copy(hr,10,4);
    minu:=StrToInt(min);
    min:=IntToStr(minu);
    hor:=StrToTime(hrs+':'+min+' '+mer);

    if(hora< hor)then
    begin
    RichEdit1.Lines.Add(ADOTable1.FieldValues['Hora']);
    RichEdit1.Lines.Add(ADOTable1.FieldValues['Evento']);
    ADOTable1.Edit;
    ADOTable1.Delete;
    ADOTable1.Refresh;
    end
    else
     ADOTable1.Next;
   end
   else
    ADOTable1.Next;
  end;
  BitAceptar.SetFocus;

El cual me muestra los datos en un RichEdit :rolleyes:, mmm aunque no en una tablita pero en fin.. jeje :D

Saludos


La franja horaria es GMT +2. Ahora son las 10:17:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi