[Lazarus-es] Error: Field "Nombre_Campo" has an invalid field type (BCD) to base index on.

Jose Antonio Cuello jcuello en artextrading.com
Vie Feb 24 08:05:04 CET 2017


Hola, por qué no pruebas a cambiar el campo Decimal a Numeric. El resultado para campos con pocos decimales es el mismo pero no te dará problemas. 

Un saludo 


De: "Ismael L. Donis Garcia via Lazarus-es" <lazarus-es en lists.lazarus-ide.org> 
Para: "Spanish version of Lazarus List" <lazarus-es en lists.lazarus-ide.org> 
CC: "Ismael L. Donis Garcia" <slibre en natio.co.cu> 
Enviados: Jueves, 23 de Febrero 2017 17:53:12 
Asunto: Re: [Lazarus-es] Error: Field "Nombre_Campo" has an invalid field type (BCD) to base index on. 

No ese no es el problema la consulta la obtengo vacia y el error me ocurre cuando voy llenando la consulta. 
La consulta la he tenido que dajar de la siguiente forma (original): 
strsql := 'select s.entidad, s.reg, s.numc, s.fecha, s.cuenta, s.subcta, s.capitulo, s.subcap, s.elemento, s.empresa, cast(s.debe as double precision) as debe, cast(s.haber as double precision) as haber, s.nota, s.clave, s.sctaor, s.eleor, s.empor from scsal s where (s.idsa is null)'; 
Si la consulta la dejo como sigue me da error al hacer el filtro: 
strsql := 'select s.entidad, s.reg, s.numc, s.fecha, s.cuenta, s.subcta, s.capitulo, s.subcap, s.elemento, s.empresa, s.debe, s.haber, s.nota, s.clave, s.sctaor, s.eleor, s.empor from scsal s where (s.idsa is null)'; 
Pongo la llave primaria idsa = null para no obtener ningun registro. 
Después a la hora de actualizar era cuando me daba el error. Por ese motivo es que no puedo usar where, ósea porque la colsulta solo me da la estructura de los campos 
if dm.rssc6.RecordCount > 0 then begin 
if ((dm.rssc1.FieldByName('elemento').AsInteger = 0) and (dm.rssc1.FieldByName('empresa').AsInteger = 0)) then 
dm.rssc6.Filter:='((cuenta = ' + dm.rssc1.FieldByName('cuenta').AsString + ') and (subcta = ''' + dm.rssc1.FieldByName('subcta').AsString + ''') and (capitulo = ''' + dm.rssc1.FieldByName('capitulo').AsString + ''') and (subcap = ''' + dm.rssc1.FieldByName('subcap').AsString + ''') and (elemento = '''') and (empresa = '''') and (haber > 0))' 
else if ((dm.rssc1.FieldByName('elemento').AsInteger = 0) and (dm.rssc1.FieldByName('empresa').AsInteger <> 0)) then 
dm.rssc6.Filter:='((cuenta = ' + dm.rssc1.FieldByName('cuenta').AsString + ') and (subcta = ''' + dm.rssc1.FieldByName('subcta').AsString + ''') and (capitulo = ''' + dm.rssc1.FieldByName('capitulo').AsString + ''') and (subcap = ''' + dm.rssc1.FieldByName('subcap').AsString + ''') and (elemento = '''') and (empresa = ''' + stremp + ''') and (haber > 0))' 
else if ((dm.rssc1.FieldByName('elemento').AsInteger <> 0) and (dm.rssc1.FieldByName('empresa').AsInteger = 0)) then 
dm.rssc6.Filter:='((cuenta = ' + dm.rssc1.FieldByName('cuenta').AsString + ') and (subcta = ''' + dm.rssc1.FieldByName('subcta').AsString + ''') and (capitulo = ''' + dm.rssc1.FieldByName('capitulo').AsString + ''') and (subcap = ''' + dm.rssc1.FieldByName('subcap').AsString + ''') and (elemento = ''' + strele + ''') and (empresa = '''') and (haber > 0))' 
else 
dm.rssc6.Filter:='((cuenta = ' + dm.rssc1.FieldByName('cuenta').AsString + ') and (subcta = ''' + dm.rssc1.FieldByName('subcta').AsString + ''') and (capitulo = ''' + dm.rssc1.FieldByName('capitulo').AsString + ''') and (subcap = ''' + dm.rssc1.FieldByName('subcap').AsString + ''') and (elemento = ''' + strele + ''') and (empresa = ''' + stremp + ''') and (haber > 0))'; 
dm.rssc6.Filtered:=true; 
if dm.rssc6.EOF then 
dm.rssc6.Append 
else 
dm.rssc6.Edit; 
Lo que me queda es buscar en el FPC a ver si lo puedo parchear, debe ser relativamente facil de arregla en el FPC, tan solo debe bastar con agregar el tipo DECIMAL = DOUBLE 
Talves lo hallan agregado ya en el FPC 3.0.1, habría que revisar. 
Saludos Reiterados 
======== 
| ISMAEL | 
======== 
----- Original Message ----- 



From: [ mailto:lazarus-es en lists.lazarus-ide.org | Fredy Gonzales via 
  Lazarus-es ] 
To: [ mailto:lazarus-es en lists.lazarus-ide.org | Spanish version of Lazarus 
  List ] 
Cc: [ mailto:fredyg1965 en gmail.com | Fredy Gonzales ] 
Sent: Thursday, February 23, 2017 10:10 AM 
Subject: Re: [Lazarus-es] Error: Field "Nombre_Campo" has an invalid field type (BCD) to base index on. 

yo creo que intentes hacer el query desde un store procedure y devuelvas. query, creo que es ub problema de conversión a la hora de la consulta. 

El 23/2/2017 09:23, "Maxi via Lazarus-es" < [ mailto:lazarus-es en lists.lazarus-ide.org | lazarus-es en lists.lazarus-ide.org ] > escribió: 

BQ_BEGIN

El filtrado de registros es bastante limitado, y lo fue siempre desde delphi. 
Creo que lo mejor es hacer el firtro en el where de la consulta y traer solo que que necesitas. 

El 22 de febrero de 2017, 17:37, Ismael L. Donis Garcia via Lazarus-es < [ mailto:lazarus-es en lists.lazarus-ide.org | lazarus-es en lists.lazarus-ide.org ] > escribió: 

BQ_BEGIN

Muchas gracias Jesús pero casi estoy seguro que es un problema del FPC. 
El campo haber no es entero ya que es un campo donde se guarda el valor de los adeudos, por ese motivo es monetario. 
Filtro para ver si una persona ya a pagado algún tipo específico de adeudo en el año. 
Analizando me di cuenta "o al menos pienso yo" que es un problema del FPC ya que me puse a analizar el error y cambié la consulta y me funcionó. 
Antes tenía la consulta. Campo Haber como Decimal, así está por diseño en la BD. 
select ....., a.haber, ... from creditos a .... 
De esta forma me da error al intentar filtrar el SQLQuery. Entonces probé de la siguiente forma: 
select ....., cast(a.haber as double precision) as haber, ... from creditos a .... 
Y de esta forma el filtro me funciona correctamente. 
Por ese motivo es que creo que es un problema de tipos del FPC que no está definido los tipos de campos DECIMALES de firebird 
No probé lo que me dijiste del filtro en el evento OnFilterRecord ya que el filtro es dinámico, ósea cambia según los datos devueltos por la consulta. 
Yo solo en la pregunta puse un caso específico de filtro, pero de todos modos se podría probar a ver que pasa, pero estoy casi seguro que va a fallar por el error: 
SErrIndexBasedOnInvField = 'Field "%s" has an invalid field type (%s) to base index on.'; 
de la unit dbconst 
Saludos Cordiales 
======== 
| ISMAEL | 
======== 
----- Original Message ----- 

BQ_BEGIN

From: [ mailto:lazarus-es en lists.lazarus-ide.org | Jesus Reyes 
        A. via Lazarus-es ] 
To: [ mailto:lazarus-es en lists.lazarus-ide.org | Spanish 
        version of Lazarus List ] 
Cc: [ mailto:jesusrmx en gmail.com | Jesus Reyes A. ] 
Sent: Wednesday, February 22, 2017 3:04 PM 
Subject: Re: [Lazarus-es] Error: Field "Nombre_Campo" has an invalid field type (BCD) to base index on. 

On Wed, 22 Feb 2017 13:49:13 -0600, Ismael L. Donis Garcia via Lazarus-es < [ mailto:lazarus-es en lists.lazarus-ide.org | lazarus-es en lists.lazarus-ide.org ] > wrote: 


BQ_BEGIN

Estoy tratando de filtar un SQLQuery incluyendo un campo Decimal de Firebird 2.5 y Lazarus me devuelve el siguiente error: 
Field "Haber" has an invalid field type (BCD) to base index on. 
Si quito dicho campo no se produce el error. 
Como podré filtrar el SQLQuery con dichos tipos de campos "Decimales"? 
Esto es un error de Lazarus o del FPC? 
Es posible solventarlo de alguna forma? 
dm.rssc5.Filter:='((cuenta = ' + dm.rssc1.FieldByName('cuenta').AsString + ') and (subcta = ''' + dm.rssc1.FieldByName('subcta').AsString + ''') and (capitulo = ''' + dm.rssc1.FieldByName('capitulo').AsString + ''') and (subcap = ''' + dm.rssc1.FieldByName('subcap').AsString + ''') and (elemento = '''') and (empresa = ''' + stremp + ''') and (haber > 0))' 
Desde ya Gracias 
======== 
| ISMAEL | 
======== 



Seguro es Haber>0 y no Haber.AsInteger ? 

En caso de que este no sea el caso y Haber es una variable entera derivado de Haber.asInteger entonces es probable sea un problema de implementación en sqldb (o sea FPC). 

Aún podrías filtrar el dataset usando el evento OnFilterRecord, cuando haces dataset.Filtered := true, se dispara el evento OnFilterRecord para cada uno de los registros, en este evento solo tienes que regresar accept := true/false; y de esta manera el registro aparecerá o no como parte del dataset. En tu caso quizás se podría implementar de esta manera: 

accept := (elemento = '''') and 
(empresa = ''' + stremp + ''') and 
(haber > 0) and 
(cuenta=dm.rssc1.FieldByName('cuenta').AsString) and 
(subcta = ''' + dm.rssc1.FieldByName('subcta').AsString + ''') and 
(capitulo = ''' + dm.rssc1.FieldByName('capitulo').AsString + ''') and 
(subcap = ''' + dm.rssc1.FieldByName('subcap').AsString + '''); 

Jesus Reyes A. 





_______________________________________________ 
Lazarus-es mailing list 
[ mailto:Lazarus-es en lists.lazarus-ide.org | Lazarus-es en lists.lazarus-ide.org ] 
[ http://lists.lazarus-ide.org/listinfo/lazarus-es | http://lists.lazarus-ide.org/listinfo/lazarus-es ] 



BQ_END


_______________________________________________ 
Lazarus-es mailing list 
[ mailto:Lazarus-es en lists.lazarus-ide.org | Lazarus-es en lists.lazarus-ide.org ] 
[ http://lists.lazarus-ide.org/listinfo/lazarus-es | http://lists.lazarus-ide.org/listinfo/lazarus-es ] 


BQ_END




-- 
El que pregunta aprende, y el que contesta aprende a responder. 

No a la obsolecencia programada: [ http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml | http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml ] 

Linux User #495070 
[ http://domonetic.com/blog | http://domonetic.com/blog ] 

_______________________________________________ 
Lazarus-es mailing list 
[ mailto:Lazarus-es en lists.lazarus-ide.org | Lazarus-es en lists.lazarus-ide.org ] 
[ http://lists.lazarus-ide.org/listinfo/lazarus-es | http://lists.lazarus-ide.org/listinfo/lazarus-es ] 


BQ_END







_______________________________________________ 
Lazarus-es mailing list 
Lazarus-es en lists.lazarus-ide.org 
http://lists.lazarus-ide.org/listinfo/lazarus-es 

BQ_END

_______________________________________________ 
Lazarus-es mailing list 
Lazarus-es en lists.lazarus-ide.org 
http://lists.lazarus-ide.org/listinfo/lazarus-es 
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20170224/daa9147f/attachment-0001.html>


Más información sobre la lista de distribución Lazarus-es