Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2017-02

Error: Field "Nombre_Campo" has an invalid field type (BCD) to base index on.

7 messages · 5 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Ismael L. Donis Garcia

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 |
========
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20170222/44df7c74/attachment.html>

Reply by email

Jesus Reyes A.
to Ismael L. Donis Garcia

On Wed, 22 Feb 2017 13:49:13 -0600, Ismael L. Donis Garcia via Lazarus-es

<lazarus-es en lists.lazarus-ide.org> wrote 18 lines
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.

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20170222/edd68d07/attachment.html>

Reply by email

Ismael L. Donis Garcia
to Jesus Reyes A.

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

Earlier message 54 lines
----- Original Message ----- From: Jesus Reyes A. via Lazarus-es To: Spanish version of Lazarus List Cc: 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 <lazarus-es en lists.lazarus-ide.org> wrote: 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. ------------------------------------------------------------------------------

Reply by email

Maxi
to Ismael L. Donis Garcia

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 <

lazarus-es en lists.lazarus-ide.org> wrote 117 lines
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 ----- *From:* Jesus Reyes A. via Lazarus-es <lazarus-es en lists.lazarus-ide.org> *To:* Spanish version of Lazarus List <lazarus-es en lists.lazarus-ide.org> *Cc:* Jesus Reyes A. <jesusrmx en gmail.com> *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 < lazarus-es en lists.lazarus-ide.org> wrote: 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 Lazarus-es en lists.lazarus-ide.org http://lists.lazarus-ide.org/listinfo/lazarus-es _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus-ide.org http://lists.lazarus-ide.org/listinfo/lazarus-es
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 Linux User #495070 http://domonetic.com/blog ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20170223/4ced5eef/attachment.html>

Reply by email

Fredy Gonzales

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" <lazarus-es en lists.lazarus-ide.org> escribió:

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 <

lazarus-es en lists.lazarus-ide.org> wrote 117 lines
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 ----- *From:* Jesus Reyes A. via Lazarus-es <lazarus-es en lists.lazarus-ide.org> *To:* Spanish version of Lazarus List <lazarus-es en lists.lazarus-ide.org> *Cc:* Jesus Reyes A. <jesusrmx en gmail.com> *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 < lazarus-es en lists.lazarus-ide.org> wrote: 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 Lazarus-es en lists.lazarus-ide.org http://lists.lazarus-ide.org/listinfo/lazarus-es _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus-ide.org http://lists.lazarus-ide.org/listinfo/lazarus-es
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 Linux User #495070 http://domonetic.com/blog

Reply by email

Ismael L. Donis Garcia
to Fredy Gonzales

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

Earlier message 107 lines
----- Original Message ----- From: Fredy Gonzales via Lazarus-es To: Spanish version of Lazarus List Cc: 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" <lazarus-es en lists.lazarus-ide.org> escribió: 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 <lazarus-es en lists.lazarus-ide.org> escribió: 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 ----- From: Jesus Reyes A. via Lazarus-es To: Spanish version of Lazarus List Cc: 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 <lazarus-es en lists.lazarus-ide.org> wrote: 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. ------------------------------------------------------------------------

Reply by email

Jose Antonio Cuello
to Ismael L. Donis Garcia

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

Earlier message 94 lines
----- 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.

Reply by email