Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   como utilizo un campo con autoincremento. (https://www.clubdelphi.com/foros/showthread.php?t=26070)

aurbano 12-10-2005 14:37:50

como utilizo un campo con autoincremento.
 
Buenos dias.

Necesito de su ayuda para utilizar, un campo con autoincremento.

Tengo un campo con autoincremento llamado Nro_fact, en la tabla ventas.

Cuando trato de guardar varios registros en la tabla ventas por medio de un dbgrid, el campo me aumenta por cada registro guardado.

Como puedo hacer para que el autoincremento, asigne el mismo numero por cada registro y al finalizar guarde el registro en la tabla de ventas, y se autoincremente en uno.

Ejemplo:


Si quiero vender varios productos, deben tener el mismo nro. de Factura y guardar estos productos en la tabla ventas correr al siguiente nro. de factura.

El codigo que utilizo es este:


procedure TForm8.RoundButton1Click(Sender: TObject);
begin
table1.first;
while table1.Eof=false do
begin
form2.Table1.FindKey([table1.fieldbyname('serial').asinteger]);
form2.Table1.edit;
form2.Table1.fieldbyname('exi_PRO').asfloat := form2.Table1.fieldbyname('exi_pro').asfloat
+ dbgrid1.Fields[3].asfloat;
form2.Table1.FieldByName('iva_PRO').ascurrency:= form2.Table1.fieldbyname('prv_pro').AsCurrency * (14/100);
form2.Table1.fieldbyname('prV_PRO').AsCurrency:= dbgrid1.Fields[4].ascurrency * (40/100)
+ dbgrid1.Fields[4].ascurrency;
form2.Table1.Post;
/// REGISTRO EN LA TABLA DE ventas
TABLE2.INSERT;
table2.fieldbyname('fec_ven').asdatetime := date;
table2.fieldbyname('ser_ven').asinteger := dbgrid1.Fields[0].AsInteger;
table2.fieldbyname('Nro_fac').Asstring := dbedit1.field.Asstring;
table2.fieldbyname('Des_ven').asstring := dbgrid1.Fields[1].Asstring;
table2.fieldbyname('Can_ven').asfloat := dbgrid1.Fields[2].Asfloat;
table2.fieldbyname('Cun_ven').ascurrency := dbgrid1.Fields[3].Ascurrency;
table2.fieldbyname('IVA_ven').ascurrency := dbgrid1.Fields[4].Ascurrency;
table2.fieldbyname('Cot_ven').ascurrency := dbgrid1.Fields[5].Ascurrency;
table2.fieldbyname('RIF_ven').asstring := dbedit2.Field.AsString;
table2.fieldbyname('nom_ven').asstring := dbedit3.Field.AsString;
table2.fieldbyname('nit_ven').asinteger := dbedit4.Field.Asinteger;
table2.fieldbyname('dir_ven').asstring := dbedit5.field.AsString;
table2.fieldbyname('tel_ven').asstring := dbedit6.Field.AsString;
table2.post;
table1.Next;
end;
END;



Gracias por su ayuda.

Lepe 12-10-2005 14:56:24

Si buscas en el foro por factura, seguro que encuentras varias formas de hacerlo. En realidad necesitas 2 tablas.

Tabla:Factura
Guardas, el nro de factura, fecha, id del cliente, etc.

Tabla:LineasF
Guardas el mismo nro de factura, y cada línea de la factura, Descripción del producto vendido, cantidad, precio unitario.

Buscando por "factura Maestro Detalle" tambien puedes obtener resultados interesantes.

aurbano 14-10-2005 18:49:36

problema con autoincremento
 
Buenas tardes amigos del club delphi.


Necesito de su ayuda para poder inplementar el campo autoincremento. El amigo lepe me indico buscar en el foro, pero la informacion que encontre no me ayuda mucho.

Tengo dos tablas una llamada auxiliar de ventas y otra ventas. En la tabla auxiliar de ventas es en donde vacio la informacion de la venta. Ejemplo. Nro. de Factura monto fecha entre otros ya conocidos. Estos datos los vacio mediante un dbgrid y unos dbedit. En un dbedit tengo el Nro. de Factura con autoincremento.

El problema que tengo es que cada vez que introduzco en el dbgrid un articulo, en el dbedit el campo Nro. de factura se incrementa a uno



Entonces mi pregunta es como hago para que el nro. de factura no se incremente a uno, sino que despues de guardar los registros, se incremente.


De antemano, gracias.
:p

Lepe 14-10-2005 19:49:48

En primer lugar y con ánimo de que cambies los nombres, yo usaría nombres de tablas más intuitivos, por ejemplo:

tabla: Factura (encabezados y demás)
tabla: Lineas (los apuntes de cada venta)

Siguiendo esta nomenclatura, lo que tienes que hacer es:

Tabla Factura:
Campo Nro_Factura (el autoincremento)
En el OnNewRecord, no tienes que hacer nada. Como es un autoincremento se hace solo :D.

Tabla Lineas:
Tienes que añadir un campo (Foreign Key) numérico, donde guardarás el nro_Factura, lo llamo Fnro_Factura, (la F de Foreing Key, clave ajena o clave foránea, como quieras llamarlo..

Tienes que asegurarte que al dar de alta un registro en Lineas, ya haya uno definido de Factura. Como vamos a realizar un Maestro-Detalle, siempre ha de existir el registro de Facturas antes que el de Lineas.

Para relacionar en delphi estas dos tablas, vas al objeto tblLineas (tabla Lineas), y en MasterSource, eliges el tblFacturas (obviamente la tabla Facturas, o su DataSource correspondiente).

Espera que estoy abriendo el delphi :D :D. En tblLineas.MasterField haz clic en los 3 puntos, ahí se donde relacionas las dos tablas.

En la ventana que se abre, en MasterField, aparecen los campos de la tabla Factura, haz clic sobre nro_Factura.

En Detaild Field, elige Fnro_Factura (campo nuevo creado) y pulsa el boton Add.

Listo. Ya tienes las dos tablas relacionadas, cuando cambies de registro en la tabla Facturas, el grid que está relacionado con tblLineas, solo mostrará los apuntes de ventas de esa Factura.


Lo que hablaba de asegurarte de que exista un registro de Factura antes que las lineas, es muy facil. Por ejemplo:

En el BeforeInsert de la tabla lineas:
Código Delphi [-]
if tblFacturas.Fieldbyname(nro_factura).IsNull then
 tblfacturas.Append;
 tblfacturas.Post;
Si en una factura en blanco (por ejemplo la primera factura que se va a crear en el programa) el usuario, que es muy listo, y está esperando que falle tu programa para echarte la bulla, el tio listo se va directamente al grid de Lineas e intenta añadir un artículo, como todavía el nº de factura no se ha creado, el nro_factura es nulo, así que añade una nueva factura y se graba, desde este punto, ya existe el nro_factura para guardarlo en la tabla Lineas.

Advertencia: Primero se debe guardar la tabla Facturas (el Maestro) y despues las Lineas (el detalle) y siempre en ese orden.

En el BeforePost de Lineas añades:
Código Delphi [-]
  tblLineas.Fieldbyname('Fnro_factura').AsInteger := 
                     tblFacturas.Fieldbyname('nro_Factura').AsInteger;

Cierro el delphi ;) . Chaus

aurbano 17-10-2005 17:45:31

campo autonumerico
 
ok. lepe gracias por tu ayuda pondre en practica tu consejo.



gracias...:D

aurbano 22-10-2005 15:49:10

como utilizar campo autoincremento
 
Hola lepe

Como estas utilize lo que me recomendastes y no me sirvio, me da el mismo error.


Por favor si puedes bajar el programa de esta pagina:


http://geocities.yahoo.com/


El id es aurbano30
el password es: 091075

el programa se llama ejemplo.zip.


gracias por rtu ayuda.

Lepe 23-10-2005 12:46:45

Cita:

Empezado por aurbano
Entonces mi pregunta es como hago para que el nro. de factura no se incremente a uno, sino que despues de guardar los registros, se incremente.

Siendo concreto a tu pregunta: No se puede hacer. Un autoincremento funciona de esa forma que comentas.

Si quieres mayor control sobre el campo nro_factura, tendrás que implementar un autoincremento a mano, y olvidarte del que trae el Database Desktop.

Ahora en tu programa tienes autoincrementos por todos sitios, no sé cual estas usando realmente, si el de la tabla aux_Ventas o el de la tabla nro_factura. En princpio en la ventana de Ventas estas usando el de la tabla nro_factura

saludos

aurbano 25-10-2005 22:11:02

problema con autoincremento
 
El autoincremento que estoy utilizando es el de la tabla nro.factura campo fnro_FACT y este debe ser guardado en la tabla ventas en el campo nro_fact con los demas registros.

Utilize el metodo que me indicastes anteriormente y resulta que al comenzar en 0 o nulo me autoincrementa a 1 pero despues no me sigue autoincrementando el campo fnro_fact.

Por favor si puedes revisar otra vez la aplicacion para ver en que error falle.

Gracias lepe....


salu2

aurbano

Lepe 26-10-2005 11:25:51

Cita:

Empezado por aurbano
El autoincremento que estoy utilizando es el de la tabla nro.factura campo fnro_FACT y este debe ser guardado en la tabla ventas en el campo nro_fact con los demas registros.

Paradox no implementa integridad referencial en cascada, por tanto, tendrás que aumentar el autoincremento, tomar el valor y copiarlo a la tabla ventas a mano.


La franja horaria es GMT +2. Ahora son las 12:01:03.

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