Spanish Ayuda para construir el sub GetRecord usando JRDC

Alejandro Viera

Member
Licensed User
Buenas a todos:

Tengo en mi config.properties definida este query:

sql.getArticulos = SELECT `descripcion`,`stock`,`neto` FROM varticulos WHERE `codinterno` IN (SELECT `codinterno` FROM links WHERE `codigob` =?)

el parámetro (codigob) es el resultado de una scaneada de código de barras de la cámara, una variable de tipo string llamada 'msg'


He hecho este sub:

GetRecord(id):
Sub GetRecord(id As Int)
    Dim req As DBRequestManager = CreateRequest
    Dim cmd As DBCommand = CreateCommand("getArticulos", Array(id))
    Wait For (req.ExecuteQuery(cmd, 0, Null)) JobDone(j As HttpJob)
    If j.Success Then
        req.HandleJobAsync(j, "req")
        Wait For (req) req_result(res As DBResult)
        req.PrintTable(res)
    Else
        Log("ERROR: "&j.ErrorMessage)
    End If
    j.Release
End Sub

y el resultado que me arroja es:
[Columns=(MyMap) {descripcion=0, stock=1, neto=2}, IsInitialized=true, Rows=(ArrayList) []

Alguien podría ayudarme a poner en variables los campos del query ? (descripcion, stock y neto)
Muchas gracias!
 

Gabino A. de la Gala

Well-Known Member
Licensed User
Longtime User
Voy de memoria, pero algo parecido a esto:
B4X:
Dim colums As Map = res.Get("columns")
For Each row() As Object In res.Rows
  DIM descripcion as string = row.get(columns.get("descripcion"))
  ... 
  ...
Next
 

Alejandro Viera

Member
Licensed User
Gracias Gabino, mira el Sub ha quedado asi:

B4X:
Sub GetRecord(id As Int)
    Dim req As DBRequestManager = CreateRequest
    Dim cmd As DBCommand = CreateCommand("getArticulos", Array(id))
    Wait For (req.ExecuteQuery(cmd, 0, Null)) JobDone(j As HttpJob)
    If j.Success Then
        req.HandleJobAsync(j, "req")
        Wait For (req) req_result(res As DBResult)
        req.PrintTable(res)
    
        Dim columns As Map = res.Get("columns")                                   [B][COLOR=rgb(184, 49, 47)]  Miembro desconocido: ge[/COLOR][/B][COLOR=rgb(184, 49, 47)][B]t[/B][/COLOR]

        For Each row() As Object In res.Rows
            Dim descripcion As String = row.get(columns.get("descripcion"))  [B] [COLOR=rgb(184, 49, 47)]Solo el 'Length' (Largo) esta permitido por arreglos.[/COLOR][/B]
            Dim stock As Float = row.get(columns.get("stock"))                         [B][COLOR=rgb(184, 49, 47)]Solo el 'Length' (Largo) esta permitido por arreglos.[/COLOR][/B]
            Dim neto As Float = row.get(columns.get("neto"))                         [B][COLOR=rgb(226, 80, 65)]  [/COLOR][COLOR=rgb(184, 49, 47)]Solo el 'Length' (Largo) esta permitido por arreglos.[/COLOR][/B]
        Next
            
    Else
        Log("ERROR: "&j.ErrorMessage)
    End If
    j.Release
End Sub

Pero me arroja los errores que he puesto en rojo en la linea que lo da.
 

josejad

Expert
Licensed User
Longtime User
Hola Alejandro:

Si tu consulta devolviese más de una fila, tendrías que recorrer toda la lista para ir viendo cada fila. Si devuelve sólo un registro, en Row.Get(0), tendrás tus 3 valores.
Así que, si no me equivoco (sin probarlo), tendrías que hacer algo como:

B4X:
Dim l as List 'Aquí almacenaremos la lista con los tres resultados.
l = Rows.Get(0) '0 ya que sólo hay un registro
descripcion = l.Get(0)
stock = l.Get(1)
neto = l.Get(2)

Por cierto, si ejecutas tu consulta directamente (por ejemplo con PHPMyAdmin), ¿te devuelve algún valor? No estoy seguro, pero viendo Rows=(ArrayList) [] me da la impresión de que la consulta no te está devolviendo ningún registro.

saludos,
 

Alejandro Viera

Member
Licensed User
José probé con lo que me indicas, pero la linea

B4X:
l = Rows.Get(0) '0 ya que sólo hay un registro

da este error: Variable 'rows' no declarada se utiliza antes de que se le haya asignado cualquier valor.

Si corro la consulta con un editor SQL si, arroja el resultado que espero!
 

josejad

Expert
Licensed User
Longtime User
¿La salida que muestras en el log ([Columns=(MyMap) {descripcion=0, stock=1, neto=2}, IsInitialized=true, Rows=(ArrayList) []) entiendo que es de req.PrintTable(res), verdad?

Creo entonces que la consulta no te está devolviendo ningún registro. Comprueba que tu sentencia es correcta o que algún registro la cumple.

Si no, sube un pequeño SQL para reproducir tu base de datos (sin datos sensibles) y tu proyecto.

saludos,
 

Alejandro Viera

Member
Licensed User
José la sentencia esta chequeada y hay un registro que cumple la condición de búsqueda.
Ahora el resultado que obtengo haciendo un LOG(res) es el siguiente.

[Columns=(MyMap) {descripcion=0, stock=1, neto=2}, IsInitialized=true, Rows=(ArrayList) [[Ljava.lang.Object;@f832f64]
, Tag=null]

si hago lo que tu me recomiendas
B4X:
Dim l As List 'Aquí almacenaremos la lista con los tres resultados.
l = res.Get(0)
Dim descripcion As String = l.Get("descripcion")
Dim stock As Int = l.Get("stock")
Dim neto As Float = l.Get("neto")

la linea que da Miembro Desconocido GET es la segunda ( l = res.get(0) )
Agradezco cualquier tipo de ayuda.
 

Gabino A. de la Gala

Well-Known Member
Licensed User
Longtime User
Perdón, al escribir de memoria creo que me confundí en lo siguiente.
En lugar de esto:
B4X:
DIM descripcion as string = row.get(columns.get("descripcion"))
Debería de ser:
B4X:
DIM descripcion as string = row(columns.get("descripcion"))
 

Gabino A. de la Gala

Well-Known Member
Licensed User
Longtime User
De todas formas, que el printable no te enseñe les datos en columnas de una manera visible, me parece un poco extraño.
Aquí te adjunto un ejemplo de como preparar los datos para cargar una tabla que en otro hilo le gustó mucho a @Sergio Castellari

B4X:
Dim cmd As DBCommand = Funciones.CreateCommand("ObtenerVisitasOnLine", Array(999999))
		Wait For (req.ExecuteQuery(cmd, 0, Null)) JobDone(j As HttpJob)
		If j.Success Then
			req.HandleJobAsync(j, "req")
			Wait For (req) req_Result(res As DBResult)
			'ToastMessageShow("Registros obtenidos: " & res.Rows.Size, True)
			If res.Rows.Size > 0 Then
				Dim cont As Int = 0
				'Log("detener... " & DetenerCargaClv)
				'req.PrintTable(res)
				Dim registros As List
				registros.Initialize
				For Each row() As Object In res.Rows
					If DetenerCargaClv = False Then
						cont = cont + 1
						registros.Add(Array As String(row(res.Columns.Get("codigo")), row(res.Columns.Get("fecha")), row(res.Columns.Get("cliente")), row(res.Columns.Get("razoncomercial")), row(res.Columns.Get("contacto")), row(res.Columns.Get("horaentrada")), row(res.Columns.Get("minutoentrada")), row(res.Columns.Get("obs")), row(res.Columns.Get("motivosvisita")), row(res.Columns.Get("agente"))))
						'Log(sb.ToString)
					Else
						Exit
					End If
					'Log("NRegistros cargados: " & CustomListView1.Size)
				Next
				
				B4XTable1.SetData(registros)
			Else
				xui.MsgboxAsync("No se han encontrado datos...", "ERROR")
			End If
 

Alejandro Viera

Member
Licensed User
[Columns=(MyMap) {descripcion=0, stock=1, neto=2}, IsInitialized=true, Rows=(ArrayList) [[Ljava.lang.Object;@e25e5c3], Tag=null]

Eso obtengo hoy.... estará mal manejado el parámetro que le paso entonces?, sin embargo devuelve las columnas involucradas en el query al mysql
 

josejad

Expert
Licensed User
Longtime User
Ahora sí hay algo en el array.

Pon tu codigo completo a ver
 

Alejandro Viera

Member
Licensed User
B4X:
Sub GetRecord(id As Int)
    Dim req As DBRequestManager = CreateRequest
    Dim cmd As DBCommand = CreateCommand("getArti", Array As String((id)))
    
    Wait For (req.ExecuteQuery(cmd, 0, Null)) JobDone(j As HttpJob)
    If j.Success Then
        req.HandleJobAsync(j, "req")
        Wait For (req) req_result(res As DBResult)
        
        Log("Total de Columnas: "&res.Rows.Size)
        
        Dim cont As Int = 0
    '    req.PrintTable(res)
        Log(res)
        
        Dim registros As List
        registros.Initialize
           
        For Each row() As Object In res.Rows
        
            cont = cont + 1
'            registros.Add(Array As String(row(res.Columns.Get("descripcion")), row(res.Columns.Get("stock")), row(res.Columns.Get("neto"))))
'            row(res.Columns.Get("descripcion"))
'            row(res.Columns.Get("stock"))
'            row(res.Columns.Get("neto")) 

        Next
    Else
        Log("ERROR: "&j.ErrorMessage)
    End If
    j.Release
End Sub

Estaba tratando de ver el ejemplo de Gabino, pero en realidad en este caso lo que preciso es leer el único registro devuelto, pero ya que estamos voy viendo como se llena una B4XTable1 que ya necesitare.

Hice pruebas en el query y los resultados cambias, o sea se esta ejecutando bien, solo me faltaría leer los resultados, que ahí tengo la mezcla de conceptos.
 

Gabino A. de la Gala

Well-Known Member
Licensed User
Longtime User
Una pregunta "tonta" al volver a leer el título
¿El servidor es jRDC o jRDC2?

¿Tocaste algo de la parte del servidor?
¿Puedes adjuntarnos el config.properties?

A mi el resultado que me queda en el log al pedir el req.PrintTable(res) no se parece en nada a lo que pusiste antes.
A mi me sale así:
B4X:
Tag: null, Columns: 11, Rows: 1537
codigo    razoncomercial    razonfiscal    telefono1    telefono2    fax    email    direccion1    cp    poblacion    provincia   
331904    AMALIO DFDDFDD    AMALIO DDDD    630666666    null    null   VVVVVL@HOTMAIL.ES    BARRIO LA IGLESIA 3117    39690    CAMARGO    CANTABRIA

Otra cosa que he visto es que los parametros en que el createcomand, yo los parametros los paso como array y tu cmo array of string. (Por si acaso tuviera que ver en algo)
 

Alejandro Viera

Member
Licensed User
Gabino, la versión del jRDC dice 2.22,

lo que he tocado el el properties, para meter otra consulta mas simple y ver si las realizaba, y si...
saque todo de un ejemplo de José, pero no se que me falta. (además de aprender :p)

B4X:
#Lines starting with '#' are comments.
#Backslash character at the end of line means that the command continues in the next line.

#DATABASE CONFIGURATION
DriverClass=com.mysql.jdbc.Driver
JdbcUrl=jdbc:mysql://localhost:3306/nexxges?characterEncoding=utf8&useSSL=false
User=root
Password=pass22021
#Java server port
ServerPort=2930

#SAMPLE
sql.Login = SELECT * FROM B4X.users WHERE `username` = ? AND `password` = md5(?)
sql.getEvents = SELECT * FROM B4X.events WHERE `month` = ? AND `id_user` = ?
sql.updateEvents = UPDATE B4X.events SET `month`=?,`event_type`=?,`description`=?, `value` = ? WHERE `id` = ?
sql.deleteEvents = DELETE FROM B4X.events WHERE `id` = ?
sql.addEvents = INSERT INTO B4X.events(`id_user`, `month`, `event_type`, `description`, `value`) VALUES (?, ?, ?, ?, ?)
sql.getArticulos = SELECT `descripcion`,`stock`,`neto` FROM articulos WHERE `codinterno` IN (SELECT `codinterno` FROM links WHERE `codigob` =?)
sql.getArti = SELECT `descripcion`,`stock`,`neto` FROM articulos WHERE `codinterno` BETWEEN 4285 AND ?

Este ultimo query lo hice para ver si el array obtenia mas resultados y comprobar la sentencia, y si lo hace.
 

josejad

Expert
Licensed User
Longtime User
Este ultimo query lo hice para ver si el array obtenia mas resultados y comprobar la sentencia, y si lo hace
Pero con la última sentencia si tre funciona y te deja acceder a los datos y con la otra no?
 

Alejandro Viera

Member
Licensed User
Con la ultima sentencia si me trae 6 registros por ejemplo, y es este el resultado de salida Log(res)

[Columns=(MyMap) {descripcion=0, stock=1, neto=2}, IsInitialized=true, Rows=(ArrayList) [[Ljava.lang.Object;@4f15ced, [Ljava.lang.Object;@162f722, [Ljava.lang.Object;@4bbc5b3, [Ljava.lang.Object;@5a1e770, [Ljava.lang.Object;@b13dae9, [Ljava.lang.Object;@d5d636e]

Necesitaria poder leer esos resultados obtenidos! en este caso 6, para orientarme un poco en el funcionamiento.
 

Gabino A. de la Gala

Well-Known Member
Licensed User
Longtime User
Con la ultima sentencia si me trae 6 registros por ejemplo, y es este el resultado de salida Log(res)

[Columns=(MyMap) {descripcion=0, stock=1, neto=2}, IsInitialized=true, Rows=(ArrayList) [[Ljava.lang.Object;@4f15ced, [Ljava.lang.Object;@162f722, [Ljava.lang.Object;@4bbc5b3, [Ljava.lang.Object;@5a1e770, [Ljava.lang.Object;@b13dae9, [Ljava.lang.Object;@d5d636e]

Necesitaria poder leer esos resultados obtenidos! en este caso 6, para orientarme un poco en el funcionamiento.
¿Por qué no descomentas la línea del log(req.PrintTable(res)) a ver que es realmente lo que te viene?
 

Alejandro Viera

Member
Licensed User
Asi esta el codigo, usando el query:
sql.getArticulos = SELECT `descripcion`,`stock`,`neto` FROM articulos WHERE `codinterno` IN (SELECT `codinterno` FROM links WHERE `codigob` =?)

Que es ejecutado: Command: query: getArticulos, took: 2ms, client=192.168.1.37 (visto en la solapa log del b4J donde voy monitoreando.


B4X:
Sub GetRecord(id As String)
    Dim req As DBRequestManager = CreateRequest
    Dim cmd As DBCommand = CreateCommand("getArticulos", Array(id))
    Log(id)
    Wait For (req.ExecuteQuery(cmd, 0, Null)) JobDone(j As HttpJob)
    If j.Success Then
        req.HandleJobAsync(j, "req")
        Wait For (req) req_result(res As DBResult)
        
        req.PrintTable(res)   
        Log("req.PrintTable(res): "&req.PrintTable(res))
        Log("res: "&res)
    
    Else
        Log("ERROR: "&j.ErrorMessage)
    End If
    j.Release
End Sub
Log("req.PrintTable(res): "&req.PrintTable(res)) NO ARROJA INFORMACION
Log("res: "&res) -> Arroja: res: [Columns=(MyMap) {descripcion=0, stock=1, neto=2}, IsInitialized=true, Rows=(ArrayList) [[Ljava.lang.Object;@a62cb41], Tag=null]
 

josejad

Expert
Licensed User
Longtime User
A ver si luego en casa replico tu base de datos y hago una prueba
 

Gabino A. de la Gala

Well-Known Member
Licensed User
Longtime User
Es raro que el printable no devuelva nada.
Algo raro tiene que haber.

Si te parece, nos pasas por privado la carpeta del servidor con la bd o nos habilitas un puerto para poder hacer pruebas desde fuera.

Un saludo.
 
Top