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)
-   -   operator not applicable to this operand type (https://www.clubdelphi.com/foros/showthread.php?t=88842)

alexglez1255 12-08-2015 17:03:30

operator not applicable to this operand type
 
buenas tardes,dias y noches a todos...tengo un problemita y no si alguien pudiera ayudarme...
hago un SQL para una consulta en un IBquery pero el primer QuotedSTR(fecini) me marca el siguiente error:

operator not applicable to this operand type

este Query lo tengo en el modulo datos, y lo ajusto de acuerdo a la consulta del usuario, para sacar un rango de fechas
de abonos de XX cobrador... La sentencia SQL es la siguiente :

Código Delphi [-]
       modulodatos.QryRepXCobYRango.SQL.Text:='Select * From Abonos '+
       +'where (fecha_cap>='+Quotedstr(fecini)+') and (fecha_cap<='+
       QuotedStr(fecfin)+') and (cod_cobrador='+QuotedStr(codcobstr)+
       ') order by fecha_cap';

le ha pasado esto a alguien, gracias por su tiempo y ayuda, y que mi Dios me los bendiga

jafera 12-08-2015 17:35:52

Buenas tardes.

Porque no usas parametros para pasar los datos a la consulta?

Código SQL [-]
modulodatos.QryRepXCobYRango.SQL.Text:='Select * From Abonos where fecha_cap>= :FECHA_INI and fecha_cap<= :FECHA_FIN and cod_cobrador= :COD_COBRADOR order by fecha_cap';

Saludos

alexglez1255 12-08-2015 17:46:47

Lo he intentado pero se me hace mas dificil especialmente a la hora de manejar las variables de fecha...ya lo intente...ademas, en la consulta tengo tres opciones:
1.-un Cobrador
2.-Todos los cobradores
3.-Solo rango de fechas
por lo que la sentencia SQL debo cambiarla....me explico... como lo harias tu con los parametros especialmente con las fechas..gracias por tu tiempo JAFERA

jafera 12-08-2015 19:14:14

Un ejemplo que uso yo (adaptalo a tus necesidades)

Código SQL [-]
SELECT DISTINCT ID_MECANIC, SUM(HORES) AS HORES, SUM(HORES_B) AS HORES_B, SUM(HORES_E) AS HORES_E,SUM(FIX) AS FIX FROM H0003
WHERE DATA >= :DESDEDATAI
AND DATA <= :FINSDATAF
AND ID_MECANIC= :ID_MECANIC
AND PAGAT = 'N'
GROUP BY ID_MECANIC

Como lo modifico desde Delphi:

Código Delphi [-]
SQLL_Paga.Close;
SQLL_Paga.ParamByName('DESDEDATAI').AsString := DateToStr(JvDateEdit1.Date);
SQLL_Paga.ParamByName('FINSDATAF').AsString := DateToStr(JvDateEdit2.Date);
SQLL_Paga.ParamByName('ID_MECANIC').AsInteger := F_ModulDades.ActualitzaPID_Mecanic.Value;
SQLL_Paga.Open;

A ver si te sirve

Saludos

alexglez1255 13-08-2015 01:29:23

Gracias JAFERA voy a intentar hacerlo asi, ... luego te digo como m fue..una pregunta los parametros de fechas inicio y final los defines como ftdate...? o como string.?

Lepe 13-08-2015 17:44:18

Las fechas en los motores de datos son una lata, si lo pasas como string, intentará cotejarlo con la forma "yyyy-mm-dd", si no casa, pues normalmente lo intenta con el formato "mm-dd-yyyy" y si tampoco casa, normalmente da error. Si el formato lo pasas con formato "dd.mm.yyyy" (al usar puntos como separadores, lo interpreta como fecha española).

Pero lo más normal para dejarse de rollos es:
- BBDD en dialecto 3
- campo en formato date o timestamp
- Los sqls los hace como ha dicho salvo un detalle, las fechas que sean TDate o TDatetime y usando:
Código Delphi [-]
SQLL_Paga.Close;
SQLL_Paga.ParamByName('DESDEDATAI').AsDate := Trunc( DateTimePicker1.DateTime ); // trunc quita la parte horaria de una fecha
SQLL_Paga.ParamByName('FINSDATAF').AsDate := Trunc( DateTimePicker2.DateTime );
SQLL_Paga.ParamByName('ID_MECANIC').AsInteger := F_ModulDades.ActualitzaPID_Mecanic.Value;
SQLL_Paga.Open;

De esa forma es Delphi quien "se pelea con el motor de bases de datos" y le pasa la fecha en el formato correcto, sin tú saber cual es, ni tener que pelearte tú.

Ten mucho cuidado al usar DateToStr y StrTodate, porque lo codificará en el formato que delphi se le ocurra, (en realidad se basa en los formatos que tengas definidos en SysUtils y en la configuración regional de windows), para dejarte de rollos, usa FormatDatetime ('dd/mm/yyyy hh:nn', CampoFechaHora.AsDateTime).


Recuerda que en Delphi un TDateTime es un float donde la parte entera son los días transcurridos desde el día cero (30/12/1899) y la parte decimal es la hora, minutos, segundos y milisegundos.

También aconsejo usar esta otra variante en los sql:
Código SQL [-]
WHERE (DATA between :ESDEDATAI AND :FINSDATAF)
porque a la larga es más legible, aunque si quieres quitar la igualdad de fechas, acabas haciéndolo como antes con el ">" y el "<".


Saludos

alexglez1255 13-08-2015 22:31:26

muchas gracias LEPE tus sugerencias me seran de mucha ayuda....sinceramente gracias

alexglez1255 13-08-2015 22:53:27

cuando paso lo parametros como me lo suguieres...

Código Delphi [-]
procedure TFrmRepdeCobr.BtHacereporteClick(Sender: TObject);
 var
  fecfin,fecini:TDateTime;
  codcobstr:String;
begin
 With logicanegocio do
  begin
   codcobstr:=IntToStr(Coddecobr);
     CDSREpxCobYrango.Close;
      case Tpickrepcobr.ItemIndex of
      0:begin
        If Coddecobr=0 then
          begin
            ShowMessage('No ha escogido el cobrador ');
            EdCodCobr.SetFocus;
          end;
         CDSREpxCobYrango.Params.ParamByName('Fdesde').value:=trunc(TPFechini.Datetime);
         CDSREpxCobYrango.Params.ParamByName('Fhasta').value:=trunc(TPFechfinal.Datetime);
         CDSREpxCobYrango.Params.ParamByName('Cod_cobrador').value:=Coddecobr;
         end;
    end;
    CDSREpxCobYrango.open; //MARCA EL ERROR AL ABRIR EL CLIENDATASET
    CDSREpxCobYrango.DisableControls;
  end;
end;

TPFechini y TPFechfinal son de pickdates...
En la linea que indico da el siguiente error..

Invalid variant type conversion

tienes alguna idea por que..?

ecfisa 14-08-2015 00:51:30

Hola alexglez1255
Cita:

Empezado por alexglez1255 (Mensaje 495488)
...
TPFechini y TPFechfinal son de pickdates...
En la linea que indico da el siguiente error..

Invalid variant type conversion

tienes alguna idea por que..?

Intenta de este modo:
Código Delphi [-]
...
var
  cds: TClientDataSet;
begin
  // (La línea siguiente es configurable desde el Object Inspector)
  DataSetProvider1.Options := DataSetProvider1.Options + [poAllowCommandText]; 

  cds := CDSREpxCobYrango;
  cds.Close;
  cds.CommandText:= 'SELECT * FROM ABONOS WHERE COD_COBRADOR = :CODCOB' + ' ' +
     'FECHA >= :FDESDE AND FECHA <= :FHASTA';
  cds.Params.ParamByName('CODCOB').Value := Coddecobr;
  cds.Params.ParamByName('FDESDE').Value := DateToStr(DateTimePickerDesde.Date);
  cds.Params.ParamByName('FHASTA').Value := DateToStr(DateTimePickerHasta.Date);
  cds.Open;
end;

Saludos :)

alexglez1255 14-08-2015 01:18:20

gracias ecfisa lo intentare

alexglez1255 17-08-2015 04:17:50

operator not applicable to this operand type
 
disculpen que vuelva a tocar el tema pero no logro encontrar por que me da este error, ya formatie la compu..instale una version delhi mas nueva (tenia la 6 enterprise y puse la 7), y no se por que me da este error al alguien le ha aparecido..? trate de usar otras alternativas que me sugirieron pero esta se me hace la mas practica por que no necesito pasar parameters...y se usa como una consulta libre...

hago un SQL para una consulta en un IBquery pero el primer QuotedSTR(fecini) me marca el siguiente error:

operator not applicable to this operand type

este Query lo tengo en el modulo datos, y lo ajusto de acuerdo a la consulta del usuario, para sacar un rango de fechas
de abonos de XX cobrador... La sentencia SQL es la siguiente :

Código Delphi [-]
       modulodatos.QryRepXCobYRango.SQL.Text:='Select * From Abonos '+
       +'where (fecha_cap>='+Quotedstr(fecini)+') and (fecha_cap<='+
       QuotedStr(fecfin)+') and (cod_cobrador='+QuotedStr(codcobstr)+
       ') order by fecha_cap';

gracias y que mi Dios los bendiga por su ayuda...

AgustinOrtu 17-08-2015 05:24:57

No es necesario tomar medidas tan drasticas como formatear, reinstalar delphi, es un error de compilacion nada mas :)

Segundo, porque no usar parametros? En realidad deberias tratar de usar siempre parametros, ya las ventajas las enumeramos miles de veces por el foro

