jueves, 28 de noviembre de 2019

Crear ID Dinamicos con POSTGRESQL

CREATE OR REPLACE FUNCTION GeneraID() RETURNS VARCHAR AS $$
DECLARE numFechaActual VARCHAR(100);
DECLARE strEnc CHAR(32);
DECLARE contador INT DEFAULT 0;
DECLARE genID VARCHAR DEFAULT '';
DECLARE contRest INT DEFAULT 1;
DECLARE incVar INT DEFAULT 1;
BEGIN
numFechaActual := REPLACE(CONCAT(TO_CHAR(NOW(), 'YYYYMMDDHHIISS'), EXTRACT(EPOCH FROM (SELECT NOW())) * 1000),'.','');
strEnc := MD5(numFechaActual);
genID := SUBSTRING(strEnc, 1, 8);
FOR contador IN 1.. LENGTH(strEnc) LOOP
IF (contRest = 8)
THEN
IF (contador IN (8,16,24))
THEN
IF (contador > 0)
THEN
incVar := contador + 1;
ELSE
incVar := contador;
END IF;
genID := CONCAT(genID, '-',SUBSTRING(strEnc, incVar, contRest));
END IF;
contRest := 1;
ELSE
contRest := contRest + 1;
END IF;
END LOOP;
return genID;
END;
$$
LANGUAGE plpgsql;

miércoles, 3 de enero de 2018

Obtener el DV de un RUN Chileno con Python.


def obtieneDV(rutSinDv):
    suma = 0
    incrementa = 2
    dv = ""
    for i in reversed(rutSinDv):
        suma +=  (int(i) * incrementa)
        incrementa = incrementa+1
        if (incrementa == 8):
            incrementa = 2
    division =  suma / 11
    resto = suma % 11
    dv = 11-resto
    if (dv == 11):
        dv = 0
    elif (dv == 10):
        dv = "K"
    return dv


Saludos.

miércoles, 13 de febrero de 2013

Funcion random en MySQL


En base a la necesidad de esta funcionalidad, 
he creado una funcion para suplir dicha falencia.
 
Espero que a alguien le sea de utilidad... 
 
Saludos. 
 
DROP FUNCTION IF EXISTS random;
DELIMITER //
CREATE FUNCTION random
(
   numero_inicial INT,
   numero_final INT
)
RETURNS INT
DETERMINISTIC
BEGIN
   DECLARE numero INT DEFAULT 0;
   DECLARE retorno INT;
   DROP TEMPORARY TABLE IF EXISTS randinit;
   CREATE TEMPORARY TABLE randinit (num INT NOT NULL);
   IF (numero_inicial > numero_final)
   THEN
      contador: LOOP
      IF (numero = numero_inicial)
      THEN
         LEAVE contador;
      ELSE
         SET numero = numero +1;
         INSERT INTO randinit(num) VALUES (numero);
      END IF;
      END LOOP contador;
   ELSEIF (numero_final > numero_inicial)
   THEN
      contador: LOOP
      IF (numero = numero_final)
      THEN
         LEAVE contador;
      ELSE
         SET numero = numero +1;
         INSERT INTO randinit(num) VALUES (numero);
      END IF;
      END LOOP contador;
   ELSE
      SET numero = numero_inicial;
      INSERT INTO randinit(num) VALUES (numero);
   END IF;
   SET retorno = (SELECT num FROM randinit ORDER BY RAND() LIMIT 1);
   RETURN retorno;
END//
DELIMITER ;

miércoles, 5 de septiembre de 2012

Obteniendo el Digito Verificador del Run Chileno con Python

Me dio por realizar esta función con el objeto de que a alguien le sirva.

Saludos!.
(Obtiene el DV del RUN chileno).

#!/usr/bin/env python
# -*- coding: utf8 -*-
"""
Script para obtener el digito verificador del RUN
e imprime todo el RUN
@author: felcontreras@gmail.com
"""
import os
import sys

def number_format(num):
    """
    Funcion la cual realiza el formateo del numero
    dejandolo asi separado por puntos.
    (USO SIMPLE)
    """
    numero = str(num)
    i = 0
    numfinal = ""
    numdex = ""
    for concat in reversed(numero):
        numfinal += concat
        if i == 2:
            numfinal += "."
            i = 0
        else:
            i += 1
    for numreal in reversed(numfinal):
        numdex += numreal
    if numdex[0] == ".":
        retorno = numdex[1:len(numdex)]
    else:
        retorno = numdex
    return retorno

def obtienedv(run):
    """
    Funcion la cual retorna el digito verificador
    a su vez el run ya formateado.
    Eso ya me voy a dormir.
    """
    permitido = "1234567890"
    total = 0
    multiplo = 2
    rutx = ""
    for cambio in run:
        if cambio in permitido:
            rutx += cambio
    for reverso in reversed(rutx):
        total += int(reverso) * multiplo
        if multiplo == 7:
            multiplo = 2
        else:
            multiplo += 1
        modulus = total % 11
        verificador = 11 - modulus
        if verificador == 10:
            div = "k"
        elif verificador == 11:
            div = "0"
        else:
            if verificador < 10:
                div = verificador
        retorno = rutx+str(div)
    return retorno

def abreArchivo(archivo):
    """
    Funcion la cual lee el archivo de origen para la opcion -i
    """
    abre = open(archivo, 'r')
    arreglo = []
    for linea in abre.readlines():
        arreglo.append(obtienedv(linea))
    abre.close()
    return "\n".join(arreglo)

def creaArchivo(archivo, info):
    """
    Funcion la cual crea el archivo de destino y almacena la información del archivo de entrada
    """
    try:
        cnuevo = open(archivo, 'w')
    except:
        print "Imposible escribir en archivo"
        sys.exit()
    cnuevo.write(info)
    cnuevo.close()
    return True

if '__main__' == __name__:
    if "--help" in sys.argv:
        print "Modo de uso:"
        print sys.argv[0]+ " 123456789 # (run)"
        print sys.argv[0]+ " -i archivo_entrada # Imprime en Pantalla | -o archivo_de_salida (opcional)"
        sys.exit()
    if len(sys.argv) > 2:
        if "-i" in sys.argv:
            try:
                archivo = sys.argv[sys.argv.index("-i")+1]
            except IndexError:
                print "Debes definir el archivo a leer"
                sys.exit()
            runs = abreArchivo(os.getcwd()+"/"+archivo)

            if "-o" in sys.argv:
                try:
                    anuevo = sys.argv[sys.argv.index("-o")+1]
                    creaArchivo(anuevo, runs)
                except:
                    print "Imposible crear el archivo de salida."
                    sys.exit()
            else:
                print runs
    elif len(sys.argv) == 2:
        print obtienedv(sys.argv[1])
    else:
        print sys.argv[0]+" --help. Para obtener mayor infromacion."

martes, 4 de septiembre de 2012

Validador de Run Chileno en Python

#!/usr/bin/env python
#-*- coding: utf8 -*-
"""
Script para la validación de RUN Chileno.
@author: felcontreras@gmail.com
"""
import sys

def filtra(rut):
    """
    Esta funcion cumple el trabajo de filtrar el RUN.
    Omitiendo asi los puntos (.) y Guiones (-) y cualquier otro caracter
    que no incluya la variable 'caracteres'.
    """
    caracteres = "1234567890k"
    rutx = ""
    for cambio in rut.lower():
        if cambio in caracteres:
            rutx += cambio
    return rutx

def valida(rut):
    """
    Esta funcion cumple el trabajo de realizar la logica de negocio,
    ya sea matematica como logica.
    """
    rfiltro = filtra(rut)
    rutx = str(rfiltro[0:len(rfiltro)-1])
    digito = str(rfiltro[-1])
    multiplo = 2
    total = 0
    for reverso in reversed(rutx):
        total += int(reverso) * multiplo
        if multiplo == 7:
            multiplo = 2
        else:
            multiplo += 1
        modulus = total % 11
        verificador = 11 - modulus
        if verificador == 10:
            div = "k"
        elif verificador == 11:
            div = "0"
        else:
            if verificador < 10:
                div = verificador
    if str(div) == str(digito):
        retorno = "Valido"
    else:
        retorno = "Invalido"
    return retorno

if __name__ == "__main__":
    if len(sys.argv) == 2:
        print valida(sys.argv[1])
    else:
        print "* Atención - Utilizando RUN: 11.111.111-1 en modo prueba.*"
        print "# Modo de empleo: 'python "+sys.argv[0]+" 22.222.222-2'. (RUN A VALIDAR) #"
        print valida("11.111.111-1")

Generador de Runs y DV Chilenos en Python

#!/usr/bin/env python
"""
Genera RUN V1.0
Este script genera RUN Chilenos validados
Utiles para registrarse en algun sitio que requiera dichos datos
y no colocar los propios.

uso: Generarut.py 10000000 10000050
Por defecto generara 500 runs entre: 10.000.000 y 10.000.500
Esto generara 50 Runs validos
"""
import sys

def generarut(desde, hasta):
    """
    Funcion que permite la generacion de runs.
    """
    arreglo = []
    multiplo = 2
    total = 0
    for i in range(desde, hasta):
        rut = str(i)
        for rinverso in reversed(rut):
            total += int(rinverso) * multiplo
            if multiplo == 7:
                multiplo = 2
            else:
                multiplo += 1
            modulus = total % 11
            verificador = 11 - modulus
            if verificador == 10:
                div = "k"
            elif verificador == 11:
                div = "0"
            else:
                    if verificador < 10:
                        div = verificador
        arreglo.append(rut + "-" + str(div))
    return arreglo

if "__main__" == __name__:
    if len(sys.argv) == 3:
        DESDE = int(sys.argv[1])
        HASTA = int(sys.argv[2])
    else:
        DESDE = 10000000
        HASTA = 10000500

     for runs in generarut(DESDE, HASTA):
         print runs

martes, 8 de febrero de 2011

Clase de conexión php-mysql

Bueno, como estaba aburrido y las clases de conexion con mysql y php no son muy completas o bien no se adaptan a mis necesidades, me dio por hacer esta que espero que a alguien le sirva de ayuda.


El codigo acontinuación.

<?php
class conSQL
{
private $usuarioDB='';
private $claveDB='';
private $hostDB='';
private $baseDB='';
public $consulta;
public $numfield;
public $affected;
public $numrows;
public $sql;
public $insertid;
private $conexion;

public function __construct($sql)
{
$this->sql = $sql;
}

private function conecta()
{
$this->conexion = @mysql_connect($this->hostDB,$this->usuarioDB,$this->claveDB) or die ("Base de datos en mantención.");
@mysql_select_db($this->baseDB);
return $this->conexion;
}

public function desconecta()
{
return mysql_close($this->conecta());
}

public function executeQuery()
{
$this->conecta();
$this->consulta = mysql_query($this->sql);
$this->numfield = mysql_num_fields($this->consulta);
$this->numrows = mysql_num_rows($this->consulta);
$this->desconecta();
$i=0;
$arreglo = array();
if ($rs = mysql_fetch_array($this->consulta)) {
do {
for ($j=0;$j<$this->numfield;$j++) {
$nombrecampo = mysql_field_name($this->consulta,$j);
$arreglo[$i][$nombrecampo] = $rs[$nombrecampo];
if ($j == $this->numfield) { $j = 0;}
}
$i++;
} while ($rs = mysql_fetch_array($this->consulta));
}
mysql_free_result($this->consulta);
return $arreglo;
}

public function executeUpdate()
{
$this->conecta();
$this->consulta = @mysql_query($this->sql);
$this->insertid = mysql_insert_id();
$this->affected = mysql_affected_rows();
$this->desconecta();
return $this->consulta;
}
}
?>

Modo de empleo:

Para este ejemplo simularemos una consulta tipo "SELECT" para que retorne algo, luego se mostrara una para el modo INSERT o UPDATE, que generalmente no retornan nada, excepto la cantidad de filas insertadas y/o actualizadas ah! y el ultimo insert realizado.

Ejemplo de SELECT.

require_once("/path/to/file/of/class/to/conexion.php");
$consulta="SELECT nombre,apellido FROM usuario";
$db = new conSQL($consulta);
$retorno = $db->executeQuery();
if ( $db->numrows > 0 )
{
foreach ( $retorno as $row )
{
echo $row['nombre']." ";
echo $row['apellido']."<br />";
}
}

?>

Ejemplo de UPDATE.
<?php

require_once("/path/to/file/of/class/to/conexion.php");
$consulta="UPDATE tbl1 SET apellido='macabeillo' WHERE nombre='juan'";
$db = new conSQL($consulta);
$db->executeUpdate();
if ( $db->affected > 0 ) // o tambien podria ser "if ( $db->affected )"
{
echo "El usuario ha sido actualizado";
}
?>

Ejemplo de INSERT.
<?php

require_once("/path/to/file/of/class/to/conexion.php");
$consulta="UPDATE tbl1 SET apellido='macabeillo' WHERE nombre='juan'";
$db = new conSQL($consulta);
$db->executeUpdate();
if ( $db->insertid > 0) // Al igual que UPDATE esto se puede hacer "if ( $db->insertid )
{
echo "El ultimo ingreso en la base de datos es: ".$db->insertid;
}

?>