Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Error paso de fecha por parametro en ADO (https://www.clubdelphi.com/foros/showthread.php?t=62058)

javi.donvito 02-12-2008 19:07:48

Error paso de fecha por parametro en ADO
 
Buenas
Tengo un problema con las fechas a la hora de realizar un Update en una base de datos SQL Server utilizando componentes ADO y delphi 7

La cosa es que a la hora de realizar un UPDATE usando parámetros me da el sigme genera una excepción que viene diciendo:

Project rRecibos.exe raised exception class EOleException with message Microsoft ODBC SQL Server Drivers Optional feature not implemented

Los parametros de la Query los tengo configurados de la siguiente forma:
DateType : ftDateTime
Direction : pdinput
name : pFecha
numericScale :0
precision: 0
size : 0
value : 0:00:00
type : date

y el procedimiento en donde realizo la consulta la tengo de la siguiente forma (en mis pruebas apunto manualmente a un registro en concreto)


procedure TfReenvios.BitBtn2Click(Sender: TObject);

Var
FechaActual:TDate;

begin
DateSeparator:='-';
FechaActual:=now;

with ADOQCambiar do

begin
// Actualizar
ADOQCambiar.SQL.Clear;
ADOQCambiar.SQL.Add ('UPDATE CuotasEmitidas SET FecSituacion = :pecha '+
'WHERE CuotasEmitidas.CodPers = 1801 ' +
'AND CuotasEmitidas.NumRecibo = 810375');
ADOQCambiar.Parameters.ParamByName('pFecha').Value:=FormatDateTime ('yyyy/mm/dd',FechaActual);
ADOQCambiar.ExecSQL;

end;
end;
He mirado por el foro y en este hilo (http://www.clubdelphi.com/foros/showthread.php?t=59267&highlight=formato+de+fecha+en+SQL )me encontré que otros con un problema similar cambiaron el tipo DateType al formato ftTimeStamp. Pues bueno, intenté seguir esa vía pero al querer cambiar el tipo me sale este error

Arguments are of wrong type, are out of aceptable range, or are in conflict with one another.

Vamos que después de estar dando vueltas y vueltas a esto ya no sé por donde seguir ni que mirar ¿Me podría decir alguien que estoy haciendo mal ? Muchas gracias.

maeyanes 02-12-2008 19:12:33

Hola...

Bienvenido a estos foros. Te recomiendo que le des una leida a la Guía de Estilo de los foros (enlace arriba de la publicidad).

Sobre tu problema, ya intentaste así?

Código Delphi [-]
ADOQCambiar.Parameters.ParamByName('pFecha').AsDateTime := FechaActual;


Saludos...

Caral 02-12-2008 19:16:40

Hola
Que base de datos usas?
Código Delphi [-]
Var
FechaActual:TDate;
begin
DateSeparator:='-';
FechaActual:= FormatDateTime('yyyy/mm/dd',now);
with ADOQCambiar do
begin
// Actualizar
ADOQCambiar.SQL.Clear;
ADOQCambiar.SQL.Add ('UPDATE CuotasEmitidas SET FecSituacion = echa '+
'WHERE CuotasEmitidas.CodPers = 1801 ' +
'AND CuotasEmitidas.NumRecibo = 810375');
ADOQCambiar.Parameters.ParamByName('pFecha').Value:= DateToStr(FechaActual);
ADOQCambiar.ExecSQL;
end;
end;
Saludos

maeyanes 02-12-2008 19:21:32

Hola...

¿Para que formatear la fecha?

Si usan una variable de tipo TDateTime, y usan la función Now, no es necesario hacer algo así. Con solo tener FechaActual := Now ya está.

También para pasar un valor a un parámetro de tipo TDateTime solo tienen que hacer AsDateTime := FechaActual...

Yo siempre lo he hecho así y hasta ahora no he tenido ningún problema.


Saludos...

ContraVeneno 02-12-2008 19:24:40

Lo bonito de usar parametros es que no tienes que hacer conversiones. Quita el "formatdatetime" y pasa directo "FechaActual".

Akelas, se me adelantaron... eso me pasa por ver un hilo, luego contestar el teléfono , atender pendientes y regresar a contestar...

Lepe 02-12-2008 19:25:37

... pero no has usado ADO ;).

En ADO sólo tienes .Value no existe AsString, AsDate, etc.

Saludos

Caral 02-12-2008 19:28:24

Hola
En access el formato es algo engorroso, por eso aveces se necesita poner, incluso como esta no funcionaria.
Por eso pregunte que base de datos usa.
Saludos

maeyanes 02-12-2008 19:33:24

Hola...

Cita:

Empezado por Lepe (Mensaje 329210)
... pero no has usado ADO ;).

En ADO sólo tienes .Value no existe AsString, AsDate, etc.

Saludos

Si lo he usado, pero no tan extensamente... :p

Y bueno, aun así, con poner .Value := FechaActual le debería funcionar sin grandes problemas. Claro siempre que establezca bien que el valor que se espera es de tipo TDateTime...


Saludos...

javi.donvito 03-12-2008 11:45:49

Gracias por la bienvenida y por responderme tan rápido. Y disculpar por el estilo del primer mensaje.

He realizado las pruebas que me habéis indicado pero sigo tendiendo problemas

El programa me genera la siguiente excepción:

'... exception class EConvertError with message "2008-12-03" is not a valid date'

No entiendo porqué, es un formato de fecha válido. Tampoco entiendo que me lo genere en ´la segunda linea

FechaActual :=StrToDate(FormatDateTime ('yyyy/mm/dd',now));

Siguiendo con las pruebas y pasando la fecha de las formas que me habias comentado

Parameters.ParamByName('pFecha').Value:=now; {o poniedo FechaActual}
me sigue generando el mismo error de ayer

Project rRecibos.exe raised exception class EOleException with message Microsoft ODBC SQL Server Drivers Optional feature not implemented

He probado y dado un motón de vueltas y me sigue dando problemas para pasar las fechas ¿Alguna sugerencia?

Gracias

Código Delphi [-]
procedure TForm1.btnActualizaClick(Sender: TObject);
Var
  FechaActual : TDateTime;
begin
  DateSeparator :='-';

 (*  En la siguiente linea
  FechaActual :=StrToDate(FormatDateTime ('yyyy/mm/dd',now));
  me sale el error
       '... exception class EConvertError with message "2008-12-03" is not a valid date'
 *)
  with ADOQCambiar do
  begin
    SQL.Clear;

    SQL.Add ('UPDATE CuotasEmitidas SET FecSituacion = :pFecha'+
            'WHERE CuotasEmitidas.CodPers = 1801 ' +
            'AND CuotasEmitidas.NumRecibo = 810375');

    Parameters.ParamByName('pFecha').Value:=StrToDate(FormatDateTime ('yyyy/mm/dd',now));
    ExecSQL;

 end;
end;

Lepe 03-12-2008 12:38:42

Código Delphi [-]
procedure TForm1.btnActualizaClick(Sender: TObject);
Var
  FechaActual : TDateTime;
begin

  with ADOQCambiar do
  begin
    SQL.Clear;

    SQL.Add ('UPDATE CuotasEmitidas SET FecSituacion = :pFecha'+
            'WHERE CuotasEmitidas.CodPers = 1801 ' +
            'AND CuotasEmitidas.NumRecibo = 810375');

    Prepare;
     if Parameters.ParamByName('pFecha') = nil then
     begin
        ShowMessage('uuuups, hace falta crear al parámetro en tiempo de ejecución con Parameters.Add( pFecha ) ');
     end
     else
     begin
        Parameters.ParamByName('pFecha').Direction := pdinput;
         Parameters.ParamByName('pFecha').DateType := ftDateTime;
        Parameters.ParamByName('pFecha').Value:= now;
     end;
    ExecSQL;
 end;
end;

Según veo estás borrando el SQL, eso hace que los parámetros también se eliminen (al menos es el comportamiento normal del Tquery, ignoro lo que hace TADOquery), En principio debería crearse al ejecutar el "Prepare" que he puesto, pero no sé las propiedades que tomaría, por eso las defino yo. Ejecuta y cuéntame si sale el showmessage, si no sale, el error que da, etc :)

Saludos

javi.donvito 03-12-2008 13:45:49

Buenas de nuevo

Lo he ejecutado y me genera la siguiente expeción:

"... exception class EDataBaseError with ADOQCambiar. Parameter 'pFecha' not found"
en la siguiente linea



Código Delphi [-] If Parameters.ParamByName('pFecha') = nil





En la Query tengo creado el parametro pFecha y lo tengo configurado de la siguiente forma



Código Delphi [-]
Attributes
(todos a false)
DataType: ftDateTime
Direction : pdInput
NumericScale : 0
Precision: 0
Siza: 0
Value : 0:00:00
Type: Date








En la linea donde pone Prepare me generaba el error en compilación Undeclared identifier por lo que la he cambiado a Prepared :=True (no se si hice bien) he probado ejecutando el código de la siguientes formas



Código Delphi [-]// Primera opción
...
Prepared := True;
If Parameters.ParamByName('pFecha') = nil
...
// Segunda opción
...
Prepared := True;
Parameters.ParamByname('pFecha').Direction := pdinput;
Parameters.ParamByname('pFecha').DataType := ftDateTime; If Parameters.ParamByName('pFecha') = nil
...



En la segunda opción me da el error


"... exception class EDataBaseError with ADOQCambiar. Parameter 'pFecha'
not found"

en la linea
Parameters.ParamByname('pFecha').Direction := pdinput;

La Query lo que pretende simplemente es cambiar las fechas de aquellos registros que previamente fueron seleccionadas. Con el error que me encontraba con la fecha he dejado la Query lo más simple y sencilla posible intentando modificar para las pruebas un único registro.

¿Que puedo hacer ahora?.
Muchas Gracias

Lepe 03-12-2008 14:39:33

El parámetro lo tienes creado en tiempo de diseño, pero al borrar el sql con "SQL.Clear" ese parámetro se elimina también de memoria, según los resultados, hay que crear el parámetro en tiempo de ejecución:
Código Delphi [-]
procedure TForm1.btnActualizaClick(Sender: TObject);
Var
  FechaActual : TDateTime;
begin

  with ADOQCambiar do
  begin
    SQL.Clear;

    SQL.Add ('UPDATE CuotasEmitidas SET FecSituacion = :pFecha'+
            'WHERE CuotasEmitidas.CodPers = 1801 ' +
            'AND CuotasEmitidas.NumRecibo = 810375');

    with Parameters.AddParameter do begin
           DataType := ftDateTime;
           Name := 'pFecha'; 
           Direction := pdInput;
           Value := now;
    end;
    Prepared := True;
    ExecSQL;
 end;
end;

A ver qué nos dice ahora :(

OFFTOPIC: ¿donde están los expertos en ADO? ¿de espectadores? :D

Saludos

javi.donvito 03-12-2008 14:56:43

Lo he probado tal cual como está escrito el procedure y me genera el siguiente error en la instruccion ExecSql:

"...exception class OleException with message "Multiple - step Ole Db operation generated errors. Check Ole Db Status value, if avalaible. No Work was done"


Gracias

ContraVeneno 03-12-2008 16:16:05

Código Delphi [-]
procedure TfReenvios.BitBtn2Click(Sender: TObject);
begin
with ADOQCambiar do begin
  // Actualizar
  If active then Close;
  SQL.Clear;
  SQL.Add ('UPDATE CuotasEmitidas SET FecSituacion = :Fecha ');
  SQL.Add('WHERE CuotasEmitidas.CodPers = 1801 ');
  SQL.Add('AND CuotasEmitidas.NumRecibo = 810375');
  Parameters.ParamByName('Fecha').Value := Now;
  ExecSQL;
 end; //with
end;

Eso funciona, comprobado. Cualquier error que te marque, no es culpa de este código y deberías buscar el error en otro lado.

javi.donvito 03-12-2008 18:18:01

Desgraciadamente me sigue dando los mismos errores. Miraré y seguiré investigando de que puede ser si logro descubrirlo os lo haré saber (si alguien tiene alguna sugerencia, será bienvenida)

Muchas gracias

javi.donvito 17-12-2008 18:21:29

Ha llegado el momento de explicaros de donde me venia el problema. Me he pasado días y días mirando por Internet, “rastreando” las causas del error y cada vez que modificaba el código del programa la pesadilla continuaba, yo creía que el problema venia en que estaba pasando mal los parámetros en la fecha o alguna historia de este tipo (eso me pasa por obcecarme en la misma idea)

La pista me la dió uno de los errores que me generaba
Microsoft SQL Server Driver. Caracteristica opcional no implementada

El tema es que originalmente la aplicación del cliente fue desarrollada en VB6 y utiliza como bases de datos Microsoft SQL Server 2000. Habia que hacer unas modificaciones y he usado Delphi 7. Los errores me los daba tanto en Windows XP como en Vista.

La Solución:

http://support.microsoft.com/kb/294160/es

Personalmente para resolver el problema del paso de las fechas por parámetro, he tenido que modificar la cadena de conexión ADO y también el código de la aplicación para que me fuera aceptada la fecha cuando se realiza la modificación del registro.

La cadena de conexión que usaba en la propiedad ConectionString del componente ADOConection era la siguiente:

Provider=MSDASQL.1;Password=password;Persist Security Info=True;User ID=nombre_usuario;Data Source=sqllaco;Mode=ReadWrite;Extended Properties="DSN=midsn;UID=sa;PWD=laco;APP=Enterprise;WSID=JAVIER_LOCAL;DATABASE=RECIBOS";Initial Catalog=RECIBOS

Y ahora es:

Provider=SQLOLEDB.1;Password=password;User ID=nombre_usuario;Data Source=sqllaco;Mode=ReadWrite;Extended Properties="DSN=midsn;UID=sa;PWD=laco;APP=Enterprise;WSID=JAVIER_LOCAL;DATABASE=RECIBOS";Initial Catalog=RECIBOS

La parte Persist Security Info=True, que aparece en la antigua configuración, en la nueva, se suprime (no recuerdo exactamente en que pagina encontré este dato, creo que en la misma web del enlace)

Y el código de programa para que esto funcione es el siguiente:

Código Delphi [-]
 procedure TForm1.Button1Click(Sender: TObject);
Var
  FechaActual : TDateTime;
begin
  FechaActual :=now;
  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Text:='Update CuotasEmitidas SET ImpRecibo = 21.02, FecSituacion= :MiFecha ' +
    ' WHERE (CuotasEmitidas.CodPers = 462 AND CuotasEmitidas.NumRecibo = 1)';
//---------------------------------------------
//  Si añado este bloque me genera error    
(*   with Parameters.AddParameter do
    begin
      DataType:=ftDate;
      Name :='MiFecha';
      Direction:=pdInput;
    end;*) 
// ------------------------------
Parameters.ParamByName('MiFecha').Value:=StrToDate(FormatDateTime('dd/mm/yyyy',fechaActual));
    Prepared:=True;
    if prepared then
       ExecSQL;
  end;

Si añado el bloque de código que lo tengo como comentario, me genera el error:

Multiple Step OLE DB operation generated errors. Check each OLE DB status value, if avalaible. No work was done.

Y en al ADOQuery1 no tengo ningún parámetro creado !

Bueno, pues aqui dejo esto por si alguien le puede servir de ayuda.
Saludos


Lepe 17-12-2008 21:18:24

Me alegro que hayas encontrado la solución... estaba bastante escondida, es lo último en que pensamos.

Sobre los parámetros, bueno, en cuanto se asigna el SQL.TEXT o se añaden textos, se parsea y se crea la lista de parámetros automáticamente (al menos era así con BDE y otros. ADO tenía sus detalles, pero no recuerdo). Lo que intento decir es que si el parámetro está creado y tú intentas crear otro con el mismo nombre, es lógico que dé error.

Si el parámetro no estuviese creado, no podrías asignar su valor ;).

Saludos


La franja horaria es GMT +2. Ahora son las 04:01:36.

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