domingo, 11 de junio de 2017

FUNCIÓN POSTGRESQL PARA CONVERTIR NÚMEROS A PALABRAS

CREATE OR REPLACE FUNCTION fn_num_a_palabra(num BIGINT) RETURNS TEXT AS
$$
DECLARE
  palab TEXT;
BEGIN

  WITH menor20(palabra, id) AS
  (
    VALUES
      ('CERO', 0), ('UNO', 1),( 'DOS', 2 ), ( 'TRES', 3),
      ( 'CUATRO', 4 ), ( 'CINCO', 5 ), ( 'SEIS', 6 ), ( 'SIETE', 7 ),
      ( 'OCHO', 8), ( 'NUEVE', 9), ( 'DIEZ', 10), ( 'ONCE', 11 ),
      ( 'DOCE', 12 ), ( 'TRECE', 13 ), ( 'CATORCE', 14),
      ( 'QUINCE', 15 ), ('DIECISEIS', 16 ), ( 'DIECISIETE', 17),
      ('DIECIOCHO', 18 ), ( 'DIECINUEVE', 19 )
   ),
   menor100(palabra, id) AS
   (
      VALUES
       ('VEINTE', 2), ('TREINTA', 3),('CUARENTA', 4), ('CINCUENTA', 5),
       ('SESENTA', 6), ('SETENTA', 7), ('OCHENTA', 8), ('NOVENTA', 9)
   )
   SELECT
     CASE
      WHEN num = 0 THEN  ''
      WHEN num BETWEEN 1 AND 19
        THEN (SELECT palabra FROM menor20 WHERE id=num)
     WHEN num BETWEEN 20 AND 99
       THEN  (SELECT palabra FROM menor100 WHERE id=num/10) ||  ' Y '  ||
             fn_num_a_palabra( num % 10)
     WHEN num = 100
       THEN   'CIEN'
     WHEN num BETWEEN 101 AND 199
       THEN   'CIENTO ' ||
           fn_num_a_palabra( num % 100)
     WHEN num BETWEEN 200 AND 999
       THEN  (fn_num_a_palabra( num / 100)) || ' CIENTOS ' ||
           fn_num_a_palabra( num % 100)
     WHEN num = 1000
       THEN   'MIL'
     WHEN num BETWEEN 1001 AND 1999
       THEN  'MIL ' ||
           fn_num_a_palabra( num % 1000)
      WHEN num BETWEEN 2000 AND 999999
       THEN  (fn_num_a_palabra( num / 1000)) || ' MIL ' ||
           fn_num_a_palabra( num % 1000)
     WHEN num BETWEEN 1000000 AND 999999999
       THEN  (fn_num_a_palabra( num / 1000000)) || ' MILLONES ' ||
           fn_num_a_palabra( num % 1000000)
     WHEN num BETWEEN 1000000000 AND 999999999999
       THEN  (fn_num_a_palabra( num / 1000000000)) || ' BILLONES ' ||
           fn_num_a_palabra( num % 1000000000)
     WHEN num BETWEEN 1000000000000 AND 999999999999999
       THEN  (fn_num_a_palabra( num / 1000000000000)) || ' TRILLONES ' ||
           fn_num_a_palabra( num % 1000000000000)
    WHEN num BETWEEN 1000000000000000 AND 999999999999999999
       THEN  (fn_num_a_palabra( num / 1000000000000000)) || ' CUATRILLONES ' ||
           fn_num_a_palabra( num % 1000000000000000)
    WHEN num BETWEEN 1000000000000000000 AND 999999999999999999999
       THEN  (fn_num_a_palabra( num / 1000000000000000000)) || ' QUINTILLONES ' ||
          fn_num_a_palabra( num % 1000000000000000000)
          ELSE ' ENTRADA NO VALIDA' END INTO palab;

  palab := RTRIM(palab);

  IF RIGHT(palab,1)='Y' THEN
    palab := RTRIM(LEFT(palab,length(palab)-1));
  END IF;

  RETURN palab;
END;
$$ LANGUAGE PLPGSQL;

martes, 10 de enero de 2017

Modificar un archivo dentro de un .jar

Lo primero que debemos hacer es obtener el archivo que queremos modificar del .jar para ello si es un archivo plano podemos simplemente descomprimir el .jar usando 7zip

para este caso tenemos un archivo llamado prueba.jar que contiene lo siguiente

org/prueba/resources/propiedades.properties y este archivo tiene el siguiente contenido


extraemos el .jar para obtenemos y modificar el archivo propiedades.properties

modificamos el archivo con el editor de nuestra preferencia y guardamos los cambios


Creamos un directorio similar al directorio de paquetes que contiene nuestro archivo al mismo nivel del archivo jar y colocamos dentro el archivo modificado en nuestro caso org\prueba\resources\propiedades.properties


Luego ejecutamos el siguiente comando


jar es un utilitario que viene incluido dentro del jdk de java para poder ejecutar este comando debemos instalar el jdk y configurar las variables de entorno.

para verificar el cambio podemos extraer nuevamente el jar y ver el archivo propiedades.properties.

Si lo que queremos modificar una clase podemos obtener el contenido de la clase usando algún decompilador como el siguiente http://jd.benow.ca/ luego de ello creamos un proyecto, creamos el archivo .java, copiamos el contenido de la clase que queremos modificar y hacemos los cambios que necesitemos, agregamos el .jar como librería del nuevo proyecto para que no nos aparezcan errores.

finalmente generamos el nuevo jar con la modificación de la clase ya echa luego descomprimimos el nuevo jar obtenemos la nueva clase y procedemos con la ejecución del comando como se explico anteriormente.

domingo, 8 de enero de 2017

obtener la edad (años, meses y días) a partir de la fecha de nacimiento con javascript

Función para calcular la edad en años, meses y días


function calcularEdad(fecha) {
        // Si la fecha es correcta, calculamos la edad

        if (typeof fecha != "string" && fecha && esNumero(fecha.getTime())) {
            fecha = formatDate(fecha, "yyyy-MM-dd");
        }

        var values = fecha.split("-");
        var dia = values[2];
        var mes = values[1];
        var ano = values[0];

        // cogemos los valores actuales
        var fecha_hoy = new Date();
        var ahora_ano = fecha_hoy.getYear();
        var ahora_mes = fecha_hoy.getMonth() + 1;
        var ahora_dia = fecha_hoy.getDate();

        // realizamos el calculo
        var edad = (ahora_ano + 1900) - ano;
        if (ahora_mes < mes) {
            edad--;
        }
        if ((mes == ahora_mes) && (ahora_dia < dia)) {
            edad--;
        }
        if (edad > 1900) {
            edad -= 1900;
        }

        // calculamos los meses
        var meses = 0;

        if (ahora_mes > mes && dia > ahora_dia)
            meses = ahora_mes - mes - 1;
        else if (ahora_mes > mes)
            meses = ahora_mes - mes
        if (ahora_mes < mes && dia < ahora_dia)
            meses = 12 - (mes - ahora_mes);
        else if (ahora_mes < mes)
            meses = 12 - (mes - ahora_mes + 1);
        if (ahora_mes == mes && dia > ahora_dia)
            meses = 11;

        // calculamos los dias
        var dias = 0;
        if (ahora_dia > dia)
            dias = ahora_dia - dia;
        if (ahora_dia < dia) {
            ultimoDiaMes = new Date(ahora_ano, ahora_mes - 1, 0);
            dias = ultimoDiaMes.getDate() - (dia - ahora_dia);
        }

        return edad + " años, " + meses + " meses y " + dias + " días";
    }
Función para verificar si una cadena es un número

function esNumero(strNumber) {
    if (strNumber == null) return false;
    if (strNumber == undefined) return false;
    if (typeof strNumber === "number" && !isNaN(strNumber)) return true;
    if (strNumber == "") return false;
    if (strNumber === "") return false;
    var psInt, psFloat;
    psInt = parseInt(strNumber);
    psFloat = parseFloat(strNumber);
    return !isNaN(strNumber) && !isNaN(psFloat);
}

viernes, 6 de enero de 2017

Angular directivas para validar input (enteros y decimales)

Decimales

directive('decimal', function() {
                return {
                    require: 'ngModel',
                    restrict: 'A',
                    link: function(scope, element, attr, ctrl) {
                        function inputValue(val) {
                            if (val) {
                                var digits = val.replace(/[^0-9.]/g, '');

                                if (digits.split('.').length > 2) {
                                    digits = digits.substring(0, digits.length - 1);
                                }

                                if (digits !== val) {
                                    ctrl.$setViewValue(digits);
                                    ctrl.$render();
                                }
                                return parseFloat(digits);
                            }
                            return "";
                        }
                        ctrl.$parsers.push(inputValue);
                    }
                };
            });

Enteros



directive('entero', function() {
            return {
                require: 'ngModel',
                restrict: 'A',
                link: function(scope, element, attr, ctrl) {
                    function inputValue(val) {
                        if (val) {
                            var value = val + ''; //convert to string
                            var digits = value.replace(/[^0-9]/g, '');

                            if (digits !== value) {
                                ctrl.$setViewValue(digits);
                                ctrl.$render();
                            }
                            return parseInt(digits);
                        }
                        return "";
                    }
                    ctrl.$parsers.push(inputValue);
                }
            };
        });



lunes, 31 de octubre de 2016

Aceptando valores nulos como parámetros en jasper report

A continuación se explica como hacer para aceptar valores nulos como parámetros en un reporte :

Se plantea la situación en la cual tenemos que hacer un listado de documentos y uno de los parámetros es el  número, creamos un parámetro llamado número y parte de la consulta seria la siguiente :

AND documento.numero = $P!{numero}

ahora si se pasa como parámetro de número el valor null el reporte nos mostrara una lista en blanco ya que ningún número de documento sera null, entonces lo que debemos hacer es lo siguiente:

creamos un nuevo parametro llamado numero_query y le ponemos como DEFAULT VALUE EXPRESSION lo siguiente :

  $P{numero}==null  ? " true": "documento.numero=".concat($P{numero}.toString())

En este caso solo validamos el valor null pero cada uno lo puede adaptar a sus necesidades validando otros valores como "".

Luego reemplazamos

AND documento.numero = $P!{numero}

por

AND $P!{numero_query} 

lunes, 1 de febrero de 2016

Mostrar pdf en iframe usando angularjs recibido de un api rest usando spring (@RestController ) + jasper report

Exportar reporte a pdf stream

byte[] response = null;
JasperPrint jasperPrint = reporteRepositorio.generarReporte(reportName,parameters);

if (TipoFormatoExportacion.STREAM.getValue().equals(formatType)) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, baos);
response=baos.toByteArray(); 

}

return response;

Controlador rest

@RequestMapping(method = RequestMethod.GET)
public void generarReporte(HttpServletRequest request,HttpServletResponse response) {

Map<String, Object> parameters = new HashMap<String, Object>();
try {
byte[] contents = reporteServicio.generarReporte("reportName",
TipoFormatoExportacion.STREAM.getValue(), parameters);
OutputStream os = response.getOutputStream();
response.setHeader("Content-Disposition", "inline; filename=file.pdf");
   response.setContentType("application/pdf");
response.setStatus(HttpServletResponse.SC_OK); 
response.setHeader("Cache-Control","private, must-revalidate, post-check=0, pre-check=0, max-age=1");
response.setHeader("Pragma","public");
os.write(contents);
os.close();
} catch (JRException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

Fragmento html
<iframe id="visualizador"></iframe>
Controlador angularjs
$http.get(CONFIG.API_URL + "/" + namereport + "/" + params, { responseType: 'arraybuffer' })
    .success(function (data) {
        if (data) {
          var file = new Blob([data], {type: 'application/pdf'});
          var url = URL.createObjectURL(file);
        }
     document.getElementById('visualizador').setAttribute('src',url);   
}).error(function (error) {});

viernes, 25 de diciembre de 2015

Moviendo el default progress indicator y hacerlo modal Vaadin

Algunas veces el progress indicador por defecto de vaadin no esta en la mejor posición y necesitamos centrarla y hacerla modal, para ello les comparto el siguiente código que es la solución para ese requerimiento :

.v-loading-indicator, .v-loading-indicator-delay, .v-loading-indicator-wait {
 position: absolute;
 z-index: 30000;
 width: 100% ;
 height: 100%;
 background: rgba(20,20,20, 0.6) url(../base/common/img/loading-indicator.gif) no-repeat 50% 50%;
}