Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Convertir Albaranes a Factura (https://www.clubdelphi.com/foros/showthread.php?t=22776)

CarmaZone 27-06-2005 15:26:57

Convertir Albaranes a Factura
 
Hola a todos, vereis tengo en mente una cosa y nose si será la forma más conveniente.

Uso Delphi 6 y paradox.

Me explico, tengo programado para crearme albaranes y factura e intento seleccionar 1 o varios albaranes y convertirlo en 1 factura.

Tengo realizada 1 consulta por cliente y entre un rango de fechas...vamos que me muestra los albaranes que elijo...

El problema que le veo es al guardar ya que tendría que guardar todas las lineas de todos los albaranes seleccionados por lo que he pensado recorrer el/los albaranes y a su vez ir recorriendo las líneas del albaran actual (con un par de while) e ir guardando los datos.

Espero haberme explicado ya que no se si esta sería la manera correcta de hacerlo.

¿Qué opinaís?

Gracias & Salu2!!! :D

Lepe 27-06-2005 15:40:43

Opino que.... ¿cual es la duda? :D

Lo que no explicas es como haces la conversion de un albaran a una factura. En principio serán 2 tablas más, Cabecera_Factura y Detalle_Factura. En la primera guardas, el cliente, la fecha, el % de iva, etc; en la segunda guardas el ID_factura, ID_Albaran, concepto y posiblemente la base imponible de ese albaran.

Si tu consulta de clientes, está ordenado además por idCliente y Porcentaje_de_iva, simplemente será un par de bucles (como bien has dicho) insertando en la tabla factura, y detalle_factura.

Nota: El albaran deberá tener un campo llamado Factura nº: de tal forma que si ese campo es distinto de nulo, no deje editarlo.

Un saludo

CarmaZone 27-06-2005 15:57:06

Creo que no me expliqué muy bien xDD. Ya está programado la creación de 1 albarán y 1 factura, con sus tablas factura y línea factura... típico xD

La duda era si es razonable usar un bucle para recorrer los albaranes y a su vez cada una de las líneas de ese albarán e ir guardando con 2 whiles.

Por ahora he hecho esto:

Código:

      DataModule_Fact_Albar.Query_Alb.First;
      DataModule_Fact_Albar.Query_Alb.DisableControls;
      while not(DataModule_Fact_Albar.Query_Alb.Eof) do
      begin
          DataModule_Fact_Albar.Query_Lin_Alb.First;
          DataModule_Fact_Albar.Query_Lin_Alb.DisableControls;
          while not(DataModule_Fact_Albar.Query_Lin_Alb.Eof) do
          begin
              with DataModule_Fact_Albar do
              begin
                  Query_Lin_Fact.Edit;
                  Query_Lin_FactCANTIDAD.Value:=Query_Lin_AlbCANTIDAD.Value;
                  Query_Lin_FactCONCEPTO.Value:=Query_Lin_AlbCONCEPTO.Value;
                  Query_Lin_FactPRECIOUNIDAD.Value:=Query_Lin_AlbPRECIOUNIDAD.Value;
                  Query_Lin_FactTOTAL.Value:=Query_Lin_AlbTOTAL.Value;
                  Query_Lin_Fact.Post;
                  Query_Lin_Alb.Next;
              end;
          end;
          DataModule_Fact_Albar.Query_Lin_Alb.EnableControls;
          DataModule_Fact_Albar.Query_Alb.Next;
      end;
      DataModule_Fact_Albar.Query_Alb.EnableControls;

Pero sólo me guarda la ultima línea del 1º albarán :mad:

Salu2!!! :D

Lepe 27-06-2005 20:30:44

Código Delphi [-]
      DataModule_Fact_Albar.Query_Alb.First;
      DataModule_Fact_Albar.Query_Alb.DisableControls;
      while not(DataModule_Fact_Albar.Query_Alb.Eof) do
      begin
          DataModule_Fact_Albar.Query_Lin_Alb.First;
          DataModule_Fact_Albar.Query_Lin_Alb.DisableControls;
          while not(DataModule_Fact_Albar.Query_Lin_Alb.Eof) do
          begin
              with DataModule_Fact_Albar do
              begin
                  Query_Lin_Fact.Edit;
                  Query_Lin_FactCANTIDAD.Value:=Query_Lin_AlbCANTIDAD.Value;
                  Query_Lin_FactCONCEPTO.Value:=Query_Lin_AlbCONCEPTO.Value;
                  Query_Lin_FactPRECIOUNIDAD.Value:=Query_Lin_AlbPRECIOUNIDAD.Value;
                  Query_Lin_FactTOTAL.Value:=Query_Lin_AlbTOTAL.Value;
                  Query_Lin_Fact.Post;
                  Query_Lin_Alb.Next;
              end;
          end;
          DataModule_Fact_Albar.Query_Lin_Alb.EnableControls;
          DataModule_Fact_Albar.Query_Alb.Next;
      end;
      DataModule_Fact_Albar.Query_Alb.EnableControls;
Te equivocas, lo añade todo, el problema es que estas haciendo un Query_Lin_Fact.Edit, por tanto, todos los albaranes se machacan en la misma linea de la factura. ¿No Debería ser Query_Lin_Fact.Append?

Por otra parte.... yo usaría tbl_Lin_Fact, la tabla, en lugar de un Query.

Supongo que es un extracto del código, ya que no se crean nuevos registros en la tabla Facturas, y siendo una relación Maestro-Detalle, debe crearse la Factura antes que las lineas de factura.

En cuanto a la pregunta original, se podría hacer con consultas de inserción.... pero tal cual está, es más simple.

Un saludo

CarmaZone 27-06-2005 20:42:13

Es verda tio, que se está machacando xDDDDDDDD, he cambiado "edit" por append y ahora lo hace pero da un problema.

Si convierto de 1 albarán a 1 factura lo hace perfecto, mete bien el cuerpo, sin embargo si la conversión es de 2 albaranes a 1 factura, me mete las líneas dobles :eek: , me mete 2 veces el cuerpo del 1º albarán y el cuerpo del 2º albarán no lo mete. Tiene haber algo mal en esa parte del codigo que me hace una pasada la 1º pasada 2 veces y ya no hace más.

Gracias Y Salu2!!!

Lepe 27-06-2005 20:57:53

Si query_Lin_Alb tiene los albaranes a meter en cada linea de factura. ¿Qué tiene query_Alb?

Saludos

CarmaZone 27-06-2005 21:06:53

Albaran: nº albaran,fecha,cliente,base imponible..
Linea Albaran: cantidad, concepto,precio/unidad, total

Factura: nº factura,fecha,cliente, cif,base imponible, iva...
Linea Factura: cantidad, concepto,precio/unidad, total

Yo meto en query_fact desde query_alb el nombre del cliente y su CIF y en query_lin_fact voy metiendo las lineas de query_lin_alb.

Mi conversión me crea bien la cabecera de la factura, (nº factura, fecha, cliente...) lo que falla es la copia del cuerpo de varios albaranes al cuerpo de 1 sola factura :rolleyes:

Salu2!!!

Lepe 27-06-2005 21:36:37

Parte de culpa de todo esto lo tienen los nombres, mira este codigo, es identico al tuyo, pero cambiando los nombres de query_lin_alb y query_alb, ya que no se corresponde con los datos que representa, y lo único que hace es "molestar". Es importante dar nombres descriptivos ;)

Código Delphi [-]
with DataModule_Fact_Albar do
begin
      qry_Clientes.First;
      Query_Clientes.DisableControls;
      while not(qry_Clientes.Eof) do
      begin
          qry_Alb_A_Facturar.First;
          qry_Alb_A_Facturar.DisableControls;
          while not(qry_Alb_A_Facturar.Eof) do
          begin
                  query_Lin_Fact.Append;
                 Query_Lin_FactCANTIDAD.Value:=qry_Alb_A_FacturarCANTIDAD.Value;
                  Query_Lin_FactCONCEPTO.Value:=qry_Alb_A_FacturarCONCEPTO.Value;
                  Query_Lin_FactPRECIOUNIDAD.Value:=qry_Alb_A_FacturarPRECIOUNIDAD.Value;
                  Query_Lin_FactTOTAL.Value:=qry_Alb_A_FacturarTOTAL.Value;
                  Query_Lin_Fact.Post;
                  qry_Alb_A_Facturar.Next;
          end;
          qry_Alb_A_Facturar.EnableControls;
          qry_Clientes.Next; // salto de cliente
      end;
      qry_Clientes.EnableControls;
end;

Yo al menos lo veo más claro, para cada cliente, se mira los albaranes que tiene que facturar, y para cada uno de ellos se crea la linea de factura.

Tu problema reside en la relación que has definido entre qry_Clientes y qry_Alb_A_Facturar. Esa relación seguro que no está bien.

Si quieres ver mejor el fallo, da de alta 4 clientes, 3 albaranes por cada cliente y manda a facturar ;)

Un saludo

CarmaZone 27-06-2005 21:44:57

Revisare tu codigo, pero he de decir que no tengo relacionado cliente con factura ni albaranes, cada albaran o factura guarda su propio campo nombre_cliente... por lo tanto de ahi no viene el problema, mi relacion es albaran con linea_albaran y lo mismo para factura. De ahi los nombres:

Query_Alb y Query_Lin_Alb--> quey albaran y query linea albaran y lo mismo para facturas, creo que los nombre son descriptivos xDDDD

Voy a seguir probando.

Gracias y Salu2!!!

Edito: Tu trozo de codigo es una relación cliente-albarán que en mi caso equivale a albaran-línea_albaran. Lo he peusto como en tu ejemplo:

Código:

    with DataModule_Fact_Albar do
      begin
          Query_Alb.First;
          Query_Alb.DisableControls;
          while not(Query_Alb.Eof) do
          begin
              Query_Lin_Alb.First;
              Query_Lin_Alb.DisableControls;
              while not(Query_Lin_Alb.Eof) do
              begin
                  Query_Lin_Fact.Append;
                  Query_Lin_FactCANTIDAD.Value:=Query_Lin_AlbCANTIDAD.Value;
                  Query_Lin_FactCONCEPTO.Value:=Query_Lin_AlbCONCEPTO.Value;
                  Query_Lin_FactPRECIOUNIDAD.Value:=Query_Lin_AlbPRECIOUNIDAD.Value;
                  Query_Lin_FactTOTAL.Value:=Query_Lin_AlbTOTAL.Value;
                  Query_Lin_Fact.Post;
                  Query_Lin_Alb.Next;
              end;
              Query_Lin_Alb.EnableControls;
              Query_Alb.Next;
          end;
          Query_Alb.EnableControls;
      end;

Y pasa lo mismo, me mete 2 veces las líneas del 1º albarán y no me guardas las del 2º :(

Lepe 28-06-2005 11:21:56

Cita:

Empezado por CarmaZone
El problema que le veo es al guardar ya que tendría que guardar todas las lineas de todos los albaranes seleccionados por lo que he pensado recorrer el/los albaranes y a su vez ir recorriendo las líneas del albaran actual (con un par de while) e ir guardando los datos.

Entonces no he comprendido el concepto; pensaba en un albaran como una unidad, no como una relación Maestro-Detalle.

Permiteme que insista en lo mismo, la relación query_Alb <-> query_Lin_Alb no funciona correctamente. Digo esto, porque ese código está perfecto, la única posibilidad de que repita lineas de factura, es que al avanzar query_Alb, la query_Lin_Alb no se actualice.

Añade un memo, y saca el query_AlbNalbaran.AsString en curso y query_Lin_AlbCAMPOLLAVE.AsString.

Si esa relación está bien, postea todo el código de crear la factura (cabecera y lineas de facturas)

Un saludo

CarmaZone 28-06-2005 15:08:15

Perdón si no me expliqué bien desde el principio, en efecto es una relación maestro-detalle entre albaran y el cuerpo del albarán. Tal como dices estará la relación mal construida porque he colocado unos showmessages y al pasarme al siguiente albarán, no me actualiza el cuerpo, por esa razón me guarda el cuerpo del 1º albarán 2 veces :(

La relación la tengo echa de esta manera:

Albarán --> clave (nº albarán)
Línea Albarán --> clave (código), clave foránea (nº albarán)

Query_albaran --> SELECT * FROM ALBARAN

QUERY_Linea_Albaran:
- DataSource --> DataSource_Albaran
- SQL --> SELECT * FROM LINEA_ALBARAN WHERE LINEA_ALBARAN.NUM_ALB = :NUM_ALB

- En la propiedad PARAMS me aparece automáticamente el campo (nº albaran) por el cual se relacionan.

Creía que de esa manera estaba bien construida la relación porque el funcionamiento de crear un albarán y su cuerpo y relacionarse me funcionaba bien, pero al pasar ésto nose lo que estará mal :eek:

Alguna idea?si debo aportar más datos solo tienes que pedirlo.

Gracias por todo y Salu2!!!

CarmaZone 28-06-2005 23:24:06

:eek: :eek: :eek: Pues creo que ya me lo guarda todo bieeeeeeeeeeeeeeen :D :D :D el problema estaba en los enable y disablecontrols :eek: , me he dado cuenta porque he construido el codigo de nuevo y lo he ido probando y sin los enable y disablecontrols va y me funciona y he comporbado que tengo que poner EnableControls antes de hacer el Next :cool:

Nose si me explico pero bueno xDDDDD, el codigo queda tal que así:

Código:

        Query_Alb.First;
          while not(Query_Alb.Eof) do
          begin
              Query_Alb.DisableControls;
              Query_Lin_Alb.First;
              while not(Query_Lin_Alb.Eof) do
              begin
                  Query_Lin_Alb.DisableControls;
                  Query_Lin_Fact.Append;
                  Query_Lin_FactCANTIDAD.Value:=Query_Lin_AlbCANTIDAD.Value;
                  Query_Lin_FactCONCEPTO.Value:=Query_Lin_AlbCONCEPTO.Value;
                  Query_Lin_FactPRECIOUNIDAD.Value:=Query_Lin_AlbPRECIOUNIDAD.Value;
                  Query_Lin_FactTOTAL.Value:=Query_Lin_AlbTOTAL.Value;
                  Query_Lin_Fact.Post;
                  Query_Lin_Alb.EnableControls;
                  Query_Lin_Alb.Next;
              end;
              Query_Alb.EnableControls;
              Query_Alb.Next;
          end;

Espero que siga todo bien, MUCHISIMAS GRACIAS POR TODOS!!!

Salu2!!!


La franja horaria es GMT +2. Ahora son las 17:13:56.

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