jguardon 09-05-2024, 19:41
Buenas

Estoy construyendo una aplicación para demostrar el uso de las comunicaciones al estilo de una API Rest mediante Requests y Responses usando JSON. Se compone de un backend en el servidor mediante CGI que recibe "requests", se loguea al usuario, realiza consultas a la base de datos y devuelve "responses" a la otra aplicación de escritorio que hace de frontend.

De momento va funcionando bastante bien, pero la forma idónea de tratar con los datos en JSON tras viajar por Internet, es construirlos y deconstruirlos mediante el uso de Collection, colecciones de datos que son objetos en sí mismos, arrays de objetos, etc.

Pues bien, tengo una colección que se compone de un primer objeto (que solo me interesa para saber que la consulta ha tenido éxito) y el segundo objeto que es un array de colecciones de datos, en este caso de los usuarios dados de alta en el sistema. Lo que quiero es crear una clase que coja un array de colecciones y me lo muestre en un gridview usando el evento Data.

Os muestro el contenido -ficticio- del JSON que luego se convierte en un objeto Variant[] (array de Collection):

Código:
{
    "status": true,
    "users": [
        {
            "idx": 1,
            "name": "jguardon",
            "psswd": "9EEA5E027AB93EC1DA",
            "perm": 1,
            "active": 1,
            "expires": null,
            "wrkgrp": null,
            "phone": null,
            "email": "unmail@fdfd.es",
            "lastlogin": "05/05/2024 14:57:17",
            "currentsession": "46.26.157.55:A507054AF954F807B685081D",
            "added_by": null
        },
        {
            "idx": 11,
            "name": "tincho",
            "psswd": "79B48CB1E208A82",
            "perm": 2,
            "active": 1,
            "expires": null,
            "wrkgrp": null,
            "phone": "555 222 333",
            "email": "otromail@teertte.com",
            "lastlogin": "05/05/2024 15:01:16",
            "currentsession": "46.26.157.55:0824D9EC6D2FD2D3EB7AA0A2",
            "added_by": "jguardon"
        },
        {
            "idx": 12,
            "name": "terco",
            "psswd": "A44E76B7D61BFFA1",
            "perm": 2,
            "active": 1,
            "expires": null,
            "wrkgrp": null,
            "phone": "46455822",
            "email": "mimail@nomail.org",
            "lastlogin": "05/04/2024 16:40:35",
            "currentsession": "192.168.0.131:CD73FA57C9ED2F3A8D8EE128",
            "added_by": "jguardon"
        },
        {
            "idx": 13,
            "name": "jesusg",
            "psswd": "my-super-secure-password",
            "perm": 2,
            "active": 1,
            "expires": null,
            "wrkgrp": null,
            "phone": "5684 05 4053",
            "email": "abcde@fghi.jk",
            "lastlogin": null,
            "currentsession": "",
            "added_by": "jguardon"
        }
    ]
}


Mediante este código es muy fácil convertirlo en objetos de gambas3. De hecho se usa todo el rato Json.Decode() y JSON.Encode() para transicionar de json a colecciones y viceversa:


Código:
Dim cResp as New Collection

cResp = JSON.Decode(CR.getResponse())

    If cResp["status"] = True Then
       
        ' hacer algo con cResp["users"]
        ' para visualizarlo en un gridview

    Endif


Esos datos en JSON provienen de la base de datos en el servidor. 'idx' es el índice y clave primaria autoincrement, pero sabemos que tras borrar e insertar nunca van a ser consecutivos, por lo que no se pueden iterar usando ese índice.

Por cierto, si alguien quiere "bichear" la aplicación del servidor CGI, la tengo en GitLab, está un poco chapucera, no controla posibles errores y es muy simple, pero es parte de mi propio aprendizaje en el mundo de Gambas CGI. Se puede depurar en el IDE usando el navegador incrustado (que no va mostrar nada porque no va por ahí el JSON) o montarlo en un servidor Apache, Lighttpd o el que más os guste. Yo lo tengo en Lighttpd que es muy ligero y rápido.

https://gitlab.com/jguardon/gambas-cgi-test

La aplicación de escritorio aún no la tengo subida a GitLab, estoy esperando a que al menos funcione el poder mostrar datos en el gridview.

A partir de aquí se abre un mundo de posibilidades para crear aplicaciones profesionales basadas en "la nube", un servidor o como queráis decirle... pero eso sí, siempre usando conexiones seguras SSL.

Saludos y espero vuestros comentarios.
asqw12 03-05-2024, 16:06
Me pueden ayudar con este codigo, 
Lince:  2 a 6 jugadores  Tablero aleatorio en cada ronda de 9 X 8 imágenes, 72 en total  Gana el primero que encuentre 15 imágenes  Se reparten 3 imágenes a cada jugador sin que se repitan, las cuales debe encontrar en el tablero  Cada jugador marca en el tablero las cartas que va encontrando, la máquina debe validar si corresponde la imagen del tablero con la imagen seleccionada.  
jguardon 02-05-2024, 18:56
Hola a todos

Puede ser porque llevo bastante tiempo sin programar en gambas en plan serio, pero me encuentro con un problema que seguramente será una tontería y me tiene ya cabreado.

Tengo una función que realiza una consulta a la BD para listar los usuarios de una tabla. La tabla contiene usuarios de un sistema con su nombre, password, email, etc y contiene ahora mismo 3 usuarios. La función trata de devolver el resultado de la consulta en un array de colecciones, siendo cada elemento del array una colección con cada pareja de valor/campo correspondiente a cada campo. Hasta ahí, todo entendido, supongo.

El problema es que el array que devuelve la función siempre contiene los datos del último registro (usuario) repetido el número de veces igual al número de registros por alguna razón que ahora no soy capaz de entender. Este es el código, creo que se puede replicar fácilmente y depurar los resultados para ver lo que expongo.

Código:
    Dim hres As Result
    Dim cResult As New Variant[]
    Dim cRecord As New Collection

    If DBConn.connDB() Then
        hres = DBConn.hConn.Exec("SELECT * FROM ERP.users;")
        While hres.Available
            cRecord.Clear
            For Each sField As ResultField In hres.Fields
                cRecord.Add(hres[sField.Name], sField.Name)
            Next

            cResult.Add(cRecord)
            hres.MoveNext
        Wend

        Return cResult

    Endif

End

A ver si alguien me abre los ojos, porque ya me lloran de tando mirar...

Saludos
Páginas (560):    1 83 84 85 86 87 560   
Bienvenido, Invitado
Tienes que registrarte para poder participar en nuestro foro.
Recordarme?
Miembros: 288
Último miembro: shoUsho
Temas del foro: 1,730
Mensajes del foro: 8,991
Últimos temas
Paren...WAIT !!!
Foro: Aplicaciones/Fragmentos de Código
Último mensaje por: tincho, 16-09-2025, 23:22
Respuestas: 4 - Vistas: 484
GambOS
Foro: General
Último mensaje por: guizans, 20-08-2025, 13:58
Respuestas: 0 - Vistas: 336
Gambas y Wayland
Foro: General
Último mensaje por: guizans, 20-08-2025, 13:56
Respuestas: 6 - Vistas: 618
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.