Páginas (2): 1 2   
jguardon   09-05-2024, 19:41
#1
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.

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
Shordi   09-05-2024, 22:56
#2
L a extensión de Gridview que hice y que está por ahí, admitía como fuente de datos una colección de colecciones. Mañana te la busco, a ver si te vale para algo.

Saludos

No podemos regresar
Shordi   10-05-2024, 09:07
#3
Dicho y hecho. Aquí tienes el ejemplo del Grid que recordaba. En realidad adopta forma de control, wGrid si no lo quieres con filtros y demás y wGridFilter si así lo quieres. En realidad el segundo es una extensión del primero.
El funcionamiento es más o menos simple: El GridView siempre usa como fuente de datos un array Variant que contiene un array por cada registro con los valores de los campos .
La Propiedad Source, que es la que hace la magia, admite un Variant[ ] como el que usa luego, un Result, un fichero de texto, un CSV o una Colección de Colecciones. Lo que hace es convertir esa source al Variant[ ] mencionado y actua con él.

Por muchos registros que se le pasen es muy rápido porque una vez cargados los datos, todos los filtros, búsquedas, ordenaciones y demás se hacen sobre ese Array en memoria sin recurrir nunca a la fuente otra vez.

Le puse lo del Array de coleciones porque el control SqlTree, que no se si recordarás que subí hace ya unos añitos, y que construye un TreeView a partir de una consulta SQL, pasaba la rama seleccionada como array de colecciones y al recibirlo así el wGrid, era muy fácil llamar luego a formularios de edición y demás.

Espero que te sirva.

Saludos
Archivos adjuntos
.gz
CollecsToGrid-0.0.1.tar.gz (Tamaño: 46.17 KB Descargas: 3)

No podemos regresar
jguardon   10-05-2024, 20:21
#4
Lo estudio este fin de semana y a ver si soy capaz de adaptarlo de la forma más simple que pueda. La verdad es que no debe ser difícil porque con arrays está chupado, pero con las colecciones creo que me estoy complicando yo sólo.

Muchas gracias

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
cogier   11-05-2024, 11:20
#5
Creo que el archivo de ejemplo tiene un error de sintaxis en la línea 44 y debería ser "added_by": "jguardon" no "added_by": jguardon.

Jugué un poco y llegué a este código. Espero que ayude.

[Imagen: Json2.png]
Archivos adjuntos
.gz
Test-0.0.9.tar.gz (Tamaño: 9.25 KB Descargas: 2)
Shordi   11-05-2024, 12:05
#6
Muy bueno, Cogier. Justo lo que Jesús quería.

No podemos regresar
jguardon   11-05-2024, 13:36
#7
(11-05-2024, 11:20)cogier escribió: debería ser "added_by": "jguardon" no "added_by": jguardon.

Efectivamente, esto fue porque edité el texto manualmente al escribir en el foro.
(11-05-2024, 11:20)cogier escribió: Jugué un poco y llegué a este código. Espero que ayude.

Fantástico, cogier. Muchísimas gracias por tu esfuerzo, creo que pronto podré subir el código de la aplicación a GitLab y a la Granja.

Saludos

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
jguardon   11-05-2024, 13:44
#8
(11-05-2024, 12:05)Shordi escribió: Muy bueno, Cogier. Justo lo que Jesús quería.

No exactamente, porque cogier ha llenado el gridview de forma "manual", iterando a través de los valores y claves de la colección.

Mi intención es usar el evento Data del gridview para manejar grandes cantidades de datos sin que la aplicación pierda su rendimiento, así que para este caso concreto con muy pocos registros no se va a notar, pero por ejemplo para un listado de artículos, clientes o ventas, la cosa podría ponerse muy lenta.

Saludos

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
cogier   14-05-2024, 17:36
#9
Entiendo su necesidad de utilizar el Gridview_Data(Row, Column).  He trabajado en mi código y he llegado a esto. Mi ordenador tarda unos 7 segundos en cargar más de 20.000 líneas, pero una vez cargado se puede desplazar el Gridview sin ningún retraso.
 
[Imagen: json3.png]
Archivos adjuntos
.gz
Test-0.1.tar.gz (Tamaño: 64.35 KB Descargas: 2)
jguardon   14-05-2024, 22:15
#10
Muchas gracias otra vez, cogier. Buen trabajo.

Esto es la solución que yo encontré para cargar un array de colecciones en gridview con el evento Data:

Código:
Public Sub GridView1_Data(Row As Integer, Column As Integer)

    Dim fields As JSONCollection

    fields = cResp["users"][Row]
    GridView1.Data.Text = fields[fields.Keys[Column]]
  
End

cResp es una JSONCollection, por aquello de mantener los valores "null" de la colección y se carga mediante JSON.Decode(jsonstring, True) desde un servidor.

Es la respuesta a un comando enviado desde la aplicación de escritorio a una aplicación CGI, en lugar de ser un fichero en nuestro PC.

Aún tengo un problema con el tratamiento de los "null" en las colecciones, pero estoy intentando averiguar las razones.

Gracias a todos los que me habéis ayudado... no era tan difícil Big Grin

Saludos

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
Páginas (2): 1 2   
  
Usuarios navegando en este tema: 5 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.