Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-06-2005
CarmaZone CarmaZone is offline
Miembro
 
Registrado: mar 2005
Posts: 59
Poder: 20
CarmaZone Va por buen camino
Lightbulb 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!!!
Responder Con Cita
  #2  
Antiguo 27-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Opino que.... ¿cual es la duda?

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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 27-06-2005
CarmaZone CarmaZone is offline
Miembro
 
Registrado: mar 2005
Posts: 59
Poder: 20
CarmaZone Va por buen camino
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

Salu2!!!

Última edición por CarmaZone fecha: 27-06-2005 a las 18:38:20.
Responder Con Cita
  #4  
Antiguo 27-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 27-06-2005
CarmaZone CarmaZone is offline
Miembro
 
Registrado: mar 2005
Posts: 59
Poder: 20
CarmaZone Va por buen camino
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 , 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!!!

Última edición por CarmaZone fecha: 27-06-2005 a las 20:57:15.
Responder Con Cita
  #6  
Antiguo 27-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Si query_Lin_Alb tiene los albaranes a meter en cada linea de factura. ¿Qué tiene query_Alb?

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 27-06-2005
CarmaZone CarmaZone is offline
Miembro
 
Registrado: mar 2005
Posts: 59
Poder: 20
CarmaZone Va por buen camino
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

Salu2!!!

Última edición por CarmaZone fecha: 27-06-2005 a las 21:11:32.
Responder Con Cita
  #8  
Antiguo 27-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 27-06-2005
CarmaZone CarmaZone is offline
Miembro
 
Registrado: mar 2005
Posts: 59
Poder: 20
CarmaZone Va por buen camino
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º

Última edición por CarmaZone fecha: 27-06-2005 a las 22:03:42.
Responder Con Cita
  #10  
Antiguo 28-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 28-06-2005
CarmaZone CarmaZone is offline
Miembro
 
Registrado: mar 2005
Posts: 59
Poder: 20
CarmaZone Va por buen camino
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

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

Gracias por todo y Salu2!!!
Responder Con Cita
  #12  
Antiguo 28-06-2005
CarmaZone CarmaZone is offline
Miembro
 
Registrado: mar 2005
Posts: 59
Poder: 20
CarmaZone Va por buen camino
Pues creo que ya me lo guarda todo bieeeeeeeeeeeeeeen el problema estaba en los enable y disablecontrols , 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

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!!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 22:28: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
Copyright 1996-2007 Club Delphi