Access - recordser

 
Vista:
sin imagen de perfil

recordser

Publicado por kanika (52 intervenciones) el 29/08/2011 13:33:43
Hola a tod@s una vez más, necesito recorrer una tabla para encontrar todos los registros que coincidan con un código y sustituir esos registros o insertar más en la tabla por los datos que tengo en un subformulario ¿como puedo hacer esto con un recordset? he escrito este código para encontrar el primer registro y ya me da error así que no he seguido más

db y X están declaradas en el módulo general como Database y Recordset respectivamente

Set db = CurrentDb
Set X = db.OpenRecordset("nombre_tabla")
X.Edit
X.FindFirst KitB_Kit = [nombre_formulario].Producto
X!KitB_Componente = [nombre_formulario].[Materia Prima]
X!KitB_Unidades = [nombre_formulario].cantidad
X.Update

os agradezco vuestra ayuda, gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Enrique Ramírez
Val: 37
Ha aumentado su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

recordser

Publicado por Enrique Ramírez (629 intervenciones) el 29/08/2011 16:00:42
Entra a mi sitio http://sites.google.com/site/jerrmex y busca la opción 24_Puro RecordSet
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

recordset

Publicado por kanika (52 intervenciones) el 30/08/2011 08:18:51
Gracias Enrique miraré tu web.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Henry

recordser

Publicado por Henry (37 intervenciones) el 29/08/2011 20:06:13
Buenas tardes Kanika

Dim X As ADODB.Recordset
Set X = New ADODB.Recordset
X.Open "nombre_tabla", CurrentProject.AccessConnection, adOpenDynamic, adLockOptimistic

' Buscar el registro
X.MoveFirst ' Se posiciona en el primer registro y a partir de este comienza a buscar
X.Find "KitB_Kit =" & [nombre_formulario].Producto
If Not X.EOF Then ' si lo consigue
X.Fields("KitB_Componente") = [nombre_formulario].Materia Prima
X.Fields("KitB_Unidades")= [nombre_formulario].cantidad
X.Update
End If

Nota: ¿El Producto se puede repetir en la tabla?
Si es así debes condicionar la lectura de la tabla con un do While y actualizar todos los registros que coincidan.
Me avisas....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

recordset

Publicado por kanika (52 intervenciones) el 30/08/2011 08:18:03
Hola Henry pues la verda que sí, el código se repite en la tabla de hecho el que tengo entre manos tiene 10 registros y tengo que sustituirlos por 17 osea reescribir 10 y añadir 7
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

recordset

Publicado por kanika (52 intervenciones) el 30/08/2011 12:24:12
De todas formas Henry me da error tu código en la tercera línea:

"Se ha producido el error '-2147217900' (80040e14)' en tiempo de ejecución:

Instrucción SQL no válida; se esperaba 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT' o 'UPDATE'."

el código que tengo ahora tal cual es:

Dim X As ADODB.Recordset
Set X = New ADODB.Recordset
X.Open "dbo_Kit estructura Baterías", CurrentProject.AccessConnection, adOpenDynamic, adLockOptimistic '***aquí me da el error
X.MoveFirst
X.Find "KitB_Kit =" & [Formulario_OT_Terminado]![SFM OT Finalizada EstructuraOT para modificar].Producto
If Not X.EOF Then
X.Fields("KitB_Componente") = [Formulario_OT_Terminado]![SFM OT Finalizada EstructuraOT para modificar].[Materia Prima]
X.Fields("KitB_Unidades") = [Formulario_OT_Terminado]![SFM OT Finalizada EstructuraOT para modificar].cantidad
X.Update
End if
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Henry

recordset

Publicado por Henry (37 intervenciones) el 30/08/2011 18:48:05
Esta facil, el error es porque el nombre de la tabla tiene espacios en blanco
dbo_Kit estructura Baterías
Cuando utilizas conección de base de datos tales como ADODB, DAO, la sentencia para abrir la tabla (OPEN) no permite espacios en blanco entre palabras. Si la tabla tiene mas de una palabra debes colocarle piso(Undercode), o las palabras pegadas. Esto es igual cuando declaras variables con mas de una palabra..
Debes modificar el nombre de la tabla como dbo_Kit_estructura_Baterias. No se en que te puede afectar este cambio, todo depende el numero de formularios, consultas, informes, etc que tengas diseñado.

Cualquier cosa me pegas un grito.......
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Henry

recordset

Publicado por Henry (37 intervenciones) el 30/08/2011 18:57:28
Se me olvido preguntarte,¿esa tabla dbo_Kit_estructura_Baterias tiene clave?, ya que se repite el codigo de producto. Tu dices que la tabla tiene 10 registros con el mismo codigo y debes procesar 17 registros del mismo codigo, 10 que ya existen y 7 que tienes que adicionar. ¿Como diferencias los registros si tienen el mismo codigo, ¿Debe haber otro campo que marque la diferencia? .
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

recordset

Publicado por kanika (52 intervenciones) el 31/08/2011 09:17:21
Hola Henry, ya sé lo de los espacios por eso mismo no puedo escribir el código directamente en SQL y pensé que con un recordset podría, la db es antigua y yo sólo estoy modificando alguna cosa, no está normalizada pero no puedo cambiar el nombre de la tabla pues se usa en toda la fábrica y no puedo parar la produción, también me he encontrado nombres con tilde e incluso consultas y formularios que se llaman de forma idéntica, un caos.
La tabla no tiene clave se repite el código en tantos registros como componentes tenga la batería en este caso en concreto tengo 10 registros con el mismo código y debo sustituirlos por 17 registros que tb tienen el mismo código pero habrá veces que en lugar de añadir tenga que borrar porque se trata de sustituir la estructrura original por la que se ha fabricado.
Si se te ocurre algo coméntame, muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

recordset

Publicado por kanika (52 intervenciones) el 31/08/2011 12:03:41
Mira Henry este código lo ejecuta sin problemas y tiene espacios en blanco:

Set db = CurrentDb
Set X = db.OpenRecordset("dbo_Kit estructura Baterías", DB_OPEN_DYNASET, 512)
X.AddNew
X!KitB_Kit = Producto
X!KitB_Componente = variable1
X!KitB_Unidades = variable2
X!KitB_FechaCreación = variable3
X.Update
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

recordset

Publicado por kanika (52 intervenciones) el 31/08/2011 16:53:31
Bueno ya casi lo tengo, al final como me daba problemas con los campos del formulario he decidido crear una tabla con los datos que quiero actualizar y pasarlos de una a otra, he creado 2 recordset y este es el código que llevo hasta ahora:


Set db = CurrentDb
Set RS = db.OPENRECORDSET("Estructura_Baterias_Temporal", DB_OPEN_DYNASET, 4)
Set X = db.OPENRECORDSET("dbo_Kit estructura Baterías", DB_OPEN_DYNASET, 512)
X.Filter = "KitB_Kit = Producto"

RS.MoveFirst
If Not RS.EOF Then

If Not X.EOF Then
X.Edit
X!KitB_Componente = RS!Materia_Prima
X!KitB_Unidades = RS!cantidad
X!KitB_FechaCreación = RS!FechaAlta
X.Update
X.MoveNext
Else
X.AddNew
X!KitB_Kit = RS!Producto
X!KitB_Componente = RS!Materia_Prima
X!KitB_Unidades = RS!cantidad
X!KitB_FechaCreación = RS!FechaAlta
X.Update
End If
RS.MoveNext
Else
RS.Close
X.Delete
X.Update
X.Close
End If

la única pega es que no me hace el filtro empieza a escribirme en el primer registro de la tabla, no del filtro ¿que me falta? tampoco me borra los registros que sobran (en caso de tener más) en la actualización
si podeís ayudarme en la recta final te lo agradezco
Gracias!! una vez más
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Henry

recordset

Publicado por Henry (37 intervenciones) el 01/09/2011 22:50:11
Hola Kanika
lo que pasa es que comienzas desde el 1er. registro porque tu lo inicias desde el 1er. registro
( RS.MoveFirst). Debes posicionarte en el registro que te interesa actualizar. Te codifique un evento que lee los datos del formulario y busca ese codigo de producto en la tabla, si consigue el codigo de producto y el componente de materia prima lo actualiza(actualiza la cantidad y la fecha). En caso de que no lo consiga, adiciona el registro.
Me supongo que el codigo de producto se puede repetir como tu me dijistes, pero el codigo del componente de materia prima presumo que no se repite en el mismo codigo de producto.
Lo que no entiendo como eliminas un registro, que condición aplicas.
este es el codigo......:

Dim val As Long
Dim db As Database
Dim X As Recordset
Set db = CurrentDb
Set X = db.OpenRecordset("dbo_Kit estructura Baterías", DB_OPEN_DYNASET, 512)
val = 0
If X.EOF Then ' Si la tabla no tiene registros se va a la etiqueta otro para adicionar el producto
GoTo otro
End If

' Se busca el codigo de producto del formulario

X.FindFirst "KitB_Kit =" & [Form_Formulario1].producto

' Si no lo consigue se va a la etiqueta otro para adicionar el producto
If X.EOF Then
GoTo otro
End If

' Consiguió el codigo de producto
Do While Not X.EOF
' Si es el codigo de producto y la materia prima del formulario se actualiza el registro
If X.Fields("KitB_Kit") = [Form_Formulario1].producto And _
X.Fields("KitB_Componente") = [Form_Formulario1].materia_prima Then
X.Edit
X.Fields("KitB_Componente") = [Form_Formulario1].materia_prima
X.Fields("KitB_Unidades") = [Form_Formulario1].cantidad
X.Fields("KitB_FechaCreación") = [Form_Formulario1].FechaAlta
X.Update
val = 1
End If
X.MoveNext
Loop

otro:
If val = 0 Then
' Adiciona el registro en el caso de que la tabla no tenga registros o que no haya conseguido el 'codigo de producto y la materia prima.
X.AddNew
X.Fields("KitB_Kit") = [Form_Formulario1].producto
X.Fields("KitB_Componente") = [Form_Formulario1].materia_prima
X.Fields("KitB_Unidades") = [Form_Formulario1].cantidad
X.Fields("KitB_FechaCreación") = [Form_Formulario1].FechaAlta
X.Update
End If
X.Close
Set X = Nothing

Nota: Lo corrí y camina a la perfección. Cualquier cosa me avisas.....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

recordset

Publicado por kanika (1 intervención) el 08/04/2012 22:48:47
oye se me olvidó darte las gracias

GRACIAS!!

aunque la solución que adopté fué borrar las líneas coincidentes y crearlas de nuevo y así ya funcionó perfectamente.

Ciao.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar