Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-05-2007
Avatar de jorelivi
jorelivi jorelivi is offline
Miembro
 
Registrado: abr 2007
Posts: 45
Poder: 0
jorelivi Va por buen camino
Agregar ceros al pincipio de folio

Hola a todos,

Quiero hacer una funcion que me permita recorrer un tabla y a su vez agregar ceros al principio de un campo especifico.

Es decir, tengo un campo llamado NUM_DOCTO, el cual contiene el numero de la factura. Pero este folio se compone de 7 digitos que pueden ser nuemeros o letras, ejemplo: 0013245 ó A000456, algunos numeros de factura no tienen los ceros al pincipio (13245) y/o le faltan los ceros intermedios (A456).

Necesito hacer algo para insertarlos, me pueden ayudar.

Gracias
__________________
La sabiduría de los sabios y la experiencia de los siglos pueden ser conservadas con las citas.
Atte.
Jorelivi
Responder Con Cita
  #2  
Antiguo 02-05-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Si lo vas a hacer desde y si usas FireBird, puedes usar la función PadStr que viene en sus UDFs, pero si lo necesitas hacer desde delphi, puedes tratar de usar la siguiente función:

Código Delphi [-]
 
type
   TOrientacion = (toLeft, toRight);
 
function PadString(Cadena :String; Llenar_Con :Char; Cantidad :Integer; Orientacion :TOrientacion) :String;
var
  I    :Integer;
  Temp :String;
begin
  if Length(Cadena) >= Cantidad then
  begin
    SetLength(Cadena, Cantidad);
  end
  else
  begin
    for I := 0 to (Cantidad - (Length(Cadena)) -1) do
      Temp := Temp + Llenar_Con;
  end;
  if Orientacion = toRight then
    Result := Cadena + Temp
  else
    Result := Temp + Cadena;
end;

la cual se usa así, para tu primer caso:

Código Delphi [-]
 
PadString('13245', '0', 7, toLeft);

Eso colocara 2 ceros o los que sean que se necesiten a la izquierda de 12345 quedando 0012345, para el otro caso tendrás que adecuar la función para que reconozca dicha situación.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #3  
Antiguo 02-05-2007
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Aquí tienes un ejemplo que acabo de preparar, es para añadir ceros por la izquierda.

Código Delphi [-]
Function FillSpacesLeft(cVar:String;nLen:Integer):String;
 begin
 Result:=StringOfChar('0',nLen - Length(cVar))+cVar;
 end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=FillSpacesleft(Edit1.Text, 10);
end;

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #4  
Antiguo 02-05-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Otra manera de hacerlo,

Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Cadena: String;
  Caracter: Char;
begin
  Cadena := Edit1.Text;
  If Cadena[1] in ['A'..'Z'] then begin  
     Caracter := Cadena[1];
     Delete(Cadena,1,1);
     ShowMessage(Caracter+Format('%.*d',[6,StrtoInt(Cadena)]));
  end
  else begin
         ShowMessage(Format('%.*d',[7,StrtoInt(Cadena)]));
  end;
end;

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #5  
Antiguo 02-05-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por marcoszorrilla
Aquí tienes un ejemplo que acabo de preparar, es para añadir ceros por la izquierda.

Código Delphi [-]
Result:=StringOfChar('0',nLen - Length(cVar))+cVar;
Un Saludo.

Acabo de anotar esa función en la libreta de "Para no olvidar".
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #6  
Antiguo 03-05-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
La función que propuse quedo reducida a esto, gracias a marcos:
Código Delphi [-]
 
type
   TOrientacion = (toLeft, toRight);
 
Function PadString(cVar :String; Caracter :Char; nLen:Integer; Orientacion :TOrientacion):String;
begin
  if Orientacion = toLeft then
    Result:=StringOfChar(Caracter, nLen - Length(cVar))+cVar
  else
    Result:=cVar+StringOfChar(Caracter, nLen - Length(cVar));
end;

Y se puede usar asi, por ejemplo:

Código Delphi [-]
 
ShowMessage(PadString('12345', '0', 10, toLeft));
ShowMessage(PadString('12345', '0', 10, toRight));
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #7  
Antiguo 03-05-2007
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
otra mas:

Cadena := FormatFloat('0000000',num_docto);
Responder Con Cita
  #8  
Antiguo 07-05-2007
Avatar de jorelivi
jorelivi jorelivi is offline
Miembro
 
Registrado: abr 2007
Posts: 45
Poder: 0
jorelivi Va por buen camino
Gracias a todos por su apoyo, estoy muy contento de pertenecer a tan importante foro.


Sus consejos y ejemplos me han sido muy utiles.


Saludos
__________________
La sabiduría de los sabios y la experiencia de los siglos pueden ser conservadas con las citas.
Atte.
Jorelivi
Responder Con Cita
  #9  
Antiguo 08-05-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Hola!

Jhonny me ¿podrias explicar con manzanas y palitos como se usa la funcion que comentas al inicio de este hilo (PadStr) en Firebird? De hecho estoy iniciandome en Firebird, actualmente tengo un campo llamado codigo cuyo valor genero con un trigger, eso me funciona bien pero efectivamente quisiera añadir 0's por la izquierda para generar un numero de codigo de hasta 999,999

Gracias por tu atencion!
Responder Con Cita
  #10  
Antiguo 08-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
PadStr es una función de alguna biblioteca de componentes.

En firebird, deberías buscar alguna biblioteca de UDF rfunc (freeware) tiene tanto padleft como padright. Eso permite usar las funciones en el sql de una consulta.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 08-05-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
En cuanto a PadStr pues quizá me equivoque (Aunque podría crearce), porque en ese momento no tenia el FireBird a mano, pero debo decir que LPad y RPad si existen y sus respectivas declaraciones serian así:

Código SQL [-]
DECLARE EXTERNAL FUNCTION lpad 
 CSTRING(255) NULL, INTEGER, CSTRING(1) NULL
 RETURNS CSTRING(255) FREE_IT
 ENTRY_POINT 'IB_UDF_lpad' MODULE_NAME 'ib_udf';

y

Código SQL [-]
DECLARE EXTERNAL FUNCTION rpad 
 CSTRING(255) NULL, INTEGER, CSTRING(1) NULL
 RETURNS CSTRING(255) FREE_IT
 ENTRY_POINT 'IB_UDF_rpad' MODULE_NAME 'ib_udf';
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #12  
Antiguo 08-05-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Nuevamente por aqui!

Ok, ya cheque lo de la udf LPAD y RPAD ya la declare en mi BD (uso IBExpert) ahora bien aun no me queda claro como integro mi trigger con esta udf pues el trigger me genera un entero y udf me devuelve una cadena. Supongo que debe hacerse una conversion como en delphi StrtoInt. Disculpen la necedad pero realmente no entiendo.

Código SQL [-]
//Trigger para generar un numero de codigo 
AS
begin
  if (new.codigo is null ) then
    new.codigo = gen_id (cod_pro_gen, 1);
end
 
//UDF LPAD: Alarga una cadena en la cantidad de digitos solicitados con 
//el caracter solicitado
//LPad(Cadena, Digitos, Caracter)
DECLARE EXTERNAL FUNCTION LPAD
    CSTRING(255) NULL,
    INTEGER,
    CSTRING(1) NULL
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'ib_udf_lpad' MODULE_NAME 'ib_udf'

Última edición por dec fecha: 08-05-2007 a las 20:35:12.
Responder Con Cita
  #13  
Antiguo 08-05-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Si tu campo "Codigo" es de tipo Integer no te va a quedar almacenado algo como 000001, para lograr el efecto que deseas debes tener tu campo como tipo String.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #14  
Antiguo 09-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Yo más bien estaba pensando en usar padleft cuando haya que mostrar al usuario la clave primaria, pero que internamente use el campo entero.

Por ejemplo, si hacemos una vista (view) para la tabla cliente, allí usamos
Código SQL [-]
select lpad( cast(idcliente as char(20), '0',20), direccion, nombre from clientes

De esta forma tienes la ventaja de usar un entero para las búsquedas, triggers, etc. de la base de datos, pero muestras al usuario el número formateado.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #15  
Antiguo 10-05-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Gracias a todos!
Lepe, habia llegado a la misma conclusion pero no sabia como implementarla.
Nuevamente gracias!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como poner ceros antes y despues de un numero fraccionario? Luis Alberto Varios 6 21-12-2005 21:29:24
Como llenar con espacion en blanco o con ceros una cadena? Luis Alberto Varios 10 02-12-2005 19:14:02
Como poner ceros delante de un numero? juliopag1 Firebird e Interbase 4 28-09-2005 01:11:06
imprimir una imagen en tamaño folio rebollo75 Impresión 3 20-04-2005 18:35:42
Ceros antes de un numero MRSAM Varios 2 24-11-2004 03:24:08


La franja horaria es GMT +2. Ahora son las 13:39:00.


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
Copyright 1996-2007 Club Delphi