Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Usar ADOQuery más de 1 Vez (https://www.clubdelphi.com/foros/showthread.php?t=40975)

NickName 04-03-2007 06:08:09

Usar ADOQuery más de 1 Vez
 
Hola...

Mi problema es que quiero ejecutar mas de 1 vez un AdoQuery y no puedo me manda el error de: Objeto Parameter mal definido. Se proporciono información incompleta o incoherente...

De esta forma uso 2 AdoQuery funcionan bien al usarlos 1 sola vez pero si quiero realizar de nuevo la consulta cambiando un parametro es donde me marca el error antes mensionado la verdad no entiendo que sucede...

La Db es de Foxpro, uso Ado como componentes de Conección, Delphi7 como lenguaje de desarrollo...

Este es el codigo donde paso parametros y hago la consulta:
Código Delphi [-]
        With Mod_Datos.ADOQuery1.Parameters  Do
        Begin
            Clear;
            AddParameter.Name := 'Fecha1';
            ParamByName('Fecha1').DataType := ftDate;
            ParamByName('Fecha1').Value  := DateTimePicker1.Date;
            //------------------
            AddParameter.Name := 'Fecha2';
            ParamByName('Fecha2').DataType := ftDate;
            ParamByName('Fecha2').Value  := DateTimePicker2.Date;
            //------------------
            AddParameter.Name := 'Cancelado';
            ParamByName('Cancelado').DataType := ftBoolean;
            ParamByName('Cancelado').Value  := True;
            //------------------
            AddParameter.Name := 'Con_Iva';
            ParamByName('Con_Iva').DataType := ftString;
            ParamByName('Con_Iva').Value  := 'L2';
            //------------------
            AddParameter.Name := 'Sin_Iva';
            ParamByName('Sin_Iva').DataType := ftString;
            ParamByName('Sin_Iva').Value  := 'L1';
        End;

        //---------------------  Con Iva ---------------------------
        Mod_Datos.ADOQuery1.Close;
        Mod_Datos.ADOQuery1.SQL.Clear;
        Mod_Datos.ADOQuery1.SQL.Add('SELECT Sum(CVenta) AS Total FROM TicketDetalle TD, Ticket T ' +
                                    'Where TD.CveTecla = :Con_Iva ' +
                                    'And TD.IdTicket = T.IdTicket ' +
                                    'And T.Cancelado <> :Cancelado ' +
                                    'And BETWEEN(T.FechaHora,:Fecha1,:Fecha2)');
        Mod_Datos.ADOQuery1.Open;
        Con_Iva:= Mod_Datos.ADOQuery1.FieldByname('Total').AsCurrency;
        //------------------------ Sin Iva ----------------------------
        With Mod_Datos.ADOQuery2.Parameters  Do
        Begin
            Clear ;
            AddParameter.Name := 'Fecha1';
            ParamByName('Fecha1').DataType := ftDate;
            ParamByName('Fecha1').Value  := DateTimePicker1.Date;
            //------------------
            AddParameter.Name := 'Fecha2';
            ParamByName('Fecha2').DataType := ftDate;
            ParamByName('Fecha2').Value  := DateTimePicker2.Date;
            //------------------
            AddParameter.Name := 'Cancelado';
            ParamByName('Cancelado').DataType := ftBoolean;
            ParamByName('Cancelado').Value  := True;
            //------------------
            AddParameter.Name := 'Con_Iva';
            ParamByName('Con_Iva').DataType := ftString;
            ParamByName('Con_Iva').Value  := 'L2';
            //------------------
            AddParameter.Name := 'Sin_Iva';
            ParamByName('Sin_Iva').DataType := ftString;
            ParamByName('Sin_Iva').Value  := 'L1';
        End;

        Mod_Datos.ADOQuery2.Close;
        Mod_Datos.ADOQuery2.SQL.Clear;
        Mod_Datos.ADOQuery2.SQL.Add('SELECT Sum(CVenta) AS Total FROM TicketDetalle TD, Ticket T ' +
                                    'Where TD.CveTecla = :Sin_Iva ' +
                                    'And TD.IdTicket = T.IdTicket ' +
                                    'And T.Cancelado <> :Cancelado ' +
                                    'And BETWEEN(T.FechaHora,:Fecha1,:Fecha2)');
        Mod_Datos.ADOQuery2.Open;
        Sin_Iva:= Mod_Datos.ADOQuery2.FieldByname('Total').AsCurrency;
        //----------------------------------------------------
        Total:= (Con_Iva + Sin_Iva);

Las consultas las hise con parametro por que fue la unica forma que pude sin parametros me marca el mismo error...

Siento que con un solo AdoQuery podria hacer las 2 consultas pero cuando lo intente me marco el mismo error...

La verdad no se que es lo que pasa....:confused: alguien que me pueda Iluminar un Poco...

vtdeleon 04-03-2007 17:18:16

Saludos

Prueba asi:
Código Delphi [-]
With Mod_Datos.ADOQuery1 do
begin
  Close;
  SQL.Clear;
  SQL.Add('SELECT Sum(CVenta) AS Total FROM TicketDetalle TD, Ticket T ' +
                                    'Where TD.CveTecla = :Con_Iva ' +
                                    'And TD.IdTicket = T.IdTicket ' +
                                    'And T.Cancelado <> :Cancelado ' +
                                    'And BETWEEN(T.FechaHora,:Fecha1,:Fecha2)');
   With Parameter do
   begin 
     ParamByName('Fecha1').DataType := ftDate;
     ParamByName('Fecha1').Value  := DateTimePicker1.Date;
            //------------------
     ParamByName('Fecha2').DataType := ftDate;
     ParamByName('Fecha2').Value  := DateTimePicker2.Date;
            //------------------
     ParamByName('Cancelado').DataType := ftBoolean;
     ParamByName('Cancelado').Value  := True;
            //------------------
     ParamByName('Con_Iva').DataType := ftString;
     ParamByName('Con_Iva').Value  := 'L2';
            //------------------
     ParamByName('Sin_Iva').DataType := ftString;
     ParamByName('Sin_Iva').Value  := 'L1';
   end
   Open;
   Con_Iva:= FieldByname('Total').AsCurrency;
 end;
No necesitas hacer AddParameter.Name := 'Fecha1';, porque el mismo componente lo agrega.

NickName 04-03-2007 19:39:25

Hola...

Muchas gracias vtdeleon Probé como me dijiste y si funciono con esa forma vi cual era el error, sucede que cuando no usaba todos los parámetros era cuando marcaba el error por ejemplo en la consulta de Con_Iva tenia el parámetro Sin_Iva y no lo utilizaba en la consulta y ese era mi error… Les pongo el código que funciona las veces que sean y con un solo AdoQuery:
Código Delphi [-]
    //--------- Con IVa -------------------
    With Mod_Datos.ADOQuery1 Do
    Begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT Sum(CVenta) AS Total FROM TicketDetalle TD, Ticket T ' +
                'Where TD.CveTecla = :Con_Iva ' +
                'And TD.IdTicket = T.IdTicket ' +
                'And T.Cancelado <> :Cancelado ' +
                'And BETWEEN(T.FechaHora,:Fecha1,:Fecha2)');
        With Parameters Do
        Begin
             ParamByName('Fecha1').DataType := ftDate;
             ParamByName('Fecha1').Value  := DateTimePicker1.Date;
             //------------------
             ParamByName('Fecha2').DataType := ftDate;
             ParamByName('Fecha2').Value  := DateTimePicker2.Date;
             //------------------
             ParamByName('Cancelado').DataType := ftBoolean;
             ParamByName('Cancelado').Value  := True;
             //------------------
             ParamByName('Con_Iva').DataType := ftString;
             ParamByName('Con_Iva').Value  := 'L2';
        End;
        Open;
        Con_Iva:= FieldByname('Total').AsCurrency;
    End;
    //--------- Sin Iva --------------
    With Mod_Datos.ADOQuery1 Do
    Begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT Sum(CVenta) AS Total FROM TicketDetalle TD, Ticket T ' +
                'Where TD.CveTecla = :Sin_Iva ' +
                'And TD.IdTicket = T.IdTicket ' +
                'And T.Cancelado <> :Cancelado ' +
                'And BETWEEN(T.FechaHora,:Fecha1,:Fecha2)');
        With Parameters Do
        Begin
             ParamByName('Fecha1').DataType := ftDate;
             ParamByName('Fecha1').Value  := DateTimePicker1.Date;
             //------------------
             ParamByName('Fecha2').DataType := ftDate;
             ParamByName('Fecha2').Value  := DateTimePicker2.Date;
             //------------------
             ParamByName('Cancelado').DataType := ftBoolean;
             ParamByName('Cancelado').Value  := True;
             //------------------
             ParamByName('Sin_Iva').DataType := ftString;
             ParamByName('Sin_Iva').Value  := 'L1';
        End;
        Open;
        Sin_Iva:= FieldByname('Total').AsCurrency;
    End;
Muchas gracias de nuevo... ;) La desesperación nos hace torpes o la falta de experiencia... :p


La franja horaria es GMT +2. Ahora son las 05:30:55.

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