Shordi   05-02-2025, 12:31
#1
Ayer intenté hacer un pequeño programa donde pensaba utilizar una base de datos sqlite y mis famosos controles de base de datos... 
Nuevo Proyecto-> Proyecto de base de datos, copia y pegar el código de los controles, un pequeño formulario... y cuál sería mi sorpresa que de repente no funcionaba nada de esos controles que llevan funcionando años.

Pequeña investigación y descubierto el problema: En los drivers de antes, la propiedad Fields de un Result actuaba como un array de objetos .ResultFields y ahora actúa como una colección que tiene como clave el nombre del campo y como valor el objeto .resulfield... 
Así, este código que extrae los nombres de campo y los tipos de datos de un result:

Código:
  For f = 0 To Value.Fields.Count - 1
        $fieldnames.Add(Value.Fields[f].Name)
        $fieldtypes.Add(value.Fields[f].type)
      Next
Deja de funcionar si usamos gb.db2 en lugar del obsoleto gb.db.
Para que funcione debe ser sustituído por algo así:
Código:
  For Each skey In Value.Fields
        $Fieldnames.Add(skey.Name)
        $Fieldtypes.Add(skey.Type)
      Next

No sé si eso es una mejora o sólo otra manera de pelar el mismo gato, pero sí sé que para revivir todos los programas que tengo (perdón, que en mi antiguo trabajo tienen) van a sudar tinta como se les ocurra actualizar al 3.20...

Malditas actualizaciones...


Es la primera vez que subo código en el foro nuevo, espero que salga bien.
Iba a poner de título "¡Pos yo me cago en las actualizaciones!"... pero es algo excesivo, creo.

Saludos

No podemos regresar
Shordi   05-02-2025, 21:17
#2
Por cierto, la solución si tienes problemas de este tipo es esta:
Código:
  'obtener dos arrays: uno con los nombres y otro con los tipos de un result
    $fieldtypes = New Integer[]
    $fieldnames = New String[]
    If Object.Class($Result).Component.Name = "gb.db2" Then ''Este es el truco para que funcione con ambos componentes
      Dim skey As ResultField
      For Each skey In $Result.Fields
        $Fieldnames.Add(skey.Name)
        $Fieldtypes.Add(skey.Type)
      Next
    Else
      For f = 0 To $Result.Fields.Count - 1
        $fieldnames.Add($Result.Fields[f].Name)
        $fieldtypes.Add($Result.Fields[f].type)
      Next
    Endif

Esta respuesta no se ilumina de colorines ¿Será porque empieza con ' ?
Última modificación: 05-02-2025, 21:22 por Shordi.

No podemos regresar
Shell   06-02-2025, 14:35
#3
Suele ocurrir, es muy común.
En parte mejor que sea una colección, más que un array.

Ya que es una solución, ¿ Qué te parece de alguna manera ubicarla en el foro de base de datos con un buen tema ?.
Es tan común estás situaciones. Es lo que tiene el mantenimiento de las aplicaciones y en parte un problema, ya que
no sabes cuando esto puede ocurrir.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.