Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Error 3022 en access

Estas en el tema de Error 3022 en access en el foro de Visual Basic clásico en Foros del Web. Hola, Tengo un problema con la grabación de datos en una tabla de Access. Hasta la semana pasada mi programa funcionaba correctamente: leo de una ...
  #1 (permalink)  
Antiguo 08/04/2013, 01:04
 
Fecha de Ingreso: abril-2013
Mensajes: 4
Antigüedad: 11 años
Puntos: 0
Error 3022 en access

Hola,

Tengo un problema con la grabación de datos en una tabla de Access.

Hasta la semana pasada mi programa funcionaba correctamente: leo de una tabla de una base de datos y grabo en otra tabla igual en otra base de datos. Y sin hacer ningún cambio, con una versión compilada hace 2 años, ha dejado de funcionar.

Utilizo Addnew y update, y la tabla de destino tiene como clave principal un campo tipo contador. Lo que he detectado es que si después del update del primer registro hago otro addnew el valor de la clave principal (campo tipo contador) no se actualiza, por lo que cuando intento hacer el update da un error 3022 (clave duplicada), es decir, en el primer addnew el ID=1 y en el segundo sigue siendo ID=1.

¿Sabe alguien si alguna actualización del Windows XP puede afectar a esto? Lo he probado en varios ordenadores y con bases de datos diferentes, directamente en visual basic y con versiones compiladas, y en todos los casos da el mismo error.

El código que uso es este

Set TPedidoSDest = BDCalzadoDes.OpenRecordset("PedidoS", dbOpenTable)
TPedidoSDest.Index = "PrimaryKey"
Set TPedidoSEnvioDest = BDCalzadoDes.OpenRecordset("PedidoSEnvio", dbOpenTable)
sql = "Select * from PedidoS WHERE PedidoS.idPedidoC = " & idPedidoCOrig
Set DYPedidoSOrig = BDCalzadoOrig.OpenRecordset(sql, dbOpenDynaset)
While Not DYPedidoSOrig.EOF
'********* SACAMOS EL IDMODELO
idModelo = ObtenerIDModelo(Asignar(DYPedidoSOrig!idModelo, 0))
idSurtido = ObtenerIDSurtido(Asignar(DYPedidoSOrig!idSurtido, 0))
idFabrica = ObtenerFabrica(Asignar(DYPedidoSOrig!idFabrica, 0))
idTarifa = ExportarTarifa(Asignar(DYPedidoSOrig!idTarifa, 0))
idFabricacion = ExportarFabricacion(Asignar(DYPedidoSOrig!idFabric acion, 0))
TPedidoSDest.AddNew
idPedidoSDest = TPedidoSDest!IDPedidoS
For j = 1 To DYPedidoSOrig.Fields.Count - 1
Campo = DYPedidoSOrig.Fields(j).Name
Select Case Campo
Case "IDPedidoC"
TPedidoSDest.Fields(Campo) = idPedidoCDest
Case "IDModelo"
TPedidoSDest.Fields(Campo) = idModelo
Case "IDSurtido"
TPedidoSDest.Fields(Campo) = idSurtido
Case "IDFabrica"
TPedidoSDest.Fields(Campo) = idFabrica
Case "IDTarifa"
TPedidoSDest.Fields(Campo) = idTarifa
Case "IDFabricacion"
TPedidoSDest.Fields(Campo) = idFabricacion
Case Else
TPedidoSDest.Fields(Campo) = DYPedidoSOrig.Fields(j)
End Select
Next j
TPedidoSDest.Update
DYPedidoSOrig.MoveNext
Wend


Gracias anticipadas
  #2 (permalink)  
Antiguo 08/04/2013, 13:00
 
Fecha de Ingreso: octubre-2008
Mensajes: 127
Antigüedad: 15 años, 6 meses
Puntos: 5
Respuesta: Error 3022 en access

Hola,

has revisado que la tabla en la que haces insert esté vacía? O que el modelo destino sea correcto?

Saludos.
  #3 (permalink)  
Antiguo 08/04/2013, 14:26
 
Fecha de Ingreso: abril-2013
Mensajes: 4
Antigüedad: 11 años
Puntos: 0
Respuesta: Error 3022 en access

La tabla puede o no estar vacía, eso no le debe de afectar porque no utilizo la instrucción "insert" sino "addnew"

El problema lo tengo en esta instrucción:

TPedidoSDest.AddNew

que debería de cambiar el campo de la clave principal

TPedidoSDest!IDPedidoS

Este es un campo tipo contador. La primera vez que entra en el bucle del "while" pone TPedidoSDest!IDPedidoS=1 y la segunda vez sigue con el mismo valor, que debería de haber cambiado.

Saludos,
  #4 (permalink)  
Antiguo 08/04/2013, 15:01
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Error 3022 en access

Me gustaria ayudar pero me marea un poco y mas aun del modo en que esta, me has cansado la vista jeje, como eres nuevo no tienes activo las etiquetas asi que resubo tu codigo y a esperar que alguien te ayude.

Código:
'Productos_por_categoria
Set TPedidoSDest = BDCalzadoDes.OpenRecordset("PedidoS", dbOpenTable)
 
 TPedidoSDest.Index = "PrimaryKey"
 
 Set TPedidoSEnvioDest = BDCalzadoDes.OpenRecordset("PedidoSEnvio", dbOpenTable)
 
 SQL = "Select * from PedidoS WHERE PedidoS.idPedidoC = " & idPedidoCOrig
 
 Set DYPedidoSOrig = BDCalzadoOrig.OpenRecordset(SQL, dbOpenDynaset)
 
 While Not DYPedidoSOrig.EOF
       '********* SACAMOS EL IDMODELO
        idModelo = ObtenerIDModelo(Asignar(DYPedidoSOrig!idModelo, 0))
       idSurtido = ObtenerIDSurtido(Asignar(DYPedidoSOrig!idSurtido, 0))
       idFabrica = ObtenerFabrica(Asignar(DYPedidoSOrig!idFabrica, 0))
        idTarifa = ExportarTarifa(Asignar(DYPedidoSOrig!idTarifa, 0))
   idFabricacion = ExportarFabricacion(Asignar(DYPedidoSOrig!idFabricacion, 0))

    TPedidoSDest.AddNew 'ADDNEW
 
    idPedidoSDest = TPedidoSDest!IDPedidoS
    For j = 1 To DYPedidoSOrig.Fields.Count - 1
         
            Campo = DYPedidoSOrig.Fields(j).Name
            Select Case Campo
                   Case "IDPedidoC": TPedidoSDest.Fields(Campo) = idPedidoCDest
                   Case "IDModelo": TPedidoSDest.Fields(Campo) = idModelo
                   Case "IDSurtido": TPedidoSDest.Fields(Campo) = idSurtido
                   Case "IDFabrica": TPedidoSDest.Fields(Campo) = idFabrica
                   Case "IDTarifa": TPedidoSDest.Fields(Campo) = idTarifa
                   Case "IDFabricacion": TPedidoSDest.Fields(Campo) = idFabricacion
                   Case Else: TPedidoSDest.Fields(Campo) = DYPedidoSOrig.Fields(j)
            End Select
 
    Next j
    TPedidoSDest.Update 'UPDATE
    
 DYPedidoSOrig.MoveNext
 Wend
Código:
Como ya sabes por donde va tu error, te sugiero que crees un proyecto nuevo(a modo de ejemplo) con menos campos, menos case's y menos todo, asi sera menos cansado estar revisando tanto codigo y mas facil dar una solucion, es lo que yo hago como ultima opcion por que al soltar bastante codigo en un foro la mayoria se aburre y no responde
__________________
123.http://bunker.host22.com
  #5 (permalink)  
Antiguo 08/04/2013, 15:12
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Error 3022 en access

Has mencionado que antes todo iba bien asi que supongo que tiene que ver con el formato de tu archivo access osea el .MDB

El error podria ser por que quizas tengas tu archivo con el formato de access 97 o 2000(Aqui funciona todo bien) y si abriste tu archivo con acccess2003 te pidio que lo actualizes a un version superior y lo hiciste sin darte cuenta(el nuevo formato entre comillas tiene otras restricciones y por eso el error).

Es mas que seguro que hiciste algo por estilo y lo peor de todo es que cuando lo actualizas de formato no se puede hacer lo inverso creo que solo instalando el access97, por ahi hay versiones portables, si crees que ese puede ser el problema yo lo tengo en portable aunque nose si funcione porque lo tengo tirado por ahi.
__________________
123.http://bunker.host22.com
  #6 (permalink)  
Antiguo 09/04/2013, 01:56
 
Fecha de Ingreso: abril-2013
Mensajes: 4
Antigüedad: 11 años
Puntos: 0
Respuesta: Error 3022 en access

Gracias por tu ayuda.

La base de datos no está actualizada a ninguna versión posterior porque el único proceso que accede a ella y no funciona es este, todas las otras aplicaciones que la usan funcionan bien. Además si la hubiera actualizado no me dejaría grabar ni el primer registro y ese sí lo graba.

Saludos,
  #7 (permalink)  
Antiguo 09/04/2013, 13:29
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Error 3022 en access

Cita:
Iniciado por dimaro Ver Mensaje

la tabla de destino tiene como clave principal un campo tipo contador
Si la tabla de destino tiene un campo contador(asumo que te refieres a autonumerico) entonces no deberias hacer nada puesto que el id se rellena automaticamente.

TPedidoSDest.AddNew 'ADDNEW

idPedidoSDest = TPedidoSDest!IDPedidoS 'Esta linea no tendrias porque colocarla ya que el id supuestamente sera automatico.

A esto me referia con el formato del archivo .mdb supongo que antes te funcionaba porque el formato de access 97 o 2000 lo permitia pero si por A o B abriste tu .mdb con access2003 creo que por dafault se actualiza aunque mantenga el mismo formato, basta con que lo hayas abierto y se malogro todo no estoy seguro, antes me paso algo similar por eso insisto con esto de los formatos.



Cita:
Iniciado por dimaro Ver Mensaje

...Este es un campo tipo contador. La primera vez que entra en el bucle del "while" pone TPedidoSDest!IDPedidoS=1 y la segunda vez sigue con el mismo valor, que debería de haber cambiado.
Si no te cambia TPedidoSDest!IDPedidoS=2 entonces algo anda mal con el bucle(por alguna razon no ejecuta el movenext) quiza la tabla origen sea tipo de dato texto y quiza este tomando TPedidoSDest!IDPedidoS=1 como si fuera un texto y por lo tanto lo toma como 0 y por eso al volver a hacer el bucle le vuelve a colocar 1

NOTA: lo campos autonumericos en access no se pueden modificar, has probado ingresar la informacion que quieres "manualmente" fijate si te lo permite, quiza el error este por ahi?
__________________
123.http://bunker.host22.com
  #8 (permalink)  
Antiguo 10/04/2013, 04:39
 
Fecha de Ingreso: abril-2013
Mensajes: 4
Antigüedad: 11 años
Puntos: 0
Respuesta: Error 3022 en access

Gracias otra vez por respuesta, pero el problema es bastante extraño porque una versión del programa compilada hace dos años no funciona, y no funciona con ninguna base de datos que utilice (he probado con unas seis o siete diferentes).

He pensado que puede ser alguna actualización de windows, porque en XP no da el error en el mismo punto que en Windows 7, en incluso en otro equipo con W7 funciona bien.

Así que he optado por crear un nuevo proyecto, que haga el mismo proceso, copiando las funciones aunque no el formulario principal y de momento ha funcionado perfectamente con la primera base de datos que me dió el problema.

Saludos,
  #9 (permalink)  
Antiguo 10/04/2013, 14:19
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Error 3022 en access

Bueno quizas sea como tu dices, podria ser por alguna actualizacion de windows, aunque tambien podria ser por haber instalado algun programa en esa PC y reemplazo algunas dll de windows o quizas del mismo access, revisa eso!, quizas dias antes de que deje de funcionar se instalo algun programa.

Cuando encuentres la razon del problema y la solucion espero la menciones, igual cualquier consulta aqui esta el foro
__________________
123.http://bunker.host22.com

Etiquetas: access, basic, sql, visual
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:02.