Spanish [B4XPages] jRDC2 + MySQL CRUD + Login

josejad

Expert
Licensed User
Longtime User
Hola Ángel:

Sí, pero hay que meter las columnas en una lista antes para después crear un mapa con (nombre_columna, valor)

B4X:
        Dim lColumns As List
        lColumns.Initialize
        rs = Answer.Get("Data")
        For Each key As String In rs.Columns.Keys
            lColumns.Add(key)
        Next
        For Each row() As Object In rs.Rows
            Dim i As Int = 0
            mapData.Initialize
            For Each record As Object In row
'                mapData.Put(rs.Columns.GetKeyAt(i), record) CODE SMELL, CHANGED
                mapData.Put(lColumns.Get(i), record)
                i = i + 1
            Next

A ver si así te funciona en B4i, y ya creo que estaría.

gracias¡¡
 

Attachments

  • Project.zip
    212.1 KB · Views: 231

angel_

Well-Known Member
Licensed User
Longtime User
Buen trabajo, no consigo que funcione por que nunca he utilizado bases de datos pero no me aparece ningún error, sólo que está duplicado esto:

B4X:
B4XPageData - 302: Duplicate sub: b4xpage_menuclick
 

josejad

Expert
Licensed User
Longtime User
He añadido al final del hilo información sobre jRDC2 que puede ser útil o aclarar algunas cosas.
 

Situ LLC

Active Member
Licensed User
Hola, tengo ya tiempo de utilizar jRDC2 + MySQL / MAriaDB me trabaja a unas velocidades alucinates, mas rapido que la version Mysql normal que ulizamos en bj y b4A, ademas he echo pruebas de la base de datos en mi PC y el server.jar en un un servidor externo y es alucinante como se comporta.

Ademas si es multi plataforma yo lo ejecuto window , Linux , wrasperry debian , androide como cliente y va de pelos. En la raspberry lo he utilizado com servidor pero las versione Pi 3 son algo lentas a menos que tengas mas de 2 gigas de memoria , Pero con la Version PI 4 va como una rayo.

Tambien se ha probado en Khadas VIM3 PRO (Androide como cliente ) , ademas de Lattepanda con windows y linuz como cliente/servidor estas electronicas son mini computadores .

Ademas desarrollo aplicaciones en BJ para la raspberry y se comportan estables (cliente /servidor). En windows se corre el server.jar y se puede poner como servicio de windows , es facil my practico , y corres el cliente ahi mismo y ademas puedes crear un ejecutable del .jar y corres de maravillas.

Gracias a mi compadre Enrique ha mejorado y tiene una version propia de jRDC2 mas facil de implementar, estable y sencilla facil de aprender, y por otro lado puedo utiliza multiples servidores los cuales agregas con solo dos archivos de texto coneccion y nombre del modulo que debes de agregar y luego pues nada empiezas a trabajar con los modulos de backend.

ver foto/.

1645665692919.png


Tengo varios modulos y cada uno maneja un servidor diferente, dependiendo de programa cliente , yo manejo los servidores asi

Private endpoint As String = "http://192.168.1.103:45010"

Como ven maneja un puerto de esa manera ya le digo el servidor que levanto y como lo voy a utilizar. Porque ya he defindo las conecciones de cada en modulo ... jemplo jason. txt contiene el string de coneccion mas el puerto y jason_routes contiene el modulo que apunta a cual es my backend algo asi ...

contenido jason_routes .txt

#Wed Apr 21 22:28:32 CDT 2021
/jasonc=ClsJasonc


1645666056342.png


Con solo eso ya defino que tabla y servidor escoji para trabajar con mi aplicacion ya sea en B4A, bAJ B4I , tengo varias aplicaciones cliente y un solo server.jar, que puede como dije estar en un server externo o local y se maneja estable y mucho mas rapido que el Libreria Mysql normal,

Para finalizar el server.jar lee en el sudirectorio y levanta cada cuenta al servidor , al final si tienes 10 modulos con diferente puertos pues 10 servidores separadas manejar en tiempo real desde tus aplicacion cliente.

Les voy mostrar un eimplo un ejemplo de la velocidad del jRDC2 en una aplicacion que estamos desarrolando en bj+web donde hacemos busquedas muy complicadas en tablas asociades y concatenadas.

Servidor.jar sitio web.
Programa aun en desarrollo ...:cool:

Este es un sistema de venta de boletos para autobus multi horario y multi empresa, como veras el sistema genera los horarios que pasaria por un origen / destino desmenuzando en horas de paso por el lugar de destino , este proceso con llevan rutinas pesadas de procesos, pero como veran la velocidad de busqueda es alucinante.

Pueden escoger Origen Liberia y destino Nicoya, y el dia de venta por el calendario, si no hay disponibles a la fecha , solo cambien al proximo dia y veras el comportamiento de jRDC2 / mysql.

Creditos y desarrollo
Enrique Pelaez.
 
Last edited:

Piluso

Member
Licensed User
Buenas noches. Justo estaba buscando info sobre KVS porque en B4X no se puede usar encriptado (por lo que estuve viendo), y me encontré con esto.
Muy bueno el trabajo José, y me respondiste sin que te pregunte.
Este ejemplo es tal cual como lo tenia hecho y me habías ayudado el otro año, así que en estos días voy a ver si lo pruebo mas a fondo.

saludos
 

Piluso

Member
Licensed User
Buenas tardes.
Siguiendo como muestra este ejemplo y tratando de hacer una consulta mas genérica del tipo "select * from mitabla;" me tira el error.
B4X:
** Activity (main) Resume **
*** Service (httputils2service) Create ***
** Service (httputils2service) Start **
ResponseError. Reason: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0)., Response: <html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 500 java.sql.SQLException: Parameter index out of range (1 &gt; number of parameters, which is 0).</title>
</head>
<body><h2>HTTP ERROR 500</h2>
<p>Problem accessing /rdc. Reason:
<pre>    java.sql.SQLException: Parameter index out of range (1 &gt; number of parameters, which is 0).</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.z-SNAPSHOT</a><hr/>
</body>
</html>
ERROR: <html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 500 java.sql.SQLException: Parameter index out of range (1 &gt; number of parameters, which is 0).</title>
</head>
<body><h2>HTTP ERROR 500</h2>
<p>Problem accessing /rdc. Reason:
<pre>    java.sql.SQLException: Parameter index out of range (1 &gt; number of parameters, which is 0).</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.z-SNAPSHOT</a><hr/>
</body>
</html>
No data

El cual se produce porque del lado del config del jrdc agrego la linea.
B4X:
sql.consulta_test = SELECT * FROM EVENTS;

y en B4A a las lineas
B4X:
    Dim Paremeters() As String = Array As String(Month, B4XPages.MainPage.KVS.Get("id_user"))
    Wait For(B4XPages.MainPage.jRDC.GetRecord("getEvents", Paremeters)) Complete (Answer As Map)

Las modifico para correr mi consulta de esta manera
B4X:
    Dim Paremeters() As String = Array As String(Null)
    Wait For(B4XPages.MainPage.jRDC.GetRecord("consulta_test", Paremeters)) Complete (Answer As Map)

Probé pasar como parámetros "" y "*" y trae siempre el mismo error, por lo que deduzco que el error esta en como paso los datos a consultar.
Entiendo lo de pasar los datos y que los resultados deben venir en un mapa o lista, lo que no entiendo es porque no puedo pasar un valor null, "" o "*" o como debo hacerlo.
 

josejad

Expert
Licensed User
Longtime User
Hola:

El error indica que estás pasando un parámetro (el array paremeter, algún día corregiré eso a parAmeter), y que tu sentencia SQL espera 0 parámetros (ya que no hay ninguna ?)

Prueba a pasar Null directamente, lo he probado así y funciona:

B4X:
Wait For(B4XPages.MainPage.jRDC.GetRecord("getEvents", Null)) Complete (Answer As Map)

saludos,
 
Last edited:

Piluso

Member
Licensed User
Buenas tardes. Volví sin resolver el problema, lo tengo encerrado pero no se como resolverlo.
Arranque de cero un proyecto, agregué los módulos de clase, copié el código que preciso, y como sugirió José le pase el valor null directamente a la consulta...
B4X:
Private Sub Button1_Click
    jRDC.Initialize
'    xui.MsgboxAsync("Hello world!", "B4X")
    Ejecuto_consulta(Null)
End Sub
Sub Ejecuto_consulta (Buscarpor  As String)
    Dim rs As DBResult
    Dim Parameters() As String = Array As String (Buscarpor)
    Wait For(jRDC.GetRecord("consulta_test_todos",Null)) Complete (Answer As Map)
    If Answer.Get("Success") Then
        rs = Answer.Get("Data")
        Log("La consulta trajo como resultado: " & rs.Rows.Size &" registros")
    Else
        xui.MsgboxAsync("There was an error getting the data. Check your server: " & Answer.Get("Error"), "Error")
        Log("No data")
    End If
End Sub
y como escribió el autor, funciona (paso resultado del log)
B4X:
[IsInitialized=true, Name=consulta_test_todos, Parameters=[Ljava.lang.Object;@e5a4e05
]
*** Service (httputils2service) Create ***
** Service (httputils2service) Start **
La consulta trajo como resultado: 5 registros
pero cuando modifico la linea,
B4X:
Wait For(jRDC.GetRecord("consulta_test_todos",Null)) Complete (Answer As Map)
y pongo Parameters para que use a la variable Buscarpor, empieza a tirar error.

Resumiendo.
El error se genera en la línea
B4X:
    Dim Parameters() As String = Array As String (Buscarpor)
y no me doy cuenta como corregirla.

Debo mover algún otro valor dentro del array, como esta en el código original?

Línea de código original:
    Dim Paremeters() As String = Array As String(Month, B4XPages.MainPage.KVS.Get("id_user"))

Disculpen si soy extenso para escribir pero quiero ser claro con los conceptos.

Saludos
Guillermo
 

josejad

Expert
Licensed User
Longtime User
Hola Guillermo:

No termino de ver el error. Quieres hacer un select sin parámetros o con parámetros?
Si quieres hacer de las dos formas, debes hacer dos consultas sql en el config.properties y llamar a cada una de forma distinta.

Creo que seria mejor que crearas la pregunta en otro hilo que no sea el tutorial.
pon tb la o las consultas sql que quieres hacer y algún dato de ejemplo de tu tabla de mysql
 

josejad

Expert
Licensed User
Longtime User
Ok, explica bien una cosa que no entiendo.
Si no necesitas ningún parámetro, qué es Buscarpor?
 

Piluso

Member
Licensed User
Es una tabla que se va modificando con el paso del tiempo, entonces debo mostrarla toda para después poder elegir entre esos valores.
De todas maneras lo voy a resolver facil, voy a agregar un IF dentro de la subrutina validando si hay algo escrito o no y dependiendo de eso corro la línea que necesite.

Si hay algo escrito
Wait For(jRDC.GetRecord("consulta_test_todos",Parameters)) Complete (Answer As Map)
sino
Wait For(jRDC.GetRecord("consulta_test_todos",Null)) Complete (Answer As Map)

Esta tarde cuando salga de mi trabajo voy a probar eso y comento.
Si no necesitas ningún parámetro, qué es Buscarpor?
Use una variable genérica que se me ocurrió en el momento para probar en un proyecto que hice para hacer pruebas nada mas.
 

josejad

Expert
Licensed User
Longtime User
A ver, como te comentaba más arriba, debes tener dos consultas distintas en config.properties

B4X:
sql.consulta_todos = SELECT * FROM mytabla
sql.consulta_filtro = SELECT * FROM mytabla WHERE id_usuario = ? AND id_cancha = ? 'por ejemplo

Y llamar a una u otra
B4X:
Wait For(jRDC.GetRecord("consulta_todos",Null)) Complete (Answer As Map)

Wait For(jRDC.GetRecord("consulta_filtro",Parameters)) Complete (Answer As Map)

quizás haya alguna otra forma de generar un WHERE 1=1v para traer todos los registros o sustituirlo por una cláusula WHERE en jRDC2, pero no la conozco.
 

Piluso

Member
Licensed User
Si Jose, asi lo tengo y asi las voy a llamar desde el sub.

quizás haya alguna otra forma de generar un WHERE 1=1v para traer todos los registros o sustituirlo por una cláusula WHERE en jRDC2, pero no la conozco.
Eso es lo que queria saber.

Tema cerrado.
Saludos
 

hda

New Member
hi, help me
I want to display all the information when the user logs in as an administrator
Of course, this does not work, can you help?:
Sub PopulateCards (Month As String)
    clvData.Clear
    Dim rs As DBResult
    B4XLoadingIndicator1.Show
    Dim vpad As String
    vpad = B4XPages.MainPage.KVS.ContainsKey("user")
    If vpad = "admin" Then
    Dim Paremeters() As String = Array As String(Month)
    Wait For(B4XPages.MainPage.jRDC.GetRecord("gevents", Paremeters)) Complete (Answer As Map)
    Else
    Dim Paremeters() As String = Array As String(Month, B4XPages.MainPage.KVS.Get("id_user"))
    Wait For(B4XPages.MainPage.jRDC.GetRecord("getEvents", Paremeters)) Complete (Answer As Map)
    End If
    
    If Answer.Get("Success") Then
        Dim mapData As Map
        rs = Answer.Get("Data")
        For Each row() As Object In rs.Rows
            Dim i As Int = 0
            mapData.Initialize
            For Each record As Object In row
                'We will make a map to pass to B4XPreferencesDialo. The map keys must suit to the db name fields
                'Construimos un mapa para pasarlo a B4XPreferencesDialog. Las claves del mapa deben coincidir con los nombres de las columnas de la bd
                mapData.Put(rs.Columns.GetKeyAt(i), record)
                i = i + 1
            Next
            Dim p As B4XView = CreateCard(mapData)
            clvData.Add(p, mapData)
        Next
    Else
        xui.MsgboxAsync("There was an error getting the data. Check your server: " & Answer.Get("Error"), "Error")
        Log("No data")
    End If
    B4XLoadingIndicator1.Hide
End Sub
 

josejad

Expert
Licensed User
Longtime User
Hi hda:

Remember that this tutorial is in English too here

I want to display all the information when the user logs in as an administrator
Then you should have an sql in the config.properties in the jRDC2 server in B4J without id_user

Something like:
B4X:
sql.getEvents = SELECT * FROM B4X.events WHERE `month` = ? AND `id_user` = ?
sql.getEventsAdmin = SELECT * FROM B4X.events WHERE `month` = ?

Then call getEventsAdmin instead getEvents
 
Top