Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   No trabaja el autoincremental (https://www.clubdelphi.com/foros/showthread.php?t=92432)

The Cid James 27-10-2017 06:15:18

No trabaja el autoincremental
 
Tenia el siguiente problema con un form =>hilo del problema

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

Código Delphi [-]
  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

Cita:

Empezado por Casimiro Notevi (Mensaje 522062)
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:

Código Delphi [-]
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

Cita:

Empezado por ElDioni (Mensaje 522075)
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:

Código Delphi [-]
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

Código Delphi [-]
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

Cita:

Empezado por wilcg (Mensaje 522119)
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

Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 17:42:20.

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