Spanish Ayuda para modificar valores en una base de datos SQL

Mufer23

Member
Buenas tardes.
Saludos, requiero modificar uno o todos los valores dentro de mi base de datos segun sea el caso, el problema es que no se utilizar la sentencia Where y no me permite modificar, agradeceria su siempre valiosa colaboracion.
B4X:
Private Sub ButtonModificarMaq_Click
    Dim mensaje As Int
    mensaje=Msgbox2("¿Desea modificar el siguiente equipo?", "Confirmación", "Si","","No",Null)
    TIPO=B4XComboBoxTipoModificar.SelectedItem
    NOMBRE=EditTextModificarNombreMaquinaria.Text
    MARCA=EditTextModificarMarcaMaquinaria.Text
    MODELO=EditTextModificarModeloMaquinaria.Text
    Select mensaje
        Case DialogResponse.POSITIVE
            sql1.ExecNonQuery("Update maquinaria set TIPO ='"& B4XComboBoxTipoModificar.SelectedItem &"', NOMBRE= '"&EditTextModificarNombreMaquinaria.text &"' ,MARCA = '"& EditTextModificarMarcaMaquinaria.text &"', MODELO ='"& EditTextModificarModeloMaquinaria.text &"' where TIPO = " & TIPO & ", NOMBRE = " & NOMBRE & ", MARCA =" & MARCA & ", MODELO = " & MODELO & "")
            ToastMessageShow("Equipo Modificado!", True)
        Case DialogResponse.NEGATIVE
            ToastMessageShow("Se ha cancelado la modificación", True)
    End Select
    Activity_Create (False)
End Sub
 

josejad

Expert
Licensed User
Longtime User
Hola Mufer:

Echa un vistazo a algún tutorial sobre sql y las condiciones de la cláusula WHERE, verás que las condiciones no se separan con comas. Aunque aquí el ejemplo es con un select, la parte a partir del WHERE es igual para un UPDATE

Ejemplo
SQL:
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;

 

Mufer23

Member
agradecido por su siempre oportuna ayuda, ahora bien ya modifique lo que me indicaste sin embargo, aun no me graba las modificaciones en la base de datos, coloco todos los campos a modificar, no me arroja error pero no modifica nada en la base de datos.
B4X:
Private Sub ButtonModificarMaq_Click
    Dim mensaje As Int
    mensaje=Msgbox2("¿Desea modificar el siguiente equipo?", "Confirmación", "Si","","No",Null)
    TIPO=B4XComboBoxTipoModificar.SelectedItem
    NOMBRE=EditTextModificarNombreMaquinaria.Text
    MARCA=EditTextModificarMarcaMaquinaria.Text
    MODELO=EditTextModificarModeloMaquinaria.Text
    Select mensaje
        Case DialogResponse.POSITIVE
            sql1.ExecNonQuery("Update maquinaria set TIPO ='"& B4XComboBoxTipoModificar.SelectedItem &"', NOMBRE= '"&EditTextModificarNombreMaquinaria.text &"' ,MARCA = '"& EditTextModificarMarcaMaquinaria.text &"', MODELO ='"& EditTextModificarModeloMaquinaria.text &"' where TIPO = '" & TIPO & "' AND NOMBRE = '" & NOMBRE & "' AND MARCA = '" & MARCA & "' AND MODELO = '" & MODELO & "'")
            ToastMessageShow("Equipo Modificado!", True)
        Case DialogResponse.NEGATIVE
            ToastMessageShow("Se ha cancelado la modificación", True)
    End Select
    Activity_Create (False)
End Sub
 

josejad

Expert
Licensed User
Longtime User
Lo siento, pero no tenemos suficiente información sin saber cómo es tu base de datos, ni qué datos tiene, etc...

- Recibes el mensaje "Equipo modificado!"?
- Se cumplen las condiciones del where? Haz un log de la sentencia e intenta ejecutarla directamente con algún gestor de base de datos
- Haz un select con las mismas condiciones del WHERE, ¿te devuelve algún registro? Si no, es que ningún registro cumple las condiciones y por tanto ninguno se modifica.
- Qué base de dato es, ¿mysql, sqlite?
- ¿Puedes subir tu proyecto para que le echemos un ojo y sea más fácil ayudarte? Veo que no has seguido los consejos que te dieron en este hilo
- ¿Qué es Activity_Create (False)? ¿Dónde has visto esa sentencia antes para usarla aquí? Si estás empezando, deberías usar B4XPages, el ciclo de vida es más sencillo que una app con Activities.

saludos,
 
Last edited:

Mufer23

Member
Efectivamente recibo el mensaje "Equipo Modificado"
- si se cumplen las condiciones del Where.
- no me devuelve algun registro, x lo que temo ninguno cumple con las condiciones.
- utilizo sqlite.
- por supuesto que puedo subir mi proyecto, tienes razon no considere los consejos del hilo anterior.
- el Activity_Create (False) es una sentencia que utilizo para que una vez ejecutado algo en la base de datos me vuelva a cargar la pagina principal, ya que anteriormente cuando ejecutaba me cargaba el customlistview en blanco.

Adjuntare mi codigo y dare una pequeña reseña, estoy intentando crear una base de datos donde se pueda crear, modificar, borrar y selecionar los diferentes equipos o implementos, ademas agregar un contador de horas que mida el trabajo, sin embargo no tengo ni la menor idea de como hacerlo, le agradeceria su apoyo.


 
Last edited:

Mufer23

Member
Proyecto
 

Attachments

  • B4XMainPage.bas
    958 bytes · Views: 62
  • ImplementosM.bas
    1,000 bytes · Views: 60
  • MaquinariasM.bas
    2.9 KB · Views: 59
  • Starter.bas
    1 KB · Views: 52

Mufer23

Member
Buenos dias Adjunto proyecto, agradecido siempre por su colaboracion
 

Attachments

  • Maquinaria2.zip
    206.4 KB · Views: 69

IdasI4A

Active Member
Licensed User
Longtime User
Buenas tardes.
Saludos, requiero modificar uno o todos los valores dentro de mi base de datos segun sea el caso, el problema es que no se utilizar la sentencia Where y no me permite modificar, agradeceria su siempre valiosa colaboracion.
B4X:
Private Sub ButtonModificarMaq_Click
    Dim mensaje As Int
    mensaje=Msgbox2("¿Desea modificar el siguiente equipo?", "Confirmación", "Si","","No",Null)
    TIPO=B4XComboBoxTipoModificar.SelectedItem
    NOMBRE=EditTextModificarNombreMaquinaria.Text
    MARCA=EditTextModificarMarcaMaquinaria.Text
    MODELO=EditTextModificarModeloMaquinaria.Text
    Select mensaje
        Case DialogResponse.POSITIVE
            sql1.ExecNonQuery("Update maquinaria set TIPO ='"& B4XComboBoxTipoModificar.SelectedItem &"', NOMBRE= '"&EditTextModificarNombreMaquinaria.text &"' ,MARCA = '"& EditTextModificarMarcaMaquinaria.text &"', MODELO ='"& EditTextModificarModeloMaquinaria.text &"' where TIPO = " & TIPO & ", NOMBRE = " & NOMBRE & ", MARCA =" & MARCA & ", MODELO = " & MODELO & "")
            ToastMessageShow("Equipo Modificado!", True)
        Case DialogResponse.NEGATIVE
            ToastMessageShow("Se ha cancelado la modificación", True)
    End Select
    Activity_Create (False)
End Sub
Esta mal la parte del WHERE en vez de comas tienes que usar And o Or, según el caso.

B4X:
sql1.ExecNonQuery("Update maquinaria set TIPO ='"& B4XComboBoxTipoModificar.SelectedItem &"', NOMBRE= '"&EditTextModificarNombreMaquinaria.text &"' ,MARCA = '"& EditTextModificarMarcaMaquinaria.text &"', MODELO ='"& EditTextModificarModeloMaquinaria.text &"' where TIPO = " & TIPO & " And NOMBRE = " & NOMBRE & " And MARCA =" & MARCA & " And MODELO = " & MODELO & "")

Y echale un vistazo a https://www.b4x.com/android/forum/t...ommon-mistakes-and-other-tips.116651/#content (punto 5)
 

Mufer23

Member
Esta mal la parte del WHERE en vez de comas tienes que usar And o Or, según el caso.

B4X:
sql1.ExecNonQuery("Update maquinaria set TIPO ='"& B4XComboBoxTipoModificar.SelectedItem &"', NOMBRE= '"&EditTextModificarNombreMaquinaria.text &"' ,MARCA = '"& EditTextModificarMarcaMaquinaria.text &"', MODELO ='"& EditTextModificarModeloMaquinaria.text &"' where TIPO = " & TIPO & " And NOMBRE = " & NOMBRE & " And MARCA =" & MARCA & " And MODELO = " & MODELO & "")

Y echale un vistazo a https://www.b4x.com/android/forum/t...ommon-mistakes-and-other-tips.116651/#content (punto 5)
Gracias por tus indicaciones, voy a ser bastante honesto aun no me familiarizo con las sentencias Sql, voy a modificar a ver como queda
 

josejad

Expert
Licensed User
Longtime User
Hola:

Echando un ojo así por encima a tu proyecto, ya que no he podido ejecutarlo porque me da errores:
- Para exportar un proyecto B4XPages, no puedes hacerlo con el menú Archivo->Exportar, eso sirve para proyectos "normales" (con Activities). Tienes que pulsar la tecla Control y darle al enlace que hay en B4XMainPage que pone
B4X:
Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip
(puedes cambiar "Project.zip" por otro nombre)
- Estás creando un proyecto con B4XPages, lo cual es la mejor manera, pero estás programando como si fuese un proyecto normal con Activity. Es decir, estás creando tu programa en la pestaña Main, cuando para B4XPages esa pestaña no debes tocarla, y hacer toda la lógica de tu programa en B4XMainPage. Por favor, echa un ojo al manual de B4XPages (lo tienes aquí en español). Crea un proyecto nuevo de B4XPages, y copia todo lo que tienes en Main, en B4XMainPage. Además de esta forma, puedes cargar cada uno de tus layouts en una B4XPage distinta y no tienes tantas variables declaradas en una sola clase.
el Activity_Create (False) es una sentencia que utilizo para que una vez ejecutado algo en la base de datos me vuelva a cargar la pagina principal, ya que anteriormente cuando ejecutaba me cargaba el customlistview en blanco.
Esto es un error, y tienes varios de ese tipo en tu código. Cuando modificas o quieres refrescar algo, no es necesario reiniciar la actividad, ni hacer un Activity.RemoveAllViews, simplemente por ejemplo tendrías que recrear el customlistview para que muestre los nuevos datos.

- Asegúrate de entender bien este ejemplo de sqlite de Klaus.
Efectivamente recibo el mensaje "Equipo Modificado"
Es lógico, no me había dado cuenta de que muestras ese mensaje cuando el usuario acepta el MsgBox, no cuando efectivamente ejecutas la sentencia SQL
- Como te ha dicho ldasl4a, es mejor usar sentencias preparadas. Sería algo así: (no lo he probado y puede tener errores)

B4X:
Private Sub ButtonModificarMaq_Click
    Dim mensaje As Int
    mensaje=Msgbox2("¿Desea modificar el siguiente equipo?", "Confirmación", "Si","","No",Null)
    TIPO=B4XComboBoxTipoModificar.SelectedItem
    NOMBRE=EditTextModificarNombreMaquinaria.Text
    MARCA=EditTextModificarMarcaMaquinaria.Text
    MODELO=EditTextModificarModeloMaquinaria.Text
    Select mensaje
        Case DialogResponse.POSITIVE
           'Añadimos los parámetros a una lista
           Dim params As List
           params.Initialize
           params.AddAll(Array(TIPO, NOMBRE, MARCA, MODELO, TIPO, MARCA))))  'el número de elementos del array debe coincidir con el número de ? de la sentencia SQL, y estar en el mismo orden
            sql1.ExecNonQuery2("Update maquinaria set TIPO = ?, NOMBRE= ? ,MARCA = ? , MODELO =?  where TIPO = ? AND NOMBRE = ? AND MARCA = ?")
            ToastMessageShow("Equipo Modificado!", True)
        Case DialogResponse.NEGATIVE
            ToastMessageShow("Se ha cancelado la modificación", True)
    End Select
   ' Activity_Create (False) Elimina esta línea y limpia la vista que te muestre los datos
   ' Por ejemplo
            CLVMaq.Clear
            CLVMaq.Add(cargarmaquinaria,i) 'Aquí tendrías que volver a leer los datos de la base de datos para que te refresque el update. Sería incluso mejor actualizar sólo el ítem que has actualizado
              
End Sub

Ánimo y dale caña
 
Last edited:
Top