Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   como seria el ParamByName de una query pero del tipo fecha (https://www.clubdelphi.com/foros/showthread.php?t=81929)

pjacob80 05-01-2013 04:43:33

como seria el ParamByName de una query pero del tipo fecha
 
hola amigos, estoy haciendo un insert en una base de datos firebird, y me tira error, a ver si alguien me puede ayudar, me dice que no existe el asdate, pero el campo es del tipo date, no se cual seria el indicador para eso...


el codigo:

Código Delphi [-]
   fprincipal.Query3.Active := false;
   fprincipal.Query3.SQL.Clear;
   fprincipal.Query3.SQL.Add('insert into temporaltrabajos (fecha, monto, vehiculo, detalle) values (:ffecha, :mmonto, :vvehiculo, :ddetalle)');
        fprincipal.query3.SQL.Add('where (codcliente=:codcliente)');
        fprincipal.Query3.sql.add('order by fecha');
        fprincipal.query3.ParamByName('ffecha').asdate:=fprincipal.query2.fieldByName('fecha').Asdate;
        fprincipal.query3.ParamByName('mmonto').Asfloat:=fprincipal.query2.fieldByName('monto').Asfloat;
        fprincipal.query3.ParamByName('vvehiculo').Asstring:=fprincipal.query2.fieldByName('vehiculo').Asstr  ing;
        fprincipal.query3.ParamByName('ddetalle').Asstring:=fprincipal.query2.fieldByName('detalle').Asstrin  g;
   fprincipal.Query3.Active := True;
   fprincipal.Query3.Open;

el el query2 tengo la consulta de la tabla trabajos, y quiero copiar 1 solo registro a la tabla temporaltrabajos (query3)

tal vez lo que hago es una burrada, y existe una forma mas facil.... no se...

Casimiro Notevi 05-01-2013 11:42:49

Sin ver la estructura de la tabla, así a palos de ciego, seguramente es datetime

marcoszorrilla 05-01-2013 13:15:03

Código Delphi [-]
procedure TfrAltas1Vendedor.BitBtn1Click(Sender: TObject);
begin
DmCli.IBDtsCli.Close;
DmCli.IBDtsCli.SelectSQL.Clear;
DmCli.IBDtsCli.SelectSQL.Add('Select * from Clientes ');
DmCli.IBDtsCli.SelectSQL.Add('Where Vendedor = :V ');
DmCli.IBDtsCli.SelectSQL.Add('And Alta Between :F1 And :F2 ');
DmCli.IBDtsCli.SelectSQL.Add('Order by Alta');
DmCli.IBDtsCli.ParamByName('V').AsString:=DmCli.IBDtsVendCODIGO.Value;
DmCli.IBDtsCli.ParamByName('F1').AsDate:=DtpkIni.Date;
DmCli.IBDtsCli.ParamByName('F2').AsDate:=DtpkFin.Date;
DmCli.IBDtsCli.Open;

DmCli.IBDtsCli.Last;
lbClientes.Caption:='Total Clientes: '+IntToStr(DmCli.IBDtsCli.RecordCount);
end;

Un Saludo.

pjacob80 05-01-2013 14:12:57

Cita:

Empezado por Casimiro Notevi (Mensaje 452938)
Sin ver la estructura de la tabla, así a palos de ciego, seguramente es datetime

el campo estaba definido como tipo date. ahora los cambie por timestamp para usar datetimepickers y que me guarde la hora tambien. el tema es que me guarda siempre la misma hora.... no se que pasa...

el codigo que uso es este:

Código Delphi [-]
        fprincipal.Query1.Active := false;
        fprincipal.query1.sql.clear;
        fprincipal.Query1.sql.Add('insert into pagos (fecha, cliente, monto, cobrador, codpago) values (:fecha, :cliente, :monto, :cobrador, :codpago)');
        fprincipal.Query1.ParamByName('fecha').AsDatetime:=datetimepicker1.Datetime;
        fprincipal.Query1.ParamByName('cliente').Asinteger:=spinedit1.value;
        fprincipal.Query1.ParamByName('monto').Asfloat:=strtofloat(edit3.text);
        fprincipal.Query1.ParamByName('cobrador').Asstring:=Fprincipal.Panelusuario.Caption;
        fprincipal.Query1.ParamByName('codpago').Asinteger:=codigodepago;
        fprincipal.Query1.Active := True;

TiammatMX 05-01-2013 14:47:16

Cita:

Empezado por pjacob80 (Mensaje 452941)
Código Delphi [-]
.
.
.

        fprincipal.Query1.ParamByName('fecha').AsDatetime:=datetimepicker1.Datetime;.
.
.
.

¿Y por qué no intentas

Código Delphi [-]
        ParamByName('fecha').AsDate := Trunc(datetimepicker1.Date);

A mí siempre me funciona y no se "atora" por cuestiones de "casteo", simplemente, continúa y guarda el valor correcto..., o de plano, irte por sustituir cada parámetro por su valor en una cadena al contruir tu sentencia SQL. De ésta forma, podrías utilizar el valor y evitarte dolores de cabeza. Suerte.

pjacob80 05-01-2013 14:52:20

pero yo quiero guardarlo completo, fecha y hora, para con eso diferenciar registros que se fueron dando de alta, en distinto tiempo.

TiammatMX 05-01-2013 14:56:28

Cita:

Empezado por pjacob80 (Mensaje 452943)
pero yo quiero guardarlo completo, fecha y hora, para con eso diferenciar registros que se fueron dando de alta, en distinto tiempo.

No hay problema, no usas Trunc(), pero siempre puedes usar FormatDateTime() y componerlo directamente en el texto de la sentencia SQL que estás construyendo. O que el campo de tu tabla en donde estés guardando tome el timestamp automáticamente cada vez que se inserte un registro.

Digo, opciones hay, y cuando una estrategia falla, siempre se puede elegir otra.

pjacob80 05-01-2013 15:15:34

claro, pero yo al meterlo directo, me lo guarda bien, ya no me da el error que me daba, el problema ahora es que me pone siempre la misma hora. no me la cambia al guardar.

ecfisa 05-01-2013 20:35:42

Cita:

Empezado por pjacob80 (Mensaje 452935)
hola amigos, estoy haciendo un insert en una base de datos firebird, y me tira error, a ver si alguien me puede ayudar, me dice que no existe el asdate, pero el campo es del tipo date, no se cual seria el indicador para eso...


el codigo:

Código Delphi [-]
   fprincipal.Query3.Active := false;
   fprincipal.Query3.SQL.Clear;
   fprincipal.Query3.SQL.Add('insert into temporaltrabajos (fecha, monto, vehiculo, detalle) values (:ffecha, :mmonto, :vvehiculo, :ddetalle)');
   fprincipal.query3.SQL.Add('where (codcliente=:codcliente)');
   fprincipal.Query3.sql.add('order by fecha');
   fprincipal.query3.ParamByName('ffecha').asdate:=fprincipal.query2.fieldByName('fecha').Asdate;
   fprincipal.query3.ParamByName('mmonto').Asfloat:=fprincipal.query2.fieldByName('monto').Asfloat;
   fprincipal.query3.ParamByName('vvehiculo').Asstring:=fprincipal.query2.fieldByName('vehiculo').Asstr  ing;
   fprincipal.query3.ParamByName('ddetalle').Asstring:=fprincipal.query2.fieldByName('detalle').Asstrin  g;
   fprincipal.Query3.Active := True;
   fprincipal.Query3.Open;

el el query2 tengo la consulta de la tabla trabajos, y quiero copiar 1 solo registro a la tabla temporaltrabajos (query3)

tal vez lo que hago es una burrada, y existe una forma mas facil.... no se...

Hola.

No entiendo el por qué de esta línea:
Código SQL [-]
fprincipal.query3.SQL.Add('where (codcliente=:codcliente)');
¿ Para que requerir la existencia si estas realizando un INSERT ? ¿ O deseabas modificar ?

Y de esta:
Código SQL [-]
fprincipal.Query3.sql.add('order by fecha');
¿ Usar ORDER BY en un ingreso ?

Probá creándote una tabla simple de prueba:
Código SQL [-]
CREATE TABLE HORARIOS (
    FECHA_DESDE      DATE,        
    FECHA_HASTA      TIMESTAMP
)

Luego, de este modo, no tendrías que tener ningún problema:
Código Delphi [-]
  with IBQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('INSERT INTO TABLA (FECHA_DESDE, FECHA_HASTA)');
    SQL.Add('VALUES (:PDESDE, :PHASTA)');
    ParamByName('PDESDE').AsDate     := DateTimePickerDesde.Date;   
    ParamByName('PHASTA').AsDateTime := DateTimePickerHasta.DateTime;
    ExecSQL;
  end;

Saludos. :)

pjacob80 10-01-2013 00:42:01

Muchas gracias a todos por las respuestas! ;)


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

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