Escribir en subformulario access

Respuesta de
a
Usuario
Hola, necesitaría su ayuda para lo siguiente.

Tengo un formulario con un subformulario dentro (en modo tabla). Me gustaría trasladar un campo del formulario a todos los registros que tengo el subformulario.

En realidad es pasar el "IdFactura" del formulario "pedido" a cada una de las líneas del subformulario "LineasPedido".

Gracias.
Avatar
Experto
Hola!

Hasta donde yo sé, debes estar trabajando en modo formulario para poder aplicar el código VBA, pues no es posible aplicar ejecución de código directamente sobre una tabla.

A no ser que haya alguien que sepa más que yo, no puedo decirte cómo resolver el problema, si no quieres trabajar con formularios.

Otra cosa es utilizar un código para rellenar los datos del "subformulario", pero una vez cerrada la tabla (y necesitarás un formulario que te haga las veces de "control" para ejecutar el código). Pero en ese caso la cosa es ligeramente complicada y necesitaras un identificador único que relacione el campo de la tabla con los registros de la tabla que te aparece como subformulario.

Ya me dirás.

Un saludo,

... http://neckkito.eu5.org ...
Usuario
Disculpa por no haber podido contestar antes, ya que quería comprobar lo que me decías y no he podido hasta hoy.

La verdad que sí que puedo escribir mediante código, pero únicamente puedo escribir en el primero de los registros que tiene el subformulario (esto he podido hacerlo tanto en modo tabla como en modo formulario).

Te indico el código que tengo puesto en el botón:

Forms!PV.[SubformPV].Form.IdFactura = Me.ProxFactura

El problema es que este código sólo traspasa el valor al primer registro del subformulario, no a todos, que es lo que yo necesito.

He intentado subir también una captura de mi formulario con el subformulario y los dos campos en cuestión para que se vea mejor, pero no he podido o no se hacerlo.

Espero haberme explicado bien.
Avatar
Experto
Hola!

Efectivamente puedes escribir código. Mi confusión es que cuando dices "en modo tabla" yo pienso en trabajar sobre la tabla directamente. Cuando hablamos de formularios se suele utilizar la expresión "en vista hoja de datos". Pero bueno... pequeños ·"tecnicismos" insignificantes... je, je..

Vamos a ver... Lo cierto es que sigo un poco "a ciegas" con lo que me explicas, pero te voy a proponer un sistema, que espero que funcione, para los nuevos registros que des de alta en el subformulario:

1.- Abre el subformulario (no el formulario) en vista diseño y saca sus propiedades

2.- Te vas a la pestaña "Al activar registro" y le generas el siguiente código:

...

Private Sub...
    Dim vProxFra as variant
    vProxFra = Forms!PV.ProxFactura
        'Si no hubiera valor en campo ProxFacutura del formulario PV
'sale del proceso sin hacer nada
    If isnull(vProxFra) then exit sub
        'Aplicamos el valor de ProxFactura al campo correspondiente
        'del subformulario
    Me.IdFactura.value=vProxFra
End Sub

...

Evidentemente tendrás que eliminar el código que tienes escrito en el botón, que de hecho, si la cosa te funciona, podrías eliminar dicho botón. Te aconsejo que hagas la prueba en una copia de tu BD, por si no es lo que esperabas.

Ahora, en teoría, cada vez que añadas una línea en el subformulario debería "copiarte" en el campo [IdFra] el número de factura correspondiente.

Ya me dirás qué tal.

Un saludo,

Neckkito
Usuario
Gracias por tu esfuerzo, pero necesito el botón.

El botón lo uso para facturar un pedido, y en ese mismo momento de pulsar el botón escribir en el subformulario de detalle el valor de la próxima factura y crear la factura.

¿No se puede hacer un bucle en código o algo así que recorra todos los registros del subformulario escribiendo el valor del campo "IdFactura" en todos ellos?

¿Cabría la opción de modificarlo en la tabla directamente en vez de en el subformulario? Cada línea del subformulario está identificada por un campo "IdPedido". Igual se podría escribir directamente en la tabla todos los registros cuyo "IdPedido" sea igual al "IdPedido" de mi formulario.

Siento de veras ser pesado, pero este es el único escoyo que tengo para tener el sistema operativo y no encuentro por ningún sitio información al respecto.
Avatar
Experto
Hola!

La verdad es que "odio" tener que dar una solución sin ver en mi "coco" toda la situación global, pero voy a confiar en lo que comentas y te voy a explicar el código que deberías asignar al botón para crear ese bucle que comentas. El código en sí funciona, pero no sé si habrá alguna característica de tu BD que lo hará fallar... ¿Qué es la vida sin riesgo? Je, je...

Voy a suponer que la tabla donde tienes los registros del subformulario se llama TPedidos. Tú debes sustituir ese nombre por el de tu BD

El código es el siguiente (te lo pongo comentado para que sepas lo que hace cada cosa):

...

Private Sub...
        'Esta línea es para guardar el registro, por precaución
docmd.runcommand accmdSaveRecord
        'Creamos el recordset y la consulta de filtro
    Dim rst as recordset
    Dim miSql as string
        'Definimos la consulta con el filtro
    Dim vId as long
    vId=me.IdPedido.value
    miSql = "SELECT TPedidos.IdPedido, TPedidos.IdFactura FROM TPedidos"
    miSql = miSql & " WHERE TPedidos.IdPedido=" & vId
        'Cogemos el valor que hay que asignar
    Dim vFra as variant 'variant porque no sé qué tipo de campo es
    vFra = me.ProxFactura.value
        'Definimos el recordset
    Set rst=currentdb.openrecordset(miSql)
        'Recorremos el recordset aplicando los nuevos valores
    rst.movefirst
    Do until rst.EOF
        With rst
            .Edit
            .Fields(1).value=vFra
            .Update
        End with
            'Nos movemos al siguiente registro
        rst.movenext
    Loop
End Sub

...

Ya me dirás si te ha funcionado.

Un saludo,

Neckkito