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

Ismael L. Donis Garcia slibre en natio.co.cu
Jue Feb 23 17:53:12 CET 2017


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



------------------------------------------------------------------------


        _______________________________________________
        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

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


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