dariodr   28-12-2020, 07:03
#1
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.

Código:
' Gambas class file

Private conexion As Connection
Private TablaContactos As Result


Public Sub Form_Open()

   conexion = New Connection
   conexion.Type = "sqlite3"
   conexion.Host = "/home/dario/gambas/PruebaBaseDatos/"
   conexion.Name = "base"
   
   Try conexion.Open()
   If Error Then
      Message.Error("Error al conectar a la base de datos")
      conexion = Null
   Else
      TablaContactos = conexion.Exec("Select * From contactos")
      If TablaContactos.Available Then MostrarCampos
   Endif

End

Public Sub MostrarCampos()
   
  txtID.Text = TablaContactos["id"]
  txtNombre.Text = TablaContactos["Nombre"]
  txtApellido.Text = TablaContactos["Apellido"]
  txtTelefono.Text = TablaContactos["Telefono"]
  txtMail.Text = TablaContactos["Mail"]
  txtNacimiento.Text = TablaContactos["FechaNacimiento"]
   
End


Public Sub btnPrimero_Click()

   TablaContactos.MoveFirst()
   MostrarCampos

End

Public Sub btnAnterior_Click()

   TablaContactos.MovePrevious()
   
   If Not TablaContactos.Available Then TablaContactos.MoveFirst()
   MostrarCampos

End

Public Sub btnSiguiente_Click()

   TablaContactos.MoveNext()
   
   If Not TablaContactos.Available Then TablaContactos.MoveLast()
   MostrarCampos

End

Public Sub btnUltimo_Click()

   TablaContactos.MoveLast()
   MostrarCampos

End

Public Sub Menu2_Click()

   btnGuardar.Visible = True
   btnCancelar.Visible = True
   btnPrimero.Visible = False
   btnAnterior.Visible = False
   btnSiguiente.Visible = False
   btnUltimo.Visible = False
   txtID.Text = ""
   txtNombre.Text = ""
   txtApellido.Text = ""
   txtTelefono.Text = ""
   txtMail.Text = ""
   txtNacimiento.Text = ""

End

Public Sub btnGuardar_Click()

   Dim VarResult As Result
   
   VarResult = conexion.Create("Contactos")
   conexion.Exec("insert into contactos values(&1,&2,&3,&4,&5,&6)",
      txtID.Text, txtNombre.text, txtApellido.Text, txtTelefono.Text, txtMail.text, txtNacimiento.text)
      
   'VarResult = Conexion.Create("Contactos")
   'VarResult["id"] = txtID.Text
   'VarResult["Nombre"] = txtNombre.Text
   'VarResult["Apellido"] = txtapellido.Text
   'VarResult["FechaNacimiento"] = txtNacimiento.Text
   'VarResult["Telefono"] = txtTelefono.Text
   'VarResult["Mail"] = txtMail.Text
   VarResult.Update
   TablaContactos = Conexion.Exec("Select * from Contactos")
   btnGuardar.Visible = False
   btnCancelar.Visible = False
   btnPrimero.Visible = True
   btnAnterior.Visible = True
   btnSiguiente.Visible = True
   btnUltimo.Visible = True

End

Public Sub btnCancelar_Click()

   btnGuardar.Visible = False
   btnCancelar.Visible = False
   btnPrimero.Visible = True
   btnAnterior.Visible = True
   btnSiguiente.Visible = True
   btnUltimo.Visible = True
   MostrarCampos

End

Public Sub Menu3_Click()

  Dim VarResult As Result
 
  'VarResult = Conexion.Edit("Contactos", "id=" & TablaContactos["id"])
  'VarResult["id"] = txtID.text
  'VarResult["Nombre"] = txtNombre.text
  'VarResult["Apellido"] = txtapellido.text
  'VarResult["FechaNacimiento"] = txtNacimiento.text
  'VarResult["Telefono"] = txtTelefono.text
  'VarResult["Mail"] = txtMail.text
  'VarResult.Update
  'TablaContactos = Conexion.Exec("Select * from Contactos")
  conexion.Exec("update contactos set nombre ='" & txtNombre.Text & "' where id ='" & txtID.Text & "';")
 
 
End

Public Sub Menu5_Click()

  Me.Close

End

Public Sub Form_Close()

  If Message.Question("¿Desea salir del programa?", "Si", "No") = 2 Then
    Stop Event
  Else
    Conexion.Close
  End If

End
Última modificación: 02-01-2021, 12:28 por jguardon.

         Dario Delgado Razuri
Siempre aprendiendo algo nuevo
tincho   28-12-2020, 12:51
#2
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
Código:
Public Sub Menu3_Click()
   Dim texto As String
   Dim idx As String
   Dim alt As Result
   alt = con.Exec("update contactos set nombre ='" & texto & "' where id ='" & idx & "';")
 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.
Última modificación: 28-12-2020, 14:41 por tincho.

1 Saludo.
dariodr   30-12-2020, 10:00
#3
Hola, te mando el tar.gz del proyecto.
Salu2.

         Dario Delgado Razuri
Siempre aprendiendo algo nuevo
tincho   30-12-2020, 11:57
#4
(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.
Código:
  VarResult = conexion.Exec("update contactos set nombre ='" & txtNombre.Text & "' where id ='" & txtID.Text & "';")
  TablaContactos = Conexion.Exec("Select * from Contactos") ' Esto lo tenes que poner después de cada alteración de los registros.

Saludos.
Archivos adjuntos
.gz
PruebaBaseDatos-0.0.2.tar.gz (Tamaño: 13.56 KB Descargas: 3)
Última modificación: 30-12-2020, 11:58 por tincho.

1 Saludo.
dariodr   31-12-2020, 06:30
#5
Gracias por la respuesta, ahora funciona muy bien.
Una consulta: en el botón Guardar (btnGuardar_Click()), se puede eliminar las lineas:

Código:
Dim VarResult As Result
VarResult = conexion.Create("Contactos")
VarResult.Update
Lo he probado borrando esas lineas y funciona. Afecta en algo al codigo si se borran.
Salu2.

         Dario Delgado Razuri
Siempre aprendiendo algo nuevo
tincho   31-12-2020, 13:59
#6
(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:
Código:
Public Sub Menu3_Click()

  Dim VarResult As Result

  VarResult = conexion.Exec("update contactos set nombre ='" & txtNombre.Text & "' where id ='" & txtID.Text & "';")
  TablaContactos = Conexion.Exec("Select * from Contactos")

End
Luego en btnGuardar_click()
Código:
  VarResult = conexion.Create("Contactos")
  conexion.Exec("insert into contactos values(&1,&2,&3,&4,&5,&6)",
    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.
Última modificación: 31-12-2020, 14:25 por tincho.

1 Saludo.
dariodr   31-12-2020, 16:03
#7
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

         Dario Delgado Razuri
Siempre aprendiendo algo nuevo
tincho   31-12-2020, 17:42
#8
(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.

1 Saludo.
  
Usuarios navegando en este tema: 4 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.