unit uReferenciasUtils;

interface


{ Si ARef1 < ARef2 -> Result := -1
  Si ARef1 = ARef2 -> Result := 0
  Si ARef1 > ARef2 -> Result := 1 }
function CompararReferencias(const ARef1, ARef2 : String) : Integer;

function DarReferenciaSiguiente(const Referencia: String): String;

implementation

uses
  JclAnsiStrings, cxVariants, SysUtils;

function CompararReferencias(const ARef1, ARef2 : String) : Integer;
var
  Aux1, Aux2 : String;
  AuxInt1, AuxInt2: Double;
  Rpl : Char;
begin
  Rpl := ' ';
  Aux1 := StrReplaceButChars(ARef1, AnsiDecDigits, Rpl);
  Aux1 := StrRemoveChars(Aux1, AnsiWhiteSpace);
  Aux2 := StrReplaceButChars(ARef2, AnsiDecDigits, Rpl);
  Aux2 := StrRemoveChars(Aux2, AnsiWhiteSpace);

  if StrIsDigit(Aux1) and StrIsDigit(Aux2) then
  begin
    AuxInt1 := StrToFloatSafe(Aux1);
    AuxInt2 := StrToFloatSafe(Aux2);
    Result := VarCompare(AuxInt1, AuxInt2)
  end
  else
    Result := VarCompare(Aux1, Aux2)
end;


{ 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.
