PDA

Ver la Versión Completa : Problema con consulta (Extraño)


Caral
02-03-2007, 21:07:40
Hola a todos y gracias de antemano por su ayuda.
Tengo esta consulta:


procedure TFReporteDiario.DTP1Change(Sender: TObject);
begin
ShortDateFormat := 'dd/mm/yyyy';
ADOQuery1.Active:= False;
ADOQuery1.SQL.Text:= 'SELECT DISTINCTROW Factura.Fecha, Factura.Terminos, Sum(Factura.MntTotal) AS SumaDeMntTotal '+
' FROM Factura '+
' WHERE Factura.Fecha = #'+DateToStr(DTP1.DateTime)+'# AND Factura.Terminos = "Contado" '+
' GROUP BY Factura.Fecha, Factura.Terminos ';
ADOQuery1.Active:= True;

ADOQuery2.Active:= False;
ADOQuery2.SQL.Text:= 'SELECT DISTINCTROW Factura.Fecha, Factura.Terminos, Sum(Factura.MntTotal) AS SumaDeMntTotal '+
' FROM Factura '+
' WHERE Factura.Fecha = #'+DateToStr(DTP1.DateTime)+'# AND Factura.Terminos = "Credito" '+
' GROUP BY Factura.Fecha, Factura.Terminos ';
ADOQuery2.Active:= True;

ADOQuery3.Active:= False;
ADOQuery3.SQL.Text:= 'SELECT DISTINCTROW PagosAdelanto.FechaTransac, Sum(PagosAdelanto.MontoCompra) AS [Suma De MontoCompra], Sum(PagosAdelanto.Abono) AS [Suma De Abono] '+
' FROM PagosAdelanto'+
' WHERE PagosAdelanto.FechaTransac = #'+DateToStr(DTP1.DateTime)+'#'+
' GROUP BY PagosAdelanto.FechaTransac ';
ADOQuery3.Active:= True;

ADOQuery4.Active:= False;
ADOQuery4.SQL.Text:= 'SELECT DISTINCTROW BancoNac.FechaTransac, Sum(BancoNac.Retiros) AS [Suma De Retiros], Sum(BancoNac.Depositos) AS [Suma De Depositos] '+
' FROM BancoNac'+
' WHERE BancoNac.FechaTransac = #'+DateToStr(DTP1.DateTime)+'#'+
' GROUP BY BancoNac.FechaTransac ';
ADOQuery4.Active:= True;

ADOQuery5.Active:= False;
ADOQuery5.SQL.Text:= 'SELECT DISTINCTROW BancoSanJoseco.FechaTransac, Sum(BancoSanJoseco.Retiros) AS [Suma De Retiros], Sum(BancoSanJoseco.Depositos) AS [Suma De Depositos] '+
'FROM BancoSanJoseco'+
' WHERE BancoSanJoseco.FechaTransac = #'+DateToStr(DTP1.DateTime)+'#'+
' GROUP BY BancoSanJoseco.FechaTransac ';
ADOQuery5.Active:= True;

ADOQuery6.Active:= False;
ADOQuery6.SQL.Text:= 'SELECT DISTINCTROW BancoSanJosedol.FechaTransac, Sum(BancoSanJosedol.Retiros) AS [Suma De Retiros], Sum(BancoSanJosedol.Depositos) AS [Suma De Depositos] '+
' FROM BancoSanJosedol'+
' WHERE BancoSanJosedol.FechaTransac = #'+DateToStr(DTP1.DateTime)+'#'+
' GROUP BY BancoSanJosedol.FechaTransac ';
ADOQuery6.Active:= True;

ADOQuery7.Active:= False;
ADOQuery7.SQL.Text:= 'SELECT DISTINCTROW CxPDetalle.FechaPago, CxPDetalle.TipoTransac, Sum(CxPDetalle.Monto) AS [Suma De Monto] '+
' FROM CxPDetalle'+
' WHERE CxPDetalle.FechaPago = #'+DateToStr(DTP1.DateTime)+'# AND CxPDetalle.TipoTransac ="PA" '+
' GROUP BY CxPDetalle.FechaPago, CxPDetalle.TipoTransac';
ADOQuery7.Active:= True;

ADOQuery8.Active:= False;
ADOQuery8.SQL.Text:= 'SELECT DISTINCTROW CxCDetalle.FechaCobro, CxCDetalle.TipoTransac, Sum(CxCDetalle.Monto) AS [Suma De Monto] '+
' FROM CxCDetalle'+
' WHERE CxCDetalle.FechaCobro = #'+DateToStr(DTP1.DateTime)+'# AND CxCDetalle.TipoTransac ="PA" '+
' GROUP BY CxCDetalle.FechaCobro, CxCDetalle.TipoTransac';
ADOQuery8.Active:= True;
end;




Lo extraño es que funciona y da bien los datos en algunas fechas en otras los datos los da incompletos, he revisado las tablas y los datos estan y correctos.
Por que sera que funciona a veces.?
Gracias por su ayuda.

Edito: No hay forma que me quede bien presentado con las etiquetas delphi.
Saludos

ContraVeneno
02-03-2007, 21:22:44
¿de que base de datos estamos hablando?

Yo te podría recomendar dos cosas:

1. Dale nombre a tus componentes, es más fácil saber que qryBancos es la consulta de bancos y es más dificil recordar para que srive ADOQuery7.

2. En lugar de utilizar SQL.Text yo te recomendaría utilizar SQL.Add(''). Esto porque al utilizar .Text toda tu consulta se presentará en una sola línea, a diferencia de utilizar .Add() en donde la consulta se presenta según el número de líneas que utilizes. Esto tiene su principal ventaja en que si tienes algún error en tu consulta, la excepción te regresará el número de línea donde tienes el error. En cambio si utilizas .Text la excepción siempre te dirá que el error esta en la línea 1.

Caral
02-03-2007, 21:36:11
Gracias ContraVeneno
La base de datos es access.
Tienes razon con lo de los nombres, casi siempre lo hago, solo cuando tengo prisa,no.
Curioso:
Cuando hago la consulta con add, me manda un error se sintaxis, en text, no.
Lo curioso es que funciona bien con todas las fechas que no sean hoy ni aller, osea da correcta la consulta en fechas menores del dia 28/02/2007, mayores a esta no.
Seguro no quiere trabajar mas, se canso.:D
Saludos

roman
02-03-2007, 21:41:05
Yo no entiendo, dices, "tengo esta consulta", pero en realidad ¡tienes ocho! ¿Fallan todas? ¿No podríamos concentrarnos en una sóla?

// Saludos

jhonny
02-03-2007, 21:41:46
Nunca en mi vida he trabajado con Acces pero quizá sea porque el formato de la fecha debe ser mm/dd/yyyy, si fuese eso tendrías que hacer:

FormatDate('mm/dd/yyyy', DTP1.DateTime);

en lugar de


DateToStr(DTP1.DateTime);


Yo no entiendo, dices, "tengo esta consulta", pero en realidad ¡tienes ocho!

jejeje, lo mismo se me paso por la cabeza cuando comence a leer jejeje

roman
02-03-2007, 21:44:44
Lo de la fecha lo está solventando con:


ShortDateFormat := 'dd/mm/yyyy';


De cualquier forma, es cierto que lo mejor es usar parámetros en lugar de pasar la fecha mezclada con la consulta.

// Saludos

Caral
02-03-2007, 21:52:44
Gracias Roman y jhonny
Son varias consultas pero si la fecha es menor que 01/03/2007, funciona bien.
Lo que me extraña es eso, por que en alguna fechas si y en otras no.
La base de datos esta actualizada y contiene la informacion.
Saludos

roman
02-03-2007, 21:57:55
Ok, pero, vuelvo a preguntar, ¿fallan todas las consultas?

// Saludos

jhonny
02-03-2007, 21:58:56
Lo de la fecha lo está solventando

Tienes razon...

En cuanto al problema, ¿Estas totalmente seguro de que estas conectado a la BD que tiene los datos reales y actualizados?

Caral
02-03-2007, 21:59:23
Exacto Roman, fallan todas, si la fecha es menor a hoy.
De lo contrario todas funciona bien.
Saludos

delphi.com.ar
02-03-2007, 22:00:10
Yo no entiendo, dices, "tengo esta consulta", pero en realidad ¡tienes ocho! ¿Fallan todas? ¿No podríamos concentrarnos en una sóla?
Por eso mismo me abstuve de responder.. :D

Hay algo a tener en cuenta, en Access es algo riesgoso trabajar con fechas con el formato #fecha#, porque Access se encarga de convertir el formato automáticamente, y para el motor: #1/31/2007# = #31/1/2007# porque se encarga automáticamente de convalidar el formato. Prueba:
SELECT #1/31/2007#, #31/1/2007#
Entonces si trabajamos con ese formato, no será seguro que hará con fechas donde el día sea menor a 12. (Esto lo resuelve según la configuración regional)

Entonces las opciones mas seguras son utilizar bind parameters, o utilizar alguna función como DateSerial, donde el orden de los parámetros no cambia:
SELECT ..
WHERE FECHA = DateSerial(2007,1,31)

Saludos!

Caral
02-03-2007, 22:02:11
Correcto jhonny
La con la fecha lo soluciono como dice Roman.
Los datos estan actualizados y me conecto bien.
El problema esta en que no quiere trabajar mas osea hoy, sera por que es viernes y hace calor y necesito una cerveza y salir del trabajo.:D
Saludos

roman
02-03-2007, 22:04:22
¡Válgame! ¿Hay algo en lo que access sea estándar? Tiene total lógica lo que dices, el 1 de marzo daría problemas y no así el 28 de febrero. Ahora pregunto, si pasas las fechas con parámetros, ¿si funciona?

// Saludos

Caral
02-03-2007, 22:08:53
No se Roman, Como lo hago?
Me das un ejemplo en un caso.
Por otro lado, cambie la sintaxis y sigue, asi:
ShortDateFormat := '#dd/mm/yyyy#';
ADOQuery1.Active:= False;
ADOQuery1.SQL.Text:= 'SELECT DISTINCTROW Factura.Fecha, Factura.Terminos, Sum(Factura.MntTotal) AS SumaDeMntTotal '+
' FROM Factura '+
' WHERE Factura.Fecha = '+DateToStr(DTP1.DateTime)+' AND Factura.Terminos = "Contado" '+
' GROUP BY Factura.Fecha, Factura.Terminos ';
ADOQuery1.Active:= True;
Saludos

jhonny
02-03-2007, 22:09:05
Caramba¡¡¡, ya recuerdo porque acces nunca me a llamado la atención.

jhonny
02-03-2007, 22:12:10
Supongo que deberia ser algo como:


ShortDateFormat := 'dd/mm/yyyy';
ADOQuery1.Active:= False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add := 'SELECT DISTINCTROW Factura.Fecha, Factura.Terminos,';
ADOQuery1.SQL.Add := 'Sum(Factura.MntTotal) AS SumaDeMntTotal ';
ADOQuery1.SQL.Add := 'FROM Factura ';
ADOQuery1.SQL.Add := 'WHERE Factura.Fecha = :fecha AND Factura.Terminos = "Contado" ';
ADOQuery1.SQL.Add := 'GROUP BY Factura.Fecha, Factura.Terminos ';
ADOQuery1.ParamByName('fecha').AsDateTime := DateTimePicker1.Date; //Donde DateTimePicker1.
//es un ejemplo de un componente que asumo se llame asi
ADOQuery1.Active:= True;


Edite: para organizar un poco a ver si se ve mejor.

roman
02-03-2007, 22:15:10
No, no. Pensé lo mismo. Pero ADO maneja distinto los parámetros. Deja reviso.

// Saludos

vtdeleon
02-03-2007, 22:32:14
Saludos

Solo cambiar y agregar algo:
ADOQuery1.Parameter.ParamByName('fecha').value := DateTimePicker1.Date; //Donde DateTimePicker1.
ADOQuery1.Parameter.ParamByName('fecha').DataType:=ftDate
Ado muchas veces no convierte el parametro al tipo de dato que deberia ser.

Caral
02-03-2007, 22:33:37
Hola
Asi:
ShortDateFormat := 'dd/mm/yyyy';
ADOQuery1.Active:= False;
ADOQuery1.SQL.Text:= 'SELECT DISTINCTROW Factura.Fecha, Factura.Terminos, Sum(Factura.MntTotal) AS SumaDeMntTotal '+
' FROM Factura '+
' WHERE Factura.Fecha = :Fecha AND Factura.Terminos = "Contado" '+
' GROUP BY Factura.Fecha, Factura.Terminos ';
ADOQuery1.Active:= True;
ADOQuery1.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
Me funciono en este primero.
Curioso me ve el dia 2, no el dia 1
Saludos

Caral
02-03-2007, 22:39:39
Hola
Tanto la opcion de jhonny como la de vtdeleon funcionan solo hay que cambiar una pequeña cosa, aun asi sigue con el problema, no ve el 1,
ve el 2, y del 28 para atras, es extraño.
saludos

Caral
02-03-2007, 22:43:09
Hola
Opcion jhonny:
ADOQuery1.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
Opcion vtdeleon:
ADOQuery1.Parameters.ParamByName('fecha').value := StrToDate(DateToStr(DTP1.Date));
ADOQuery1.Parameters.ParamByName('fecha').DataType:=ftDate ;
La dos funcionan igual.
Muchas gracias por estar ayudandome.
Saludos

vtdeleon
02-03-2007, 22:47:01
StrToDate(DateToStr(DTP1.Date))
No creo que sea necesario hacer todas esas conversiones, con solo poner DTP1.date, debería bastar.

Caral
02-03-2007, 22:54:40
Hola vtdeleon
Gracias por estar ayudandome;
No vasta, me da un error dice que no coinciden los tipos, si pongo todo eso si funciona bien.
Saludos

Caral
02-03-2007, 23:08:04
Hola
Muchisimas Gracias a todos, ya lo solucione, con la opcion de jhonny modificada, ya me da todos los datos.
Nota: La opcion de vtdeleon funciona a la perfecion tambien.
Sois unos verdaderos Maestros.
Muchas Gracias de nuevo y que paseis un buen fin de semana.
Saludos

jhonny
02-03-2007, 23:11:38
Me alegra que todo vaya bien :) , Pero me da curiosidad y seria bueno que nos mostraras cómo quedo finalmente la cosa ;).

roman
02-03-2007, 23:14:06
Yo también quiero verlo. La verdad es que la opción de Van Troi fue lo que intenté pero intercambiando el orden: primero el DataType y luego la sustitución, y simplemente no me encuentra ningún registro.

// Saludos

Caral
02-03-2007, 23:18:43
Hola
Gracias jhonny
Asi Quedo:

procedure TFReporteDiario.DTP1Change(Sender: TObject);
begin
ADOQuery1.Active:= False;
ADOQuery1.SQL.Text:= 'SELECT DISTINCTROW Factura.Fecha, Factura.Terminos, Sum(Factura.MntTotal) AS SumaDeMntTotal '+
' FROM Factura '+
' WHERE Factura.Fecha = :Fecha AND Factura.Terminos = "Contado" '+
' GROUP BY Factura.Fecha, Factura.Terminos ';
ADOQuery1.Active:= True;
ADOQuery1.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
// esta opcion tambien sirve
// ADOQuery1.Parameters.ParamByName('fecha').value := StrToDate(DateToStr(DTP1.Date));
// ADOQuery1.Parameters.ParamByName('fecha').DataType:=ftDate ;
ADOQuery2.Active:= False;
ADOQuery2.SQL.Text:= 'SELECT DISTINCTROW Factura.Fecha, Factura.Terminos, Sum(Factura.MntTotal) AS SumaDeMntTotal '+
' FROM Factura '+
' WHERE Factura.Fecha = :Fecha AND Factura.Terminos = "Credito" '+
' GROUP BY Factura.Fecha, Factura.Terminos ';
ADOQuery2.Active:= True;
ADOQuery2.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));

ADOQuery3.Active:= False;
ADOQuery3.SQL.Text:= 'SELECT DISTINCTROW PagosAdelanto.FechaTransac, Sum(PagosAdelanto.MontoCompra) AS [Suma De MontoCompra], Sum(PagosAdelanto.Abono) AS [Suma De Abono] '+
' FROM PagosAdelanto'+
' WHERE PagosAdelanto.FechaTransac = :FechaTransac'+
' GROUP BY PagosAdelanto.FechaTransac ';
ADOQuery3.Active:= True;
ADOQuery3.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));

ADOQuery4.Active:= False;
ADOQuery4.SQL.Text:= 'SELECT DISTINCTROW BancoNac.FechaTransac, Sum(BancoNac.Retiros) AS [Suma De Retiros], Sum(BancoNac.Depositos) AS [Suma De Depositos] '+
' FROM BancoNac'+
' WHERE BancoNac.FechaTransac = :FechaTransac'+
' GROUP BY BancoNac.FechaTransac ';
ADOQuery4.Active:= True;
ADOQuery4.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));

ADOQuery5.Active:= False;
ADOQuery5.SQL.Text:= 'SELECT DISTINCTROW BancoSanJoseco.FechaTransac, Sum(BancoSanJoseco.Retiros) AS [Suma De Retiros], Sum(BancoSanJoseco.Depositos) AS [Suma De Depositos] '+
'FROM BancoSanJoseco'+
' WHERE BancoSanJoseco.FechaTransac = :FechaTransac'+
' GROUP BY BancoSanJoseco.FechaTransac ';
ADOQuery5.Active:= True;
ADOQuery5.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));

ADOQuery6.Active:= False;
ADOQuery6.SQL.Text:= 'SELECT DISTINCTROW BancoSanJosedol.FechaTransac, Sum(BancoSanJosedol.Retiros) AS [Suma De Retiros], Sum(BancoSanJosedol.Depositos) AS [Suma De Depositos] '+
' FROM BancoSanJosedol'+
' WHERE BancoSanJosedol.FechaTransac = :FechaTransac'+
' GROUP BY BancoSanJosedol.FechaTransac ';
ADOQuery6.Active:= True;
ADOQuery6.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));

ADOQuery7.Active:= False;
ADOQuery7.SQL.Text:= 'SELECT DISTINCTROW CxPDetalle.FechaPago, CxPDetalle.TipoTransac, Sum(CxPDetalle.Monto) AS [Suma De Monto] '+
' FROM CxPDetalle'+
' WHERE CxPDetalle.FechaPago = :FechaPago AND CxPDetalle.TipoTransac ="PA" '+
' GROUP BY CxPDetalle.FechaPago, CxPDetalle.TipoTransac';
ADOQuery7.Active:= True;
ADOQuery7.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));

ADOQuery8.Active:= False;
ADOQuery8.SQL.Text:= 'SELECT DISTINCTROW CxCDetalle.FechaCobro, CxCDetalle.TipoTransac, Sum(CxCDetalle.Monto) AS [Suma De Monto] '+
' FROM CxCDetalle'+
' WHERE CxCDetalle.FechaCobro = :FechaCobro AND CxCDetalle.TipoTransac ="PA" '+
' GROUP BY CxCDetalle.FechaCobro, CxCDetalle.TipoTransac';
ADOQuery8.Active:= True;
ADOQuery8.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));

end;
Si no se ve bien, por favor arreglenlo.
Roman, jhonny, vtdeleon, delphi.com.ar y todos muchas gracias
Saludos

jhonny
02-03-2007, 23:29:28
Si le quitamos unas cuantas lineas al principio también te funcionaria?:

ADOQuery1.Active:= False;
ADOQuery1.SQL.Text:= 'SELECT DISTINCTROW Factura.Fecha, Factura.Terminos, Sum(Factura.MntTotal) AS SumaDeMntTotal '+
' FROM Factura '+
' WHERE Factura.Fecha = :Fecha AND Factura.Terminos = :Termino '+
' GROUP BY Factura.Fecha, Factura.Terminos ';
ADOQuery1.Active:= True;
ADOQuery1.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
ADOQuery1.Parameters[1].Value:= 'Contado';

ADOQuery2.Active:= False;
ADOQuery2.Active:= True;
ADOQuery2.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
ADOQuery2.Parameters[1].Value:= 'Credito';

ADOQuery3.Active:= False;
ADOQuery3.SQL.Text:= 'SELECT DISTINCTROW PagosAdelanto.FechaTransac, Sum(PagosAdelanto.MontoCompra) AS [Suma De MontoCompra], Sum(PagosAdelanto.Abono) AS [Suma De Abono] '+
' FROM PagosAdelanto'+
' WHERE PagosAdelanto.FechaTransac = :FechaTransac'+
' GROUP BY PagosAdelanto.FechaTransac ';
ADOQuery3.Active:= True;
ADOQuery3.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
ADOQuery4.Active:= False;
ADOQuery4.SQL.Text:= 'SELECT DISTINCTROW BancoNac.FechaTransac, Sum(BancoNac.Retiros) AS [Suma De Retiros], Sum(BancoNac.Depositos) AS [Suma De Depositos] '+
' FROM BancoNac'+
' WHERE BancoNac.FechaTransac = :FechaTransac'+
' GROUP BY BancoNac.FechaTransac ';
ADOQuery4.Active:= True;
ADOQuery4.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
ADOQuery5.Active:= False;
ADOQuery5.SQL.Text:= 'SELECT DISTINCTROW BancoSanJoseco.FechaTransac, Sum(BancoSanJoseco.Retiros) AS [Suma De Retiros], Sum(BancoSanJoseco.Depositos) AS [Suma De Depositos] '+
'FROM BancoSanJoseco'+
' WHERE BancoSanJoseco.FechaTransac = :FechaTransac'+
' GROUP BY BancoSanJoseco.FechaTransac ';
ADOQuery5.Active:= True;
ADOQuery5.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
ADOQuery6.Active:= False;
ADOQuery6.SQL.Text:= 'SELECT DISTINCTROW BancoSanJosedol.FechaTransac, Sum(BancoSanJosedol.Retiros) AS [Suma De Retiros], Sum(BancoSanJosedol.Depositos) AS [Suma De Depositos] '+
' FROM BancoSanJosedol'+
' WHERE BancoSanJosedol.FechaTransac = :FechaTransac'+
' GROUP BY BancoSanJosedol.FechaTransac ';
ADOQuery6.Active:= True;
ADOQuery6.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
ADOQuery7.Active:= False;
ADOQuery7.SQL.Text:= 'SELECT DISTINCTROW CxPDetalle.FechaPago, CxPDetalle.TipoTransac, Sum(CxPDetalle.Monto) AS [Suma De Monto] '+
' FROM CxPDetalle'+
' WHERE CxPDetalle.FechaPago = :FechaPago AND CxPDetalle.TipoTransac ="PA" '+
' GROUP BY CxPDetalle.FechaPago, CxPDetalle.TipoTransac';
ADOQuery7.Active:= True;
ADOQuery7.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
ADOQuery8.Active:= False;
ADOQuery8.SQL.Text:= 'SELECT DISTINCTROW CxCDetalle.FechaCobro, CxCDetalle.TipoTransac, Sum(CxCDetalle.Monto) AS [Suma De Monto] '+
' FROM CxCDetalle'+
' WHERE CxCDetalle.FechaCobro = :FechaCobro AND CxCDetalle.TipoTransac ="PA" '+
' GROUP BY CxCDetalle.FechaCobro, CxCDetalle.TipoTransac';
ADOQuery8.Active:= True;
ADOQuery8.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));

