📘 Manual de Usuario — Uxmalia Pascal para Reportes

Desarrollado por Paudi — Programador informático y entusiasta de la tecnología. Instrumentista en el gobierno y apasionado por el desarrollo de software. ✨

🎯 ¿Qué es Uxmalia Pascal para Reportes?

Es un entorno de programación integrado en Uxmalia Tienda 25 que permite crear, personalizar e imprimir reportes contables, financieros, de inventario y ventas usando un lenguaje similar a Pascal estándar, con funciones propias para manejo de bases de datos Access, fechas, impresión y gráficos.

💡 Tip: Este manual está diseñado para usuarios que ya tienen experiencia con los reportes de Uxmalia. Si eres nuevo, comienza con la sección "Estructura Básica".

🧩 Estructura Básica de un Reporte

Todo reporte debe seguir esta estructura mínima:

{*******************************************************************************
Nombre del Reporte
Descripción breve
(C) Año - Empresa. URL
*******************************************************************************}
Pantalla; // Define que se mostrará en pantalla
Detalle(4, 27); // Área imprimible: margen izquierdo 4mm, alto 27cm

// === VARIABLES ===
VAR variable1, variable2: TIPO;

// === CONSTANTES ===
const _Desc = 'Título del Reporte';

// === FUNCIONES AUXILIARES ===
function NombreFuncion(param: TIPO): TIPO;
begin
// Código
Result := valor;
end;

// === PROCEDIMIENTOS ===
PROCEDURE NombreProcedimiento;
begin
// Código
end;

// --- INICIO DEL PROGRAMA ---
NuevoReporte(_Desc); // Inicia el reporte

// Tu lógica aquí: cálculos, SQL, impresión

Imprime; // ¡No olvides esta línea!
⚠️ Importante: La línea Imprime; es obligatoria. Sin ella, el reporte no se generará.

🧰 Funciones Básicas (Impresión y Formato)

ImpTexto(texto: STRING; x, y: FLOAT)

Imprime texto en coordenadas (x, y) en centímetros.

ImpTexto('Hola Mundo', 2.0, 5.0);

ImpTextoArt(texto: STRING; x, y: FLOAT; fuente: STRING; tamaño: INTEGER; negrita: BOOLEAN)

Imprime texto con formato (fuente, tamaño, negrita).

ImpTextoArt('Título', 2.0, 3.0, 'Arial', 12, si); // En negrita

ImpTextoColor(texto: STRING; x, y: FLOAT; color: INTEGER)

⚠️ En tu sistema, esta función puede no estar disponible. Se recomienda redefinirla así:

procedure ImpTextoColor(t: string; x, y, c: float);
begin
ImpTexto(t, x, y); // Ignora el color por compatibilidad
end;

ImpLinea(x1, y1, x2, y2, grosor: FLOAT)

Dibuja una línea entre dos puntos.

ImpLinea(1.0, 4.0, 19.0, 4.0, 0.2); // Línea horizontal

ImpCuadro(x, y, ancho, alto, grosor: FLOAT)

Dibuja un rectángulo (solo borde).

ImpCuadro(1.0, 1.0, 19.0, 25.0, 0.3); // Marco del reporte

ImpCuadroColor(x, y, ancho, alto, grosor, color: FLOAT)

Dibuja un rectángulo con color de relleno.

ImpCuadroColor(2.0, 6.0, 1.0, 0.5, 1, 32768); // Verde

ImpImagenDesde(archivo: STRING; x, y, ancho: FLOAT)

Inserta una imagen (JPG, BMP, etc.).

ImpImagenDesde('LOGO.JPG', 1.0, 1.5, 10);

📊 Funciones de Fecha y Hora

Year, Month, Day: INTEGER

Devuelven el año, mes y día actuales del sistema.

ANIO := Year; // 2025
MES := Month; // 6
DIA := Day; // 24

ATFechaHoy: STRING

Devuelve la fecha actual en formato legible.

ImpTextoDer(ATFechaHoy, 17, 2.0); // "24/06/2025"

FechaSQL(anio, mes, dia: INTEGER): STRING

Formatea fecha para SQL: #MM/DD/YYYY#

FECHA_INI := FechaSQL(2025, 6, 1); // #06/01/2025#

DiasEnMes(mes, anio: INTEGER): INTEGER

Calcula días del mes (incluye años bisiestos).

dias := DiasEnMes(2, 2024); // 29

mess(mes: INTEGER): STRING

Devuelve nombre del mes en español.

nombre := mess(3); // "Marzo"

📚 Funciones de Base de Datos (SQL)

SQL: STRING

Asigna una consulta SQL para ejecutar.

RegComoFlotante(campo: STRING): FLOAT

Devuelve el valor del campo como número decimal.

SQL := 'SELECT SUM(TRA_TOTAL) AS TOTAL FROM TRANSACCIONES WHERE ...';
VENTAS := RegComoFlotante('TOTAL');

RegPrimero, RegSiguiente, RegEsUltimo

Para recorrer registros uno por uno (útil cuando hay múltiples filas).

RegPrimero;
while not RegEsUltimo do
begin
TOTAL := TOTAL + RegComoFlotante('CAMPO');
RegSiguiente;
end;

🧮 Funciones Matemáticas y de Texto

IntToStr(n: INTEGER): STRING

Convierte número entero a texto.

texto := IntToStr(123); // "123"

ATFloatToStr(f: FLOAT): STRING

Convierte número decimal a texto.

texto := ATFloatToStr(123.45); // "123.45"

ATDinero(texto: STRING; decimales: INTEGER): STRING

Formatea como moneda (con símbolo $, comas y decimales).

ImpTexto(ATDinero(ATFloatToStr(1500.5), 2), 5.0, 6.0); // "$1,500.50"

UxLeft(s: STRING; n: INTEGER): STRING

Extrae los primeros n caracteres de una cadena.

UxLeft('Factura001', 7); // "Factura"

UxRight(s: STRING; n: INTEGER): STRING

Extrae los últimos n caracteres de una cadena.

UxRight('20250624', 2); // "24"

Length(s: STRING): INTEGER

Devuelve la longitud (número de caracteres) de una cadena.

len := Length('Hola'); // 4

Copy(s: STRING; inicio, cantidad: INTEGER): STRING

Extrae una subcadena desde la posición inicio con cantidad de caracteres.

Copy('Hola Mundo', 1, 4); // "Hola"

📈 Funciones Avanzadas (Gráficas y Cálculos)

BarraHorizontal(x, y, valor, max_valor, ancho_max, alto: FLOAT)

Dibuja una barra horizontal proporcional al valor máximo. Ideal para gráficas comparativas.

BarraHorizontal(3.0, 6.0, VENTA_MES, MAX_VENTA, 12.0, 0.6, COLOR);

Ejemplo de uso en gráfica:

// Dibuja una barra horizontal
procedure BarraHorizontal(x, y, valor, max_valor, ancho_max, alto: FLOAT; color: INTEGER);
var ancho_barra: FLOAT;
begin
if max_valor > 0 then
ancho_barra := (valor / max_valor) * ancho_max
else
ancho_barra := 0;
ImpCuadroColor(x, y, ancho_barra, alto, 1, color);
end;

🖨️ Control de Impresión

NuevoReporte(titulo: STRING)

Inicia un nuevo reporte. ¡Obligatorio!

NuevoReporte('Reporte de Ventas');

Margen(cm: FLOAT)

Establece el margen izquierdo en centímetros.

Margen(1); // 1 cm de margen izquierdo

Imprime

¡OBLIGATORIO! Finaliza e imprime el reporte. Sin esta línea, no se genera nada.

Imprime;

NuevaPagina

Salta a una nueva página en el reporte.

NuevaPagina;

Arriba

Posiciona el cursor en la parte superior de la página actual.

Arriba;

🧪 Ejemplo Completo: Reporte de Ventas Diarias

{*******************************************************************************
Reporte: Ventas del Día
(C) 2025 Paudi Systems. https://paudi.work
*******************************************************************************}
Pantalla;
Detalle(4, 27);

VAR VENTAS: FLOAT;
VAR ANIO, MES, DIA: INTEGER;

function FechaSQL(anio, mes, dia: INTEGER): STRING;
begin
Result := '#' + UxRight('0' + IntToStr(mes), 2) + '/' +
UxRight('0' + IntToStr(dia), 2) + '/' +
IntToStr(anio) + '#';
end;

NuevoReporte('Ventas del Día');

ANIO := Year; MES := Month; DIA := Day;

SQL := 'SELECT SUM(TRA_TOTAL) AS TOTAL FROM TRANSACCIONES ' +
'WHERE TRA_FECHA = ' + FechaSQL(ANIO, MES, DIA) +
' AND TRA_TT LIKE "*Venta*"';
VENTAS := RegComoFlotante('TOTAL');

Margen(1);
ImpTextoArt('VENTAS DEL DÍA', 1.0, 2.0, 'Arial', 14, si);
ImpTexto('Fecha: ' + UxRight('0' + IntToStr(DIA), 2) + '/' +
UxRight('0' + IntToStr(MES), 2) + '/' + IntToStr(ANIO), 1.0, 3.0);
ImpTexto('Total: ' + ATDinero(ATFloatToStr(VENTAS), 2), 1.0, 4.0);

ImpLinea(0.8, 4.5, 19.0, 4.5, 0.2);

Imprime;

💡 Consejos y Buenas Prácticas

  • Siempre termina con Imprime; → Si no, no se genera el reporte.
  • Prueba primero con Pantalla; → Para ver resultados sin imprimir.
  • Usa ATDinero y ATFloatToStr → Para evitar errores de formato.
  • Valida si los totales son 0 → if Result = 0 then Result := 0;
  • Comenta tu código → Facilita mantenimiento futuro.
  • Usa NuevaPagina y Arriba → Para reportes largos o con gráficas separadas.
  • Prueba en diferentes periodos → Diario, semanal, mensual, para asegurar que las fechas se calculan correctamente.
🚀 Pro Tip: Guarda tus funciones auxiliares (como UxLeft, UxRight, FechaSQL) en un archivo base y cópialas en cada nuevo reporte. ¡Te ahorrarás mucho tiempo!

❓ ¿Dónde puedo aprender más?

  • Revisa los reportes ya creados en tu sistema (son tu mejor guía).
  • Experimenta modificando valores de posición (x, y) para ajustar diseño.
  • Siempre prueba en modo Pantalla antes de imprimir.
  • Visita https://paudi.work para más recursos y soporte.