Sie sind auf Seite 1von 11

http://www.ajpdsoft.com/modules.php?

name=News&file=article&sid=260 Este artculo explica cmo realizar un programa en Delphi (extensible para cualquier lenguaje de programacin) que gestione y calcule eficientemente el control de stock (control de existencias de artculos en almacn). Os explicaremos paso a paso los campos necesarios en la tabla de artculos, facturas a clientes y facturas de proveedores. Tambin os explacamos en qu eventos de los formularios/ventanas de Delphi ser preciso colocar el cdigo fuente necesario para llevar esta gestin.

Cmo programar control de stock (existencias en almacn) de artculos paso a paso Este artculo explica cmo realizar un programa en Delphi (extensible para cualquier lenguaje de programacin) que gestione y calcule eficientemente el control de stock (control de existencias de artculos en almacn). Os explicaremos paso a paso los campos necesarios en la tabla de artculos, facturas a clientes yfacturas de proveedores. Tambin os explacamos en qu eventos de los formularios/ventanas de Delphi ser preciso colocar el cdigo fuente necesario para llevar esta gestin.

El control de existencias en almacn se hace imprescindible en organizaciones/empresas de compra/venta de artculos (para controlar los artculos disponibles en almacn), de montaje de maquinaria (para controlar la disponibilidad de las piezas necesarias para el montaje), agrcolas (para controlar la disponibilidad de los productos fitosanitarios en almacn), informticas (para controlar la disponibilidad del material para montaje y venta de equipos). En definitiva se hace necesario para cualquier empresa que realice compras de material/artculos/productos y quiera saber en todo momento de cuantos elementos dispone. En este manual mencionaremos siempre "almacn" como el sitio fsico donde se alojen los productos/material/artculos, no tiene por qu ser un almacn como tal, puede ser cualquier tipo de ubicacin, incluso puede que no sea fsica. En primer lugar crearemos las tablas de la base de datos necesarias para esta gestin, por supuesto este artculo es un ejemplo simple, se puede complicar todo lo que se quiera. La primera tabla y la ms importante es la de artculos, os mostramos el script sql para MySQL necesario para crear esta tabla (en negrita destacamos los campos para el stock): CREATE TABLE articulo ( codigo int(10) unsigned NOT NULL auto_increment, fecha datetime, codigoproveedor int(10) unsigned, nombre varchar(150), preciocompra float, precioventa float, stock float, stockminimo float, avisostockminimo char(1), observacion varchar(255), codigomarca int(10) unsigned, codigofamilia int(10) unsigned,

codigomodelo int(10) unsigned, codigobarras varchar(30), caracteristicas text, porcentajebeneficio float, porcentajeiva float, porcentajedto float, PRIMARY KEY (codigo) ); Otra de las tablas ser la que almacene las facturas de proveedores (los que nos sirven el material), estar formada a su vez por dos tablas enlazadas por la clave fornea, por un lado la tabla de factura propiamente dicha, con la siguiente estructura: CREATE TABLE facturaproveedor ( codigo int(10) unsigned NOT NULL auto_increment, numero varchar(10), importetotal float, baseimponible float, porcentajeiva float, importeiva float, porcentajedescuento float, importedescuento float, codigoproveedor int(10) unsigned NOT NULL, fecha datetime, cobrado char(1), observacion varchar(255), importepagado float, PRIMARY KEY (codigo) ); y por otro lado la tabla detalle, donde se guardarn las lneas de la factura (en negrita indicamos el campo que afectar a la gestin del stock): CREATE TABLE facturaproveedordetalle ( codigo int(10) unsigned NOT NULL auto_increment, codigofactura int(10) unsigned, codigoarticulo int(10) unsigned, concepto varchar(150), cantidad float, importe float, precio float, porcentajedto float, PRIMARY KEY (codigo) ); Al igual que las facturas de los proveedores, tambin guardaremos, necesariamente, las facturas de los clientes. As podremos controlar las dos formas de entrada (proveedores) y salida (clientes) de stock. La estructura de la tabla de facturas de clientes sera: CREATE TABLE facturacliente ( codigo int(10) unsigned NOT NULL auto_increment, numero varchar(15), importetotal float, baseimponible float, porcentajeiva float, importeiva float, porcentajedescuento float, importedescuento float, codigocliente int(10) unsigned NOT NULL, fecha datetime, cobrado char(1), observacion varchar(255), importecobrado float, contabiliza char(1), imprimida char(1), enviada char(1), fechaenvio datetime, piefactura text, PRIMARY KEY (codigo) ); la tabla donde se guardarn las lneas de las facturas de los clientes ser:

CREATE TABLE facturadetalle ( codigo int(10) unsigned NOT NULL auto_increment, codigofactura int(10) unsigned, codigoarticulo int(10) unsigned, concepto varchar(150), cantidad float, importe float, precio float, porcentajedto float, PRIMARY KEY (codigo) ); Por supuesto, las tablas anteriores y su estructura es un ejemplo sencillo, se puede enfocar como se desee, dependiendo de las caractersticas de la organizacin que vaya a utilizar la aplicacin. Una vez creadas las tablas, desde Delphi o cualquier otro lenguaje de programacin, tendremos en cuenta las siguientes acciones: * En el formulario de alta de artculo, una ventana como esta:

colocaremos los dos campos, el primero para saber y poder modificar (aunque se puede impedir la modificacin manual) el stock actual del artculo, el segundo para indicar cual es el stock mnimo a partir del cual se avisar al usuario. En principio. * En el formulario de alta de lnea de factura de proveedor (entrada de stock), una ventana como esta:

colocaremos el campo "cantidad" necesario para el control de stock, opcionalmente podremos colocar una etiqueta informativa con el stock actual de artculo, para mostrarlo, en el evento "onExit" del cdigo de artculo o al seleccionar el artculo con el botn de seleccin o mediante el lector de cdigos de barras, aadiremos el siguiente cdigo fuente:

md.TC2.Close; md.TC2.SQL.Clear; md.TC2.SQL.Add('Select a.stock'); md.TC2.SQL.Add ('from articulo'); md.TC2.SQL.Add ('where a.codigo = :pCodigo'); md.TC2.ParamByName('pCodigo').Value := codigo; md.TC2.Open; if md.TC2.RecordCount > 0 then lstock.Caption := md.tc2.fieldbyname('stock').AsString; else lstock.Caption := '';
si se trata de una modificacin de un artculo existente, deberemos guardar en una variable global la cantidad actual (antes de que el usuario la modifique) del artculo actual. Para ello declararemos esta variable en esta ventana:

private { Private declarations } codigoArticuloAnterior : integer; cantidadActual : Double; public { Public declarations } end;
y en el evento "show" "create" del formulario aadiremos el siguiente cdigo:

if tag = 2 then //Modificar begin BSeleccionarProducto.Enabled := true; md.tFacturaDetalleProveedor.edit; txtCodigoArticulo.SetFocus; caption := 'Modificacin de ' + ventana + '...'; obtenerDatosArticulo(md.tFacturaDetalleProveedorcodigoarticulo.Value, ''); cantidadActual := md.tFacturaDetalleProveedorcantidad.AsFloat; end;

y, por supuesto, en el evento "onClick" del botn "Aceptar", colocaremos las siguientes lneas de cdigo:

try md.tFacturaDetalleProveedor.Post; //validar actualizarStock (true, md.tFacturaDetalleProveedorcantidad.AsFloat cantidadActual, md.tFacturaDetalleProveedorcodigoarticulo.AsInteger); except txtCodigoArticulo.setfocus; raise; end; close;

el cdigo del procedimiento "actualizarStock" ser el siguiente:

procedure actualizarStock (entrada : boolean; cantidad : double; codigo : Integer); begin with md.tcStock do begin close; SQL.Clear; SQL.Add('UPDATE articulo); if entrada then SQL.Add('SET stock = stock + :pCantidad') else SQL.Add('SET stock = stock - :pCantidad'); SQL.Add('WHERE Codigo = :pCodigo'); ParamByName('pCantidad').DataType := ftFloat; ParamByName('pCantidad').Value := cantidad; ParamByName('pCodigo').DataType := ftInteger; ParamByName('pCodigo').Value := codigo; execsql; close; end; end;
en el caso de que sea una insercin de una nueva lnea de factura de proveedor, no ser necesario guardar la cantidad anterior pues no existe, con lo cual la variable global "cantidadActual" se inicializar a cero. El resto de procedimientos ser el mismo que para la modificacin. * En el formulario de alta de lnea de factura de cliente (salida de stock), una ventana como esta:

se tratar de forma similiar a las lneas de facturas de proveedores, con la nica salvedad del procedimiento "onClick" del botn "Aceptar" que ser el siguiente:

try md.tFacturaDetalle.Post; //validar actualizarStock (false, md.tFacturaDetallecantidad.AsFloat cantidadActual, md.tFacturaDetallecodigoarticulo.AsInteger); except txtCodigoArticulo.setfocus; raise; end; close;
Si queremos avisar al usuario en el caso en que el stock actual del artculo sea inferior al stock mnimo, en el evento "onClick" del botn "Aceptar" podremos colocar el siguiente cdigo, despus de validar la lnea:

md.TC2.Close; md.TC2.SQL.Clear; md.TC2.SQL.Add('Select a.stock, a.stockminimo'); md.TC2.SQL.Add ('from articulo'); md.TC2.SQL.Add ('where a.codigo= :pCodigo'); md.TC2.ParamByName('pCodigo').Value := codigo; md.TC2.Open; if md.TC2.RecordCount > 0 then if md.TC2.FieldByName('stock').AsFloat < md.TC2.FieldByName('stockminimo').AsFloat then showmessage ('Atencin: el stock del artculo es inferior a ' + md.TC2.fieldbyname ('stockminimo').AsString;
Otro evento que debemos tener en cuenta es la posibilidad de que el usuario elimine una lnea de la factura de proveedor o de la factura de cliente o incluso una factura de cliente o proveedor completa. En estos casos se debe restablecer el stock de los artculos que se eliminarn, en cuyo caso colocaremos el siguiente cdigo, en el evento "eliminarFacturaCliente":

md.tc2.Close; md.tc2.sql.clear; md.tc2.SQL.add('SELECT cantidad, codigoarticulo'); md.tc2.SQL.add('FROM facturadetalle'); md.tc2.SQL.add('WHERE CodigoFactura = :pCodigo'); md.tc2.ParamByName('pCodigo').DataType := ftString; md.tc2.ParamByName('pCodigo').AsInteger := codigoFacturaEliminar;

md.tc2.open; while not md.tc2.Eof do begin codigoMaterial := md.tc2.fieldbyname ('codigoarticulo').AsInteger; cantidad := md.tc2.fieldbyname ('cantidad').AsFloat; actualizarStock (true, cantidad, codigoMaterial); md.tc2.Next; end; try md.tc2.Close; md.tc2.sql.clear; md.tc2.SQL.add('DELETE FROM FacturaDetalle'); md.tc2.SQL.add('WHERE CodigoFactura = :pCodigo'); md.tc2.ParamByName('pCodigo').DataType := ftString; md.tc2.ParamByName('pCodigo').AsInteger := codigoFacturaEliminar; md.tc2.ExecSQL; ttabla.Delete; except raise; end;
para "eliminarFacturaProveedor" haremos lo mismo cambiando "True" por "False" en el procedimiento "actualizarStock", obviamente cambiaremos tambin los nombres de los campos y tablas.

Por ltimo, deberemos controlar el evento "Eliminar lnea factura", que se producir cuando un usuario decida eliminar slo una lnea de la factura, en cuyo caso colocaremos el siguiente cdigo (para restablecer el stock):

if messagedlg ('Est seguro que desea eliminar el concepto [' + nombre + '] de la ' + ventana + '?', mtconfirmation, [mbyes, mbno], 0) = mryes then begin codigoMaterial := md.tFacturaDetallecodigoarticulo.AsInteger; cantidad := md.tFacturaDetallecantidad.AsFloat; actualizarStock (true, cantidad, codigoMaterial); try md.tFacturaDetalle.delete; except raise; end; end;

otro

Conceptos bsicos en la programacin con Delphi


No es el objeto del presente proyecto hacer un repaso exhaustivo de la programacin en Pascal, por eso vamos a ver de forma somera solo algunas de las caractersticas de que dispone Delphi, principalmente aquellas que le diferencian ms del Pascal estndar. Para ello, vamos a introducir una serie de conceptos:

1. 2. 3. 4. 5.

Objetos Componentes Propiedades Eventos Mtodos

Objetos

Como su propio nombre indica, el Object Pascal (usado por Delphi) es un lenguaje totalmente orientado a objetos. Prcticamente todos los elementos del entorno Delphi son objetos, que unas veces se encuentran definidos de antemano (los forms, los componentes de la paleta, objetos no visuales, etc), y otras se definen en nuestra propia aplicacin (por ejemplo el componente TPostIt de ANALOGIA.EXE definido en la unit U_Misc). Todo el desarrollo de aplicaciones en Delphi est ntimamente ligado con la definicin y uso de objetos, por lo que es fundamental conocer la mecnica que Object Pascal utiliza para describir un objeto, sus caractersticas y su funcionamiento, sobre todo a la hora de que el programador cree sus propios componentes. En muchos casos no es necesario conocer el funcionamiento de la programacin orientada a objetos para programar con Delphi, puesto que en la mayora de los casos existen controles ya creados sin necesidad de tener que programarlos. Por ejemplo en ANALOGIA.EXE la mayora de los objetos forman parte de la VCL de Delphi y otros dos componentes han sido escritos por terceros (RChart y TFormulaParser), sin embargo ha sido til desarrollar un componente propio (TPostIt) para mostrar la tabla de valores de los componentes en el programa. La propia programacin visual de Delphi, que escribe parte del cdigo automticamente, hace posible utilizar objetos de forma prctica sin tener por qu comprender al cien por cien su funcionamiento.

Componentes

Un componente es cualquiera de los elementos que podemos insertar en una ficha, tanto si su funcin es visual como si no lo es (por supuesto un componente es tambin un objeto). Un ejemplo de componente puede ser RChart, usado en ANALOGIA.EXE para dibujar las grficas. Sin conocer exactamente el cmo realiza su funcin, el programador manipula una serie de propiedades, mtodos y eventos que caracterizan al componente, a travs de los cuales se "maneja" el componente en la forma deseada. Por supuesto el usuario puede crear sus propios componentes y usarlos en distintas aplicaciones, de forma que la reusabilidad del cdigo es mxima. A los componentes que cuentan con una parte visual, como puede ser un botn, se les denomina controles.

Propiedades

Los componentes, y de hecho todos los objetos de Delphi son de uso general, por lo que a la hora de usarlos de alguna forma deberemos adecuarlos a nuestras necesidades. Para ello nos serviremos de las propiedades de cada objeto, mediante las cuales podremos establecer el ttulo de una ventana, el tipo de letra de una etiqueta de texto o el color en el que aparecen los distintos controles. Se puede pensar en las propiedades como si fuesen variables pertenecientes a un objeto (veremos que no es as exactamente), de tal forma que para acceder a ellas generalmente habr que indicar no slo el nombre de la propiedad, sino tambin a qu objeto pertenece. La modificacin o consulta del valor de una propiedad puede diferir segn intentemos acceder a ella mientras estamos diseando un form, en tiempo de diseo, o bien mediante el cdigo del programa, en tiempo de ejecucin. Ciertas propiedades estn slo accesibles en tiempo de ejecucin, por lo que mientras estamos diseando la ficha no aparecern. Adems hay algunas propiedades que son de slo lectura, por lo que su valor puede ser consultado, pero no modificado, y otras que son slo de escritura. Aunque a primera vista si usamos un componente prefabricado, las propiedades pueden parecer simples variables, en la mayora de las ocasiones una propiedad no es una variable, y la modificacin o consulta de su valor puede conllevar que internamente el componente ejecute un cierto cdigo. Si por ejemplo tuvisemos un componente para comunicaciones serie que se encargase de enviar mensajes a un ordenador remoto, podramos tal vez asignar una cadena de caracteres a una hipottica propiedad "Envia". De esta forma, con una simple asignacin (Envia:='Mensaje a mandar') se pondra en marcha todo el mecanismo implcito en el componente para enviar el mensaje al ordenador remoto. Esta propiedad podra ser un ejemplo de propiedad de slo escritura, ya que slo interesa mandar el mensaje al ordenador remoto, sin conservar informacin acerca del mensaje, por lo que sera inapropiada su lectura.

Eventos

Como dije anteriormente, la programacin en el entorno Windows se caracteriza por estar dirigida por eventos, de tal forma que un programa no tiene por qu ejecutarse necesariamente de forma secuencial, sino que ciertas porciones de cdigo se ejecutarn cuando ocurra un cierto evento. Los eventos son seales que el entorno recibe desde distintos elementos, como puedan ser el ratn, el teclado o un temporizador. Estos eventos son redirigidos a las aplicaciones, que en caso de aceptarlos debern responder adecuadamente de ellos. Ciertos eventos pueden ser gestionados por el propio Windows, otros quedarn a cargo del propio lenguaje que estemos usando, y un tercer grupo sern los que lleguen hasta nuestro programa. En Delphi prcticamente todo el cdigo que escribimos ir asociado a algn evento. Si retomamos el ejemplo del componente para comunicaciones serie, podra interesarnos que se ejecutara un evento cada vez que se recibiese un carcter por el puerto serie, de forma que podramos escribir el cdigo necesario para guardar el carcter en un archivo cada vez que se produjese el evento. Normalmente los eventos a los que reaccionarn los componentes sern las pulsaciones del teclado o el ratn, activaciones de los componentes, etc.

Mtodos

Los componentes Delphi adems de disponer de propiedades y poder responder a ciertos eventos, habitualmente tambin disponen de mtodos. Un mtodo es un procedimiento o funcin que nos permite realizar una determinada accin en el componente, pudiendo necesitar o no el paso de algn parmetro. Al igual que ocurre en las propiedades, a la hora de usar un cierto mtodo normalmente tendremos que indicar primero el objeto o componente al que pertenece, de tal forma que la accin del mtodo recaiga sobre l, y no sobre cualquier otro. El hecho de que cada objeto sea propietario de una serie de propiedades y mtodos, variables y cdigo, que no son accesibles a ningn otro objeto externo, recibe el nombre de encapsulacin, aunque tambin es posible definirlos de tal modo que sean accesibles a otros objetos.

http://www.gratisprogramas.org/descargar/manual-de-programacion-delphi-6-y-7/ http://www.weblibrosgratis.com/search/label/Ofimatica

Das könnte Ihnen auch gefallen