Y por ultimo de que tipo es la variable "fecini"?

Tenes que tener en cuenta que QuotedStr recibe como parametro un string. Es decir, esto no te va a compilar:

Código Delphi [-]
var
  i: Integer;
begin
  ShowMessage(QuotedStr(i));
end;

alexglez1255 17-08-2015 05:38:59

este es el proceso tratando de usar parameters, no me da error me pero no me arroja ningun resultado la consulta
los parameters FDESDE y FHASTA son de tipo fecha y el cod_cobrador es entero...


Código Delphi [-]
procedure TFrmRepdeCobr.BtHacereporteClick(Sender: TObject);
 var
  fecfin,fecini:TDate;
  codcobstr:String;
begin
 With logicanegocio do
  begin
  CDSREpxCobYrango.Close;

    fecini:=strtodate(formatdatetime('mm/dd/yy',TPFechini.Date));
    Fecfin:=strtodate(FormatDateTime('mm/dd/yy',TPFechfinal.Date));
   codcobstr:=IntToStr(Coddecobr);
   ShowMessage('datos a buscar en inicial:'+DateToStr(fecini)+' final:'+datetostr(fecfin)+' cobrador :'+IntToStr(Coddecobr));
      case Tpickrepcobr.ItemIndex of
      0:begin

        If Coddecobr=0 then
          begin
            ShowMessage('No ha escogido el cobrador ');
            EdCodCobr.SetFocus;
          end;
        CDSREpxCobYrango.Params.ParamByName('Cod_cobrador').Value := Coddecobr;
        CDSREpxCobYrango.Params.ParamByName('FDESDE').Value := fecini;
        CDSREpxCobYrango.Params.ParamByName('FHASTA').Value := fecfin;
        CDSREpxCobYrango.Open;

//         modulodatos.TAbonConsultar.SelectSQL.Text:='Select * From Abonos '+
//        +'where (fecha_cap>='+QuotedStr(fecini)+') and (fecha_cap<='+QuotedStr(fecfin)+') and (cod_cobrador='+QuotedStr(codcobstr)+
//       ') order by fecha_cap';
//      modulodatos.TAbonConsultar.ExecSQL;
//      CDSAbonoConsulta.open;
         end;

    end;
  end;
end;

AgustinOrtu 17-08-2015 05:42:01

No mandes los parametros como string; manda directamente las fechas y "que se las arregle" el motor sql. Eso es justamente lo bueno de los parametros, seteas el valor y a cobrar

alexglez1255 17-08-2015 05:46:58

si ves AGUSTINORTU es lo que hago extraigo la fecha (un string) y la convierto a date (strtodate) y asigno directamente las fechas
a los parametros pero no me sale nada...algo no estoy haciendo bien...gracias de antemano

ecfisa 17-08-2015 07:56:07

Hola alexglez1255.

Por favor no abras otro hilo con la misma consulta, de ese modo evitamos los resultados redundantes en las búsquedas.
Si lo que buscas es destacar nuevamente la consulta, basta con que agregues un nuevo mensaje al final del hilo inicial y este pasa automáticamente a encabezar la lista de nuevos mensajes.

Combiné ambos mensajes, con idéntico título y mismo contenido, en el primero.

Saludos y gracias por tu colaboración :)

alexglez1255 19-08-2015 17:11:25

quiero agradecer sinceramente a TODOS especialmente a mi Dios JEHOVA...pero tambien a todos ustedes...ecfisa, AgustinOrtu,Lepe, jafera, por todas sus aportaciones y ideas y con gran gusto les dire que ya logramos hacerlo funcionar y la sugerencia que al final logro hacerlo fue la de ECFISA...

Código Delphi [-]
var
  cds: TClientDataSet;
begin
  // (La línea siguiente es configurable desde el Object Inspector)
  DataSetProvider1.Options := DataSetProvider1.Options + [poAllowCommandText]; 

  cds := CDSREpxCobYrango;
  cds.Close;
  cds.CommandText:= 'SELECT * FROM ABONOS WHERE COD_COBRADOR = :CODCOB' + ' ' +
     'FECHA >= :FDESDE AND FECHA <= :FHASTA';
  cds.Params.ParamByName('CODCOB').Value := Coddecobr;
  cds.Params.ParamByName('FDESDE').Value := DateToStr(DateTimePickerDesde.Date);
  cds.Params.ParamByName('FHASTA').Value := DateToStr(DateTimePickerHasta.Date);
  cds.Open;
end;
ME HACE LA CONSULTA DE LAS FECHAS...Y NO ME DA NINGUN ERROR...PERO SI FUE UN DOLOR DE CABEZA..GRACIAS A TODOS ESPCIALMENTE A MI CREADOR JEHOVA...


La franja horaria es GMT +2. Ahora son las 21:42: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