ERROR 3021 en tiempo de ejecución. Intentando realizar una búsqueda en base de datos.

Aquí un nuevo error en el programa que estoy tratando de ejecutar, el programa es sencillo, llenar una base de datos de unos productos, pero que al intentar ingresar me revise primero si ya existe uno con el CODIGOPRODUCTO que se esta introduciendo, de ser así msgbox de existencia, de lo contrario ingresar los datos del nuevo producto.

La estoy trabajando conectando a través de ADO, la conexión esta ejecutada ya que en un DATAGRID me refleja lo que actualmente esta en la tabla de datos.

Aquí les anexo el código:

Private Sub cmdingresar_Click()
Dim tbl As New adodb.Recordset

tbl.Open "SELECT * FROM PRODUCTOS WHERE CODIGOPRODUCTO= '*" & txtcodigoprod.Text & "'", CN, adOpenDynamic, adLockOptimistic

tbl.MoveFirst <----- aquí me indica que es el error 3021

Do While Not tbl.EOF
    If tbl("CODIGOPRODUCTO") = Val(txtcodigoprod.Text) Then
        MsgBox "Ya existe el producto"
    Else
tbl.AddNew
tbl("ITEM") = txtitem.Text
tbl("MARCA") = txtmarca.Text
tbl("CARACTERISTICAS") = txtcaracteristicas.Text
tbl("CODIGOPRODUCTO") = Val(txtcodigoprod.Text)
tbl("CODIGO ARANCEL") = Val(txtcodigoaranc.Text)
tbl.Update
    End If
tbl.MoveNext

Loop

End Sub

Aquí les anexo la pantalla...

Ese código para la búsqueda me lo facilito el sr Richard Alejandro Villarroel Gonzalez el cual lo tagueo para que continue ayudándome y si alguien más puede aportarnos se los agradecería.

2 respuestas

Respuesta
1

José Antonio: Ignoro el alcance global de tu código, pero supongo que te salta el error porque el Recordset no tiene registros.

Si es así prueba con:

If Not tbl.EOF And Not tbl.BOF Then

tbl.MoveFirst

Do While Not tbl.EOF
    If tbl("CODIGOPRODUCTO") = Val(txtcodigoprod.Text) Then
        MsgBox "Ya existe el producto"
    Else
tbl.AddNew
tbl("ITEM") = txtitem.Text
tbl("MARCA") = txtmarca.Text
tbl("CARACTERISTICAS") = txtcaracteristicas.Text
tbl("CODIGOPRODUCTO") = Val(txtcodigoprod.Text)
tbl("CODIGO ARANCEL") = Val(txtcodigoaranc.Text)
tbl.Update
    End If
tbl.MoveNext

Loop

Else

MsgBox "Este recordset no tiene Registros"

End If

Pd.- Solo he mirado ese tema. Mis saludos >> jacinto

Gracias Jacinto por participar... utilice tu código, pero colocándole un CODIGOPRODUCTO igual a uno existente o diferente me envía la línea del MsgBox "Este recordset no tiene Registros"...

El alcance es simple... ingresar productos con las características que están en el Form y que al darle a "INGRESAR" revise si ya existe ese código, lance un Msgbox y si no que lo ingrese a la base de datos.

P.D: no tengo mucha experiencia con esta programación (ADO) de hecho estoy aprendiendo a usarla, pero aquí fue dnd me tranque.

Gracias igual.

José Antonio: Supongo que la Conexion ADO no será la adecuada pero salvo que tengas una poderosa razón para utilizar ADO, yo te sugiero que utilices DAO, de modo que >>

Dim StrSQL As String

Dim tbl As DAO.Recordset

StrSQL = "SELECT * FROM PRODUCTOS WHERE CODIGOPRODUCTO= '" & Me.txtcodigoprod & "'"

Set tbl = Currentdb.OpenRecordset(StrSQL, dbOpenDynaset)

'Aquí el resto del código hasta

End If 'el que hay después del MsgBox

'Antes del EndSub

Tbl. Close

Set tbl = Nothing

Si aún así no consigues lo que buscas lo miro con más atención porque estoy contestando sobre la marcaha. Saludos >> Jacinto

Respuesta
1

Otra vez José Antonio, al trabajar con Recordset, el programa cree que ya hay registros, al usar tbl. MoveFirst, se le dice: "Muévete al primer registros", al no tener se sale justamente en la línea del tbl. MoveFirst.

En el error pasado te alerté de errores que te iban a salir. Y uno de estos es el error 3021, También te hice una rutina de errores para que programa no se cerrara y lo ob ligues a agregar el primer registro.

Te la vuelvo a hacer, esta vez más completo:

Private Sub cmdingresar_Click()
Dim tbl As New adodb.Recordset
On Error GoTo ControlErrores
tbl.Open "SELECT * FROM PRODUCTOS WHERE CODIGOPRODUCTO= '*" & txtcodigoprod.Text & "'", CN, adOpenDynamic, adLockOptimistic
tbl.MoveFirst
Do
    If tbl("CODIGOPRODUCTO") = Val(txtcodigoprod.Text) Then
        MsgBox "Ya existe el producto"
    Else
        tbl.AddNew
        tbl("ITEM") = txtitem.Text
        tbl("MARCA") = txtmarca.Text
        tbl("CARACTERISTICAS") = txtcaracteristicas.Text
        tbl("CODIGOPRODUCTO") = Val(txtcodigoprod.Text)
        tbl("CODIGO ARANCEL") = Val(txtcodigoaranc.Text)
        tbl.Update
    End If
    tbl.MoveNext
Loop Until tbl.EOF
ControlErrores:
    Select Case Err.Number
        Case 3021
            Resume Next ' Esta linea lo que hace es mandar el compilador a la línea siguiente _
            despues del error 3021, o sea, a: Do While Not tbl.EOF, pero Yo lo cambié por el ciclo _
            Do _
            Loop Until tbl.EOF que  hace es entrar primero y al final verifica el EOF
        Case Else
            Msj = "Error # " & Str(Err.Number) & " fue generado por " _
            & Err.Source & Chr(13) & Err.Description
            MsgBox Msj, , "Error"
    End Select
End Sub

Dentro del bloque: Select Case...End Select, puedes capturar todos los errores

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas