ACCESS. ¿Cómo actualizar un campo sin borrarlo?

Por ejemplo, si tenemos una tabla Clientes y otra Pedidos, quiero actualizar un campo de Clientes con sus pedidos pero sin machacar el dato anterior. Si el cliente ha pedido Peras, manzanas y plátanos, quiero que en el campo de Clientes aparezcan estas tres palabras seguidas en el mismo campo. Todo ello con vistas a elaborar un escrito(informe) en el que aparezca en el encabezado lo que el cliente ha pedido.

1 respuesta

Respuesta
1
Siempre puedes poner que la consulta de actualización concatene el valor actual del campo con otro nuevo
UPDATE Clientes SET pedidos=trim$(pedidos & ' ' & 'Peras') WHERE nCliente=1234
También te interesaría ver que no haya pedido ya las peras para no añadirlas 2 veces. En ese caso sería:
UPDATE Clientes SET pedidos=trim$(pedidos & ' ' & 'Peras') WHERE nCliente=1234 and instr(pedidos,'Peras')=0
No entiendo muy bien cómo sería la sintaxis. Te lo especifico un poco mejor: Tabla Clientes con los campos IdCliente y TodoslosArticulos. Tabla Pedidos con los campos IdCliente y Artículos. A cada registro de Clientes le corresponden varios registros en Pedidos. Lo que yo quiero es que el campo TodoslosArticulos se actualice con el campo Artículos pero conservando el campo anterior. Es decir quiero concatenar en TodoslosArticulos el valor del campo Artículos. ¿Cómo sería la sintaxis? Gracias por tu interés.
Para hacer lo que quieres pienso que lo mejor sería hacer una función 'resumenArticulosCliente' que te devuelva la lista de artículos que tiene pedidos el cliente.
Para ello, en un módulo copia el siguiente código:
Function resumenArticulosCliente(ByVal idCliente As Long) As String
    Dim txt As String
    Dim rs As Recordset
    txt = "SELECT DISTINCT Articulos FROM Pedidos WHERE idCliente=" & idCliente & " ORDER BY Articulos"
    Set rs = CurrentDb().OpenRecordset(txt)
    If Not rs.EOF Then rs.MoveFirst
    txt = ""
    Do While Not rs.EOF
        txt = txt & rs!Articulos & " "
        rs.MoveNext
    Loop
    rs.Close
    resumenArticulosCliente = Trim$(txt)
End Function
Después puedes usar esa función desde cualquiera de tus consultas. Por ejemplo desde una consulta de actualización en la cual realices la siguiente llamada a la función anterior:
UPDATE Clientes SET TodoslosArticulos=resumenArticulosCliente(idCliente);
Esa consulta actualizaría la lista de artículos de todos los clientes.
Al ejecutar la consulta sale el error: Se ha producido el error '13' en tiempo de ejecución. No coinciden los tipos
Este es el código que he escrito:
Function resumenarticuloscliente(ByVal idclientes As Long) As String
Dim txt As String
    Dim rs As Recordset
    txt = "select distinct articulos from pedidos where idclientes=" & idclientes & " order by articulos"
    Set rs = CurrentDb().OpenRecordset(txt)
    txt = ""
    Do While Not rs.EOF
        txt = txt & rs!articulos & " "
        rs.MoveNext
        Loop
        rs.Close
        resumenarticuloscliente = Trim$(txt)
End Function
Estoy un poco desorientada. No se como seguir. Gracias por tu ayuda
¿Qué tipo de datos contiene 'idClientes'?
Yo he supuesto que sería un número entero. Si es un texto tendrás que poner lo siguiente:
txt = "select distinct articulos from pedidos where idclientes='" & idclientes & "' order by articulos"
Por cierto, supongo que el error te lo está dando en el "openRecordset".
Mira a ver si con eso se corrige.
IdClientes es numérico y, sí, el error lo está dando en el "openrecordset"
Por lo que veo estás poniendo 'idClientes' en lugar de 'idCliente' que ponías en tu primer mensaje.
¿Tienes algún otro campo que se llame así?
Si no lo tienes, lo normal sería que te diera otro error, no el que sale.
Si cambiando eso no te funciona, mándame la base de datos por correo ([email protected]) con poquitos datos de prueba para que vea lo que ocurre.
Creo que tu dirección de correo no está bien escrita.
Efectivamente, mi nombre es Santiago y la dirección: [email protected]
Se me fueron los dedos. Disculpa.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas