DMarlon Studio

Lección 20 · 20 de 20

Proyecto: la factura de una tienda · Pascal

Un pequeño proyecto en Pascal que reúne records, arrays, bucles, procedimientos y Format para imprimir la factura de una tienda de informática.

Pascal · Proyecto: la factura de una tienda en DMarlon Studio: el código del ejemplo y su salida en la terminal

Este programa junta lo visto en el curso. Cada línea de la factura es un record TLine con el producto, la cantidad y el precio, y la factura entera es un array constante de cuatro líneas, escritas con la forma (Product: 'Mouse'; Qty: 2; Price: 12.50).

VatRate es una constante con el 21 % de IVA: si cambia, se toca en un solo sitio. El procedimiento Row escribe cualquier fila de la factura, con un texto a la izquierda y un importe a la derecha, gracias a Format('%-26s%9.2f', ...); su parámetro caption es const.

El bucle `for line in Invoice` recorre las líneas una a una. Para cada una se prepara el texto con otro Format (producto, cantidad y precio) y se pasa a Row junto con el importe, line.Qty * line.Price, que también se va sumando en subtotal.

subtotal es una variable con valor inicial, Double = 0. Al terminar el bucle, tres llamadas a Row escriben el subtotal, el IVA y el total, todos alineados en la misma columna.

Es la misma lógica que hay detrás de una aplicación de escritorio con Lazarus, como la demo de Odoo sin conexión de DMarlon Studio: allí las líneas salen de una base de datos y se ven en una rejilla, pero las cuentas son las mismas. Para probar este programa, ábralo con el destino Consola y pulse F9.

Código · main.pas

program main;uses SysUtils;type  TLine = record    Product: String;    Qty: Integer;    Price: Double;  end;const  VatRate = 0.21;  Invoice: array[1..4] of TLine = (    (Product: 'Keyboard'; Qty: 1; Price: 24.90), (Product: 'Mouse'; Qty: 2; Price: 12.50),    (Product: 'USB cable'; Qty: 3; Price: 4.99), (Product: 'Monitor'; Qty: 1; Price: 139.00));procedure Row(const caption: String; amount: Double);begin  WriteLn(Format('%-26s%9.2f', [caption, amount]));end;var  line: TLine;  subtotal: Double = 0;begin  for line in Invoice do  begin    Row(Format('%-10s %2d x %6.2f', [line.Product, line.Qty, line.Price]), line.Qty * line.Price);    subtotal := subtotal + line.Qty * line.Price;  end;  Row('Subtotal', subtotal);  Row('VAT 21%', subtotal * VatRate);  Row('TOTAL', subtotal * (1 + VatRate));end.

Salida · fpc main.pas && ./main

Keyboard    1 x  24.90        24.90
Mouse       2 x  12.50        25.00
USB cable   3 x   4.99        14.97
Monitor     1 x 139.00       139.00
Subtotal                     203.87
VAT 21%                       42.81
TOTAL                        246.68

Para recordar

  • Un array de records guarda datos con forma de tabla.
  • Las constantes evitan repetir números como el IVA.
  • Un procedimiento con Format mantiene alineadas todas las filas.
  • for ... in recorre un array sin manejar índices.

Ejercicio

Aplique un 5 % de descuento si el subtotal pasa de 150 euros: calcúlelo con un if, escríbalo con Row en negativo y calcule el IVA y el total sobre el importe ya rebajado.