PDA

Ver la Versión Completa : No trabaja el autoincremental


The Cid James
27-10-2017, 06:15:18
Tenia el siguiente problema con un form =>hilo del problema (http://www.clubdelphi.com/foros/showthread.php?t=92425)

El problema era que al abrir el form ejecutaba el post al abir el form

fmodulo.tVenta.Active := true;
fmodulo.tVenta.Insert;
fmodulo.tVenta.Edit;
fmodulo.tVenta.Post; // este codigo fue el que removí para solucionarlo
fmodulo.tVentadetalle.Active :=true;
fventa :=tfVenta.Create(self);
fVenta.ManualDock(dp1);
fVenta.Align := alclient;
fventa.Show;

Pero ahora la aplicacion no trabaja como corresponde, no me genera el id_venta automaticamente por lo cual mi pregunta seria como puedo generar el id_venta si no hago el post antes hacer el post al abir el form sin que vuelva a tener el problema de que me genere registros de ventas como en el hilo que puse al principio

Gracias por su tiempo

Casimiro Notevi
27-10-2017, 10:21:27
Tendrás que dar más información, no vemos tu ordenador desde aquí ;)

The Cid James
27-10-2017, 10:56:40
Tendrás que dar más información, no vemos tu ordenador desde aquí ;)

A ver así, tengo dos form uno venta y uno principal en el principal tengo un botón que dice nueva venta (el código que pase) y abre venta que tiene el dbedit que extrae el dato de N° de venta que es un autoincremental en la base de datos.
Cuando tenia el código que saque me daba el numero de venta osea que auto incrementaba normalmente cuando creaba el formulario y hacia el post, ahora que lo saque no hace nada.

ElDioni
27-10-2017, 14:49:21
No se que es lo que quieres conseguir o que es lo que no consigues, de todas formas si que veo algo raro en tú código y es estas dos líneas:


fmodulo.tVenta.Insert;
fmodulo.tVenta.Edit;


Haces un insert y a continuación un edit en el mismo objeto, creo que el Edit sobraría.

Saludos.

The Cid James
28-10-2017, 02:51:41
No se que es lo que quieres conseguir o que es lo que no consigues, de todas formas si que veo algo raro en tú código y es estas dos líneas:


fmodulo.tVenta.Insert;
fmodulo.tVenta.Edit;


Haces un insert y a continuación un edit en el mismo objeto, creo que el Edit sobraría.

Saludos.

No tiene nada que ver con el problema pero si tenes razon, gracias

Casimiro Notevi
28-10-2017, 17:26:02
Tienes un problema de "concepto" en el desarrollo, o también puede ser que no lo haya entendido, ¿para qué quieres saber el número autoincremental? y ¿exactamente qué es ese número, un ID para claves primarias, o un número sucesivo como el de una factura, por ejemplo?

The Cid James
29-10-2017, 01:43:56
Es el n de factura por eso es un autoincremental y al abrir el form de la forma que hacia antes (con el post en el botón del llamado)me lo mostraba,el problema que de esa forma aunque no se facturara (se cancelara la venta por ejempo ) igual el autoincremental subia por eso el hilo anterior

Casimiro Notevi
29-10-2017, 11:36:43
No puedes usar un autoincremental para el número de factura, porque a veces puede que canceles alguna, borres, etc. y se perderían números. Para el número de factura debes usar el "último+1".

The Cid James
29-10-2017, 14:41:28
Estoy usando un campo SI/NO en el caso de anulación, pero aunque no la use el autoincremental tampoco debería subir en el caso de que no se haga la compra, y en la practica aunque se anule la boleta incrementa el n° de factura porque no deberías ser capaz de usar la misma.

Y ahi mi problema... si hago el post al abrir el form el auto incremental sube incluso si cancelo la operación y sino lo hago no veo el numero de factura

Casimiro Notevi
29-10-2017, 17:50:04
Por eso te digo que un autoincremental no se usa para números de facturas.

wilcg
30-10-2017, 04:51:23
Hola The Cid James,
quizas te sirva esto, yo uso un autoincremental de esta manera y al mismo tiempo le indico de que numero iniciar y
podras manejar el ID a tu antojo, solo haz como te indico y pruebalo y analizalo si te sirve luego lo personalizas
a tu agrado.

te menciono que uso componentes UniDac, creo que no va haber diferencias con otros componentes.

Necesitaras un Query y renombralo como Generador, vas al Fields Editor -> New Field -> en
Name -> dale un nombre ID
Type -> indica el tipo de campo a INTEGER
Component -> teva a generar un nombre algo asi GeneradorID

luego usa esta FUNCION

function GenerarID( tTabla, tCampoId :string; tNum :integer): Integer;
var
NCodigo: Integer;
begin
with Generador do
begin
Close;
SQL.Clear;
SQL.Add('SELECT MAX(' + tCampoId );
SQL.Add(') AS ID FROM ' + tTabla );
Open;
NCodigo := GeneradorID.AsInteger;
if NCodigo = 0 then
Result := tNum
else
Result := NCodigo + 1;
Close;
Active := False;
end;

{
USO: GenerarID( 'clientes','id_cliente',3001);

ejemplo
GenerarID( 'clientes', //Nombre de la tabla
'id_cliente', //Nombre del campo a incrementar, tiene que ser numerico, etc
3001 //Aca le indicas de que numero quieres que inicie por primera vez
);
}
end;

NOTA: probado en PostgreSQL y Acces. en SQLite no va hay que adaptarla.
mas claro imposible...

The Cid James
30-10-2017, 10:34:04
Hola The Cid James,
quizas te sirva esto, yo uso un autoincremental de esta manera y al mismo tiempo le indico de que numero iniciar y
podras manejar el ID a tu antojo, solo haz como te indico y pruebalo y analizalo si te sirve luego lo personalizas
a tu agrado.

te menciono que uso componentes UniDac, creo que no va haber diferencias con otros componentes.

Necesitaras un Query y renombralo como Generador, vas al Fields Editor -> New Field -> en
Name -> dale un nombre ID
Type -> indica el tipo de campo a INTEGER
Component -> teva a generar un nombre algo asi GeneradorID

luego usa esta FUNCION

function GenerarID( tTabla, tCampoId :string; tNum :integer): Integer;
var
NCodigo: Integer;
begin
with Generador do
begin
Close;
SQL.Clear;
SQL.Add('SELECT MAX(' + tCampoId );
SQL.Add(') AS ID FROM ' + tTabla );
Open;
NCodigo := GeneradorID.AsInteger;
if NCodigo = 0 then
Result := tNum
else
Result := NCodigo + 1;
Close;
Active := False;
end;

{
USO: GenerarID( 'clientes','id_cliente',3001);

ejemplo
GenerarID( 'clientes', //Nombre de la tabla
'id_cliente', //Nombre del campo a incrementar, tiene que ser numerico, etc
3001 //Aca le indicas de que numero quieres que inicie por primera vez
);
}
end;

NOTA: probado en PostgreSQL y Acces. en SQLite no va hay que adaptarla.
mas claro imposible...
Ahora veo como adapto para sql, estaba pensando exactamente el algo así para la solución e iba a preguntar como podía obtener el valor max para poder hacerlo xD.
Muchas gracias