Cambiar origen de datos en controles de Formulario

amig@s,

Tengo un formulario F donde veo los registros de una tabla T. Estoy intentando cambiar el origen de datos del formulario al pulsar un botón CmdAlta, de modo que tras pulsarlo, se visualice un nuevo Registro (DoCmd. GoToRecord,, acNewRec) pero los cuadros de texto (donde antes veía los registros de T), se conviertan en controles independientes. Lo he intentado con RecordSource pero no me funciona y desconozco si es factible.

¿Cómo podría hacerlo?

1 Respuesta

Respuesta
1

Tu consulta no tiene mucho sentido para mí. Si estamos hablando de registros es porque hay una tabla origen del registro.

Desde el momento que quieres que cambien los controles a controles independientes, quitándole el origen del registro al formulario, ya no estamos hablando de "ir a un nuevo registro", sino que estamos hablando de un formulario independiente.

Lo que pides sí se puede hacer, pero, sinceramente, no le veo la utilidad. Deberías realizar dos operaciones:

Primera, quitarle el origen al formulario

Segunda, quitarle el origen a los campos (controles) del formulario

El código sería así:

...

Private Sub...

docmd.runcommand accmdrecordsgotonew 'Para ir a un nuevo registro

me.recordsource="" 'Quita el origen del formulario

me.control1.controlsource="" 'Quita el origen del control

me.control2.controlsource="" 'Etc.

End sub

...

Hola,

ante todo gracias por la colaboración prestada.

Creo que como bien dices, lo que planteo no es lo más acertado, y la solución que me indicas (a mi enfoque erróneo) no resuelve mi problema. Intentaré explicar la idea de mi planteamiento:

El botón CmdAlta me muestra en el formulario un registro único, inicialmente en blanco, producto de un DoCmd.GoToRecord , , acNewRec. Desde que escriba algo en ese registroX, se muestra vacío el siguiente registro como es lógico, pero el asunto está en que al salir del registroX, Access guarda en la Tabla T su contenido.

El objetivo que busco es que "sólo se guarde el registroX en T cuando únicamente pulse otro botón, CmdGuardar". ¿Cómo evitar que al cambiar de registro, Access guarde el anterior?

Mi idea, como te comenté, era hacer el registroX independiente sólo tras pulsar CmdAlta, y que luego, tras guardarlo con CmdGuardar, volviera a retomar el origen de datos de la tabla T. El hecho de "intentar" convertirlo en independiente era, si cabe, para evitar el cambio de registro.

En resumen, el asunto está en que desde que saque el foco del registroX, éste se guarda en T (lógicamente) y la idea es que no lo haga hasta que pulse el botón CmdGuardar.

Espero haberme explicado y a ver si puedes echarme un cable.

Muchas gracias nuevamente.

Empezaré con las malas noticias... Lo que quieres hacer, hasta donde yo sé, es imposible. Access, de manera predeterminada, guarda automáticamente el registro (es decir, la información que has escrito). Eso tiene sus ventajas (como que no debes preocuparte de guardar el registro) y sus inconvenientes (según qué uso quieras darle a la información). En definitiva, que una vez escribes la información queda guardada (salvo que hagas un "undo"), tengas o no tengas botón de guardar registro, ya cierres el formulario, ya cambies de registro o vayas a uno nuevo.

Las buenas noticias: se puede crear un sistema para "simular" lo que quieres. Sin embargo, el sistema no es perfecto: por ejemplo, los autonuméricos podrían jugarte una mala pasada. Y, si estableces relaciones en base a un autonumérico, podría suceder que la información no te quedara correctamente relacionada.

En pocas palabras, que el "parche" sería para la introducción de información relativamente "simple" (resumiendo, si lo quieres aplicar se debe testear para comprobar que funciona todo bien).

Otro inconveniente es que lo que en teoría es más que simple (una tabla y sobre ella un formulario, y ya funciona) se complica un poco, y hay un poco de "trabajillo". Y si el formulario tiene un origen en varias tablas (a través de SQL) yo no te lo recomiendo en absoluto.

Te lo explico a grandes rasgos para un sistema sencillo:

- Supongamos que tu tabla se llama TDatos. Lo que hacemos es copiar esa tabla y pegarla (sólo estructura) como TDatosTmp (Ojo con los autonuméricos!). A esa tabla le añades un checkbox, con valor predeterminado "NO", y de nombre, por ejemplo, [Guardado]

- El formulario que se crea se basa en la tabla TDatosTmp.

- Rellenas el primer registro. Si le das al botón "Guardar" lo que haría el botón es cambiar el valor de [Guardado] a True. (Evidentemente, si no lo guardas -o te olvidas de guardarlo- el check seguirá siendo False)

- Vas rellenando así el resto de registros.

¿Cuál sería la operativa a nivel de eventos y código? En general, sería la siguiente:

- En el evento "Al abrir el formulario" debería ejecutarse una SQL que borrara todos los registros de TDatosTmp.

- En el evento "Al cerrar" del formulario debería ejecutarse una SQL (o un objeto consulta) que te anexara, a TDatos, todos los registros de TDatosTmp, teniendo en cuenta que dicha consulta estaría filtrada por todos aquellos checks cuyo valor es True (es decir, los registros que has dicho explícitamente que se guarden).

De esta manera, como podrás intuir, aquellos registros que sí has dicho que se guarden pasarían a la tabla principal, mientras que aquellos que no has querido guardar se perderían.

Espero que más o menos hayas podido entender la mecánica del funcionamiento. Y, como te comentaba antes, deberías testearla a fondo antes de darla por buena por si surge algún problema de pérdida de registros que sí deberían haberse guardado. Si algo va mal es porque en alguna parte nos hemos equivocado.

Un saludo,

Neckkito

Hola buenas,

muchas gracias por la idea aportada.

Realmente el planteamiento que propones no es malo, de hecho algo semejante ya he usado en algún que otro formulario, basándome en tablas temporales y sobre todo mediante el apoyo del checkbox para el guardado del registro. Sin embargo, no creo posible implementarlo en el esquema que tengo, no ya por los posibles contras (autonuméricos, dependencia a varias tablas,...) que se podrían controlar (incluso bajo mi esquema creo que estarían exentos), sino más bien, porque necesito visualizar los registros guardados de T (con aplicación de filtros mediante cuadros combinados y demás, ...) y tan sólo si se pulsa el botón CmdAlta es cuando "desaparece todo" y sólo debe visualizarse el registro nuevo (que lógicamente dependerá de T).

Si ese registro nuevo tuviera origen de datos en la tabla temporal, en principio no podría visualizar desde el mismo formulario los registros de T.

Bueno creo que tendría que darle un repaso al asunto, pero se me han ocurrido algunas propuestas que podrían servirme:

1.- una sería el uso de controles independientes y ocultos en el formulario F, de modo que al pulsar el botón CmdAlta, se oculten los registros con origen en T y se visualicen los independientes (controlando los momentos de visibilidad de cada cual).

2.- La otra opción podría pasar por hacer el formulario F de lectura, y mediante el uso de un subformulario independiente y algún que otro checkbox que sirviera de trasiego de los datos entre F y el subformulario, agregar, tras pulsar CmdAlta, el contenido a la tabla T directamente (mediante SQL o como fuera).

De cualquier manera agradezco mucho tu planteamiento (me ha "abierto" las ideas).

Ggracias y un saludo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas