PDA

Ver la Versión Completa : Rellenar de ceros en firebird.


eduarcol
04-07-2008, 14:45:23
Como puedo hacer para rellenar un campo con ceros desde SQL, en Firebird 2.0. Yo tengo un query asi:

Insert into Facturas (Numero,...) values ((Select Gen_Id(FACTURAS, 1) from rdb$database));

hasta aqui todo bien, pero el numero de factura es string y deberia quedar 00000001

Firebird tendra alguna funcion para eso o debo generar el UDF???

duilioisola
04-07-2008, 15:06:11
en el trigger:

begin
numero = Gen_Id(FACTURAS, 1);
num_factura = cast(numero as varchar(8));
/* 8 guiones bajos, significa 8 espacios de largo */
while (new.num_factura not like '________') do
new.num_factura='0'||new.num_factura;
end;

jhonny
04-07-2008, 15:08:37
Otra opción es la siguiente:

En Firebird 2.1 no tendrias que hacer nada mas ya que existe la función lpad dentro del motor... solo sería cuestión de hacer lo siguiente:

Insert into Facturas (Numero,...) values (lpad((Select Gen_Id(FACTURAS, 1) from rdb$database), 8, '0'));

Pero como estas usando Firebird 2.0, deberas registrar la UDF, lo bueno es que esa función ya viene en las UDFs que se distribuyen dentro de Firebird 2.0, por lo que solo bastaría con hacer lo siguiente:

DECLARE EXTERNAL FUNCTION lpad
CSTRING(255), INTEGER, CSTRING(1)
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'IB_UDF_lpad' MODULE_NAME 'ib_udf';

Y luego si, en tu sentencia SQL, hacer lo que dije mas arriba, osea:

Insert into Facturas (Numero,...) values (lpad((Select Gen_Id(FACTURAS, 1) from rdb$database), 8, '0'));

Y listo, eso es todo. Espero te sirva :).

eduarcol
04-07-2008, 15:38:51
gracias a los dos, voy a ponerlo en practica a ver que tal

eduarcol
04-07-2008, 16:14:56
ok pobre la de Udf y funciono de pelos, ahora en termino de rendimiento que es lo mas recomendado?, buscar si la udf ya esta registrada o registrarla siempre que la necesite?, al menos en local no velo diferencia significativa, en redes no he podido probarlo :confused:

RolphyReyes
04-07-2008, 16:25:00
Saludos.

Para que te funcione debes de registrarla inmediamente, osea que si ya tienes la BD en produccion debes de ir donde este e instalarla la UDF.

Hasta luego.

jhonny
04-07-2008, 16:49:13
Saludos.

Para que te funcione debes de registrarla inmediamente, osea que si ya tienes la BD en produccion debes de ir donde este e instalarla la UDF.

Hasta luego.

Lo bueno es que como esta función pertenece a una UDF se que ditribuye con FireBird 2.0, entonces ya la deben tener los servidores donde instalaste Firebird 2.0, solo sera cuestión de ejecutar el script para registrarla y listo (Con cualquier actualizador de tu aplicativo, podrias hacerlo).

Pero eso si, debes tener en cuenta que si te actualizas a Firebird 2.1 o superior, ya no necesitaras registrarla, porque dicha función ya viene en el motor ;).

Al González
05-07-2008, 05:25:57
...Pero eso si, debes tener en cuenta que si te actualizas a Firebird 2.1 o superior, ya no necesitaras registrarla, porque dicha función ya viene en el motor ;).
Una idea para tu blog: creo que sería interesante que publicaras una especie de prontuario con todas las nuevas funciones que vienen integradas en Firebird 2 y 2.1. Para los que en algún momento daremos el salto desde la versión 1.5. :)

Saludos y felicidades por los cinco mil "posts". ;)

Al.

jhonny
05-07-2008, 17:31:41
Una idea para tu blog: creo que sería interesante que publicaras una especie de prontuario con todas las nuevas funciones que vienen integradas en Firebird 2 y 2.1. Para los que en algún momento daremos el salto desde la versión 1.5. :)

Saludos y felicidades por los cinco mil "posts". ;)

Al.

Primero que todo, gracias por la felicitación :).

En cuanto a lo de publicar las funciones de Firebird en el Blog, pues es una labor que pronto ire publicando, no todas al tiempo porque son muchas, pero si una a una, de todas formas por ahora he ido publicando las caracteristicas principales.

maxid
23-10-2008, 18:56:20
No sabia de la funcion y me vino al pelo ya que queria una columna año y mes ordenada pero al no tener los ceros a la izquierda me ordena el 1 juanto al diez y no muestra la consecutividad.

Gracias por tu aporte

jhonny
23-10-2008, 19:25:50
Que bueno que te haya servido la función, ya sea que te refieras a la mia o a la indicada por duilioisola :).

A proposito, el articulo que prometí en el 9 post de este hilo, decidí hacerlo en aquella ocasión simplemente traducioendo el archivo README.builtin_functions.txt de Firebird 2.1 y lo publiqué en http://jhonny.clubdelphi.com/?p=48