Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Sumar un Numero real Una Cadena (https://www.clubdelphi.com/foros/showthread.php?t=77112)

hondaalberto 22-12-2011 15:23:14

Sumar un Numero real Una Cadena
 
Buenos dias a Todos

Mi Inquietud es la Siguiente: Estoy utilizando delphi7 y SqlServer Express 2008 y necesito que al momento de grabar las facturas en la base de datos, asignarle un Número de Comprobante Fiscal a cada una de ellas el cual es un String que contiene números y letras y debo incrementarlo en uno cada vez que se genera una nueva factura.

El Número de comprobante Fiscal tiene la Siguiente estructura "A010010010100000001" Donde los primero 11 caracteres son fijos y los demas 8 corresponden a la Secuencia.

Para almacenas esta información utilizo una tabla llamada <Serie> la cual tiene los Siguientes Campos:

Inicial, varchar(19)
Final, varchar(19)
último Utilizado varchar(19)

En el Campo Inicial y final ya tengo la Secuencia que voy a utilizar antes de empezar a Facturar
Ej: Inicial = A010010010100000001 y Final = A010010010100000050

En el Campo último utilizado debo ir guardando cual fue el Ultimo Número de comprobante fiscal que se asigno a las Facturas.

Lo que necesito sabes es como puedo A esta Cadena(A010010010100000001) Sumarle uno y obtener como resultado la siguiente cadena (A010010010100000002).

Muchas Gracias de Antemano a Todos por Su valioso tiempo y ayuda.

MartinS 22-12-2011 16:04:32

Hola: A ver si entendí la pregunta

Aqui va el algoritmo

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var Original,AConvertir, Nuevo: String;
    ValorAnterior, NuevoValor: Int64;
    i : Integer;
begin
  // Valor original en formato string
  Original := Edit1.Text;
  // Tomo solo la parte que interesa
  AConvertir := Copy(Original,12,08);
  // y la borro
  Delete(Original,12,08);
  // Convierto el resultante a entero
  ValorAnterior := StrToInt(AConvertir);
  // le sumo uno
  Inc(ValorAnterior);
  // y lo asigno a una variable
  NuevoValor := ValorAnterior;
  //  completo una variable string con ceros antes del valor resultante;
  for i := 1 to (8-Length(IntToStr(NuevoValor))) do
    Insert('0',Nuevo,I);
  // y le agrego el numero final como string
  Nuevo := Nuevo+IntToStr(NuevoValor);
  // Despues le agrego eso nuevo a la cadena que le habia quidato el final
  Edit2.Text := Original+Nuevo;
end;


Para probarlo inicia una nueva aplicacion y agrega dos TEdit y un boton donde pegas este codigo. (lo probe con el texto de tu mensaje y pareciera que anda). Saludos

hondaalberto 22-12-2011 19:39:38

Muchas Gracias Martin, lo voy a probar y te dejo saber como me fue, pero muchas gracias por tu ayuda y por tu tiempo.

hondaalberto 23-12-2011 14:26:52

La lógica esta buena pero lo que necesito hacer es Tomar el número de Comprobante Fiscal desde la tabla serie y hacer el incremento de la Cadena tomando en cuenta el último utilizado, no digitarlo en un edit, porque la idea es que al momento de registrar la factura de forma automatica tengo que incrementar el Número de comprobante y asignarselo a la nueva factura.

ecfisa 23-12-2011 18:05:35

Hola Alberto.

Lo ideal sería hacerte un procedimiento almacenado al efecto pero no conozco la sintáxis de SqlServer. Desde Delphi podrías hacer algo como:
Código Delphi [-]
function TForm1.ProxNroComprobante: string;
begin
  with TuQuery do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT NRO_COMPROBANTE FROM TABLA_SERIE'); // supongo la tabla con un registro
    Open;
    Result:= 'A0100100101' +
      StringOfChar('0', 8 - Length(FieldByName('NRO_COMPROBANTE').AsString)) +
      IntToStr(FieldByName('NRO_COMPROBANTE').AsInteger + 1 );
    Close;
  end;
end;
Donde NRO_COMPROBANTE sería el campo de la tabla (TABLA_SERIE) de donde se tóma el número de comprobante fiscal.

Ejemplo de uso:
Código Delphi [-]
   NuevaFactura.AsString:= ProxNroComprobante;

Saludos.

MartinS 23-12-2011 23:53:35

Cita:

Empezado por hondaalberto (Mensaje 421820)
La lógica esta buena pero lo que necesito hacer es Tomar el número de Comprobante Fiscal desde la tabla serie y hacer el incremento de la Cadena tomando en cuenta el último utilizado, no digitarlo en un edit, porque la idea es que al momento de registrar la factura de forma automatica tengo que incrementar el Número de comprobante y asignarselo a la nueva factura.

Esta bien Alberto, la idea era que vieras como se podria recortar el numero de factura guardado que contiene letras, convertirlo en entero, sumarle uno y generar un nuevo string con el nuevo numero. Lo que dice ecfisa es correcto pero yo tampoco conozco SQL Server.

El procedimiento tambien lo puedes hacer como una funcion donde le das el numero que tenes guardado y te da el nuevo donde luego se lo pasarias como parametro para el nuevo registro.-

AzidRain 24-12-2011 00:04:46

Solo una pregunta que siempre termina por ser un problema cuando guardamos en algun lado la última factura generada: la concurrencia. Para un solo puesto de facturación no hay problema pero de uno a mil la cosa se complica. Lo mejor es desarollar el mecanismo de asignación directamente en el servidor o bien obtener ese último dato justo antes de guardar la factura. En MySQL por ejemplo tengo un campo autoincrementado que me mantiene todo bajo control ya que el programa cliente le pide un folio, este se lo asigna y asi continua con los demás de manera que nunca hay que llevar el control manualmente. O bien que de antemano te conste que la factura tiene el folio deseado en cuyo caso no vale la pena tal control, pero lo que comentas se trata de factura electrónica.

AzidRain 24-12-2011 00:07:43

Como recomendación, siempre que en el folio convivan letras y números hay que tratar de divirlos hasta donde se pueda, en tu caso bastan 2 campos: serie (char) y folio (longint), tanto por código como por SQL puedes hacer la concatenación para obtener el código completo y te olvidas de conversiones más adelante


La franja horaria es GMT +2. Ahora son las 19:58:57.

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