Bloque de registros

¿Es posible definir en un reporte el numero de registros que deben aparecer aunque existan registros vacíos? El problema es que necesito que aparezcan en un reporte 19 registros a pesar que haya por ejemplo solo 2 completos (por lo menos que se vean las filas vacías), y ya se sabe que Access solo muestra registros cuando hay algo escrito.
Hay alguna forma de hacerlo con programación, ¿contando los registros que encuentra y si son menores a 19 mandar a escribir la diferencia pero en blanco?
Bueno, esperando tu respuesta.
Muchos saludos
Irene

2 Respuestas

Respuesta
1
Estimada Irene:
En programación todo es posible, puede ser más o menos difícil, pero nunca imposible.
Para solucionar tu problema, debes recurrir a VBA en el informe.
Situate en las propiedades del informe. Abre las propiedades de este e inserta algo parecido a este código:
Aux=Tablaparainforme()
Esta código ejecuta una función que te expongo posteriormente.
En el origen de datos del informe debes seleccionar una tabla temporal que vamos a generar con la función indicada y que yo he llamado CLIENTES TMP en mi ejemplo.
La función que genera esta tabla es la que expongo a continuación:
Public Function Crear_Tablaparainforme()
Dim sql As String, Num
Dim T_TAB As Recordset
Dim DB As Database
Set DB = CurrentDb()
sql = "SELECT Clientes.IdCliente, Clientes.NombreCliente INTO [CLIENTES TMP]"
sql = sql & " FROM Clientes"
DoCmd.SetWarnings False
DoCmd.RunSQL sql
DoCmd.SetWarnings True
Set T_TAB = DB.OpenRecordset("CLIENTES TMP")
If T_TAB.RecordCount < 19 Then
Dim i
Num = T_TAB.RecordCount + 1
For i = Num To 19
T_TAB.AddNew
T_TAB!IdCliente = i
T_TAB!NombreCliente = "sd"
T_TAB.Update
Num = Num + 1
Next
End If
End Function
En esta función, como podras observar, se crean unas variables como:
Dim sql As String, Num
Dim T_TAB As Recordset
Dim DB As Database
La primera variable es para ejecutar una sentencia de sql, la segunda es una variable para un contador, la tercera para abrir un recordset, y la cuarta para abrir la base de datos.
Set DB = CurrentDb()
Con set seleccionamos la base de datos actual.
sql = "SELECT Clientes.IdCliente, Clientes.NombreCliente INTO [CLIENTES TMP]"
sql = sql & " FROM Clientes"
Esta sql es una sentencia que va a crear una tabla temporal 'CLIENTES TMP' a partir de una tabla de clientes existentes.
DoCmd.SetWarnings False
DoCmd.RunSQL sql
DoCmd.SetWarnings True
Estos comandos ejecutan la consulta.
Set T_TAB = DB.OpenRecordset("CLIENTES TMP")
Con Set T_TAB Seleccionamos la nueva tabla temporal
If T_TAB.RecordCount < 19 Then
Si los registros de esa tabla son menos de 19 que son los que necesitamos para nuestro informe...
Dim i
Creamos una variable i para hacer un bucle.
Num = T_TAB.RecordCount + 1
Damos valor a la variable num, asignándole el primer numero de registro que debe añadir a la tabla temporal a partir del número de registros que tenemos actualmente.
For i = Num To 19
Desde ese registro, hasta un total de 19 vamos a realizar un bucle.
T_TAB.AddNew
T_TAB!IdCliente = i
T_TAB!NombreCliente = "sd"
T_TAB.Update
Añadimos un registro nuevo a la tabla temporal, cuyo identificador IdCliente es el valor de i y el nombrede cliente un valor sin identificar que llamamos 'sd'.
Num = Num + 1
Sumamos 1 al numerador del bucle.
Next
vamos al siguiente paso para crear un nuevo registro, hasta un total de 19.
End If
End Function
Fin de la función.
De esta forma hemos creado 19 registros en la tabla temporal, que serán mostrados en el informe.
Espero que esta información te sirva, ya que controlar el formato del informe, es algo más complicado.
No obstante, si lo que necesitas es crear espacios, puedes probar a mover las secciones para conseguir las dimensiones oportunas.
En cualquier caso, si no logras dar con la solución, vuelve a escribirme y amplia tu consulta, tanto como sea posible, aportando más datos.
Hola Sófocles,
Estoy sumamente agradecida por tu e-mail, fue muy explicativo y entendible, gracias por las explicaciones que das sobre el código, un millón de gracias por tu ayuda y el interés :)
He tratado de adaptar el código a mi sistema pero no me esta funcionando, en mi caso, estoy trabajando con Sub Reportes, así que quizás tiene algo que ver con esto.
Algo que no entendí muy bien es que me dices que en el origen de datos tengo que poner la Tabla Temp que se crea con el código, esto me imagino que tiene que ser en el Controlsource del mi subreporte, que es donde se muestran mis registros, ¿pero cómo voy a tomar los datos reales que están almacenadas en mi tabla que se llama "Comments"? ¿Los toma con el sql de la función?
La funcion va justamente después de "Aux=Tablaparainforme, no?
Estoy haciendo un sistema para el manejo de los reportes de gastos. En el reporte tengo un subreporte con los detalles de los gastos ocurridos en cada fecha, cuyo origen es "Commens", pero en este subreporte existen dos subforms, pues tengo que tomar información no solamente de la tabla "Comments", sino también de "Bussiness" y OtherExpenses", esto es porque existe una separación para llenar los diferentes tipos de gastos de la empresa.
En el sql seleccione todos los campos que utilizo en el subreporte, supongo que esta bien.
Otra cosa, cuando defino DB as Database, VB no me propone entre sus opciones de tipo de datos el tipo "Database", tengo que escribirlo.
Bueno, espero tu respuesta, gracias de nuevo!
Un abrazo
Irene
Estimada Irene:
Voy a intentar responder en el orden que me preguntas.
Sobre el origen del registro (controlsource), efectivamente la tabla temporal tiene que formar parte de la consulta que alimente ese informe.
Para tomar los datos reales que están almacenadas en tu tabla que Comments tienes que realizar una función que te genere los 19 registros, o crear el espacio en el informe y mantener la estructura de la sql que alimenta el informe.
Si utilizas la función, esta debe ir justamente antes de seleccionar los datos con la sql, para que la tabla temporal se genere antes de que tomes los registros que en ella se han creado.
Supongo que esto aclarará un poco más el método que te planteaba.
Sobre el proyecto que llevas a cabo para el manejo de los gastos, creo que lo más conveniente es que me envíes una copia de lo que tienes hecho, si no es muy comprometido, y así podre evaluar mejor la estructura que necesitas para ese informe, que a mi entender tiene un cierto grado de complejidad.
Puedes mandármelo a: [email protected]
Comprueba la existencia de virus, ya que mi sistema bloquea los ficheros adjuntos que considera inseguros.
De esta forma, a vuelta de correo, podré ofrecerte mi ayuda en toda su extensión, ya que de otra forma lo único que vamos a hacer es perder el tiempo que es lo más valioso que tenemos.
Por ultimo, sobre tu pregunta sobre la definición de DB, posiblemente te falte referenciar en las librerías la correspondiente a ADO. Para incluirla o comprobar si existe, abre el código y en herramientas referencias comprueba la existencia de Microsoft DAO 3.6 Object Library, o la versión que corresponda.
Si lo tienes bien, no te preocupes por escribirlo, que te funcionará apropiadamente.
Respuesta

A Block of records is a method of tracking multiple items in a spreadsheet or database. In the context of healthcare, it is used to track clinical trial data, drug manufacturing history and quality control information. It may also be used to track other types of data that are relevant to the research, manufacturing and quality control processes within a company. A Block of records is a method of tracking multiple items in a spreadsheet or database. In the context of healthcare, it is used to track clinical trial data, drug manufacturing history and quality control information. It may also be used to track other types of data that are relevant to the research, manufacturing and quality control processes within a company.  1v1 lol

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas