Comunidad Gambas-es

Versión completa: Uso de update en Gambas
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola comunidad, tengo este pequeno programa de ejemplo con base de datos (SQLite3), el problema es a la hora de hacer el Update no se actualiza la DB, tengo que cerrar la aplicacion y volverla a abrir para que se actualicen. Me podiran decir que le falta. El codigo de actualzar esta en el boton Menu3_click.
Les dejo el codigo.
Saludos.

GAMBAS
  1. ' Gambas class file
  2.  
  3. Private TablaContactos As Result
  4.  
  5.  
  6. Public Sub Form_Open()
  7.  
  8.    conexion = New Connection
  9.    conexion.Type = "sqlite3"
  10.    conexion.Host = "/home/dario/gambas/PruebaBaseDatos/"
  11.    conexion.Name = "base"
  12.    
  13.    Try conexion.Open()
  14.       Message.Error("Error al conectar a la base de datos")
  15.       conexion = Null
  16.    Else
  17.       TablaContactos = conexion.Exec("Select * From contactos")
  18.       If TablaContactos.Available Then MostrarCampos
  19.    Endif
  20.  
  21.  
  22. Public Sub MostrarCampos()
  23.    
  24.   txtID.Text = TablaContactos["id"]
  25.   txtNombre.Text = TablaContactos["Nombre"]
  26.   txtApellido.Text = TablaContactos["Apellido"]
  27.   txtTelefono.Text = TablaContactos["Telefono"]
  28.   txtMail.Text = TablaContactos["Mail"]
  29.   txtNacimiento.Text = TablaContactos["FechaNacimiento"]
  30.    
  31.  
  32.  
  33. Public Sub btnPrimero_Click()
  34.  
  35.    TablaContactos.MoveFirst()
  36.    MostrarCampos
  37.  
  38.  
  39. Public Sub btnAnterior_Click()
  40.  
  41.    TablaContactos.MovePrevious()
  42.    
  43.    If Not TablaContactos.Available Then TablaContactos.MoveFirst()
  44.    MostrarCampos
  45.  
  46.  
  47. Public Sub btnSiguiente_Click()
  48.  
  49.    TablaContactos.MoveNext()
  50.    
  51.    If Not TablaContactos.Available Then TablaContactos.MoveLast()
  52.    MostrarCampos
  53.  
  54.  
  55. Public Sub btnUltimo_Click()
  56.  
  57.    TablaContactos.MoveLast()
  58.    MostrarCampos
  59.  
  60.  
  61. Public Sub Menu2_Click()
  62.  
  63.    btnGuardar.Visible = True
  64.    btnCancelar.Visible = True
  65.    btnPrimero.Visible = False
  66.    btnAnterior.Visible = False
  67.    btnSiguiente.Visible = False
  68.    btnUltimo.Visible = False
  69.    txtID.Text = ""
  70.    txtNombre.Text = ""
  71.    txtApellido.Text = ""
  72.    txtTelefono.Text = ""
  73.    txtMail.Text = ""
  74.    txtNacimiento.Text = ""
  75.  
  76.  
  77. Public Sub btnGuardar_Click()
  78.  
  79.    Dim VarResult As Result
  80.    
  81.    VarResult = conexion.Create("Contactos")
  82.    conexion.Exec("insert into contactos values(&1,&2,&3,&4,&5,&6)",
  83.       txtID.Text, txtNombre.text, txtApellido.Text, txtTelefono.Text, txtMail.text, txtNacimiento.text)
  84.       
  85.    'VarResult = Conexion.Create("Contactos")
  86.    'VarResult["id"] = txtID.Text
  87.    'VarResult["Nombre"] = txtNombre.Text
  88.    'VarResult["Apellido"] = txtapellido.Text
  89.    'VarResult["FechaNacimiento"] = txtNacimiento.Text
  90.    'VarResult["Telefono"] = txtTelefono.Text
  91.    'VarResult["Mail"] = txtMail.Text
  92.    VarResult.Update
  93.    TablaContactos = Conexion.Exec("Select * from Contactos")
  94.    btnGuardar.Visible = False
  95.    btnCancelar.Visible = False
  96.    btnPrimero.Visible = True
  97.    btnAnterior.Visible = True
  98.    btnSiguiente.Visible = True
  99.    btnUltimo.Visible = True
  100.  
  101.  
  102. Public Sub btnCancelar_Click()
  103.  
  104.    btnGuardar.Visible = False
  105.    btnCancelar.Visible = False
  106.    btnPrimero.Visible = True
  107.    btnAnterior.Visible = True
  108.    btnSiguiente.Visible = True
  109.    btnUltimo.Visible = True
  110.    MostrarCampos
  111.  
  112.  
  113. Public Sub Menu3_Click()
  114.  
  115.   Dim VarResult As Result
  116.  
  117.   'VarResult = Conexion.Edit("Contactos", "id=" & TablaContactos["id"])
  118.   'VarResult["id"] = txtID.text
  119.   'VarResult["Nombre"] = txtNombre.text
  120.   'VarResult["Apellido"] = txtapellido.text
  121.   'VarResult["FechaNacimiento"] = txtNacimiento.text
  122.   'VarResult["Telefono"] = txtTelefono.text
  123.   'VarResult["Mail"] = txtMail.text
  124.   'VarResult.Update
  125.   'TablaContactos = Conexion.Exec("Select * from Contactos")
  126.   conexion.Exec("update contactos set nombre ='" & txtNombre.Text & "' where id ='" & txtID.Text & "';")
  127.  
  128.  
  129.  
  130. Public Sub Menu5_Click()
  131.  
  132.  
  133.  
  134. Public Sub Form_Close()
  135.  
  136.   If Message.Question("¿Desea salir del programa?", "Si", "No") = 2 Then
  137.     Stop Event
  138.   Else
  139.     Conexion.Close
  140.   End If
  141.  


Hola Dario,
Antes de nada, bienvenido al foro.
Si subes el proyecto tar.gz (ctrl+alt+a) es mas fácil para nosotros poder ver que sucede.
De todas maneras veo que algo no esta bien en Menu3_Click, deberías usar la siguiente formula unResult = UnaSentenciaSQL, por ejemplo de esta manera
GAMBAS
  1. Public Sub Menu3_Click()
  2.    Dim texto As String
  3.    Dim idx As String
  4.    Dim alt As Result
  5.    alt = con.Exec("update contactos set nombre ='" & texto & "' where id ='" & idx & "';")
  6.  End


Nota: Te recomiendo que en adelante pongas el código gambas de los mensajes con el resaltado de sintaxis, mira este otro post
https://gambas-es.org/showthread.php?tid...%C3%B3digo
Saludos.
Hola, te mando el tar.gz del proyecto.
Salu2.
(30-12-2020, 10:00)dariodr escribió: [ -> ]Hola, te mando el tar.gz del proyecto.

ok, lo revise, hice algunos cambios y ahora funciona correctamente.
En el evento 3 luego de actualizar un registro tenes que actualizar también el "result" que usas para mostrar los datos de lo contrario serán datos que no reflejen los de la base.
El result de "vista" es una COPIA de los datos para usar en el programa pero los datos reales están en la base, en un archivo en este caso, así que si modificas los datos del archivo tenes que volver a generar el result de vista otra vez.
GAMBAS
  1.   VarResult = conexion.Exec("update contactos set nombre ='" & txtNombre.Text & "' where id ='" & txtID.Text & "';")
  2.   TablaContactos = Conexion.Exec("Select * from Contactos") ' Esto lo tenes que poner después de cada alteración de los registros.



Saludos.
Gracias por la respuesta, ahora funciona muy bien.
Una consulta: en el botón Guardar (btnGuardar_Click()), se puede eliminar las lineas:

GAMBAS
  1. Dim VarResult As Result
  2. VarResult = conexion.Create("Contactos")
  3. VarResult.Update


Lo he probado borrando esas lineas y funciona. Afecta en algo al codigo si se borran.
Salu2.
(31-12-2020, 06:30)dariodr escribió: [ -> ]Una consulta: en el botón Guardar (btnGuardar_Click()), se puede eliminar las lineas:
Tene en cuenta que estas usando el evento Menu3_Click() para guardar y no btnGuardar_Click(), así que desde esta perspectiva podrías borrar todo btnGuardar_Click() ademas el botón esta oculto (btnGuardar.Visible = False).
Una forma correcta de guardar los datos es:
GAMBAS
  1. Public Sub Menu3_Click()
  2.  
  3.   Dim VarResult As Result
  4.  
  5.   VarResult = conexion.Exec("update contactos set nombre ='" & txtNombre.Text & "' where id ='" & txtID.Text & "';")
  6.   TablaContactos = Conexion.Exec("Select * from Contactos")
  7.  


Luego en btnGuardar_click()
GAMBAS
  1.   VarResult = conexion.Create("Contactos")
  2.   conexion.Exec("insert into contactos values(&1,&2,&3,&4,&5,&6)",
  3.     txtID.Text, txtNombre.text, txtApellido.Text, txtTelefono.Text, txtMail.text, txtNacimiento.text)


Esas dos sentencias hacen lo mismo pero "conexion.Exec(..." se escribe así: "VarResult = conexion.Exec(..."
Luego existen, desde el punto de vista SQL, dos formas de "insertar" registros, una es insertar un registro "en blanco" con INSERT y luego modificarlo con UPDATE ... WHERE o bien insertar directamente el registro con todos sus valores finales.
Luego desde el punto de vista de gambas existen formas de insertar registros sin usar el lenguaje SQL como "conexion.Create" que supongo que valen para todos lo tipos de bases de datos a las que este vinculada "conexion".
Vos estas mezclado la forma Gambas con la forma SQL en el mismo método, lo cual no es que este mal pero, en mi opinión, no es una forma ordenada de escribir el código.
También cambia la cosa si el indice es auto incremental o no, si hay algún campo que es de valor único, como el DNI de una persona por ejemplo.
Bueno, el mundo de las bases de datos es vasto, pero puede gestionarse muy bien con gambas si organizas bien las cosas, es decir la base de datos y el código definidos eficientemente.
Saludos.
Hola Tincho, el ejemplo lo saque de este documento PDF. En la ultima parte (pag. 9) dice que se puede hacer con sentencias SQL estandar, (UPDATE, INSERT, DELETE) y queria hacerlo asi.
Saludos
(31-12-2020, 16:03)dariodr escribió: [ -> ]En la ultima parte (pag. 9) dice que se puede hacer con sentencias SQL estandar, (UPDATE, INSERT, DELETE) y queria hacerlo así

Claro que se puede hacer con SQL estándar de hecho en mis programa uso sql todo lo que puedo porque es mas eficiente y me da mas control sobre las acciones sobre la base.
Mi comentario es respecto a que vos usas en el mismo método sentencias sql y "sentencias" gambas para operar sobre la base, pero sobre gustos no hay nada escrito, usa la manera que mas te guste.
Si lo que deseas hacer es experimentar con el fin de aprender te recomiendo que uses dos métodos uno "gambas" y otro SQL así ves como trabajan ambos e incluso podes ver que rendimiento tiene uno respecto del otro.
Saludos.