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