Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: anmaroso en 29 de Octubre 2015, 11:33
-
Buenos días.
No me actualiza la base de datos con Visual Basic. Paso el código.
If ds.HasChanges Then
Try
Me.Validate()
dt.AcceptChanges()
da.Update(dt)
MsgBox("datos actualizados")
Catch ex As Exception
MsgBox("Update failed")
End Try
MsgBox(vms2)
Else
MsgBox("No hay modificación de registros")
End If
dt es la tabla Dim dt As DataTable
da el OleDbDataadapter Dim da As New OleDb.OleDbDataAdapter
Lo intento de mil maneras y no lo logro. algo hago mal pero no lo veo.
Gracias y Saludos.
-
Hola anmaroso con el código que has pegado no veo información suficiente para saber lo que falla. En estos hilos hay ejemplos y siguiéndolos es posible que puedas solucionar el problema:
https://www.aprenderaprogramar.com/foros/index.php?topic=2980.0
https://www.aprenderaprogramar.com/foros/index.php?topic=1485.0
saludos
-
Hola Alex, buenos días:
He ido a los enlaces que me indicaste y no encontré la solución. Después de mucho indagar he logrado que me actualice todos los registros modificados a excepción del primero de la base de datos que no encuentro la manera.
Te paso el código a ver dónde falla.
Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.DataRow
Public Class FPTRANSF2
Dim cnn As New OleDb.OleDbConnection
Dim cnnm As New OleDb.OleDbConnection
Dim da As New OleDb.OleDbDataAdapter
Dim daf As New OleDb.OleDbDataAdapter
Dim dt As DataTable
Dim dtf As DataTable
Dim ds As DataSet
Dim vffp As DateTime
Dim de As New BindingSource
Public vfs1 As Single
Public vfi1 As Integer
Dim col As Double
Dim col1 As String
Dim col2 As Date
Dim col3 As Integer
Private Sub FPTRANSF2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
vffp = FPTRANSF.vffp
Dim cb As New OleDbCommandBuilder(da)
cnn = New OleDb.OleDbConnection
cnn.ConnectionString = strcon
cnnm = New OleDb.OleDbConnection
cnnm.ConnectionString = strcon
Dim consulta As String
Dim consulta1 As String
If vffp = Nothing Then '> vgfi Then
MsgBox("Fecha no seleccionada ")
Else
Me.B1.Visible = True
Me.B2.Visible = True
MsgBox("Fecha seleccionada " & vffp)
End If
consulta = "SELECT TFACTURASR.VENCIMIENTO, TPROVEEDORES.NOMBRE, " & _
"TFACTURASR.IMPORTE, TFACTURASR.IMPORTET, " & _
"TFACTURASR.FACTURANR, TFACTURASR.FECHAE, " & _
"TFACTURASR.FACTURANE, TFACTURASR.CONCEPTOP, " & _
"TFACTURASR.FECHAP, TFACTURASR.CLAVE " & _
"FROM TPAGO INNER JOIN (TPROVEEDORES INNER JOIN " & _
"TFACTURASR ON TPROVEEDORES.CLAVE = TFACTURASR.CPROVEEDOR) " & _
"ON TPAGO.CLAVE = TFACTURASR.FPAGO " & _
"WHERE (((TPROVEEDORES.NOPAGAR)= FALSE) AND " & _
"((TFACTURASR.NOPAGAR)= FALSE) AND " & _
"((TFACTURASR.IMPORTET)= 0) AND " & _
"((TFACTURASR.FECHAP)<= Datevalue('" & vgfi & "')) AND " & _
"((TFACTURASR.PAGADA)= FALSE) AND " & _
"((TFACTURASR.FPAGO) LIKE '4%') AND " & _
"((TFACTURASR.VENCIMIENTO) = Datevalue('" & vffp & "'))) " & _
"ORDER BY TPROVEEDORES.NOMBRE"
da = New OleDb.OleDbDataAdapter(consulta, cnn)
ds = New DataSet
dt = New DataTable
da.Fill(dt)
ds.Tables.Add(dt)
consulta1 = "SELECT IMPORTET, CONCEPTOP, FECHAP, CLAVE FROM TFACTURASR " & _
"ORDER BY CLAVE"
daf = New OleDb.OleDbDataAdapter(consulta1, cnnm)
dtf = New DataTable
daf.Fill(dtf)
If dt.Rows.Count > 0 Then
preparartransferencia()
Else
MsgBox("sigue")
prepararfichero()
End If
End Sub
Private Sub preparartransferencia()
DG1.DataSource = dt
Dim vmt1 As String
Dim vmt2 As String
Dim vms1 As Single
Dim fila As Integer = 0
While fila <= dt.Rows.Count - 1
vmt1 = DG1.Rows(fila).Cells(1).Value
vmt1 = dt.Rows(fila)(1)
vms1 = 0.0
vmt2 = ""
Do While dt.Rows(fila)(1) = vmt1 And fila <= dt.Rows.Count - 1
vms1 = vms1 + dt.Rows(fila)(2)
If vmt2 = "" Then
vmt2 = dt.Rows(fila)(6)
Else
vmt2 = vmt2 & "," & dt.Rows(fila)(6)
End If
dt.Rows(fila)(8) = dt.Rows(fila)(0)
If fila = dt.Rows.Count - 1 Then
dt.Rows(fila)(3) = vms1
dt.Rows(fila)(7) = vmt2
vfs1 = vfs1 + vms1
Exit While
Else
If fila < dt.Rows.Count - 1 Then
fila = fila + 1
End If
End If
Loop
If fila <= dt.Rows.Count - 1 Then
fila = fila - 1
dt.Rows(fila)(3) = vms1
dt.Rows(fila)(7) = vmt2
vfs1 = vfs1 + vms1
fila = fila + 1
End If
End While
For Each row As DataRow In dt.Rows
If row.RowState = DataRowState.Modified Then
col = row.Item("IMPORTET")
col1 = row.Item("CONCEPTOP").ToString
col2 = row.Item("FECHAP")
col3 = row.Item("CLAVE")
Dim consultam As String
consultam = "UPDATE TFACTURASR SET IMPORTET = ('" & col & "'), " & _
"CONCEPTOP = ('" & col1 & "'), " & _
"FECHAP = Datevalue('" & col2 & "') " & _
"WHERE (CLAVE) = (" & col3 & ") "
Try
If (Not cnnm Is Nothing) Then
cnnm.Close()
End If
cnnm.Open()
Dim cmd As New OleDbCommand(consultam, cnnm)
cmd.ExecuteNonQuery()
dtf.AcceptChanges()
Catch ex As Exception
MessageBox.Show("No ha actualizado bien")
End Try
End If
Next
End Sub
Perdona por mi atrevimiento ya que soy muy novato pero pienso que pudiera ser porque se tratase del último registro del bucle de los modificados.
Te agradecería si puedes revisarlo a ver si hay errores.
Gracias y saludos.
-
Hola anmaroso, una estrategia que puede ser útil es mostrar por pantalla las consultas que intervienen para verificar que estén bien construidas.
Simplemente escribir algo como
MsgBox ("La consulta a ejecutar es: " & consultam) ó MsgBox ("La consulta a ejecutar es: " & consulta1)
De este modo puedes ver si hay algún error en la generación de consultas ¿Qué obtienes al mostrarlas por pantalla?
Otra cosa, cuando te refieres a que no te modifica el primer registro ¿te refieres a una fila o a una columna? Si es una columna, ten en cuenta que algunas columnas pueden estar definidas como autoincrementales y por ello no es posible modificarlas a través de una consulta ya que sus valores se generan automáticamente.
Saludos
-
Hola, Alex:
Buenos días.
Al final después de tanto tiempo encontré el error .Estaba en que uno de los registros de la base de datos no se actualizaba porque el registro estaba corrupto, no se solucionaba compactando la base de datos por eso he tardado tanto en descubrirlo, ha sido borrar el registro y actualizar bien.
Muchas gracias por tu comprensión.
Saludos.
-
Vaya! Ese problema que comentas parece bastante difícil de detectar, yo diría que puede ocurrir pero es bastante infrecuente. Gracias por comentar cómo lo has solucionado.
Saludos