Spanish Llenar spinner + mysql

ebqlabs

Active Member
Licensed User
Hola. Me gustaría nuevamente molestar .

Necesito lleganar un comboBox desde una base datos , el cual al momento de cargar la información

Ejemplo
Id nombre
10 chile
20 España
30 italia

Muestre el nombre y a su vez me guarde el id para después poder grabar el id y no su nombre.

También me gustaría saber como hacer que al momento de consultar un registro x y si este registro en su momento se grabo con el país chile .este lo muestre y sigan apareciendo el llenado del combo al principio y si vuelvo a grabar se valla el ID y no su nombre

Gracias
 
Last edited:

mczubel

Member
Licensed User
Longtime User
1)
Sub llenadospiner
Spinner1.Clear
c=s.ExecQuery(¨SELECT pais FROM Paises ORDER BY pais¨)
If c.RowCount>0 Then
For i=0 To c.RowCount-1
c.Position=i
Spinner1.Add(C.GetString(¨pais¨)
Next
Else
´algo....
Enf if
End Sub

2) en un boton:

SELECT id FROM paises WHERE pais = ¨´& spinner1.SelectedItem&´¨........

No entendí el final para recargar el spinner: 1ero. spiner1.clear
 

Descartex

Well-Known Member
Licensed User
Longtime User
Para llevar los dos valores en funcion de un spinner, yo lo hago con un Map paralelo, más o menos asi:

B4X:
Sub llenadospiner
MapPaises.Clear
Spinner1.Clear
c=s.ExecQuery(¨SELECT id,pais FROM Paises ORDER BY pais¨)
If c.RowCount>0 Then
For i=0 To c.RowCount-1
c.Position=i
Spinner1.Add(C.GetString(¨pais¨)
MapPaises.Put("pais","id")
Next
Else
´algo....
Enf if
End Sub
Así tendremos un Map con el par Key=Nombre del pais, Value=Id del pais.
En el momento de querer asignar el valor de id en función del país seleccionado, haremos algo asi:
B4X:
ValorADesignar=MapPaises.Get(Spinner.SelectedItem)

Un saludo.
 

rscheel

Well-Known Member
Licensed User
Longtime User
De esta manera.

B4X:
Sub Spinnerllenar
        Dim lista As List
        lista.Initialize
        s.BeginTransaction
        c = s.ExecQuery("SELECT * FORM tu_tabla")
        For I = 0 To c.RowCount - 1
        c.Position = I
        Spinner1.Add(c.GetString("nombre"))
        lista.Add(c.GetString("id"))
        Next
        Spinner1.Tag = lista
        s.TransactionSuccessful
        s.EndTransaction
        c.Close
End Sub

Para leer el valor seleccionado

B4X:
Dim id As Int
Dim cbValor As List
cbValor = Spinner1.Tag
id = cbValor.Get(Spinner1.SelectedIndex)
 

ebqlabs

Active Member
Licensed User
Muchas Gracias por sus respuestas, me sirvieron bastantes, lo que si me quedo una duda.

Cuando yo consulte por un registro (Ej:Cliente), que en su momento se grabo con el país Chile, como le inserto al Spinner el dato al combo con el cual fue grabado Spinner.add(), así lo tengo yo, pero cuando voy a grabar nuevamente se me desfasa el ID con respecto a los demás, me explico.

Ej:
Si Chile es el ID 10, me dice que estoy en el ID 20 que pertenece a otro dato, pero si no inserto el dato al momento de consultar por este cliente, el Spinner carga bien y el ID me lo entrega correctamente, como debería ser?

Gracias.-
 

rscheel

Well-Known Member
Licensed User
Longtime User
P
Muchas Gracias por sus respuestas, me sirvieron bastantes, lo que si me quedo una duda.

Cuando yo consulte por un registro (Ej:Cliente), que en su momento se grabo con el país Chile, como le inserto al Spinner el dato al combo con el cual fue grabado Spinner.add(), así lo tengo yo, pero cuando voy a grabar nuevamente se me desfasa el ID con respecto a los demás, me explico.

Ej:
Si Chile es el ID 10, me dice que estoy en el ID 20 que pertenece a otro dato, pero si no inserto el dato al momento de consultar por este cliente, el Spinner carga bien y el ID me lo entrega correctamente, como debería ser?

Gracias.-

Puedes colocar el código que estas usando?
 

ebqlabs

Active Member
Licensed User
No te entendí esa parte, mira haber si me explico mejor.-

Al levantar el Form en el Activity_Create, yo cargo el Spinner con la consulta para que me traiga todos los Países, pero también a su vez ingreso con un código cliente el cual me hace otra consulta y me trae los datos para llenar los campos, necesito que el Spinner se llene con el país que tiene dicho cliente, yo lo e estado haciendo así
Spinner.add(m.Get("pais")), pero me agrega otro dato mas a la lista del Spnnier y al momento de preguntar por el ID del Spinner este se encuentra desfasado.

Gracias.-
 

rscheel

Well-Known Member
Licensed User
Longtime User
No te entendí esa parte, mira haber si me explico mejor.-

Al levantar el Form en el Activity_Create, yo cargo el Spinner con la consulta para que me traiga todos los Países, pero también a su vez ingreso con un código cliente el cual me hace otra consulta y me trae los datos para llenar los campos, necesito que el Spinner se llene con el país que tiene dicho cliente, yo lo e estado haciendo así
Spinner.add(m.Get("pais")), pero me agrega otro dato mas a la lista del Spnnier y al momento de preguntar por el ID del Spinner este se encuentra desfasado.

Gracias.-

Prueba con esto

B4X:
Sub Process_Globals
    Dim VarPais As String
End Sub

B4X:
Sub Activity_Create(FirstTime As Boolean)
    CargaDatos
End Sub

B4X:
Sub CargaDatos
     'CargaDatos del Cliente
     'Una ves que cargas los datos del Cliente, tambien trayendo el pais
      VarPais = m.Get("pais")
      Spinnerllenar
End Sub

B4X:
Sub Spinnerllenar
        Dim lista As List
        lista.Initialize
        s.BeginTransaction
        If VarPais == "" Then
            c = s.ExecQuery("SELECT * FORM Paises")
        Else
            c = s.ExecQuery("SELECT * FORM Paises WHERE Pais = "&VarPais)
        End If
        For I = 0 To c.RowCount - 1
        c.Position = I
        Spinner1.Add(c.GetString("pais"))
        lista.Add(c.GetString("id"))
        Next
        Spinner1.Tag = lista
        s.TransactionSuccessful
        s.EndTransaction
        c.Close
End Sub

Algo asi, puede que te funcione mejor, lo que no dejas en claro si en el cliente tienes el id del país o el nombre del país.
 

ebqlabs

Active Member
Licensed User
ID Cliente IDPais
___________________
100 Pablo 100(CHILE)
101 José 101(Italia)


tengo una relación de tablas y una consulta para traer el nombre del pais

Si consulto por el cliente 100 este debería insertarme el Spinner el pais chile, pero al levantar el FORM también consulto por la tabla países para que me llene el Spinner, el problema esta que si inserto Chile en el cliente 100, es como que me agregara otro registro al spinner esto hace que cuando quiero rescatar el ID del spinner este se desfase.-
 

rscheel

Well-Known Member
Licensed User
Longtime User
No termino de entender, para que quieres Llenar el spinner con los países si solo vas a utilizar el país con el cual esta asociado el cliente, a no ser que quieras cambiarle el pais has lo que te dije arriba eso debiera funcionar.
 

Descartex

Well-Known Member
Licensed User
Longtime User
No tienes que añadirlo, sino, despues de cargar el spinner con todos los valores y el map como te dije con la combinacion valor/pais pones algo asi.
B4X:
Spinner1.SelectedIndex(Spinner1.IndexOf(MapPaises.Get("pais"))

Asi, activas en el spinner el que te devuelva la variable "pais" (o como la llames en tu codigo).

Un saludo.
 

ebqlabs

Active Member
Licensed User
No termino de entender, para que quieres Llenar el spinner con los países si solo vas a utilizar el país con el cual esta asociado el cliente, a no ser que quieras cambiarle el pais has lo que te dije arriba eso debiera funcionar.

SI es justamente eso, si consulto el cliente, poder cambiar el país.-


Gracias.-
 

ebqlabs

Active Member
Licensed User
B4X:
Sub Globals

    Dim h1 As HttpJob
    Dim h2 As HttpJob
    Dim Json1 As JSONParser
    Dim Json2 As JSONParser

End Sub

B4X:
Sub Activity_Create(FirstTime As Boolean)

    Activity.LoadLayout("plantilla")

    h1.initialize("json1", Me)
    h1.Download2("http://www.prueba.cl/prueba.php", Array As String("codigo", "0"))

    h2.initialize("json2", Me)
    h2.Download2("http://www.prueba.cl/cliente.php", Array As String("codigo", "0"))

End Sub

B4X:
Sub JobDone(job As HttpJob)

    If job.Success Then
        Select job.JobName
            Case "json1"
                CargarSpinner(job.GetString)
            Case "json2"
                CargarCliente(job.GetString)
        End Select
    Else
        Msgbox(job.ErrorMessage, "Error")
    End If

End Sub

B4X:
Sub CargarSpinner(datos As String)

    Json1.Initialize(datos)

    Dim m As Map

    m=Json1.NextObject
    Dim data As List
    data=m.Get("data")

    Dim lista As List
    lista.Initialize

    For i = 0 To data.Size-1
        m=data.Get(i)
        Spinner.add(m.Get("Paises"))
        lista.Add(m.Get("ID"))
    Next

    Spinner.Tag = lista

End Sub

B4X:
Sub CargarCliente(datos As String)

    Json2.Initialize(datos)

    Dim m As Map
    m=Json2.NextObject
    Dim data As List
    data=m.Get("data")

    m=data.Get(0)

    LblNom.Text = m.Get("nombre")
    ...
    ...
    ...
    Spinner/*Como lo cargo*/


End Sub

Necesito cargar el país del cliente, pero sin Spinner.add() ya que me lo repetirá, esto para una actualización del país.-

Gracias.-
 
Last edited:

rscheel

Well-Known Member
Licensed User
Longtime User
B4X:
Sub Globals

    Dim h1 As HttpJob
    Dim h2 As HttpJob
    Dim Json1 As JSONParser
    Dim Json2 As JSONParser

End Sub

B4X:
Sub Activity_Create(FirstTime As Boolean)

    Activity.LoadLayout("plantilla")

    h1.initialize("json1", Me)
    h1.Download2("http://www.prueba.cl/prueba.php", Array As String("codigo", "0"))

    h2.initialize("json2", Me)
    h2.Download2("http://www.prueba.cl/cliente.php", Array As String("codigo", "0"))

End Sub

B4X:
Sub JobDone(job As HttpJob)

    If job.Success Then
        Select job.JobName
            Case "json1"
                CargarSpinner(job.GetString)
            Case "json2"
                CargarCliente(job.GetString)
        End Select
    Else
        Msgbox(job.ErrorMessage, "Error")
    End If

End Sub

B4X:
Sub CargarSpinner(datos As String)

    Json1.Initialize(datos)

    Dim m As Map

    m=Json1.NextObject
    Dim data As List
    data=m.Get("data")

    Dim lista As List
    lista.Initialize

    For i = 0 To data.Size-1
        m=data.Get(i)
        Spinner.add(m.Get("Paises"))
        lista.Add(m.Get("ID"))
    Next

    Spinner.Tag = lista

End Sub

B4X:
Sub CargarCliente(datos As String)

    Json2.Initialize(datos)

    Dim m As Map
    m=Json2.NextObject
    Dim data As List
    data=m.Get("data")

    m=data.Get(0)

    LblNom.Text = m.Get("nombre")
    ...
    ...
    ...
    Spinner/*Como lo cargo*/


End Sub

Necesito cargar el país del cliente, pero sin Spinner.add() ya que me lo repetirá, esto para una actualización del país.-

Gracias.-

No lo he probado pero podría ser algo como

B4X:
spinner.SelectedIndex=()
 

ebqlabs

Active Member
Licensed User
No lo he probado pero podría ser algo como

B4X:
spinner.SelectedIndex=()

Si coloco para probar spinner.SelectedIndex= 3, funciona me trae el dato que esta posicionado en el index 3, pero debe faltar algo mas para que inserte el dato real que viene de la base datos Ejemplo si el cliente tiene chile cuando lo cargue en el spinner me diga chile.-
 

ebqlabs

Active Member
Licensed User
Si coloco para probar spinner.SelectedIndex= 3, funciona me trae el dato que esta posicionado en el index 3, pero debe faltar algo mas para que inserte el dato real que viene de la base datos Ejemplo si el cliente tiene chile cuando lo cargue en el spinner me diga chile.-

Favor quien me puede ayudar con esto, Gracias.-
 

rscheel

Well-Known Member
Licensed User
Longtime User
Por casualidad, no has probado lo que te publicaron mas arriba. Igual tienes que tener encenta que como estas manejando los datos directamente con json es mas difícil poder manejarlos, seria mas fácil que cuando inicie la aplicación sincronizar los datos al teléfono y luego manejarlos desde la aplicación.


B4X:
Sub CargarCliente(datos As String)

    Json2.Initialize(datos)

    Dim m As Map
    m=Json2.NextObject
    Dim data As List
    data=m.Get("data")

    m=data.Get(0)

    LblNom.Text = m.Get("nombre")
    ...
    ...
    ...
    'Spinner Como lo cargo 
    Spinner.SelectedIndex(Spinner.IndexOf(m.Get("pais"))

End Sub
 

rscheel

Well-Known Member
Licensed User
Longtime User
Puedes probar para sincronizar los datos a una bd local sqlite con lo siguiente.

B4X:
Sub Process_Globals
    Private Server As String
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Server = "DIRECCION DEL ARCHIVO PHP EN TU SERVIDOR"
    User_PHP
End Sub

B4X:
Sub GetData(SQL_Cadena As String, sJob As String)
    Dim GetSQL As HttpJob
    GetSQL.Initialize(sJob, Me)
    GetSQL.download2(Server, Array As String ("SQL", SQL_Cadena))
End Sub

Sub User_PHP
    GetData("SELECT * FROM usuario WHERE Alguna condicion;","GetUsuario")
End Sub

B4X:
Sub JobDone(Job As HttpJob)
    If Job.Success Then
            Dim res As String
            res = Job.GetString
            Log("Back from Job:" & Job.JobName )
            Log("Job Text: " & res)
            Dim parser As JSONParser
            parser.Initialize(res)

        Select Job.JobName
       
            Case "GetUsuario"
               Dim ListOfUsuario As List
                 ListOfUsuario = parser.NextArray 'returns a list with maps
                If ListOfUsuario.Size == 0 Then
                   '
                Else
                    s.BeginTransaction
                    s.ExecNonQuery("DELETE FROM usuario")
                    For i = 0 To ListOfUsuario.Size - 1
                        Dim Users As Map
                        Users = ListOfUsuario.Get(i)
                        s.ExecNonQuery2("INSERT INTO usuario VALUES(?,?,?,?,?,?)", Array As String(Users.Get("id_usuario"), Users.Get("nombre"), Users.Get("imei"), Users.Get("activo"), Users.Get("id_zona"), Users.Get("usr_tipo")))
                    Next
                    s.TransactionSuccessful
                    s.EndTransaction
                End If
        End Select
    Else
        'ToastMessageShow("Error: " & Job.ErrorMessage, True)
    End If
    Job.Release

End Sub

Para Sincronizar datos al servidor si haces algún cambio de la siguiente manera

B4X:
Sub SincronizaRegistro
    s.BeginTransaction
    c = s.ExecQuery("SELECT * FROM registro WHERE id_registro = 0 ORDER BY id")
    For i = 0 To c.RowCount-1
    c.Position = i
    GetData("AQUI PUEDE IR UN INSERT O UN UPDATE MYSQL PHP"; SELECT * FROM USUARIO", "GetRegistro")  ' PUEDES HACER UN SELECT Y TRAER LOS REGISTROS ENVIADOS AL SERVIDOR Y DEJARLOS EN EL TELEFONO NUEVAMENTE ACTUALIZADOS.
    Next

    s.TransactionSuccessful
    s.EndTransaction
End Sub

B4X:
<?php

    $host = "SERVIDOR";
    $user = "USER";
    $pw = "PASS";
    $db = "BASE DE DATOS";

    $conn = new mysqli($host, $user, $pw, $db);

    /* verificar la conexión */
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    /* cambiar el conjunto de caracteres a utf8 */
    if (!$conn->set_charset("utf8")) {
        printf("Error cargando el conjunto de caracteres utf8: %s\n", $mysqli->error);
    exit();
    }

    $result = $conn->query($sql);

    $SQL = $_GET["SQL"];
    $SQL_SEPARADO = explode(";", $SQL);

    for($i = 0 ;$i<count($SQL_SEPARADO);$i++) {
        if ($SQL_SEPARADO[$i]!='') {
            $pre = $conn->query($SQL_SEPARADO[$i]);
            if ($pre->num_rows > 0) {
                $rows = array();
                while($r = $pre->fetch_assoc()) {
                    $rows[] = $r;
                }
            }
        }
    }
       print json_encode($rows);

?>

Y antes de hacer todo lo antes dicho puedes consultar primero si el usuario tiene conexión a Internet, si no la tiene puede trabajar de forma local y puedes colocar un servicio que cuando tenga conexión sincronice los datos.
 

ebqlabs

Active Member
Licensed User
Por casualidad, no has probado lo que te publicaron mas arriba. Igual tienes que tener encenta que como estas manejando los datos directamente con json es mas difícil poder manejarlos, seria mas fácil que cuando inicie la aplicación sincronizar los datos al teléfono y luego manejarlos desde la aplicación.


B4X:
Sub CargarCliente(datos As String)

    Json2.Initialize(datos)

    Dim m As Map
    m=Json2.NextObject
    Dim data As List
    data=m.Get("data")

    m=data.Get(0)

    LblNom.Text = m.Get("nombre")
    ...
    ...
    ...
    'Spinner Como lo cargo
    Spinner.SelectedIndex(Spinner.IndexOf(m.Get("pais"))

End Sub

B4X:
Spinner.SelectedIndex = Spinner.IndexOf(Map.Get(m.Get("pais")))

Así me resulta pero no al 100% algo pasa que vuelvo atrás y adelante, osea carga todo de nuevo y no muestra el indice del cliente, como que queda en la carga inicial, pero es a veces, pero no es la idea.-
 

rscheel

Well-Known Member
Licensed User
Longtime User
B4X:
Spinner.SelectedIndex = Spinner.IndexOf(Map.Get(m.Get("pais")))

Así me resulta pero no al 100% algo pasa que vuelvo atrás y adelante, osea carga todo de nuevo y no muestra el indice del cliente, como que queda en la carga inicial, pero es a veces, pero no es la idea.-
Lo que pasa es que tienes que cargar primero los datos del cliente y al final el spinner esta cargando primero el spinner.
 
Top