PDA

Ver la Versión Completa : operator not applicable to this operand type


alexglez1255
12-08-2015, 17:03:30
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 :

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?

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)

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:

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:

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:

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

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

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

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

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:


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


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


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