Esta solución completa y sencilla de Access le permite imprimir una o más etiquetas para uno o más registros.

    El artículo del mes pasado How to print one or more labels for a single Access record (Cómo imprimir una o más etiquetas para un único registro de Access) combina unos cuantos objetos para crear una solución de impresión sencilla que le permite elegir un registro e imprimir el número de etiquetas que especifique. Este mes te mostraré una solución similar que te permite imprimir una o más etiquetas para uno o más discos.

    Esta técnica es más compleja que la del mes pasado, pero también es más completa. Un formulario continuo acepta valores de entrada que representan el número de etiquetas que desea para uno, varios o incluso todos los registros. La solución de este mes puede encargarse de todo: la impresión de uno o más sellos para uno o más discos.

    Estoy usando Access 2019 en un sistema Windows 10 de 64 bits, pero los objetos y el código se ejecutarán en versiones anteriores hasta 2003. Para su comodidad, puede descargar los archivos de ejemplo.accdb,.mdb y.cls. (Ambas bases de datos también contienen el formulario de registro único del mes pasado.) Esta base de datos no es apropiada para Access Web Apps o Access Web Services. Este artículo asume que usted sabe cómo crear una tabla y usar asistentes para crear formularios e informes.

    Más información sobre Office

    Los componentes

    La solución requiere los siguientes componentes:

    • Una tabla permanente de datos que puede querer imprimir en las etiquetas
    • Una tabla temporal que almacena sólo los registros que desea imprimir
    • Una forma continua
    • Un informe de etiqueta
    • Dos procedimientos de VBA

    Vamos a generar los componentes necesarios y luego pasaremos por un par de ejemplos.

    Romper una regla

    Es importante señalar que esta solución rompe las reglas de normalización al añadir un campo que no soporta directamente la entidad de la tabla permanente. El ejemplo utiliza la tabla Customers de la base de datos Northwind. Añadiremos un campo a esta tabla y lo usaremos para almacenar temporalmente el número de etiquetas a imprimir para un registro. Para ello, su primer paso es abrir la tabla Customers en la vista Design y añadir un campo NumberOfLabels, como se muestra en la . Las propiedades por defecto están bien. Grabe la modificación y cierre la tabla. (No es necesario un valor predeterminado.)

    El nuevo campo almacena el número de etiquetas.

    La desnormización de la mesa evita un problema inherente a los formularios continuos: Un control no encuadernado almacena el mismo valor para cada registro. Al trabajar con un control de formulario que está vinculado a la mesa, se evita mucho trabajo. En mi opinión, el intercambio vale la pena. Después de ejecutar el informe de etiquetas, el código elimina los valores de entrada almacenados en la tabla, por lo que los valores desnormalizados son siempre temporales.

    Crear la tabla temporal

    La tabla temporal se basa en Clientes. Debe contener los campos necesarios para las etiquetas, pero no los datos. Cree la tabla temporal manualmente o copie la tabla Clientes como se indica a continuación:

    1. Haga clic con el botón derecho en Clientes en el panel de navegación y seleccione Copiar.
    2. Haga clic con el botón derecho del ratón en el panel de navegación y seleccione Pegar.
    3. Introduzca el nombre Clientes temporales.
    4. Seleccione la opción Sólo estructura .
    5. Haga clic en Aceptar.

    Cree una tabla temporal basada en la tabla Clientes.

    Si copia la tabla Clientes, abra la copia en la vista Diseño y elimine la clave primaria. Además, asegúrese de que no se requiere ningún campo y elimine cualquier índice único. Estas propiedades de tabla generarán errores cuando la solución intente duplicar registros. No se preocupe si la tabla temporal contiene campos que no necesita para el informe de etiquetas. Puedes borrarlos, pero son inofensivos.

    Crear el informe de etiquetas

    A continuación, utilice el Asistente de informes de etiquetas para generar un informe sobre clientes temporales. Añada los siguientes campos: Nombre de la empresa, dirección, ciudad, región, código postal y país (. En Access 2019, el asistente se encuentra en el grupo Informes en la ficha Crear.

    En Access 2003, utilice el Asistente de informes.

    Base un informe de etiqueta en la tabla temporal.

    Crear el formulario continuo

    La figura D muestra un formulario continuo basado en la tabla Clientes. Utilice el asistente Múltiples elementos (Más formularios en el grupo Formularios en la ficha Crear. En versiones anteriores, Access utiliza el término continuo, no Múltiples Elementos.

    Utilice este formulario continuo para especificar el número de etiquetas de cada empresa.

    Con el formulario de la vista Diseño, elimine los controles externos y cambie el tamaño de los restantes si es necesario. Si utiliza una versión de cinta, puede desactivar la propiedad Remove Layout (Eliminar diseño) predeterminada para que funcione con los controles de forma individual, como se indica a continuación:

    1. Haga clic en la ficha Organizar.
    2. En el grupo Tabla, haga clic en Eliminar diseño.

      El formulario no necesita mostrar los mismos datos que desea imprimir. Sólo necesita los valores necesarios para identificar y filtrar los registros. Por ejemplo, el formulario no muestra la dirección porque probablemente no la necesite para determinar si desea imprimir la etiqueta. Confiarías en el nombre del cliente. Los otros campos contienen buenas opciones de filtrado. Discutiremos el filtrado más tarde.

      Agregue un botón de comando al encabezado del formulario, establezca su propiedad Caption en «Print Labels» y llámelo cmdPrintLabels. Luego, haga clic en el botón Ver código en el grupo Herramientas y agregue los procedimientos que se muestran en las listas A y B. Nota: No copie el código de esta página web; el Editor de Visual Basic (VBE) devolverá los errores porque no puede interpretar todos los caracteres web correctamente. En su lugar, descargue el archivo de demostración o importe el módulo de clase descargable.

      Listado A

      Formularios rellenados utilizando la tabla permanente de Clientes como fuente del registro del formulario. iTab Dim As IntegerDim lTotal As LongDim iLab As IntegerDim rstTable As ADODB.RecordsetSet rstTable = New ADODB.RecordsetOn Error GoTo errHandler'Save current record in case user forgets to hit enter.If Me.Dirty Then Me.Dirty = False'Filter form's recordset to remove records with 0 label value.Me.Filter = "NumberofLabels <> 0"Me.FilterOn = True' Debug.Print Me.Recordset.RecordCount'Get record count for first For loop below. Long es necesario.lTotal = Me.Recordset.RecordCount' Debug.Print lTotal'Close and delete records from Temporary Customers table.DoCmd.SetWarnings FalseDoCmd.Close acTable, "Temporary Customers"DoCmd.RunSQL "DELETE FROM[Temporary Customers]"DoCmd.SetWarnings True'Open recordset based on temporary customers table...'Need static cursor to support RecordCount property...''En la actualidad no es relevante, pero se puede considerar en el futuro.

      r

      stTable.open "[Temporary Customers]", CurrentProject.Connection, _adOpenStatic, adLockPessimistic'Populate Temporary Customers tables for label report.'First For tracks the number of records in form recordset.'Second For tracks the number of labels for each record.With rstTableFor iTab = 1 To lTotal'Add multiple records for same record.'Second For inserts individual record multiple times.'. Debug.Print Me.NumberOfLabels.ValueFor iLab = 1 To Me.NumberOfLabels.Value.AddNew!CustomerID = Me.CustomerID!CompanyName = Me.CompanyName!Address = Me.Address!City = Me.City!Region = Me.Region!PostalCode = Me.PostalCode!Country = Me.Country.UpdateNext iLab'Move to next record in form.DoCmd.

      G

      oToRecord , , , acNextNext iTabEnd WithDoCmd.OpenReport "Customer Label Report", acViewPreviewrstTable.CloseSet rstTable = NothingMe.Filter = ""Exit SuberrHandler:MsgBox Err.Number & ": " & Err.Description, vbOKOnly, "Error"DoCmd.SetWarnings TruerstTable.CloseSet rstable = NothingMe.Filter = ""End SuberrHandler

      Listado B

      Private Sub Form_Close()'Quitar valores de etiquetas de entrada de la tabla subyacente, Customers.On Error GoTo errHandler'Close Customers table if open and then delete NumberOfLabels values.DoCmd.SetWarnings FalseDoCmd.Close acTable, "Customers"DoCmd.

      RunSQL «UPDATE Customers SET NumberOfLabels = NULL»DoCmd.SetWarnings TrueExit SuberrHandler:MsgBox Err.Number & «: » & Err.Description, vbOKOnly, «Error»End Suberr

      Antes de abandonar el VBE, asegúrese de que se hace referencia a la biblioteca ADO. En el menú Herramientas, seleccione Referencias y verifique que la última biblioteca de ADO esté marcada, como se muestra en la . Luego, regrese a Acceso, guarde el formulario y ciérrelo.

      Debe hacer referencia a una biblioteca de ADO.

      Utilice el formulario

      Ahora vamos a trabajar con dos ejemplos sencillos. Primero, imprimamos una etiqueta para Alfreds Futterkiste, tres etiquetas para Antonio Moreno Taquería, y dos para Bon app’ para un total de seis etiquetas. Abra el formulario continuo en la vista Formulario e introduzca los valores respectivos, como se muestra en la . Cuando esté listo para ejecutar el informe de etiquetas, haga clic en el botón Imprimir etiquetas. La figura G muestra el informe de la etiqueta resultante.

      Introduzca el número de valores para cada registro.

      El informe de etiquetas contiene el número apropiado de etiquetas para cada registro.

      En este punto, puede imprimir las etiquetas o no. Al cerrar el informe de etiquetas, Access vuelve al formulario continuo con los valores de entrada todavía intactos. Puede actualizar esos valores o cerrar el formulario. El código en el evento Cerrar del formulario (Listado B) reajusta el campo NumberOfLabels para cada registro en Clientes a Nulo.

      El código del botón es más simple de lo que parece. En primer lugar, el código guarda el formulario para asegurarse de que el último valor de etiqueta introducido llegue al informe de etiqueta. A continuación, la aplicación de un filtro simple elimina los registros sin marcar. Dos sentencias SQL cierran Clientes temporales (para evitar un error si está abierto) y eliminan registros de la tarea de impresión anterior.

      Los dos Loops For copian los registros restantes a los Clientes Temporales. El primer bucle rastrea el número de registros en el conjunto de registros filtrado. El segundo bucle rastrea el número de etiquetas que desea para los registros individuales. Si desea tres etiquetas, el segundo bucle inserta el registro actual en la tabla temporal tres veces.

      Después de completar los dos ciclos, la tabla temporal contiene los registros apropiados para completar el informe de la etiqueta: una etiqueta para Alfreds Futterkiste, tres para Antonio Moreno Taquería, y dos para Bon app’. Finalmente, el código abre el informe de etiqueta, destruye el conjunto de registros y restaura el filtro del formulario a cero.

      Si el formulario y el informe están abiertos, ciérrelos para trabajar con un ejemplo de filtrado. Vuelva a abrir el formulario y utilice el filtro de selección incorporado para limitar los registros a México, como se indica a continuación:

      1. Haga doble clic dentro de cualquier campo País que contenga México.
      2. En el grupo Sort & Filter (en la pestaña Inicio) seleccione Equals «Mexico» en el menú desplegable de la opción Selection .


        Utilice la opción Selección para filtrar los registros.

        Después de filtrar el registro, ingrese los siguientes valores de etiqueta: 2 para Ana Trujillo Emparedados y helados y 3 para Centro comercial Moctezuma () y haga clic en el botón Imprimir etiquetas. Al filtrar los registros utilizando datos naturales, puede limitar rápidamente el número de registros que necesita ver. Puede introducir fácilmente los valores sin filtrar, pero el filtrado puede hacer que su tarea sea más fácil. Puede filtrar por cualquier campo, pero filtrar antes de introducir

        valores de etiqueta.


        Filtrar los registros antes de introducir los valores de las etiquetas.

        Por tu cuenta

        Al aplicar esto a su propio trabajo, recuerde actualizar los nombres de los objetos (tablas, formularios, informes y campos) en consecuencia. Cuantos más timbres y silbatos añadas, más código necesitarás para acomodar esas mejoras. Además, el manejo de errores es básico; pruebe extensivamente para permitir respuestas personalizadas.

        Envíenme sus preguntas sobre Office

        Respondo a las preguntas de los lectores cuando puedo, pero no hay garantía. Cuando se ponga en contacto conmigo, sea lo más específico posible.

        Por ejemplo, «Please troubleshoot my workbook and fix what’s wrong» probablemente no obtendrá respuesta, pero «Can you tell me why this formula is’ t returning the expected results? Por favor, menciona la aplicación y la versión que estás usando. No envíe archivos a menos que se le solicite; las solicitudes iniciales de ayuda que lleguen con archivos adjuntos se eliminarán sin leer. ConsejoTecnologico.com no me reembolsa por mi tiempo o experiencia en ayudar a los lectores, ni tampoco pido una cuota a los lectores a los que ayudo. Puede ponerse en contacto conmigo en susansalesharkins@gmail.com.

        Lea también….