Caral
02-03-2007, 23:44:32
Hola
Tienes toda la razon jhonny y queda mas claro el codigo y legible.
Muchas gracias por el tiempo que me disteis, la verdad ya me tenia un poco loco esto.
Gracias Maestro.
Saludos

vtdeleon
02-03-2007, 23:47:33
No entiendo como funciona al reves.
ADOQuery1.Active:= True;
ADOQuery1.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));Es decir, primero activas el Query y despues el parametro :confused:, No sabía que se podía hacer así.

Saludos

roman
02-03-2007, 23:50:19
Pues a mi que me aspen pero no entiendo nada. ¿Cómo está eso de que primero activan la consulta y luego sustituyen los parámetros? ¿ESO funciona? :eek:;

// Saludos

jhonny
02-03-2007, 23:51:52
No enteindo como funciona al revez.

No se porque no había preguntado eso antes, pues de hecho cuando puse ese código al revés inmediatamente caí en cuenta lo edite y lo coloque al derecho, pero luego Caral dijo que funciono y bueno yo también me quede medio enredado.

vtdeleon
02-03-2007, 23:52:55
Estamos todos enliado:D. Caral danos luz!

Caral
03-03-2007, 00:01:01
Hola
Pues cosas de la vida insolitas, cuando me disteis el codigo pense exactamente lo mismo, aun asi lo coloque como estaba y funciona, como, no se, revisando mi codigo en otros form, cuando uso parametros, primero uso el parametro y luego activo la consulta, asi:
Ejemplo de un codigo:
begin
try
QRTransPend:=TQRTransPend.Create(self);
begin
QRTransPend.ADOQuery1.Parameters[0].Value := Edit3.Text;
QRTransPend.ADOQuery1.Parameters[1].Value := Edit4.Text;
end;
QRTransPend.ADOQuery1.Open;
If RadioGroup1.ItemIndex = 0 then QRTransPend.Print
else QRTransPend.Preview;
finally
QRTransPend.Free;
end;
Preguntais a este novato:D , que dificil.:D
Para mi es que me quiere tanto delphi que hace todo lo posible para servir sea como sea.:D
Saludos

roman
03-03-2007, 00:01:35
Pero además, me parece que DEBERÍA funcionar sin tanta conversión:


ADOQuery1.Parameters[0].Value:= StrToDate(DateToStr(DTP1.Date));
ADOQuery1.Active:= True;


esto es, como mencionaba Van Troi:


ADOQuery1.Parameters[0].Value:= DTP1.Date;
ADOQuery1.Active:= True;


pues en el primer caso regresamos a un tipo TDate.

Pero, ¡no funciona! ¿Y saben por qué? ¡Porque el valor de DTP1.Date no es un Date! Tiene la parte fracionaria del tiempo. ¿No se supone que debería estar truncado? ¿Será que me falta aplicar algún parche al Delphi?

// Saludos

Caral
03-03-2007, 00:04:00
Nota curiosa:
Acabo de invertir el parametro en una consulta y tambien funciona, osea al reves y al derecho.
Delphi, eres genial.:D
Hay que preguntar esto a Borland.:D
Saludos

vtdeleon
03-03-2007, 00:07:52
Tienes razon, lo trae todo. Lo probe con el Turbo.

vtdeleon
03-03-2007, 00:12:14
Me dá, que si se aplica esto:
ADOQuery1.Parameters.ParamByName('fecha').DataType:=ftDate deberia funcionar sin la conversión.

roman
03-03-2007, 00:16:36
Pues no. Al menos en mi caso, si pongo


ADOQuery1.Active := false;

ADOQuery1.Parameters.ParamByName('fecha').DataType := ftDate;
ADOQuery1.Parameters.ParamValues['fecha'] := DateTimePicker1.Date;

ADOQuery1.Active := true;


no funciona. Pero si pongo


ADOQuery1.Active := false;

ADOQuery1.Parameters.ParamByName('fecha').DataType := ftDate;
ADOQuery1.Parameters.ParamValues['fecha'] := Trunc(DateTimePicker1.Date);

ADOQuery1.Active := true;


funciona bien. Incluso puedo quitar la asignación del tipo de datos:


ADOQuery1.Active := false;

ADOQuery1.Parameters.ParamValues['fecha'] := Trunc(DateTimePicker1.Date);

ADOQuery1.Active := true;


pero entonces me falla si quiero una segunda consulta con otro parámetro.

// Saludos

vtdeleon
03-03-2007, 00:21:01
Pero, ¡no funciona! ¿Y saben por qué? ¡Porque el valor de DTP1.Date no es un Date! Tiene la parte fracionaria del tiempo. ¿No se supone que debería estar truncado? ¿Será que me falta aplicar algún parche al Delphi?Lo mismo sucede con MonthCalendar.

Caral
03-03-2007, 00:21:26
Hola Roman
Esta si es una parte importante:
pero entonces me falla si quiero una segunda consulta con otro parámetro.
A mi me falla si creo una segunda consulta con otro parametro.
Osea si ejecuto una consulta bien pero si vuelvo a ejecutar otra me da el error.
Como lo soluciono, o si tiene que ver el orden en algo.
Saludos

vtdeleon
03-03-2007, 00:24:16
Ejecutando la misma consulta?

roman
03-03-2007, 00:26:21
Esta si es una parte importante:


¿¡¡Esta Síiii!???

Y todo lo demás ¿no?

Je, je, disculpa, estoy de broma :D

// Saludos

vtdeleon
03-03-2007, 00:35:48
Con una tabla que tengo en access aqui me ha funcionado de 10.

With AdoQuery do
begin
close;
SQL.Text:='Select fecha from control where fecha<:fecha';
Parameters.ParamByName('fecha').DataType:=ftDate;
Parameters.ParamValues['fecha']:=Trunc(DateTimePicker1.Date);
Open;
end;Lo he ejecutado una y otra vez, y esta nítido!

Caral
03-03-2007, 00:38:51
Hola
Es Viernes me parece muy bien.:D
Perdon por la equivocacion, la consulta no da problemas, se puede hacer al reves y al derecho cuantas veces se quiera y no da problemas.
En realidad estaba en esta otra parte:
procedure TFReporteDiario.Button1Click(Sender: TObject);
begin
// revisa si ya fue procesado el reporte
ADOQuery9.SQL.Add('WHERE ReporteDiario.Fecha =#'+DateToStr(DTP1.DateTime)+'#');
AdoQuery9.Open;
if DBEdit26.Text = DateToStr(DTP1.DateTime) then
begin
MessageDlg('Este Reporte ya fue Procesado.',mtInformation,[mbOK],0);
ADOQuery9.Close;
// Close;
end
else
if MessageBox(Handle,
PChar('Desea Procesar este Reporte' + #13#10 +
'Reporte diario de transacciones'),
PChar('Reportes'),
MB_OKCANCEL + MB_DEFBUTTON1 + MB_SYSTEMMODAL) = IDOK then
begin
ADOQuery9.Close;
ADOTable1.Open;
ADOTable1.Insert;
DBEdit13.Text:= DateTostr(DTP1.DateTime);
DBEdit14.Text:= DBEdit1.Text;
DBEdit15.Text:= DBEdit2.Text;
DBEdit16.Text:= DBEdit3.Text;
DBEdit17.Text:= DBEdit4.Text;
DBEdit18.Text:= DBEdit5.Text;
DBEdit19.Text:= DBEdit6.Text;
DBEdit20.Text:= DBEdit7.Text;
DBEdit21.Text:= DBEdit8.Text;
DBEdit22.Text:= DBEdit9.Text;
DBEdit23.Text:= DBEdit10.Text;
DBEdit24.Text:= DBEdit11.Text;
DBEdit25.Text:= DBEdit12.Text;
ADOTable1.Post;

end;
end;
El problema se presenta, Cuando guardo la informacion en otra tabla, tengo que salir del programa cada vez que guardo la informacion.
Osea Guardo una vez, salgo, guardo y asi, bueno otro problemita.:D
Me lo chequeais.:)
Saludos
Saludos