Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con consulta (Extraño) (https://www.clubdelphi.com/foros/showthread.php?t=40947)

Caral 02-03-2007 21:07:40

Problema con consulta (Extraño)
 
Hola a todos y gracias de antemano por su ayuda.
Tengo esta consulta:

Código Delphi [-]
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:

Código Delphi [-]
FormatDate('mm/dd/yyyy', DTP1.DateTime);

en lugar de

Código Delphi [-]
 
DateToStr(DTP1.DateTime);

Cita:

Empezado por roman
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:

Código Delphi [-]
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

Cita:

Empezado por roman
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

Cita:

Empezado por roman
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:
Código SQL [-]
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:
Código SQL [-]
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:
Código Delphi [-]
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:

Código Delphi [-]
   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:
Código Delphi [-]
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:
Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 23:35:42.

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