Anónimo
Volcar array a un subformulario
Estoy intentando hacer el cálculo de mi nómina ya que a veces hay diferencias sobre la del mes anterior que no entiendo y quiero poder comprobarla yo mismo. Tengo un formulario en el que introduzco mi DNI y Fecha, y en base a estos datos y búsquedas en varias tablas voy calculando los importes de los conceptos. Todos estos datos los almaceno en una tabla auxiliar (array) que quiero volcar a un subformulario (independiente) pero no consigo más que me aparezcan todas las líneas en la primera del subformulario, y no genera un "registro/línea" por cada grupo de datos del array. He probado con:
Docmd. Gotorecord,, acnew
Me! Subformulario. Requery
Pero sigue haciendo lo mismo. ¿Cómo puedo hacerlo?
Docmd. Gotorecord,, acnew
Me! Subformulario. Requery
Pero sigue haciendo lo mismo. ¿Cómo puedo hacerlo?
1 respuesta
Respuesta de josecmf
1
1
josecmf, Access. Monopuesto y multipuesto. Más de 13 años de experiencia
Perdona, puedes explicarte un poco mejor, con más detalle, y nombres de ejemplo.
Si, lo que tengo es un Formulario principal "Nomina" que además tiene un Subformulario "Recibo" independiente (creado como un formulario más) cuyos datos son los típicos de un recibo de nómina: Cuantía, Precio, Concepto, Descrip. Concepto, Devengo (+) y Deducción (-). Al entrar en "Nomina" pido datos como un DNI, Año y Mes. A partir de aquí, cogiendo datos de diferentes Tablas de Access hago los cálculos del recibo de la nómina y los voy almacenando en un array: Tabreb(15, 11). El problema es que en el momento de volcar el array al Subformulario "Recibo" para presentar el resultado:
Tabreb(índice, 1), Tabreb(índice, 2), ...
Tabreb(índice+1, 1) ... etc.
No me aparecen. To lo que consigo es presentar los datos en la primera línea del Subformulario. Va sobrescribiendo los anteriores y no se ve nada. No se genera una línea o registro en el Subformulario por cada grupo del array Tabreb(índice, de 1 a11). Lo que uso es:
while índice <= 15
Recibo![Cuantia] = Tabreb(índice, 1)
Recibo![Precio] = Tabreb(índice, 2), etc....
índice= índice + 1
Wend
DoCmd.RunCommand acCmdRecordsGoToNew
Me![Recibo].Requery
He probado de todas la maneras pero el subformulario no genera ni una línea más que la primera y única. Si me puedes ayudar te lo agradezco ya que después de todos los cálculos solo me queda esa parte.
De cualquier manera, muchas Gracias.
Tabreb(índice, 1), Tabreb(índice, 2), ...
Tabreb(índice+1, 1) ... etc.
No me aparecen. To lo que consigo es presentar los datos en la primera línea del Subformulario. Va sobrescribiendo los anteriores y no se ve nada. No se genera una línea o registro en el Subformulario por cada grupo del array Tabreb(índice, de 1 a11). Lo que uso es:
while índice <= 15
Recibo![Cuantia] = Tabreb(índice, 1)
Recibo![Precio] = Tabreb(índice, 2), etc....
índice= índice + 1
Wend
DoCmd.RunCommand acCmdRecordsGoToNew
Me![Recibo].Requery
He probado de todas la maneras pero el subformulario no genera ni una línea más que la primera y única. Si me puedes ayudar te lo agradezco ya que después de todos los cálculos solo me queda esa parte.
De cualquier manera, muchas Gracias.
El código que me dices se genera con un botos que pertenece al Subformulario, ¿verdad?
Si es así, prueba a añadir, después del buble While... Wend
Me.Update
Me. Addnew
Y quita el DoCmd. Y el Requery.
Este ultimo lo pones al final.
Si es así, prueba a añadir, después del buble While... Wend
Me.Update
Me. Addnew
Y quita el DoCmd. Y el Requery.
Este ultimo lo pones al final.
Gracias. Estoy leyendo el correo desde el curro. Lo pruebo en casa y te cuento.
Muchas Gracias.
Muchas Gracias.
Hola. No, no uso botones desde el subformulario, una vez que se han introducido el Año y el Mes desde un evento del Mes (Al Salir) llamo a un procedimiento desde el que hago todo. Llamo a otros procedimientos para cargar datos de tablas, etc. y al final cuando tengo los datos en el Array(15, 11) la idea era pasarlos directamente a cada uno de los campos en el ciclo que te comenté. Probé ayer y añadí lo que me dijiste pero al compilar me daba error "No se encontró el método o el dato miembro", luego lo puse como:
While índice<= 14
Recibo![Cuantia] = Tabreb(índice, 1)
Recibo![Precio] = Tabreb(índice, 2) .........
índice= índice+ 1
Wend
Me![Recibo].Form.Update
Me![Recibo].Form.AddNew
Me![Recibo].Form.Requery
Y me deja compilar pero me da un error "No se puede asignar un valor a este objeto", por los campos del Subformulario y eliminé de estos el "Origen de Control" y ya no me da error pero no sale ni la primera línea. En realidad, antes de este último error probé poniendo Me.[Recibo]. Update y Me.[Recibo]. Addnew pero me daba otro error "Error definido por la aplicación o el objeto" que según la ayuda viene a decir que el error no está codificado entre los errores de Visual Basic. Antes lo intenté con Split y Join pero no hay manera de engañar a RecordSource. No sé cuál es el disparador de los subformualrios para generar líneas/registros ¿un retorno de carro? ¿Alguna comprobación entre las tablas de la Base de Datos?
Bueno, si tienes alguna idea, ya me dirás.
Gracias.
While índice<= 14
Recibo![Cuantia] = Tabreb(índice, 1)
Recibo![Precio] = Tabreb(índice, 2) .........
índice= índice+ 1
Wend
Me![Recibo].Form.Update
Me![Recibo].Form.AddNew
Me![Recibo].Form.Requery
Y me deja compilar pero me da un error "No se puede asignar un valor a este objeto", por los campos del Subformulario y eliminé de estos el "Origen de Control" y ya no me da error pero no sale ni la primera línea. En realidad, antes de este último error probé poniendo Me.[Recibo]. Update y Me.[Recibo]. Addnew pero me daba otro error "Error definido por la aplicación o el objeto" que según la ayuda viene a decir que el error no está codificado entre los errores de Visual Basic. Antes lo intenté con Split y Join pero no hay manera de engañar a RecordSource. No sé cuál es el disparador de los subformualrios para generar líneas/registros ¿un retorno de carro? ¿Alguna comprobación entre las tablas de la Base de Datos?
Bueno, si tienes alguna idea, ya me dirás.
Gracias.
¿Y si en vez de hacerlo así pruebas a ejecutar una consulta de anexar datos?
Imaginando que la tabla origen de datos del subformulario recibo es: OrigenRecibo
El código que tendrías que introducir podría ser:
'Fuera del bucle While Wend
Dim strSQL as String
'DEntro del bucle
strSQL="INSERT INTO OrigenRecibo ( Campo1, Campo2,..., CampoN ) SELECT " & _
Tabreb(indice, 1) & " AS Expr1, " & _
Tabreb(indice, 2) & " AS Expr2, " & _
Tabreb(indice, 3) & " AS Expr3, " & _
....
Tabreb(indice, n) & " AS ExprN; "
DoCmd. RunSQL
Cada una de estas ejecuciones de SQL inserta una fila en la tabla origen del formulario. Al final de todo esto, fuera del bucle, puedes poner:
Me. Recordset. Requery
Para que te actualice los valores.
Imaginando que la tabla origen de datos del subformulario recibo es: OrigenRecibo
El código que tendrías que introducir podría ser:
'Fuera del bucle While Wend
Dim strSQL as String
'DEntro del bucle
strSQL="INSERT INTO OrigenRecibo ( Campo1, Campo2,..., CampoN ) SELECT " & _
Tabreb(indice, 1) & " AS Expr1, " & _
Tabreb(indice, 2) & " AS Expr2, " & _
Tabreb(indice, 3) & " AS Expr3, " & _
....
Tabreb(indice, n) & " AS ExprN; "
DoCmd. RunSQL
Cada una de estas ejecuciones de SQL inserta una fila en la tabla origen del formulario. Al final de todo esto, fuera del bucle, puedes poner:
Me. Recordset. Requery
Para que te actualice los valores.
Aproximadamente es lo que tengo ahora. Estaba bloqueado por este tema y al final lo que hice fue crear una tabla Temporal con los campos que necesito mostrar y un procedimiento para insertar los datos en Temporal y saber si estaba haciendo bien los cálculos. Después simplemente con igualar:
Me!Recibo.RecordSource = "SELECT .... (los campos de la tabla temporal) " y añadiendo un Requery funciona muy bien. El problema es que hay que vaciar la tabla cada vez que se ejecuta el programa y aunque se puede automatizar con otro procedimiento haciendo ún "DELETE ...." no me parecía muy práctico. también un poco por cabezonada ya que me parece alucinante que microsoft dé por supuesto que a un Subformulario solo pueden llegar datos de una tabla de Base de Datos o de una consulta SQL. Me gustaría conseguir el efecto que te he contado, pero si con la solución que tengo ahora das el tema por terminado lo entiendo.
Gracias, ya me dirás.
Me!Recibo.RecordSource = "SELECT .... (los campos de la tabla temporal) " y añadiendo un Requery funciona muy bien. El problema es que hay que vaciar la tabla cada vez que se ejecuta el programa y aunque se puede automatizar con otro procedimiento haciendo ún "DELETE ...." no me parecía muy práctico. también un poco por cabezonada ya que me parece alucinante que microsoft dé por supuesto que a un Subformulario solo pueden llegar datos de una tabla de Base de Datos o de una consulta SQL. Me gustaría conseguir el efecto que te he contado, pero si con la solución que tengo ahora das el tema por terminado lo entiendo.
Gracias, ya me dirás.
Creo que el problema es de concepto, más que de incapacidad de access.
Los formularios propiamente no almacenan información, sino que lo hace la tabla a la que estén asociados. Esta es la solución que te proponía y la que has adoptado.
Hay una excepción y es cuando los controles son independientes. Ahí si pueden almacenar información sin estar vinculada a ninguna tabla. Y eso es lo que tu querías hacer.
Pero la equivocación es pensar que esos controles se pueden replicar tantas veces como tú quieras. Esos controles existen una vez si son independientes o se repiten tantas veces como registros haya en la tabla si están vinculados a un campo.
Pero si quieres varias filas de controles independientes, tendrás que crearlos. Es decir, has de tener el mismo array que tienes en memoria.
Los formularios propiamente no almacenan información, sino que lo hace la tabla a la que estén asociados. Esta es la solución que te proponía y la que has adoptado.
Hay una excepción y es cuando los controles son independientes. Ahí si pueden almacenar información sin estar vinculada a ninguna tabla. Y eso es lo que tu querías hacer.
Pero la equivocación es pensar que esos controles se pueden replicar tantas veces como tú quieras. Esos controles existen una vez si son independientes o se repiten tantas veces como registros haya en la tabla si están vinculados a un campo.
Pero si quieres varias filas de controles independientes, tendrás que crearlos. Es decir, has de tener el mismo array que tienes en memoria.
No me lo había planteado así, veía un Subformulario simplemente como un control que gestiona la navegación por un grupo de datos ("scroll" ) y que en principio dándole un determinado formato no debería tener más misterio, vengan los datos de donde vengan. De cualquier manera, antes de la solución que me proponías y que más o menos tengo, pensé en un array de controles para facilitar el manejo de los datos ya que la otra opción era hacerlo manualmente y me pareció que el cálculo de la nómina iba a ser lo de menos con lo complicado que pueda ser al tener presentar unas 14 o 15 líneas con 6 o 7 datos en cada línea, eso suponiendo que las líneas no superen las mostradas en pantalla.
¿Hay alguna manera de definir un array de controles para evitar tener que montar string's con los nombres de los campos por cada línea que quiera "generar"?.
¿Hay alguna manera de definir un array de controles para evitar tener que montar string's con los nombres de los campos por cada línea que quiera "generar"?.
Pues la verdad es que no lo he hecho nunca.
Te he buscado una pregunta en todoexpertos que te puede ayudar, pero antes de llevarme la "gloria" de algo que no es mío prefiero que lo veas allí y en su caso, que le preguntes a el.
http://www.todoexpertos.com/categorias/tecnologia-e-internet/bases-de-datos/microsoft-access/respuestas/1372467/crear-controles-en-ejecucion
Por lo que he visto, todo se basa en el método CREATECONTROL.
Te he buscado una pregunta en todoexpertos que te puede ayudar, pero antes de llevarme la "gloria" de algo que no es mío prefiero que lo veas allí y en su caso, que le preguntes a el.
http://www.todoexpertos.com/categorias/tecnologia-e-internet/bases-de-datos/microsoft-access/respuestas/1372467/crear-controles-en-ejecucion
Por lo que he visto, todo se basa en el método CREATECONTROL.
Todavía no he mirado el enlace que me dices pero seguiré por ahí. Me sirva o no, gracias por el interés, porque estaba bastante bloqueado y no sabía si me estaba tirando al monte con lo de la INSERT en la tabla temporal.
Muchas gracias otra vez por un TRABAJO desinteresado que no es muy habitual.
Un Saludo.
Muchas gracias otra vez por un TRABAJO desinteresado que no es muy habitual.
Un Saludo.
- Compartir respuesta
- Anónimo
ahora mismo