PDA

Ver la Versión Completa : como seria el ParamByName de una query pero del tipo fecha


pjacob80
05-01-2013, 04:43:33
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:


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
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
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:


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
.
.
.

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


¿Y por qué no intentas

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
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
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:


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:
fprincipal.query3.SQL.Add('where (codcliente=:codcliente)');
¿ Para que requerir la existencia si estas realizando un INSERT ? ¿ O deseabas modificar ?

Y de esta:
fprincipal.Query3.sql.add('order by fecha');
¿ Usar ORDER BY en un ingreso ?

Probá creándote una tabla simple de prueba:

CREATE TABLE HORARIOS (
FECHA_DESDE DATE,
FECHA_HASTA TIMESTAMP
)


Luego, de este modo, no tendrías que tener ningún problema:

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! ;)