Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Facturación e Inventario (https://www.clubdelphi.com/foros/showthread.php?t=46017)

silver07 20-07-2007 22:15:35

Facturación e Inventario
 
:confused: Hola a todos, soy un novato en Delphi (uso Delphi 7) y me gustaría que alguien me dijera dónde puedo conseguir un manual paso a paso para realizar una factura con sus respectivas tablas(maestro/detalles) y que pueda manejar un inventario de productos o artículos, aquí he podido encontrar varios ejemplos pero estan algo avanzado y yo necesito un material más explicativo.

Espero se haya entendido lo que trato de buscar. Si alguien me puede ayudar se lo agradecería.

Gracias de antemano.:(

Caral 20-07-2007 22:25:26

Hola
Aqui: Facturacion
Hay un ejemplo: Facturacion_Caral.zip
Este hace lo que necesitas.
Saludos

silver07 23-07-2007 15:21:39

Factura e Inventario
 
:o Te agradezco el enlace caral. Hice la respectiva descarga pero esta algo avanzado para un novato como yo. No habrá otro ejemplo menos avanzado?, un poco más explicativo si es posible como dije anteriormente.:(


Gracias anticipadas.

Caral 23-07-2007 17:09:34

Hola
Pues tratemos de empezar:
Para comenzar se necesitan crear las tablas:
Ya con la base de datos hecha, veremos, que pasa.
Sigues?
Saludos

Caral 23-07-2007 17:22:05

Paso 2:
Crear un formulario para el ingreso de los clientes:
Para este fin trabajaremos con los componentes ADO.
Primero crearemos un form y un DataModule, asi:
Seguimos?
Saludos

silver07 23-07-2007 17:23:48

Factura e Inventario
 
Gracias Caral por tu tiempo, estoy utilizando Access para las tablas y la versión 7 de Delphi, tengo parte de la base de datos hecha te iré informando sobre los avance, muchas gracias de nuevo por el tiempo invertido.:)

Caral 23-07-2007 17:28:17

Hola
Bueno casualmente, estaba tratando de guiarte en este proceso, las descargas que hay en los otros post, son el proceso paso a paso 1( las Tablas),2 (El primer form y datamodule), no es el programa completo que bajaste, te interesa seguir?.,
Saludos

silver07 23-07-2007 17:36:10

Factura e Inventario
 
Desde luego que me interasa bastante seguir, muchisimas gracias Caral.:D

Caral 23-07-2007 17:45:20

Hola
Me alegro.
Come veras, ya estan las tablas, clientes, articulos, factura, tambien tenemos el form que va a ser el principal y el datamodule.
Bueno seguimos con lo demas.
Se supone que tenemos que entrar en el programa de alguna manera, verdad?
Vamos a colocar un menu, con este ingresaremos a todo, ademas colocaremos un image para que se vea bien, asi:
Seguimos.
Saludos

Caral 23-07-2007 17:56:52

Paso 4.
Ya tenemos la entrada principal.
Ahora vamos a crear el primer form (Clientes), lo vamos a hacer de la manera mas facil, usando los comonentes basicos, luego ya podras cambiar lo que quieras (como un maestro).
Creamos un nuevo form, le puse el nombre de fclientes al primero, no inporta, a este le pondermos otro FMantClientes.
Si te fijas en el AdoTable, dandole doble click, veras todos los campos de la tabla.
Si voy despacio me dices.
Saludos

silver07 23-07-2007 17:59:16

Factura e Inventario
 
Perfecto, aúnque los resultados de lo que vaya haciendo te lo iré comentando al día siguiente, ya que donde trabajo no utilizan delphi de hecho nisiquiera Windows.

Muchas gracias otra vez por el tiempo invertido.:)

Caral 23-07-2007 18:16:56

Paso 5:
Aqui vamos con la parte del form cliente:
Analizalo un poco, veras que es muy simple, por lo menos lo basico.
Seguimos.
Saludos

Caral 23-07-2007 18:29:06

Paso 6:
Ahora crearemos el form para los articulos, igual que el de clientes:
Seguimos los mismos pasos:
Como no va a alcanzar el espacio en los cip, solo pondre los unit, solo tendras que ponerlos en la misma carpeta y añadirlos al proyecto, en project, add to project.
Aqui va el nuevo form, articulos, dale click al memo en añadir articulos pones esto:
Código Delphi [-]
  FArticulos:=TFArticulos.Create(self);
   try
    FArticulos.ShowModal;
   finally
    FArticulos.Free;
   end;
Seguimos.
Saludos

silver07 23-07-2007 18:41:06

Factura e Inventario
 
Estoy descargando todo el material, solo que me pondre en marcha en cuanto llegue a casa, ya que aquí en el trabajo no tengo Delphi.

Muchas gracias otra vez por tu ayuda y el tiempo invertido.:)

Caral 23-07-2007 19:39:06

Paso 7:
Como veras ya esta hecho el form de facturacion, en este momento solo lo tengo formado, sin codigo, nada mas para que veas la forma basica de hacerlo.
Este enlazara a clientes y a articulos, luego calculara la cantidad del articulo X el precio, el descuento el impuesto y dara el total de la factura.
En el primer paso, se colocan los articulos con las cantades y su respectivo precio, se van guardando, se calculan y se imprime la factura.
Hay que tener en cuenta que se tendra que tener un consecutivo de la factura.
Al igual que el anterior copia el codigo en la carpeta y añadelo al proyecto.
Coloca esto en el memu principal en Facturacion, Facturar, dandole click.
Código Delphi [-]
  FFactura:=TFFactura.Create(self);
   try
    FFactura.ShowModal;
   finally
    FFactura.Free;
   end;
Ya tenemos algo adelantado, verdad.:D , mas facil nada, solo delphi puede hacer algo asi de rapido.
Aqui van los tres form que hemos hecho, Clientes, Articulos, Factura, los pongo otra vez por si tienes algun problema.
Saludos

Caral 23-07-2007 21:53:46

Paso 8:
Bueno como estoy entretenido con esto, va el siguiente avance:
Ya tenemos la factura, ya enlazamos a los clientes y a los articulos, ahora necesitamos que al enlazarlos nos traiga la informacion que solicitamos al form de facturar.
Para empezar agrega un par de clientes y un par de articulos a las tablas, con esto veras los resultados.
Bien:
En el form de Clientes (FMantClientes).
Vamos a agregar unas lineas de codigo en Public:
Código Delphi [-]
 public
    { Public declarations }
     Cod_Cliente: string;
     NombreCliente: string;
  end;
Aqui estoy diciendo que me mantenga estas variables publicas, ya que las usare en el form de Factura, como ves las declare en un form y las usare en otro.
En el mismo from Clientes (FMantClientes).
En el boton de cerrar:
Código Delphi [-]
Cod_Cliente := ADOTable1CodCliente.AsString;
NombreCliente := ADOTable1NombreCliente.AsString;
Close;
Aqui estoy diciendo que cuando cierre, quiero estas variables declaradas en relacion a la tabla.

Lo mismo vamos a hacer en el form Articulos (FArticulos).
En Public:
Código Delphi [-]
 public
    { Public declarations }
     Cod_Parte: string;
     Descripcion: string;
  end;
Y en el boton cerrar:
Código Delphi [-]
Cod_Parte := ADOTable1CodProducto.AsString;
Descripcion := ADOTable1Descripcion.AsString;
Close;
Creo que esta muy claro, si no pregunta.:D
Hecho esto, aqui esta el form de factura con los cambios necesarios, no hace mucho mas de momento, ya lo hara.:D
Saludos

ariefez 23-07-2007 23:39:36

Excelente!!!, estas cosas son las que motivan a uno ha aportar, almenos con un granito,

aunque no lo he leido (ya q no uso access) me parece interesante, al igual que los otros tutoriales que haz expuesto.

Saludos...

Caral 23-07-2007 23:42:03

Paso 9:
Me distraje haciendo cositas asi que cambie la tabla Factura un poco, bueno bastante, por eso la subo de nuevo.
En el siguiente post pongo el form de factura ya bastante adelantado, solo faltarian los totales e imprimir, creo, ya me diras.
Aqui esta la base de datos:
Saludos

Caral 23-07-2007 23:43:27

Hola
Gracias ariefez
Me alegro que te guste, ojala le sirva a muchos.
Saludos

Caral 24-07-2007 00:19:59

Paso 10:
Aqui esta el form de factura mas adelantado.
Como trabaja:
Al entrar en el form, este automaticamente genera un numero de factura nuevo.
La fecha de la factura se pone al dia.
Se busca el cliente con el boton buscar, con solo cerrar el form de clientes el codigo y el nombre de este se colocan en el form de facturar.
Lo mismo se hace con el articulo, se busca.
Se coloca la cantidad de este articulo, el precio unitario, en la casillas pequeñas de descuento e impuesto se colocan los porcentajes, este los calculara solo en la parte de abajo a la hora de guardar.
Una vez hecho esto se puede seguir colocando otros articulos con sus precios, descuentos etc, y guardarlos, esta sera la lista de la factura (varios articulos).
Con solo pasar a la parte de Resumen de factura, se podra ver cada uno de los articulos.
Para ver una factura ya hecha, simplemente se pone el numero de esta y se pasa al resumen.
Bueno, ya seguiremos.
Saludos

silver07 24-07-2007 17:39:06

Factura e Inventario
 
Muchas gracias Caral a esto me referia, anoche trabaje con los mantenimientos y el diseño de la factura pués hoy en cuanto llegue a casa continuaré aplicando los pasos 9 y 10, de momento todo marcha bien. La verdad que este proyecto me ha inspirado.:D


Muchas Gracias otra vez por tu tiempo.:p

Caral 24-07-2007 17:51:30

Paso 11:
Bueno ya el form de factura tiene cara, ya genera los totales, en base a la suma de los articulos que se le coloquen.
Hay que recordar que solo se necesita incluir al cliente y las condiciones una vez, en cuanto a los articulos, pues seran las veces que sea necesario, dependiendo de la venta, por supuesto.
Bueno aqui esta el form ya casi listo, lo unico que faltaria seria imprimir la factura, esto lo hariamos con Qreport, que es el que conozco.
Espero te este sirviendo y a alguien mas.
Saludos

Caral 24-07-2007 18:37:21

Paso 12:
Creacion de la factura imprimida en qreport.
Bueno con este paso creo que ya esta mas o menos listo, por lo menos ya se puede entender un poco como funciona esto de la facturacion, hay otras, muchas otras maneras de hacer esto, pero he querido hacerlo lo mas sencillo posible para que se pueda empezar con delphi.
Espero haber cubierto tu inquietud silver07 y que te sirva a ti y a otros esta pequeña practica.
Saludos

tenporal 25-07-2007 20:09:36

Saludos Caral, estaba viendo tu tutorial de facturacion y tengo una pregunta

¿ En donde debo instalar la carpeta con la bd?
¿ En donde debo tener el proyecto de delphi ?

Caral 25-07-2007 20:14:17

Hola
Pues en realidad no me he puesto a pensar en eso, en cualquier lado supongo.
Simplemente en el Datamodule en el adoconnection le das la direccion que quieras.
Hay otra manera y es un archivo ini, si necesitas te lo explico.
Saludos

Caral 25-07-2007 22:16:23

Hola
Como hay una pregunta del amigo tenporal con relacion a donde colocar la Base de datos y el Programa, he querido dar la opción de hacerlo con un archivo .ini como lo indique antes, me parece practico, asi que va.
Para empezar hay que hacer un archivo ini, Abrimos el block de notas y se coloca esto:
Cita:

[BD]
Path="C:\Facturacion.MDB"
[Logon]
Auto="No"
Login=""
Pass=""
Se guarda en este caso con el nombre de BDatos.ini

Como ven aqui le estoy diciendo que la base de datos esta en C:\ y ya sabemos que se llama Facturacion.mdb, si queremos colocar la base de datos en otra carpeta o sub carpeta simplemente le cambiamos la direccion, ejemplo:
Cita:

[BD]
Path="C:\Programa\MiCarpeta\Facturacion.MDB"
[Logon]
Auto="No"
Login=""
Pass=""
Como ven el resto queda igual, simple verdad.
Ahora vamos a hacer que nuestro programa lea este archivo.
Hay que tener en cuenta que el archivo BDatos.ini, tendra que estar en la misma carpeta que el programa.
Ahora abrimos el programa en Delphi, abrimos el datamodule, en el evento OnCreate del datamodule, ponemos esto:
Código Delphi [-]
procedure TDataModule1.DataModuleCreate(Sender: TObject);// esta parte ya la pone Delphi
Var BaseDeDatos, ConStr : String;
    IniFile: TIniFile;
begin
   // Obtiene la ruta y el nombre de la base de datos
   IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'BDatos.ini');// aqui esta el nombre del archino ini
   BasedeDatos := IniFile.ReadString('BD','Path','');
   If BasedeDatos = '' then ShowMessage('Error al cargar Base de Datos');
   ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
             'Data Source='+BaseDeDatos+';'+
             'Persist Security Info=False;'+
             'Jet OLEDB : Database Password=admin';
   ADOConnection1.ConnectionString := ConStr;
   ADOConnection1.Open;

end;
Ahora en el uses del mismo DataModule ponemos esto:
Cita:

uses
SysUtils, Classes, DB, IniFiles, ADODB, Forms, Dialogs;
Y a funcionar, ahora cada vez que arranque el programa, buscara primero el archivo BDatos.ini, y se conectara a la base de datos, podeis poner la base de datos donde querais, siempre la encontrara, incluso en red, recordad poner el archivo ini en la misma carpeta donde este el programa.
Espero les sirva, la explicacion.
Saludos

Caral 26-07-2007 00:11:27

Hola
Siguiendo mi politica de poner los archivos aqui esta el archivo ini, para que lo veáis, por si tenéis dudas.
Saludos

tenporal 28-07-2007 19:35:26

Otra pregunta amigo Caral

¿Como evitas que el usuario teclee 2 articulos diferentes asignandole la misma clave del articulo?

Por ejemplo:

articulo: 1
Descripcion: Teclado

articulo: 1
Descripcion: Raton

En el modulo de articulos teclee estos 2 registros con la misma clave y me lo acepto sin problemas, pero no tendria aqui llaves duplicadas ¿como resuelvo esto?

Saludos

Caral 28-07-2007 19:40:06

Hola
Supongo que te refieres al form de articulos, lo que quieres hacer es que el ID del articulo no se repita o no tenga uno igual en la tabla, si es asi.
Ya te respondo, un momento.
Saludos

Caral 28-07-2007 20:58:52

Hola
Bueno aqui estoy respondiendo a la duda de Tenporal, los cambios los vamos ha hacer en el From de articulos (FArticulos).
Primero:
El Componente DBNavigator1.
A este le quitamos las opciones de Post, Cancel, Refresh., no las necesitamos.
Segundo:
Colocamos un ADOQuery (AdoQuery1) en el from, lo conectamos igual que el adotable1 que tenemos al datamodule en connection (DataModule1.ADOConnection1).
Tercero:
Colocamos un Boton (Guardar) en el Form y en el evento OnClick, ponemos esto:
Código Delphi [-]
 If DBEdit1.Text <> '' then
   Begin
     ADOQuery1.Active:= false;
     ADOQuery1.SQL.Text:= 'Select CodProducto from Articulos Where CodProducto = :cod ';
     ADOQuery1.Parameters.ParamByName('cod').Value := DBEdit1.Text;
     AdoQuery1.Active := true;
     IF ADOQuery1CodProducto.AsString = DBEdit1.Text then
     begin
     MessageDlg('Código ya existe, favor seleccionar otro',mtError,[mbOK],0);
     DBEdit1.Text:= '';
     end
     else
     If ADOTable1.State = dsInsert then
     begin
     ADOTable1.Post;
     ADOTable1.Active:= False;
     ADOTable1.Active := true;
     end;
     end;
Creo que esta facil de entender.
Primero se verifica que el dbedit1 este vacio
Se coloca una consulta al query1 y se busca que, si el parametro es igual al dbedit1 salga un mensaje de lo contrario se grabe en la tabla y se refresque, siempre que la tabla este en modo insert (dsInsert).
Espero sea esto lo que preguntabas y te sirva.
Saludos

tenporal 31-07-2007 05:34:23

Lo que vi en el diseño de la base de datos en access, es que no tienes un campo definido como llave primaria.

¿cual seria la mejor manera de normalizar la base de datos de access, con llave primaria o sin llave primaria?:confused:

Ahora otra pregunta,

Si en vez de guardar el articulo, el usuario da click en el boton cancelar
¿no queda un registro en blanco en la tabla de articulos?:confused:

Saludos a tod@s.

Caral 31-07-2007 17:45:58

Hola
1- Access obliga a colocar llaves primarias sobre todo cuando se hacen consultas ligadas, de lo contrario, no lo amerita.
2- Cambiando la colocacion de la sentencia, se puede hacer lo que dices, estudialo un poco, lo entenderas, no deberia crear un registro en blanco.
Recuerda que esta ayuda, no es perfecta, como sabes soy novato, como muchos, solo intento ayudar y dar una luz de lo que se puede hacer.
Saludos

novato03 12-08-2007 14:37:49

Asunto
 
Hola amigo Caral, me descargue el programa paso a paso que hiciste y para analizarlo, pero cuando lo ejecuto me presenta el error cuando le presiono el botón guardar.

Project Factura.exe raised exception class EOleExcenption with message 'El número de valores de consulta y el ´numero de campos de destino son diferentes'¨. Process stopped. Use Step or Run to continue.

Caral 12-08-2007 15:24:33

Hola novato03
Esto pasa cuando intentas guardar datos incompletos.
En el caso del programa en el form factura, si los edits y combobox que estan en blanco no contienen informacion, genera el error, la logica dice que es una factura y por lo tanto se tiene que formalizar.
Rellena todos los campos vacíos y resulto.
Espero que sea este el problema que me mencionas.
Saludos

novato03 12-08-2007 16:01:13

Asunto
 
Acabo de completar todos los campos y sale el mismo error.:(


Project Factura.exe raised exception class EOleException with message 'El número de valores de consulta y el número de campos de destino son diferentes'. Process stopped. Use Step or Run to continue.

Caral 12-08-2007 16:12:47

Hola
No tiene por que pasar.
Has tocado algo?
El programa lo tengo y funciona perfectamente, es muy raro.
Revisa el codigo del boton guardar, tiene que estar asi:
Código Delphi [-]
procedure TFFactura.Button1Click(Sender: TObject);
Var
  a,b,c,d,e,f,g,h : real;
begin
 a:= StrTofloat(ECantidad.Text);
 b:= StrTofloat(EMonto.Text);
 d:= StrTofloat(EDesc.Text);
 f:= StrTofloat(EImp.Text);
 c:= a * b;
 e:= c * d / 100;
 g:= (c - e) * f / 100;
 h:= c - e + g;
 ESTotal.Text:= floatToStr(c);
 EDescuento.Text:=floatToStr(e);
 EImpuesto.Text:=floatToStr(g);
 ETotal.Text:= floatToStr(Round(h));

 AdoQuery1.SQL.Text := 'Insert into Factura Values ('+QuotedStr(ECodFactura.Text)+', '+DateToStr(DateTimePicker1.DateTime)+', '+QuotedStr(ECodCliente.Text)+ ', '+QuotedStr(ECodArticulo.Text)+ ', '+QuotedStr(Label9.Caption)+ ', '+QuotedStr(ECantidad.Text)+ ', '+QuotedStr(ComboBox1.Text)+', '+QuotedStr(EOCompra.Text)+', '+
                        QuotedStr(EVendedor.Text)+', '+QuotedStr(EDesc.Text)+', '+QuotedStr(EImp.Text)+', '+QuotedStr(ESTotal.Text)+', '+QuotedStr(EDescuento.Text)+ ', '+QuotedStr(EImpuesto.Text)+ ', '+QuotedStr(ETotal.Text)+')';
 AdoQuery1.ExecSQL;

end;
Como veras el insert recorre los campos y el value revisa los datos.
Copia y pega este codigo, tiene que funcionar.
Saludos

novato03 12-08-2007 16:32:16

Asunto
 
El código esta de la siguiente manera...


Código Delphi [-]
procedure TFFactura.Button1Click(Sender: TObject);
Var
  a,b,c,d,e,f,g,h : real;
begin
 a:= StrTofloat(ECantidad.Text);
 b:= StrTofloat(EMonto.Text);
 d:= StrTofloat(EDesc.Text);
 f:= StrTofloat(EImp.Text);
 c:= a * b;
 e:= c * d / 100;
 g:= (c - e) * f / 100;
 h:= c - e + g;
 ESTotal.Text:= floatToStr(c);
 EDescuento.Text:=floatToStr(e);
 EImpuesto.Text:=floatToStr(g);
 ETotal.Text:= floatToStr(Round(h));
 AdoQuery1.SQL.Text := 'Insert into Factura Values ('+QuotedStr(ECodFactura.Text)+', '+DateToStr(DateTimePicker1.DateTime)+', '+QuotedStr(ECodCliente.Text)+ ', '+QuotedStr(ECodArticulo.Text)+ ', '+QuotedStr(Label9.Caption)+ ', '+QuotedStr(ECantidad.Text)+ ', '+QuotedStr(ComboBox1.Text)+', '+QuotedStr(EOCompra.Text)+', '+
                        QuotedStr(EVendedor.Text)+', '+QuotedStr(EDesc.Text)+', '+QuotedStr(EImp.Text)+', '+QuotedStr(ESTotal.Text)+', '+QuotedStr(EDescuento.Text)+ ', '+QuotedStr(EImpuesto.Text)+ ', '+QuotedStr(ETotal.Text)+')';
 AdoQuery1.ExecSQL;
end;

y la tabla de factura, contiene los siguientes campos:


CodFactura (Número)
Fecha
CodCliente (Número)
Terminos (Texto)
OrdenCompra (Texto)
CodVendedor (Texto)
Excento (si/no)
TasaImpuesto (Número)
Anulada (si/no)
MntEnvio (Fecha)
MntSubTotal (Número)
MntDescuento (Número)
MntImpuesto (Número)
MntTotal (Número)
MntContado (Número)
MntCheque (Número)
MntTarjeta (Número)
MntOtros (Número)
Saldo (Número)
Pagado (Número)
CodArticulo (Número)

Caral 12-08-2007 16:50:08

Hola
El paso 9, explica lo que te esta pasando.
La tabla fue modificada en ese paso, quedo asi:

Campos:
CodFactura (Número)
Fecha
CodCliente (Número)
CodArticulo (Texto)
Descripcion (Texto)
Cantidad (Numero)
Terminos (Texto)
OrdenCompra (Texto)
CodVendedor (Texto)
Excento (Numero)
TasaImpuesto (Número)
MntSubTotal (Número)
MntDescuento (Número)
MntImpuesto (Número)
MntTotal (Número)

Revisalo, si tienes mas dudas, ya las resolveremos.
Saludos

novato03 12-08-2007 17:29:01

Asunto
 
Muchas gracias amigo Caral. Ya esta resuelto:)
Pero tengo que digitar el precio y el impuesto.
:rolleyes:No habrá alguna forma de hacerlo automático?


Gracias por la ayuda Amigo Caral...:)

novato03 12-08-2007 17:41:07

Asunto
 
Disculpa amigo Caral, pero el unit(UFClientes) cuando ejecuto el programa me presenta el siguiente error:


Cannot open file "C:\UFClientes.pas". El sistema no puede hallar el archivo especificado.

Para resolver el problema he tenido que colocar ese form en disco "C:\ " libremente solo así funciona.

Hay alguna forma resolver este problema?:confused:

Gracias anticipadas...


La franja horaria es GMT +2. Ahora son las 17:58:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi