Ver Mensaje Individual
  #8  
Antiguo 25-04-2012
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Reputación: 21
AzidRain Va camino a la fama
Te pongo un ejemplo de como lograr lo que necesitas.

Requisitos Previos:

La tabla donde vas a llevar el control de folios debe ser InnoDB ya que vamos a utilizar transacciones, aqui tienes un script para crearla:

Código SQL [-]
CREATE TABLE `folios_facturas` (
  `sucursal` varchar(3) NOT NULL DEFAULT '',
  `ultimo_folio_talon` int(11) DEFAULT NULL,
  `ultimo_folio_cfd` int(11) DEFAULT NULL,
  `serie_fiscal` varchar(5) DEFAULT NULL,
  PRIMARY KEY (`sucursal`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

En este ejemplo tenemos 4 campos, puedes usar los que necesites segun los folios que quieras controlar, bastaria con tener solo uno que contenga el ultimo folio de factura utilizado. Vamos a dejar sin uso el campo sucursal y serie fiscal. Asi que inicializamos la tabla creando un registro que contenga los folios con que iniciamos

Código SQL [-]
  INSERT FOLIOS_FACTURAS SET ULTIMO_FOLIO_talon=1, SUCURSAL="X";

Ahora si ya podemos empezar a actualizar la tabla segun los folios que vayamos ocupando, yo lo hago mediante la siguiente función que me da el folio que voy a utilizar.

Código Delphi [-]

function GetFolios(var aFolioCFD,aFolioTalon:Integer;var aSerieFiscal: string; aSucursal:string):Boolean;
begin
  Result := FALSE;
  capadatos.StartTrans;   // Iniciamos la transacción
  with Capadatos.QueryCreate('UPDATE FOLIOS_FACTURAS SET ULTIMO_FOLIO_TALON=ULTIMO_FOLIO_TALON+1, ULTIMO_FOLIO_CFD=ULTIMO_FOLIO_CFD+1 WHERE SUCURSAL=:SUCURSAL') do
  Try
   Try
    ParamByName('SUCURSAL').AsString := aSucursal;
    ExecSQL;                // Se ejecuta el query para aumentar el folio
    SQL.Clear;
    SQL.Add('SELECT * FROM FOLIOS_FACTURAS WHERE SUCURSAL=:SUCURSAL');
    ParamByName('SUCURSAL').AsString := aSucursal;
    Open;
    aFolioTalon  := FieldByName('ULTIMO_FOLIO_TALON').AsInteger;  //Leemos los folios ya actualizados
    aFolioCFD    := FieldByName('ULTIMO_FOLIO_CFD').AsInteger;
    aSerieFiscal := FieldByName('SERIE_FISCAL').AsString;
    Close;
    Capadatos.Commit;  //Cerramos la transacción
    Result := True;

  Except
     capadatos.RollBack; // Si algo falla, abortamos la transacción y el folio permanece sin cambios
  end;
  Finally
    Free;
  End;
end;

Yo utilizo Zeos para hacer el acceso a datos, pero lo puedes modificar sin problema para usar cualquier componente.

Ahora bien, para usar la función hacemos:

1.- Editamos los datos de la factura, documento o lo que sea (excepto el folio, ese lo dejamos al final)
2.- Llamamos a la funcion que nos dará el folio
3.- Guardamos la factura con el folio que obtuvimos.

También puedes abrir la transacción antes de llamar a la funcion y cerrarla justo despues de guardar la factura.

Efecto:

Mientras esta abierta la transacción, cualquier otro usuario no podrá obtener un numero de folio hasta que se cierre o aborte la transacción. De esta forma nunca habrá la posibilidad de que 2 usuarios obtengan el mismo folio.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita