Ayuda en Access

Mi problema es el siguiente: no puedo hacer que a partir de un valor que viene de un formulario, se verifique si en otra tabla existe si si es así ejecute una consulta de eliminación de datos(ya la tengo lista) .
El problema es que a partir del formulario, anexo los datos en una tabla distinta a la de origen del Formulario, Esta otra tabla tiene una clave ppal y al tratar de anexar aparece el error de que no acepta duplicados, entonces al aparecer este error o al existir ya un registro con este valor, quiero que borre el registro de la tabla origen del Formulario.
Espero puedas ayudarme.
Desde ya muchas gracias.

1 Respuesta

Respuesta
1
Si no he entendido mal, lo que quieres es añadir registros a una tabla, desde una consulta, y si los datos que quieres añadir ya existen en la tabla de destino quieres que se borren de la tabla de origen.
Si esto es así, lo único que debes hacer es crear una consulta previa para eliminar los datos de la tabla de origen utilizando para ello la tabla de destino para hacer coincidentes los registros a eliminar con los registros del origen.
Si por el contrario quieres mantener los datos de la tabla de origen, y simplemente actualizar los valores de la tabla de destino, puedes utilizar un método compuesto de dos consultas, una de datos añadidos y otra de actualización.
Primero: haces una consulta de datos añadidos. De esta forma, en la tabla final quedan todos los registros que tienen que estar.
Segundo: haces una consulta de actualización. De esta forma, los valores de los campos de la tabla destino, quedan actualizados a los valores de la tabla origen o viceversa.
Espero haberte ayudado, si no es así comentame algo más sobre tu proyecto e intentaré ampliar la solución.
El problema es el siguiente, las consultas ya las tengo y funcionan, el problema es que no logro hacer una macro con condiciones, es decir, que primero trate de añadir los registros (mediante la consulta de datos anexados), luego si no pudo anexar -porque ya existía uno de los datos el cual en la tabla en la que trato de anexarlo es la clave ppal- que lo elimine y me avise mediante un cartel que ya existía. Si no existía que lo anexe y que me avise mediante un cartel.
Te comento que lo estoy tratando de hacer mediante un formulario que mediante un botón que ejecute la macro. Ya he probado muchas cosas : ej: condiciones en macro, que efectúe la de eliminación cuando encuentre un error ([AlOcurrirError]), ahora estoy tratando de hacerlo en VB que busque con el dato del formulario en cada registro de la tabla y compruebe si existe.
Saludos
Desde ya muchas gracias.
Por lo que he podido percibir eres un usuario aventajado en Access.
El método que empleas esta muy bien, pero yo intentaría solucionar todo por código y evitar las macros, creo que esto ya lo has podido deducir.
Bien, en el código supongo que efectúas un recorrido en un recordset y registro a registro compruebas la existencia.
Si esto es así, la existencia la comprobaras con una función adicional que abre el recordset de destino y en base a los criterios de selección localizan un registro, si existe devuelve verdadero y si no existe devuelve falso.
Si el valor es verdadero sacas un mensaje, este registro existe, y permites la opción de continuar.
Si no existe lo insertas en la tabla e indicas que va a ser insertado.
Lo que todavía no me ha quedado claro es si es un proceso masivo de registros, o por el contrario es un proceso que realizas registro a registro.
Si no te importa aclarame esto último, y facilitarme la función que ejecutas en el evento al hacer clic del botón que me comentabas e intentare solucionar definitivamente tu problema.
Si no quieres hacer publica la función puedes mandármela a:
[email protected]
Primero que nada te agradezco muchísimo tu ayuda.
Me estás entendiendo correctamente, me parece que si es posible evitar la recorrida registro por registro ya que en una base grande se volvería muy lento, lo que quiero es que busque en un campo de un registro, nada más.
Saludos
Gatosf
Private Sub Form_AfterInsert()
Dim db As Database
Dim rst As Recordset
Dim strSQL As String
Set db = CurrentDb
If Me![Condicion] = -1 Then
strSQL = "SELECT * FROM Elementos WHERE Elementos.serie ='" _
& Forms!Movimientos![combo2] & ";'"
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
If rst.** Then "Aqui es donde no se que funcion poner para que recupere el registro y lo compare
Beep
MsgBox "Ya existe Numero de serie"
DoCmd.OpenQuery "Elimina Último reg"
Else
DoCmd.OpenQuery "Anexa Nuevos", acNormal, acAdd
DoCmd.OpenQuery "V2F", acNormal, acEdit
End If
End If
Set db = Nothing
Set rst = Nothing
End Sub
Vamos a repasar la función:
Private Sub Form_AfterInsert()
Dim db As Database
Dim rst As Recordset
Dim strSQL As String
Set db = CurrentDb
If Me![Condicion] = -1 Then
strSQL = "SELECT * FROM Elementos WHERE Elementos.serie ='" _
& Forms!Movimientos![combo2] & ";'"
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
'***** AQUI DEBES METER UN BUCLE
Do WHILE not rst.EOF
If Existe_Registro(rst.NombreCampo) then
Beep
MsgBox "Ya existe Numero de serie"
DoCmd.OpenQuery "Elimina Último reg"
Else
DoCmd.OpenQuery "Anexa Nuevos", acNormal, acAdd
DoCmd.OpenQuery "V2F", acNormal, acEdit
End If
rst.movenext
loop
Set db = Nothing
Set rst = Nothing
End Sub
La función Existe_Registro(IdRegistro) puede ser mas o menos asi:
'******************************************************
' Función: Existe_Cliente
'
' Concepto: Comprueba la existencia de un cliente
'
' (c) Angel Pérez Díaz. 1993 - 2001. Todos los Derechos Reservados.
'
'*********************************************************************
Public Function Existe_Cliente(CoCli)
On Error GoTo Error_Existe_Cliente
Existe_Cliente = False
Dim T_CLI As Recordset
Dim DB As DAtabase
Set DB=CurrentDB()
Dim sql
sql = "SELECT [CLIENTES].*"
sql = sql & " FROM [CLIENTES]"
sql = sql & " WHERE [CLIENTES].CO_CLI=" & CoCli
Set T_CLI = DB.OpenRecordset(sql)
If T_CLI.RecordCount > 0 Then
Existe_Cliente = True
End If
T_CLI.Close
Error_Existe_Cliente:
MsgBox Error$, 48, TituloAPLICACION
Exit Function
Exit Function
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas