miércoles, 12 de noviembre de 2008

Postgres: Cantidad de Transacciones por dia.

Para determinar la cantidad de transacciones diarias deberas de ejecutar al siguiente instruccion:

select datname, xact_commit, xact_rollback from pg_stat_database;

Por Ej. el resultado puede ser el que adjunta en la imagen.


Para hacer el calculo tomemos como ejemplo bd_5 y realicemos lo siguiente:
1514158 -
219 = 1513939

Donde
1513939 son la cantidad de transacciones desde que se instalo o comenzo a utilizarse la Base de Datos, ahora para determinar cuantas se ejecutaron durante un dia debera de ejecutarse al dia siguiente (misma hora de preferencia) la misma instruccion y comparar los resultados.

Continúa...

sábado, 11 de octubre de 2008

Editor VIM : Algunos SET Importantes

Aqui algunos Seteos del Editor VIM, pueden ser de mucha ayuda.

set nocompatible Añadiendo en nuestro fichero vimrc la opción ”set nocompatible”, hacemos que VIM permita utilizar funciones extras que no están disponibles en el VI clásico y tradicional. Seria importante que la tengan definida en el .vimrc. Utilizar ”set compatible” u omitir esta opción hará que algunas de las mejores funcionalidades de VIM no estén disponibles, para preservar la compatibilidad con VI.

set autoindent Esta función (también puede utilizarse ”set ai”), hace que cuando pulsemos enter en un fichero de texto, la nueva línea que insertamos sea indentada automáticamente (es decir, se inserten espacios al principio de la misma y el cursor se posicione en una determinada posición). Esto puede servir, por ejemplo, para programar: si estamos escribiendo un bloque de código indentado a 3 espacios (por ejemplo), al pulsar enter no empezaremos en el primer carácter sino que automáticamente se nos situará el cursor en la columna 3. Literalmente, lo que hace VIM es que cuando pulsamos Enter, indenta la nueva línea a la misma profundidad que la anterior.

set noai Esta función hace lo contrario de ”set autoindent”, es decir, cuando pulsemos Enter iremos directamente al primer carácter de la siguiente línea. Esta función resulta muy útil cuando estamos editando código indentado y queremos, por ejemplo, pegar texto o código desde una selección de texto externa (copiar y pegar desde un navegador, otro editor, etc.). Como el texto que pegamos ya está indentado, no necesitamos que Vim lo indente añadiendo espacios. Si lo pegáramos tal cual, veríamos como la indentación original sumada a la identación automática de Vim haría que no se respetara el indentado real del texto. Para evitar esto, podemos pulsar ESC (pasar a modo comando), y teclear ”:set noai”, y pegar el texto externo (que se pegará bien). Después podemos volver al modo de identación con ESC y ”:set ai”.

set backup Si está activada esta opción, cada vez que grabemos el fichero se almacenará una copia de la ”versión” anterior como fichero~ (con el carácter ’~’ detrás).

set nobackup Esto sirve para lo contrario que ”set backup”, es decir, para deshabilitar la generación de ficheros de backup.

set ruler Con ”set ruler”, VIM muestra la posición X,Y actual del cursor en la barra de estado.
set wrap Activa el ”cortado” de líneas largas en pantalla: si tenemos activada esta opción y una línea es más larga (de ancho) que lo que podemos ver en nuestra ventana del editor, VIM la partirá (visualmente). Si no la tenemos activada, simplemente sólo podremos ver desde el inicio de la línea hasta lo que nos permita la ventana del editor o la terminal (pero no partirá la línea).
set nowrap Las líneas que no caben en pantalla no serán visualmente partidas (lo contrario de set wrap).

set incsearch Habilita la búsqueda incremental: esto implica que cuando hacemos búsquedas con el comando ”/”, Vim no esperará a que pulsemos ENTER para comenzar la búsqueda. VIM irá buscando las palabras conforme vayamos tecleando sus diferentes letras.

set hlsearch Habilita el coloreado de las palabras encontradas en las búsquedas, en un color diferente del color del texto.

set tabstop y set sw Estas 2 opciones permiten definir el tamaño (en espacios) de los tabuladores (por defecto suelen ser 8). Un ejemplo de uso sería ”set tabstop=3” y ”set sw=3”.

set expandtap Convertir todos los tabuladores en espacios: ideal para los que, como yo, detestan los tabuladores y prefiráis los espacios para tabular. Junto a las 2 opciones anteriores, cuando pulséis ”TAB” no se introducirá un carácter tabulador sino el número de espacios prefijados.

set noerrobells Evitar que Vim ”pite” en caso de error.

syntax on Como ya hemos visto, activa el coloreado de sintaxis (si VIM entiende el formato del fichero que editamos). La orden que lo desactiva sería ”syntax off”.

Para ver un excelente Manual clic aqui.

Continúa...

viernes, 10 de octubre de 2008

Como Crear o Quemar una Imagen ISO

Normalmente siempre es un problema Quemar las Imagenes ISO, necesitas algun software de pago y medio complicado de utilizar, un poco por necesidad y por casualidad encontre un Software bastante intuitivo y sencillo de utilizar, ademas de la simpleza con la que se instala.

Si deseas bajarlo da clic aqui.;

Hay versiones para Windows XP, 2003 y Vista; lo he utilizado en este ultimo y resulta muy sencillo.

No se olviden es Free para uso personal.

Luego de instalar su uso es sencillo:

1.- Clic derecho sobre el archivo ISO.

2.- Seleccionar "Copiar imagen a CD".

3.- quemar la ISO.

Continúa...

lunes, 6 de octubre de 2008

Error en el Return Next

Error al Ejecutar Funcion en plpgsql, como aso curioso me ocurrio este error:

ERROR: se llama una funcion que retorna un conjunto en un contexto que no puede aceptarlo
CONTEXT: PL/pgSQL function "get_record_cadenas" line 7 at return next

Lamentablemente no encontre la solucion facilmente, aqui un ejemplo de una funcion, el error y la solucion:


CREATE OR REPLACE FUNCTION maestros.get_record_cadenas(campod bpchar, tabla bpchar, campof bpchar, cadena bpchar)
RETURNS SETOF record AS
$BODY$
declare
record1 record;
begin
--*
FOR record1 IN execute 'select ' || $1 || ' from ' || $2 || ' where position(' || $3 || ' in ' || quote_literal($4) || ') > 0' LOOP
return next record1;
end loop;
return;
end
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Al llamar a la funcion de esta forma:

select maestros.get_record_cadenas('usu_nombre', 'maestros.usuarios', 'usu_codigo', '003--*--GERENCIA')

Me arrojaba el error arriba indicado en rojo.

La solucion resulta bastante simple:

select * from maestros.get_record_cadenas('nombres', 'clientes', 'codigo', 'valor1*valor2*valor3') as (usuario varchar);

Continúa...

lunes, 29 de septiembre de 2008

PostgreSql: Creacion de campo con CASE WHEN END en el Default

El dia de hoy necesite crear un campo que me parecio medio complejo al principio, la verdad que no busque documentacion si no que me aventure a crearlo.

La idea era crear un campo que tomara la fecha del Sistema y colocara los dos ultimos digitos del año, como siempre hay muchas formas de hacerlo, aqui copio lo que hice y funciono, por lo menos funcionara dentro del proximo milenio :D

ALTER TABLE maestros.numerador ADD COLUMN anho character(2) DEFAULT case when extract(year from now()) - 2000 > 10 then '' else '0' end || cast(extract(year from now()) - 2000 as varchar);

Siempre se descubren y aprenden cosas nuevas.

Como dicen: "Hoy puedo irme a dormir tranquilo ya que aprendi una cosa mas!!!!"

Continúa...

miércoles, 24 de septiembre de 2008

Windows vista: Activar Usuario Administrador

Los usuarios en Windows Vista aunque pertenezcan al grupo de Administradores no poseen la totalidad de privilegios del Administrador. Ni tan siquiera desactivando el UAC (Control de Acceso) se consiguen los mismo derechos. Por ejemplo, Virtual Server 2005 no puede instalarse en un usuario Administrador ni tan siquiera si se desactiva el UAC, debiendo instalarse en el verdadero usuario
"Administrador".

Para activar el Usuario "Administrador" debemos hacer lo siguiente:


1.- En Windows Vista Business, Ultimate y Enterprise: Boton derecho en Equipo, Clic en Administrar, y en la parte de cuentas de usuario, boton derecho en el usuario Administrador y activar.

2.- En Windows Home o Home Premium, no parece dicha opcion por lo que tendremos que hacerlo desde una consola de comandos. Arrancamos en Accesorios una consula de comandos con el boton derecho y "Ejecutar como Administrador" ( Inicio, Accesorios y boton derecho en simbolo del sistema y "ejecutar como administrador" ). Desde ella ejecutamos:

net user Administrador /active:yes

Es importante reiniciar la Pc luego de estos cambios. Deberia de bastar con cerrar sesion y se vera el usuario, pero sabem,os que Windows no siempre funciona asi.

Continúa...

martes, 22 de julio de 2008

Como abrir un archivo PDF desde VB 6

Quizas por un poco de flojera al buscar o por que no me daba tiempo (paciencia) para leer con calma es que me demoro encontrar un procedimiento aparentemente tan sencillo, aqui coloco dos ejemplos de como hacerlo.

Metodo 1:

Shell ("rundll32.exe url.dll,FileProtocolHandler " & App.Path & ("\reportes\Mi_Archivo.pdf")), vbMaximizedFocus

Sencillo abre el arcivo PDF en una ventana maximizada


Metodo 2:

El procedimiento consiste en colocar un objeto AcroPDF en un formulario, presenta todos los menu del Acrobat REader, el ejemplo completo aqui.

Continúa...

miércoles, 4 de junio de 2008

Firefox Download Day 2008

Download Day 2008

Queremos establecer un récord Guinness mundial al software más descargado en 24 horas ¡y con tu ayuda sabemos que podemos conseguirlo! Aquí hay otras formas de involucrarse
Juega limpio. Ayúdanos a conseguir este récord de forma legal.
Por favor, abstente de programar bots de descarga o cualquier tipo de mecanismo deshonesto. Realmente creemos en nuestra comunidad para difundir la voz.

Continúa...

viernes, 30 de mayo de 2008

Con un Query listar las fechas entre una y otra

Un listado de fechas entre una y otra fecha, bastante interesante y sencillo, es un aporte en la lista de postgres

select '25/05/2008'::date+dia
from generate_series(1,'02/06/2008'::date - '25/05/2008'::date) dia;


?column?
------------
2008-05-26
2008-05-27
2008-05-28
2008-05-29
2008-05-30
2008-05-31
2008-06-01
2008-06-02
(8 rows)

Para poder entenderla mejor prueben este Query:

select *
from generate_series(1,'02/06/2008'::date - '25/05/2008'::date) dia;

Continúa...

jueves, 29 de mayo de 2008

Algunos trucos y artificios para Windows

Siempre hay algunos trucos y artificios que se utilizan para tratar de hacer una mejor labor de Soporte, aqui algunos de esos trucos que me sirven y sirvieron, quizas fuera de epoca, pero en fin para que puedan ser utilizados y encontrados cada vez que se necesiten.


Eliminar Messenger

RunDll32 advpack.dll,LaunchINFSection %windir%\INF\msmsgs.inf,BLC.Remove

Desactivar las activaciones de las memorias USB

1.- Ingresar al RegEdit
2.- Ingresar a la ruta HKLM\system\CurrentControlSet\Services\USBSTORE
3.- Ubicar Start y cambiar el valor de 3 por 4

Error con el Photo Editor

Photo Editor cannot find or open file name

For Microsoft Windows 2000
1.- Log on to Windows 2000 or Windows NT 4.0 by using an account that is a member of the administrators group.
2.- Click Start and then click Run.
3.- In the Open box, type regedt32.exe and then click OK.
4.- In the Registry Editor, select the following registry key:
HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\Graphics Filters
5.- On the Security menu, click Permissions.
6.- In the Registry Key Permissions dialog box, in the Name list, click Users.
7.- In the Permissions list, under Allow, click to select Full Control.
8.- Click OK.
9.- On the Registry menu, click Exit.
NOTE: You can apply a slightly more restrictive set of permissions to the HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\Graphics Filters key by clicking Advanced in the Permissions for Graphics Filters dialog box.

For Microsoft Windows XP
1.- Log on as administrator or as a member of the administrators group.
2.- Click Start and then click Run. In the Open box, type Regedit.exe.
3.- Select the following key:
HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\Graphics Filters
4.- On the Edit menu, click Permissions and then click Advanced.
5.- Verify that the Inherit from parent the permission entries that apply to child objects check box is selected.
6.- Select Users from Permission entries, and then click Edit.
7.- In the Allow column, select the Full Control check box, and then click OK.
8.- Click OK and close the Registry Editor.

Continúa...

lunes, 24 de marzo de 2008

Postgres 8.3 en Windows XP ( LATIN1 - WIN1252 ) Parte I

Hace unos días necesite instalar PostgreSql 8.3 en una Laptop con Windows XP, un poco por flojera y falta de ganas de leer hice lo que siempre recomiendan en una instalación de PostgreSql en Windows, presionar Siguiente ... Siguiente ... Siguiente ... Siguiente ...

Luego me fui dando cuenta que no todo esta bien, ya que al crear la BD no me dejaba hacerlo en Latin1; debía de hacerlo en WIN1252; de todas maneras lo hice así y restaure el Backup de la BD, el problema ya fue luego cuando intente conectarme desde un Proyecto de VB a la BD, mal de mi parte no tener el mensaje exacto a la mano, sin embargo en mi defensa debo de mencionar que no me voy dar como satisfecho hasta no saber como solucionar esto.

Hice lo que normalmente se hace en Windows (desinstalar e instalar nuevamente), al momento de instalar y me percate de Locales, ahí le coloque "C" y al finalizar la instalación podía ya crear la BD en Latin1.

La solución no es esta, esto solo es una salida espero en poco tiempo continuar con la Parte II.

Continúa...

Excel se pone lento al abrir libro

Una de las cosas raras que me ocurrio con Excel, es que una de las Pc's se ponia lenta al abrir una hoja de calculo por segunda o tercera vez, se buco muchas soluciones, desde cambiar la impresora por defecto hasta reinstalar el Office, pasando por el cambio de PST y la reparacion del Office 2003 Standar Edition.


Luego de mucho buscar la solucion fue un poco marciana ya que debiamos de seguir los siguientes pasos:

1.- Entrar a Panel de control.
2.- Opciones de Carpeta.
3.- Buscar la extension XLS.
4.- Presionar Opciones Avanzadas.
5.- Seleccionar Abrir y presionar el boton de Editar
6.- Agregar "%1" al final de Aplicacion utilizada para realizar la accion, quedando tal como esta a continuacion:

"C:\Archivos de programa\Microsoft Office\OFFICE11\EXCEL.EXE" /e "%1"

7.- Quitar el check de la opcion Utilizar DDE.

Debo de mencionar la invalorable ayuda de Gerald Campos ( mas conocido en el mundo artistico como "El Espectacular"); ya que sin su ayuda no hubiera sido posible determinar la marciana solucion.

Continúa...

viernes, 29 de febrero de 2008

Paracas Febrero 2008

Desde hace tiempo tenia deseos de ir a visitar Paracas (Pisco - Ica), siempre por uno u otro motivo posponia la visita o no me animaba, este año luego de muchas dudas e indesiciones, realizamos esta aventura de paseo; claro que recibi varios comentarios de que la Ciudad de Pisco estaba muy mal hice caso de estos comentarios y programe mi vista.

Como podran ver en la foto de la derecha tengo hijos pequeños, por tanto tuve que programar el horario del paseo para que ellos gozaran, aqui los detalles por si se animan a hacer algo similar.

Decidimos salir de Lima en el horario de las 3 am (S/ 20 el costo del pasaje ) - esto para evitar ver la ciudad en mal estado y que los niños queden impactados por esto - tuvimos que hacer dormir a mis hijos a las 7 pm.

Llegamos al cruce de Pisco y la Panamericana a las 7 am, tengo la mala suerte que en cada viaje en omnibus encuentro a algun pasajero que ronca como tren serrano, asi que me fue un poco dificil dormir; de ahi tomamos un colectivo hasta Paracas (aprox. 15 minutos de viaje y S/. 18 de costo); ahi hay gran cantidad de empresas que brindan el servicio para pasear en lanchas por las Islas Ballestas el costo es de S/. 40 por adulto y S/. 30 por niño (se puede negociar) ; 08:30 am nos embarcamos para el paseo deseado.

El paseo me resulto sorprendente desde ver como los Lobos de Mar de forma tan habil y graciosa se meten en el cerco formado por las redes de pescar hasta la neblina que se presento, ver el Candelabro inmenso que puede ser observado en toda su magnitud desde el mar.

El paseo se puso aun mejor, pudiendo ver a las Aves Guaneras ( Pelicanos Peruanos, Cormoranes, Gaviotas y Gaviotines ) , los Pinguinos y los Lobos Marinos con sus auillidos caracteristicos, ademas de verlos muy cerca del deslizador, resulto sorprendente ver la cantidad de lobos que habian en la Isla; la vista de estos fue impresionante para todos.

Hasta ahora he tenido pocas vaciones, pero creo que ninguna he gozado tanto como estas, bonitos recuerdos, excelente fotos y maravillosos momentos con la familia; consideren ir a visitar las Islas Ballestas, no solo contentense con verla en fotos, es peruana y la tenemos cerca asi que aprovechen.

Continúa...

jueves, 31 de enero de 2008

Postgres: Realizar backup de BD

Aqui un procedimiento bastante sencillo que permite sacar Backup de la Base de Datos en Postgres, claro esta utilizando un script en Bash.

#!/bin/sh
#
echo "---------- Captura fecha -----------"
fecha=`date +%Y%m%d%H%M`
#
echo "-------- Borra si existiera --------"
rm -f /home/postgres/backup/bk1$fecha.tar
rm -f /home/postgres/backup/bk2$fecha.tar
echo "---------- Haciendo pg_dump --------"
pg_dump -Ft -b cm_pan > /home/postgres/backup/bk1$fecha.tar
pg_dump -Ft -b cargom > /home/postgres/backup/bk2$fecha.tar
#
gzip /home/postgres/backup/bk1$fecha.tar
gzip /home/postgres/backup/bk2$fecha.tar
#
echo "----------- Final -------------"

Como complemento se debe de colocar en el crontab del usuario postgres para que se ejecute tantas veces sea necesario y asi sacar los Backups varias veces al dia.

Continúa...

miércoles, 30 de enero de 2008

Apagar a determinada hora un equipo con Linux

Es un proceso sencillo y muy basico, muchas veces he encontrado algunos datos no muy exacto o un poco enredados, utilizando algun script o pasando parametros.

La forma mas sencilla que encontre para apagar el equipo fue haciendo lo siguiente:

1.- Ingresar al crontab como root

crontab -e

2.- Agregar la linea de apagado:

00 22 * * * /sbin/shutdown -hF now

Con esto le decimos que se apague diariamente a las 10 de la noche o 22:00 hrs.

Continúa...

miércoles, 23 de enero de 2008

Función que escriba en letras una cantidad numérica

La siguiente función la recibí vía correo de una de las listas de Postgresql, si bien es cierto no la hice debo de señalar que si la enviaron a la lista se puede hacer publica, excelente función Ramiro Arenas

CREATE FUNCTION cletra(numeric) RETURNS character varying AS $_$
declare

ptotal alias for $1;

total numeric;
total1 numeric;
cent2 numeric;
cent numeric;
cent1 char(2);

mil numeric;
millon numeric;
millones numeric;
sav numeric;
unit numeric;
deci numeric;
centi numeric;
factor numeric;
sav1 numeric;
depesos numeric;
lletra varchar;
letras varchar;

begin

total := ptotal;

total1:= total;
total := trunc(total);
cent2 := total1 - total;
cent := cent2*100;
cent1 := '00';

if total=0 then
lletra := 'CERO PESOS';
return 'CERO PESOS';
end if;

mil:=0;
millon:=0;
millones:=0;
depesos:=0;
sav:=1;
unit:=1;
deci:=1;
centi:=1;
factor:=1;
sav1:=1;
letras:=' ';

while total > 0 loop
if total > 1999999 then
depesos := 1;
factor := 1000000;
millones := 1;
millon := 0;
else
if total > 999999 then
depesos := 1;
factor := 1000000;
millon := 1;
else
if total > 999 then
factor := 1000;
mil := 1;
else
factor := 1;
mil := 0;
end if;
end if;
end if;

sav := total;

total := trunc(total/factor);
sav := sav-(total*factor);
if sav = 0 then
depesos := 0;
end if;

centi:=TRUNC(total/100);

if centi = 0 then
letras := rtrim(letras)||' ';
end if;
if centi = 1 then
if total = 100 then
letras := rtrim(letras)||' CIEN';
else
letras := rtrim(letras)||' CIENTO';
end if;
end if;
if centi = 2 then
letras := rtrim(letras)||' DOSCIENTOS';
end if;
if centi = 3 then
letras := rtrim(letras)||' TRESCIENTOS';
end if;
if centi = 4 then
letras := rtrim(letras)||' CUATROCIENTOS';
end if;
if centi = 5 then
letras := rtrim(letras)||' QUINIENTOS';
end if;
if centi = 6 then
letras := rtrim(letras)||' SEISCIENTOS';
end if;
if centi = 7 then
letras := rtrim(letras)||' SETECIENTOS';
end if;
if centi = 8 then
letras := rtrim(letras)||' OCHOCIENTOS';
end if;
if centi = 9 then
letras := rtrim(letras)||' NOVECIENTOS';
end if;

total:=total - (centi*100);
deci :=trunc(total/10);
unit :=total-(deci*10);

if total >= 30 then
if deci = 3 then
letras := rtrim(letras)||' TREINTA';
end if;
if deci = 4 then
letras := rtrim(letras)||' CUARENTA';
end if;
if deci = 5 then
letras := rtrim(letras)||' CINCUENTA';
end if;
if deci = 6 then
letras := rtrim(letras)||' SESENTA';
end if;
if deci = 7 then
letras := rtrim(letras)||' SETENTA';
end if;
if deci = 8 then
letras := rtrim(letras)||' OCHENTA';
end if;
if deci = 9 then
letras := rtrim(letras)||' NOVENTA';
end if;
if unit > 0 then
letras := rtrim(letras)||' Y';
end if;
else
unit := total;
end if;

if unit = 0 then
letras := rtrim(letras)||' ';
end if;
if unit = 1 then
letras := rtrim(letras)||' UN';
end if;
if unit = 2 then
letras := rtrim(letras)||' DOS';
end if;
if unit = 3 then
letras := rtrim(letras)||' TRES';
end if;
if unit = 4 then
letras := rtrim(letras)||' CUATRO';
end if;
if unit = 5 then
letras := rtrim(letras)||' CINCO';
end if;
if unit = 6 then
letras := rtrim(letras)||' SEIS';
end if;
if unit = 7 then
letras := rtrim(letras)||' SIETE';
end if;
if unit = 8 then
letras := rtrim(letras)||' OCHO';
end if;
if unit = 9 then
letras := rtrim(letras)||' NUEVE';
end if;
if unit = 10 then
letras := rtrim(letras)||' DIEZ';
end if;
if unit = 11 then
letras := rtrim(letras)||' ONCE';
end if;
if unit = 12 then
letras := rtrim(letras)||' DOCE';
end if;
if unit = 13 then
letras := rtrim(letras)||' TRECE';
end if;
if unit = 14 then
letras := rtrim(letras)||' CATORCE';
end if;
if unit = 15 then
letras := rtrim(letras)||' QUINCE';
end if;
if unit = 16 then
letras := rtrim(letras)||' DIECISEIS';
end if;
if unit = 17 then
letras := rtrim(letras)||' DIECISIETE';
end if;
if unit = 18 then
letras := rtrim(letras)||' DIECIOCHO';
end if;
if unit = 19 then
letras := rtrim(letras)||' DIECINUEVE';
end if;
if unit = 20 then
letras := rtrim(letras)||' VEINTE';
end if;
if unit = 21 then
letras := rtrim(letras)||' VEINTIUNO';
end if;
if unit = 22 then
letras := rtrim(letras)||' VEINTIDOS';
end if;
if unit = 23 then
letras := rtrim(letras)||' VEINTITRES';
end if;
if unit = 24 then
letras := rtrim(letras)||' VEINTICUATRO';
end if;
if unit = 25 then
letras := rtrim(letras)||' VEINTICINCO';
end if;
if unit = 26 then
letras := rtrim(letras)||' VEINTISEIS';
end if;
if unit = 27 then
letras := rtrim(letras)||' VEINTISIETE';
end if;
if unit = 28 then
letras := rtrim(letras)||' VEINTIOCHO';
end if;
if unit = 29 then
letras := rtrim(letras)||' VEINTINUEVE';
end if;
if millones=1 then
letras := rtrim(letras)||' MILLONES';
millones := 0;
else
if millon=1 then
letras := rtrim(letras)||' MILLON';
millon := 0;
else
if mil=1 then
letras := rtrim(letras)||' MIL';
mil := 0;
end if;
end if;
end if;
total:=sav;
end loop;

if cent=0 then
cent1:='00';
else
cent1:=cast(cent as char(2));
end if;
if depesos=1 then
letras := rtrim(letras)||' DE PESOS '||cent1||'/100 M.C.';
else
letras := rtrim(letras)||' PESOS '||cent1||'/100 M.C.';
end if;

lletra := '('||ltrim(letras)||')';

return lletra;
end
$_$
LANGUAGE plpgsql;

Continúa...