unit uReferenciasUtils;

interface

uses
  uDAInterfaces, uDADataTable, uDABusinessProcessor;

  function darReferenciaSiguiente(const Referencia: String): String;

implementation

uses
  SysUtils;

{ Se utiliza en las reglas de negocio del servidor y
  devuelve la conexión utilizada por el BusinessProcessor para
  procesar los deltas. }
function darReferenciaSiguiente(const Referencia: String): String;
var
  ParteEntera, ParteCaracter: String;
  Semaforo: Boolean;
  i, LongitudParteEntera: Integer;
begin
  //Por defecto la parte caracter será todo
  ParteCaracter := Copy(Referencia, 1, length(Referencia));
  Semaforo:= false;
  for i := 0 to length(Referencia) do
  begin
    if (Referencia[i] in ['0','1','2','3','4','5','6','7','8','9']) then
    begin
       if not Semaforo then
       begin
          //Cogemos el resto de la cadena suponiendo que no hay más caracter
          ParteEntera := Copy(Referencia, i, length(Referencia)+1);
          Semaforo := true;
       end;
    end
    else
    begin
       //Volvemos a asignar la parte caracter ya que hemos encontrado otro
       //e inicializamos el semáforo para volver a coger la parte entera si encontramos
       //algún número
       ParteCaracter := Copy(Referencia, 1, i);
       Semaforo := False;
    end;
  end;

  LongitudParteEntera := Length(ParteEntera);
  //Si no tenemos ningún número en parte entera asignamos 1 por defecto
  try
    i := StrToInt(ParteEntera);
  except
    i := 1;
  end;

  //Incrementamos y rellenamos con ceros, en el caso de ser necesario
  Inc(i);
  ParteEntera := IntToStr(i);
  for i:=Length(ParteEntera) to LongitudParteEntera-1 do
      ParteEntera := '0' + ParteEntera;

  Result := ParteCaracter + ParteEntera;
end;


end.
