Spanish ¿ Como detener jRDC para actualizarlo a una versión mas nueva ?

Sergio Castellari

Active Member
Licensed User
Hola gente

Estos días pude retomar el tema de implementar un Servidor jRDC.
Después de mucho leer en el foro, ver vídeos de Erel, pasarme unos consejos @José J. Aguilar , más todo lo que busqué en la WEB ... logré compilar mi jRDC, y copiarlo y ejecutarlo en mi servidor VPS.
Me doy cuenta que funciona, porque ejecuto mi ip: puerto / test y me devuelve que esta corriendo !!!! Ni se imaginan mi alegría !!!! :RE

Pero, siempre hay un pero: me doy cuenta, que la versión que compilé de jRDC no tiene los comandos SQL que YO necesito para comenzar a probar que funciona con mi DataBase.
Ya probé sobreescribirlo, borrarlo de la carpeta original donde lo ejecute..pero NADA ... sigue trabajando con la versión original !!!!

¿¿¿Como hago para detener jRDC, y permitirme instalar otra versión mas nueva ???

Saludos
Sergio

PD: Tengo muchas mas preguntas...pero iré de a poco!!!
 

José J. Aguilar

Expert
Licensed User
Hey Segio! Espero que todo bien con todo esto del COVID para ti y la familia


Detén tu servidor como indica el paso 5, una vez detenido, deberias poder copiar la Nueva version y ejecutarla.
 

Sergio Castellari

Active Member
Licensed User
@José J. Aguilar !!!!

Sos un genio!!!!...Ya me anote el proceso para "matar" el servicio, copiar la nueva versión, y ponerla a funcionar!! jajaja....estoy FELIZ!!!

Ahora seguiré avanzando para ver si "funcionan" los comandos agregados....seguramente seguiré preguntando...

Saludos,
Sergio

PD: Gracias por preguntar amigo, por suerte y tomando los mayores cuidados, por aquí todo bien...pero ahora se viene el invierno, y seguramente la cosa se va a poner peor.
YO deseo lo mismo para ti y tus seres queridos...las noticias de España son bastante fuertes....solo les deseo lo mejor!!!
 

Sergio Castellari

Active Member
Licensed User
@José J. Aguilar

Ahora tengo un "problemita" con mi primer comando:

Hice esto en la APP B4A:

B4X:
Sub CreateRequest As DBRequestManager
     ' Por cada solicitud, se crea un nuevo DBRequest...
   Dim req As DBRequestManager
   req.Initialize(Me, rdcLink)
   Return req
End Sub

Sub CreateCommand(Name As String, Parameters() As Object) As DBCommand
   Dim cmd As DBCommand
   cmd.Initialize
   cmd.Name = Name
   If Parameters <> Null Then cmd.Parameters = Parameters
   Return cmd
End Sub

Sub Button1_Click
   Dim req As DBRequestManager = CreateRequest
   Dim cmd As DBCommand = CreateCommand("create_table_animals", Null)
   Wait For (req.ExecuteQuery(cmd, 0, Null)) JobDone(j As HttpJob)
   If j.Success Then
            ToastMessageShow("Tabla creada correctamente",True)
   Else
       Log("ERROR: " & j.ErrorMessage)
   End If
   j.Release   
End Sub

en Button1_Click deberia ejecutarse este "comando" del jRDC:

sql.create_table_animals=CREATE TABLE IF NOT EXISTS animals (\
id INTEGER PRIMARY KEY AUTO_INCREMENT,\
name CHAR(30) NOT NULL,\
image BLOB)

pero salta este error:
ResponseError. Reason: java.sql.SQLException: Can not issue data manipulation statements with executeQuery()., Response: <html>
etc etc etc...

¿¿¿ Que estoy haciendo mal ???

Mi pequeño entender, me indica que tengo ALGO mal en la subrutina del Click...pero no se que!!!!!

PD: Estoy tratando de aplicar/entender lo básico que puso Erel en el ejemplo incial.

Saludos y desde ya gracias!!!,
Sergio
 

José J. Aguilar

Expert
Licensed User
Mira que error te da en B4J en vez de en B4A.
es decir, antes de ponerse a trabajar sobre el jar que generes, es bueno tener B4J corriendo a la vez que B4A, asi ves los errores tb que la base de datos le pasa a B4J
 

José J. Aguilar

Expert
Licensed User
Viendo ahora tu código, no sé si has copiado el ejemplo de Erel o lo has creado tú.
según el tutorial de RDC (el antecesor de jRDC2)
Non-select commands are sent with ExecuteCommand (single command) or ExecuteBatch (any number of commands)

es decir, como el comando que estas ejecutando no es un select, deberias usa executecommand en vez de executequery si no me equivoco.
 

Sergio Castellari

Active Member
Licensed User
Mira que error te da en B4J en vez de en B4A.
es decir, antes de ponerse a trabajar sobre el jar que generes, es bueno tener B4J corriendo a la vez que B4A, asi ves los errores tb que la base de datos le pasa a B4J

No te entiendo.
Que tiene que ver B4J, cuando estoy ejecutando la APP, que se supone ya tiene la conexion con el jRDC configurada Process_Globals.
No comprendo muy bien ingles, pero pareciera decirme que no puedo usar req.ExecuteQuery para ejectar el comando...
 

Sergio Castellari

Active Member
Licensed User
Viendo ahora tu código, no sé si has copiado el ejemplo de Erel o lo has creado tú.
según el tutorial de RDC (el antecesor de jRDC2)
Non-select commands are sent with ExecuteCommand (single command) or ExecuteBatch (any number of commands)

es decir, como el comando que estas ejecutando no es un select, deberias usa executecommand en vez de executequery si no me equivoco.

Claro...ahora voy comprendiendo...pero el asunto es que NO SE USAR executeComand!!! (Yo tome el ejemplo de Erel y solo cambié el nombre del comando....
 

José J. Aguilar

Expert
Licensed User
Que tiene que ver B4J
A ver, jRDC2 es un servidor hecho en B4J, tu lo has compilado en B4J y has copiado tu jar en tu servidor y lo has ejecutado. Pero eso es cuando ya esta en produccion. En desarrollo no te hace falta ejecutar ese jar, tu ejecutas B4J, le das a run y ya estaria ejecutandose en tu ordenador tu servidor jRDC2. Tu app B4A haces que apunte a tu direccion de tu pc con B4J, asi puedes ir haciendo cambios sobre la marcha. Una vez que todo funciona, ya compilas tu jar y lo pones en tu VPS y apuntas desde tu app a ese servidor.

NO SE USAR executeComand
Si te fijas en el ejemplo, mas abajo pone:
Example of sending an INSERT request. Ahi lo piedes ver. Echale un ojo tambien al video.
 

Sergio Castellari

Active Member
Licensed User
Wow!!!!...

Cada segundo aprendo algo nuevo contigo!!!!....
Aja...claro...no me había dado cuenta de que B4J "ejecuta" al servidor jRDC en mi compu!!!....ESTE DATO ESTA GENIAL, ya que mayormente me voy a pasar en modo dearrollo para ir ajustando...
Peeeroooo, no me doy cuenta como tengo que APUNTAR mi app B4A a la direccion local del jRDC, ni si tengo que hacer algo con el puerto que estoy usando...(en esto necesito tu ayuda!!!!)

Con respecto al ejemplo del INSERT, pues ahi lo cambie y funcionooooo!!!...Me agrego la tabla "Animals" a la database que habia configurado!!!! ES LA ALEGRIA TOTAL!!!

Desde ya MIL GRACIAS por tus ayuda (no me he dado cuenta que hora es alla, pero creo que son 4 horas mas) asi que ningún problema..esperaré a mañana!!!

Abrazos totales José!!
Sergio
 

roerGarcia

Active Member
Licensed User
Longtime User
Apenas te iba a comentar eso:

B4X:
Sub InsertRecord (Name As String)
   Dim cmd As DBCommand = CreateCommand("insert_animal", Array(Name, Null))
   Dim j As HttpJob = [B]CreateRequest.ExecuteBatch(Array(cmd), Null)[/B]
   Wait For(j) JobDone(j As HttpJob)
   If j.Success Then
       Log("Inserted successfully!")
   End If
   j.Release
End Sub

Que bueno que ya lo resolviste.
Saludos
 

José J. Aguilar

Expert
Licensed User
como tengo que APUNTAR mi app B4A a la direccion local del jRDC,
"Buenos días" Sergio:

Pues mira la ip de tu PC (por ejemplo con ipconfig o en las propiedades de red) y pones esa dirección en tu app de B4A.
Por ejemplo: http://192.168.1.133:8090/rdc
El puerto pues el mismo que tuvieses (de hecho, el que configures en B4J en la línea ServerPort=8090. (o el que sea, en el ejemplo es 17 mil y algo)

Eso sí, hay algo que tienes que tener en cuenta. Como ya sabes, B4A apunta al servidor jRDC2 (B4J) y éste a tu servidor de base de datos (mysql o la que sea).
Cuando pusiste el servidor jRDC2 en tu VPS, probablemente tengas tu base de datos en el mismo VPS, por tanto en la configuración de B4J pones localhost, ya que ambos servidores (jRDC2 y Mysql) están en el mismo ordenador.

Ahora cuando hagas las pruebas sobre tu pc, si tienes la base de datos también en tu pc (por ejemplo con xamp o wamp) también debes poner en B4J localhost.
Pero si el servidor B4J va a estar en tu pc, y vas a trabajar sobre la base de datos de tu VPS, entonces en B4J deberías poner la ip de tu VPS

B4X:
#DATABASE CONFIGURATION
DriverClass=com.mysql.jdbc.Driver
JdbcUrl=jdbc:mysql://localhost:3306?characterEncoding=utf8 #para el caso de que estén en el mismo ordenador

#O

JdbcUrl=jdbc:mysql://la.ip.del.VPS:3306?characterEncoding=utf8 #para el caso de que estén en ordenadores distintos el servidor jRDC2 y el de la base de datos

No comprendo muy bien ingles
Prueba esta web, que las traducciones son bastante buenas:
 

Sergio Castellari

Active Member
Licensed User
Buen día @José J. Aguilar !!!!

Anoche seguí insistiendo (como todo programador) un buen rato más....y encontré una respuesta tuya a un colega, que tenia un problema similar. Y me anote esto en mi GUIA:
https://www.b4x.com/android/forum/threads/how-to-connect-to-mysql-database.98619/ >>> Magistral explicación de Jose J. Aguilar (en el post #17) de cómo funciona jRDC2 como intermediario entre la App B4A y MySQL en el VPS

ASI CON ESTO logré entender que podía tener jRDC activo en mi PC, y hacer las pruebas de desarrollo con las Base de datos en el VPS (en mi VPS tengo una BD, dedicada a pruebas que de igual estructura que las de mi clientes). Di un paso más!!!!

Las pruebas que estoy haciendo (en un principio) es para VALIDAR Usuario y contraseña de acceso al sistema:
Ahora bien :
- Logro obtener todos los registros de Usuarios de acceso a mi sistema, es una columna (campo) llamado NOMBRE. Los veo perfectamente con "req.PrintTable(res)"
- En cada registro (todo es texto) tengo 3 partes donde se encuentra el Nombre de Usuario, la Contraseña y un Flag.
- Necesito poder obtener los 3 datos separados para CHEQUEARLOS.
Peeeeroo no se como obtener el resultado de cada registro, y separar dichos datos. Por ejemplo:

Registro 1: Sergio..............pepito..............ok
Registro 1: Jose................genius..............ok

20 caracteres para Usuario
20 caracteres para Contraseña
2 caracteres para Flag

Actualmente en mi sistema de Gestión, utilizo SubStr(variable,x,y) y obtengo separadamente los Nombres, Contraseñas, y flag....

¿¿¿Como hago esto cn B4A ??? Como obtengo los Nombres y Contraseñas para poder "analizar" si el Usuario es válido ???

Desde ya muchisimas gracias por tu ayuda!
Sergio
 

José J. Aguilar

Expert
Licensed User
jeje, estuve anoche por ponerte el enlace que dices, pero como comentas que el inglés no se te da bien, preferí no hacerlo.

Cuando haces tu query (supongo que algo como "SELECT user, password FROM users WHERE usuario = ? AND password=md5(?)" o lo que sea, recuperas el valor en res, que al ser del tipo DBResult tiene un mapa con los nombres de las columnas, y una lista con todos los registros devueltos (en este caso, a tí sólo te devolvería 1 usuario si la consulta fuera correcta


Pues en la propia sub PrintTable tienes una pista de cómo recuperar los datos (y aproximadamente en el minuto 15:50 del tutorial.
Después de esperar por el resultado, que se devolverá en res:
B4X:
Wait For (req) req_Result(res As DBResult)
    For Each row() As Object In res.Rows
        Log(row(0)) 'Aquí si cada línea que te devuelve la consulta, tiene un solo campo, sólo tendrás row(0), sino, pues cada campo será row(1), row(2), etc...
    Next

Cuando indicas que obtienes tus registros como:
Registro 1: Sergio..............pepito..............ok
Registro 1: Jose................genius..............ok
no sé si te refieres a que son columnas separadas, o es un solo string.
En este caso, mira las funciones de los strings:
1587388551549.png
 

Attachments

  • 1587388551549.png
    1587388551549.png
    15.2 KB · Views: 102

Sergio Castellari

Active Member
Licensed User
Hola José,

Bueno, con tus pistas, más mi tozudes...HE LOGRADO EL COMETIDO!!...Mi APP, verifica y controla (valida) el acceso al sistema. Aquí te paso el trozo de código que realiza la tarea (para que veas si hago algo mal...):

B4X:
Sub btnAcceder_Click
     Dim cUsrIng, cPasIng As String
     Dim lLogin = False As Boolean
     cUsrIng = EditText1.Text
     cPasIng = EditText2.Text
     If cUsrIng = "" Or cPasIng = "" Then
        MsgboxAsync("Es necesario Usuario y/o Contraseña válidos","Acceso al sistema...")
          EditText1.RequestFocus
            Return
     End If
      'Aqui leo todos los Usuarios del Sistema
     '***************************************
     ProgressDialogShow("Procesando...espere...")
     Dim cTexto, cUsr, cPas, cBnd As String
     Dim req As DBRequestManager = CreateRequest
   Dim cmd As DBCommand = CreateCommand("select_usuarios", Null)
   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)
     'trabajar con el resultado
     req.PrintTable(res)
         For Each row() As Object In res.Rows
       'Log("Yo: " & row(0)) 'Aquí si cada línea que te devuelve la consulta, tiene un solo campo, sólo tendrás row(0), sino, pues cada campo será row(1), row(2), etc...
             cTexto = row(0)                  'Obtengo el contenido del primer campo (puede haber varios campos en la consulta)
             'Log("Texto: " & cTexto)
             cUsr = cTexto.SubString2(0,19)   '[20] Obtengo el Usuario
             cBnd = cTexto.SubString2(20,23)  '[4]  Obtengo el Estado (Habilitado o no)
             cPas = cTexto.SubString2(24,40)  '[16] Obtengo la Contraseña
             'Log("Usuario: " & cUsr & " , " & "Pass: " & cPas & " , " & "Estado: " & cBnd)
             cUsr = cUsr.Replace(".","")       'Quito los puntos [.] del texto
             cBnd = cBnd.Replace(".","")
             cPas = cPas.Replace(".","")
             'Log("Usuario: " & cUsr & " , " & "Pass: " & cPas & " , " & "Estado: " & cBnd)
             If cUsrIng = cUsr And cPasIng = cPas Then
                  If  cBnd = "S" Then
                    lLogin = True
                 Else
                    lLogin = False
                 End If
                 Exit
             End If
     Next
     ProgressDialogHide
         If lLogin =True Then
              MsgboxAsync("Acceso PERMITIDO !!!","Acceso al sistema...")
     Else
              If cBnd = "N" Then
                MsgboxAsync("Usuario DESABILITADO." & CRLF & "Consulte al administrador.", _
                             "Acceso al sistema...")
                 EditText1.Text = ""
                 EditText2.Text = ""
             Else
                MsgboxAsync("Usuario y/o contraseña NO Válido !!!","Acceso al sistema...")
             End If
             EditText1.RequestFocus
     End If
   Else
     Log("ERROR: " & j.ErrorMessage)
   End If
   j.Release   
End Sub

Bueno, ahora necesito si tu sabes, como hacer para que un EditBox, acepte el texto todo en mayuscula al ingresar. Hay alguna propiedad tipo UPPERCASE o algo asi??

Saludos!
 

José J. Aguilar

Expert
Licensed User
Bueno, ahora necesito si tu sabes, como hacer para que un EditBox, acepte el texto todo en mayuscula al ingresar. Hay alguna propiedad tipo UPPERCASE o algo asi??
Ya te voy a reñir eh, jeje? Abre un nuevo hilo con nuevas dudas para que este no se haga interminable.

saludos,
 

José J. Aguilar

Expert
Licensed User
Oye Sergio:

Lo que no entiendo de tu código es por qué haces un select de todos los usuarios y los comparas con el usuario que está intentando loguearse, en vez de hacer un select solo del usuario que se está intentando loguear.
 

angel_

Well-Known Member
Licensed User
Actualmente en mi sistema de Gestión, utilizo SubStr(variable,x,y) y obtengo separadamente los Nombres, Contraseñas, y flag....

¿¿¿Como hago esto cn B4A ??? Como obtengo los Nombres y Contraseñas para poder "analizar" si el Usuario es válido ???
Otra sugerencia es separar los datos por comas (u otro texto) y utilizar Split, de esta forma
B4X:
Regex.Split(",", Registro)(0) 'Nombre
Regex.Split(",", Registro)(1) 'Contraseña
 

Sergio Castellari

Active Member
Licensed User
Oye Sergio:

Lo que no entiendo de tu código es por qué haces un select de todos los usuarios y los comparas con el usuario que está intentando loguearse, en vez de hacer un select solo del usuario que se está intentando loguear.

Hola @José J. Aguilar
Hoy tuve un día de mucho trabajo y por ello que no pude continuar con esta mini APP (se que a esta hora por allá, debes estar descansando), pero bueno, no quise molestarte y cuando vuelvo...ZAS...me pasaste el POST exacto que necesitaba!!!... GRACIAS!!!

Explico el motivo: Esta APP va a ser una opción que van a tener mis clientes existentes para acceder al sistema de gestión comercial que actualmente utilizan. Por ello, tengo que adaptarme a las tablas existentes en la Base de datos. NO PODRIA hacer una consulta directamente por Usuario y Contraseña, por que la estructura de mi DB no lo tiene de esa forma. Entonces, debo traer todos los registros con los Usuarios de ESE sistema, y desmenusar el formato interno. ESE formato viene (por compatibilidad) desde la epoca en que mis sistemas estaban hechos en Clipper y DBFs.

Abrazos totales
 
Top