Ayuda con código implementado en Visual Basic por error en tiempo de ejecución con un datagrid

Hola de nuevo, me aparece un error que dice:
Error '3265' en tiempo de ejecucion:
No se encontro el elemento en la coleccion que corresponde con el nombre o el ordinal pedido.
me aparece al guardar lo que tengo en el datagrid y lo de las cajas de texto, y me lo alcanza a guardar pero me lo guarda doble vez, aqui te dejo el codigo.
Private Con As New Connection
Private Rec As ADODB.Recordset
Private Rec2 As ADODB.Recordset
Private Rec3 As ADODB.Recordset
Public var As String
Dim addFlag As Boolean
Private Sub cmdCancelar_Click()
If Rec.EOF Then
    Display
Else
    Display
    Rec.CancelUpdate
    'Rec2.CancelUpdate
    'Rec3.CancelUpdate
    Form_Activate
    cmdIngresar.Visible = False
    txtValorLegalizacion.Text = ""
    lblTotal2.Caption = ""
    Label1.Visible = False
    Label2.Visible = False
    txtConcepto.Text = ""
    txtConcepto.Visible = False
    txtValor.Text = ""
    txtValor.Visible = False
    cmdNuevo.Enabled = True
    If permiso = "A" Then cmdModificar.Enabled = True
    If permiso = "B" Then cmdModificar.Enabled = True
    cmdCancelar.Enabled = False
    cmdGuardar.Enabled = False
    cmdFirst.Enabled = True
    cmdPrevious.Enabled = True
    cmdNext.Enabled = True
    cmdLast.Enabled = True
End If
cmdIngresar.Visible = False
Label1.Visible = False
Label2.Visible = False
txtConcepto.Visible = False
txtValor.Visible = False
End Sub
Private Sub cmdFirst_Click()
Rec.MoveFirst
Display
End Sub
Private Sub cmdGuardar_Click()
Set Con = New ADODB.Connection
With Con
    .ConnectionString = "provider = microsoft.ace.oledb.12.0;data source=D:\PROYECTO TYT\TYT.accdb"
    .Open
End With
Dim strSql As String
For i = 1 To Me.DataGrid1.ApproxCount
    strSql = "insert into RECIBOS values('" + CStr(Me.DataGrid1.Columns(0).CellValue(i)) + "','" + Me.DataGrid1.Columns(1).CellValue(i) + "','" + Me.DataGrid1.Columns(2).CellValue(i) + "','" + CStr(Me.DataGrid1.Columns(3).CellValue(i)) + "')"
    Con.Execute strSql
Next
If lblTotal2.Caption = "" Then
    MsgBox "DEBE INGRESAR LOS DATOS Y VALORES"
    txtConcepto.SetFocus
Else
    With Rec2
        If addFlag Then .AddNew
        Rec2!LEGALIZACION = lblLegalizacionNo.Caption
        Rec2!USUARIO = lblNombre.Caption
        Rec2!ANTICIPODIRIGIDO = lblDirigdoA.Caption
        Rec2!VALORANTICIPO = lblValorAnticipo2.Caption
        Rec2!OBRA = lblObra2.Caption
        Rec2!VALORLEGALIZACION = txtValorLegalizacion.Text
        Rec2!TOTAL = lblTotal2.Caption
        .Update
    End With
    addFlag = False
    cmdNuevo.Enabled = True
    If permiso = "A" Then cmdModificar.Enabled = True
    If permiso = "B" Then cmdModificar.Enabled = True
    cmdGuardar.Enabled = False
    cmdCancelar.Enabled = False
    cmdFirst.Enabled = True
    cmdPrevious.Enabled = True
    cmdNext.Enabled = True
    cmdLast.Enabled = True
    'cmdBuscar.Enabled = True
    'cmdCancelarBuscar.Enabled = True
    cmdIngresar.Visible = False
    Label1.Visible = False
    Label2.Visible = False
    txtConcepto.Visible = False
    txtValor.Visible = False
End If
End Sub
Private Sub cmdIngresar_Click()
Rec3.AddNew
Rec3(0) = lblLegalizacionNo.Caption
Rec3(1) = lblObra2.Caption
Rec3(2) = txtConcepto.Text
Rec3(3) = txtValor.Text
Rec3.Update
Dim suma As Double
suma = 0
For i = 1 To Me.DataGrid1.ApproxCount
    suma = suma + Me.DataGrid1.Columns(3).CellValue(i)
Next
Me.txtValorLegalizacion.Text = FormatCurrency(suma)
Dim res As Long
Dim num1 As Long
Dim num2 As Long
num1 = FormatNumber(lblValorAnticipo2.Caption)
num2 = FormatNumber(txtValorLegalizacion.Text)
res = num1 - num2
lblTotal2.Caption = FormatCurrency(res)
txtConcepto.Text = ""
txtValor.Text = ""
End Sub
Private Sub cmdLast_Click()
Rec.MoveLast
Display
End Sub
Private Sub cmdModificar_Click()
cmdGuardar.Enabled = True
cmdCancelar.Enabled = True
End Sub
Private Sub cmdNext_Click()
With Rec
    .MoveNext
    If .EOF Then .MoveLast
End With
Display
End Sub
Private Sub cmdNuevo_Click()
addFlag = True
cmdNuevo.Enabled = False
cmdModificar.Enabled = False
cmdGuardar.Enabled = True
cmdCancelar.Enabled = True
cmdFirst.Enabled = False
cmdPrevious.Enabled = False
cmdNext.Enabled = False
cmdLast.Enabled = False
cmdIngresar.Visible = True
Label1.Visible = True
Label2.Visible = True
txtConcepto.Visible = True
txtValor.Visible = True
End Sub
Private Sub cmdPrevious_Click()
With Rec
    .MovePrevious
    If .BOF Then .MoveFirst
End With
Display
End Sub
Private Sub Form_Activate()
Set Rec3 = New ADODB.Recordset
    With Rec3
        .Fields.Append "NO", adInteger, 20
        .Fields.Append "OBRA", adVarChar, 250
        .Fields.Append "CONCEPTO", adVarChar, 250, adFldUpdatable
        .Fields.Append "VALOR", adCurrency, adFldUpdatable
        .Open
    End With
Set Me.DataGrid1.DataSource = Rec3
Display
End Sub
Private Sub Form_Load()
Dim permiso As String
lblNombre = var
permiso = frmINGRESO.acc
If permiso = "A" Then
    cmdNuevo.Enabled = True
    cmdModificar.Enabled = True
    cmdCancelar.Enabled = True
    cmdGuardar.Enabled = True
    cmdBorrar.Enabled = True
ElseIf permiso = "B" Then
    cmdNuevo.Enabled = True
    cmdModificar.Enabled = True
    cmdCancelar.Enabled = True
    cmdGuardar.Enabled = True
    cmdBorrar.Enabled = False
Else
    cmdNuevo.Enabled =...

1 Respuesta

Respuesta
1
Aqui:
With Rec2
        If addFlag Then .AddNew
        Rec2!LEGALIZACION = lblLegalizacionNo.Caption
Es donde graba por segunda vez, debes quitar es .AddNew, y dejar esa parte del codigo solo para actualizar los cambios que hayan cuando el registro ya existe.
Con respecto al error, es que estas tratando de llamar un campo que no existe en el recordset que acabas de llamar.
Tambien puede ocurrir porque al momento del INSERT tienes un valor de mas, esto quiere decir la tabla tiene 5 campos por ejemplo, y tu le estas enviando 6. Esto es muy comun s tienes un campo que acepte decimales y le estas enviando el valor como 999,99 entonces supone que la coma decimal es otro dato, debes cambiar la coma decimal por un punto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas