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; 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; SQL.Clear;
SQL.Add('SELECT * FROM FOLIOS_FACTURAS WHERE SUCURSAL=:SUCURSAL');
ParamByName('SUCURSAL').AsString := aSucursal;
Open;
aFolioTalon := FieldByName('ULTIMO_FOLIO_TALON').AsInteger; aFolioCFD := FieldByName('ULTIMO_FOLIO_CFD').AsInteger;
aSerieFiscal := FieldByName('SERIE_FISCAL').AsString;
Close;
Capadatos.Commit; Result := True;
Except
capadatos.RollBack; 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.