viernes, 19 de octubre de 2012

Lógica de negocio en Base de datos o Java

 

En el desarrollo de software surgen muchas dudas, una de ellas me hizo reflexionar el siguiente planteamiento:

  1. Lógica de negocio en la base de datos: por lógica de negocio se entiende las reglas y la manipulación de los datos para proveer un resultado esperado. La ubicación de esta lógica supone varias ventajas:
    1. Lógica centralizada: la lógica esta centralizada y no importa el cliente que intente accederla, siempre va a ser la misma, con un mismo lenguaje SQL.
    2. Velocidad: al tener los datos en el mismo motor que ejecuta los procedimientos, se evita el ir y venir entre el servidor web o cliente y la base de datos por datos a procesar.
    3. Actualización: al estar centralizada, un cambio en la lógica actualiza todos los clientes que la utilicen, sin importar la plataforma.

También supone ciertas desventajas:

  1. Difícil de mantener: Trabajar con SQL es como trabajar con Cobol, es programación procedimental en su gran mayoría; agregar una nueva funcionalidad podría suponer revisar muy bien en que parte va y rezar para que nada se dañe.
  2. No hay buenas practicas: no hay test eficientes, no hay metodología orientada a objetos, no hay herencia ni interfaces que podría ahorrar bastante código y simplificar la lógica.
  3. Velocidad: el rendimiento podría llegar a verse comprometido al procesar todo en la base de datos, en vez de ser utilizada solo como repositorio de datos.
  4. Dependencia del proveedor: el software queda atado al SGBD que se utilizo para su desarrollo. Cambiar de motor implica volver a hacer todo de nuevo.

Que opinan ustedes?

viernes, 17 de agosto de 2012

Swing Multihilo ProgressBar indeterminate

El anterior ejemplo se utilizo SwingWorker para hacer un llamado a un procedimiento que se demora mucho y de paso no bloquear la interfaz y poder actualizar. Este funciona bien pero por alguna razón no me funcionó igual cuando quería utilizar el progressbar de modo indeterminate. (.setIndeterminate(true)) así que encontré una forma de hacerlo y es en vez de extender el objeto de trabajo de Thread se extiende de SwingWorker, con esto, sobreescribiendo el metodo doInBackground el SwingWorker se encargaría de actualizar la interfaz sin bloquearla.



public class Procesar extends SwingWorker { 
@Override     
protected Object doInBackground() throws Exception {         barra.setIndeterminate(true);        
 // proceso con duración indeterminada         
barra.setIndeterminate(false);         
return "Hecho.";     } }

}

Lógicamente el llamado a dicha clase cambia y ya se ejecutaría con run() sino con execute()


lanzador = new Procesar();
lanzador.execute();


Saludos.

miércoles, 25 de julio de 2012

Swing netbeans multihilo con barra de progreso

Con este ejemplo podemos usar una barra de progreso en Netbeans, los controles se pueden dibujar y cuando necesitemos procesar algo que consuma tiempo lo podemos mostrar con la barra de progreso desde esta clase


    static class HiloDeLaBarra extends Thread {
        private static int RETARDO = 500;
        JProgressBar Barra;
           
        // Constructor
        public HiloDeLaBarra(JProgressBar barra) {
            Barra = barra;
        }

        // Subrutina que incrementa la barra de progreso
        public void run() {
            int minimo = Barra.getMinimum();
            int maximo = Barra.getMaximum();
           
            Runnable Incrementa = new Runnable()
            {
                public void run() {
                    int valor = Barra.getValue();
                    Barra.setValue(valor + 1);
                }
            };

            for (int i = minimo; i < maximo; i++) {
                try {
                    SwingUtilities.invokeAndWait(Incrementa);
                    Thread.sleep(RETARDO);
                } catch (InterruptedException ignoredException) {} catch (InvocationTargetException ignoredException) {}
            }
        }
    }

   

Podemos usar un botón para iniciar el proceso, al cual debemos colocarle en el ActionListener el llamado a la clase.

        ActionListener actionListener = new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            Boton.setEnabled(false);
            Thread Hilo = new HiloDeLaBarra(BarraDeProgreso);
            Hilo.start(); // Lo ejecuta
          }
        };
        Boton.addActionListener(actionListener);

miércoles, 27 de junio de 2012

Borrar Filas Duplicadas


Siempre es bueno tener una llave única en las tablas del sistema; pero en algunos casos, cuando las llaves son autonumericas o no tiene llave, las inserciones se pueden volver un problema cuando los registro son repetidos y no hay forma de identificar uno del otro, sino solamente por la autonumerica o por el rowid.
Puedes eliminar los registros uno a uno, o con uno de los siguientes script’s:
Borra todos los registros que no esten en los minimos de la misma tabla.
DELETE FROM departamento
WHERE rowid NOT IN(
       SELECT MIN(rowid)
          FROM departamento d
      GROUP BY D.departamento_id
)

Similar a la anterior, pero sin el NOT IN
DELETE FROM departamento A
WHERE ROWID > (
SELECT min(rowid)
FROM departamento BWHERE A.departamento_id = B.departamento_id);

Ahora con Exists


DELETE FROM departamento A
WHERE EXISTS
(
SELECT ‘x’
FROM departamento B
WHERE A.departamento_id = B.departamento_id
AND B.rowid > A.rowid);


Teletrabajo


Ya existe en Colombia una ley que reglamenta el teletrabajo con las mismas garantías de un trabajador presencial; este es un resumen del reglamento:

Encontrar el 2do o N valor mas alto o mas bajo


Es fácil encontrar el valor mas alto o mas bajo de una consulta de datos con las funcionas max() y min(); pero cuando se necesita el segundo o tercer valor mas alto, la cosa cambia un poco, de esta forma:
select id from
(select rownum r, id
from trabajo
order by id desc)
where r=2;
De esa forma tendremos la consulta ordenada de forma descendente pero tomando a partir de la fila 2.

Grouping Sets Oracle


Grouping Sets es una extension del Group By, esta permite crear cortes de agrupaciones en un listado de datos agrupados; por ejemplo, si queremos totalizar una consulta por departamento y trabajo, grouping sets haria un corte cada vez que cambie uno de los campos segun el orden que sean escritos y totalizaria lo que lleva hasta el momento. Dichas columnas de agrupacion seran nulas y el campo de agrupacion del select sera el totalizado:
SELECT fact_1_id,
       fact_2_id,
       fact_3_id,
       SUM(sales_value) AS sales_value,
       GROUPING_ID(fact_1_id, fact_2_id, fact_3_id) AS grouping_id
FROM   dimension_tab
GROUP BY GROUPING SETS((fact_1_id, fact_2_id), (fact_1_id, fact_3_id))
ORDER BY fact_1_id, fact_2_id, fact_3_id;

 FACT_1_ID  FACT_2_ID  FACT_3_ID SALES_VALUE GROUPING_ID
---------- ---------- ---------- ----------- -----------
         1          1                4363.55           1
         1          2                4794.76           1
         1          3                4718.25           1
         1          4                5387.45           1
         1          5                5027.34           1
         1                     1      2737.4           2
         1                     2     1854.29           2
         1                     3     2090.96           2
         1                     4     2605.17           2
         1                     5     2590.93           2
         1                     6      2506.9           2
         1                     7     1839.85           2
         1                     8     2953.04           2
         1                     9     2778.75           2
         1                    10     2334.06           2
         2          1                5652.84           1
         2          2                4583.02           1
         2          3                5555.77           1
         2          4                5936.67           1
         2          5                4508.74           1
         2                     1     3512.69           2
         2                     2     2847.94           2
         2                     3      2972.5           2
         2                     4     2534.06           2
         2                     5     3115.99           2
         2                     6     2775.85           2
         2                     7     2208.19           2
         2                     8     2358.55           2
         2                     9     1884.11           2
         2                    10     2027.16           2

miércoles, 2 de mayo de 2012

Volviendo a Linux

 

Hace un tiempo había cambiado el Ubuntu 11.10 a windows xp, esperando que fuese mas rápido, pero con un portátil de 1Gb de Ram y un Celeron a 1Ghz (o 1.2 no me acuerdo), después de instalar todas las aplicaciones necesarias, este se puso mas lento que el mismo Ubuntu, así que se me dio por pasarlo a windows 7, (también me habían dicho que era mas eficiente con los recursos…) pero al final siguió igual de lento; así que espere a que saliera Ubuntu 12.04 LTS (LTS significa Long Term Support, es decir, una versión con soporte de larga duración), pero esta vez no me aventure a instalar Ubuntu con unity, sino que baje Kubuntu, y hasta ahora esta corriendo fluido, incluso sin instalarle el paquete “kubuntu-low-fat-settings” el cual cambia la configuración de KDE para hacerlo mas liviano; hice esta prueba cuando tenia Ubuntu 11.10 con escritorio KDE, funcionó a la perfección,  el escritorio es mas liviano para equipos viejitos; pero la recomendación es si van a usar KDE instalen Kubuntu, ahorran espacio y velocidad.

Aun así, estoy pensando en aumentar la memoria, igual el nuevo kernel trae soporte PAE de serie.

PD: Escrito desde Windows Live Writter en la pc del trabajo… si alguien sabe de alguna para Linux con conexión a blogger por favor escribirla en los comentarios.

miércoles, 25 de abril de 2012

Encabezado Fijo ( con jquery )

Anteriormente había escrito un articulo sobre como mantener el encabezado fijo en el un tabla html con css; ahora he encontrado un plugin de jquery que permite hacerlo de forma mas facil:

1. Se descarga de: http://www.tablefixedheader.com/download/
2. Se vincula en la pagina donde esta la tabla que vas a fijar el encabezado: <script src="/js/jquery.fixheadertable.min.js" type="text/javascript"></script>
3.  Se llama al plugin con los siguientes parametros:



$('#miTabla').fixheadertable({
caption : 'Titulo de la tabla',
colratio     : [80, 90, 90, 90], // medidas del ancho de cada columna
resizeCol         : true,  // se puede cambiar el tamaño de la columna
minColWidth : 80 ,
height   : 400,
showhide       : true // esto es para ocultar o mostrar los datos con un clic
});

A petición de un lector:

<table id="miTabla">
    <thead>
        <tr>
            <th>Col 1</th>
            <th>Col 2</th>
            <th>Col 3</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>XXX</td>
            <td>YYY</td>
            <td>ZZZ</td>
        </tr>
        <tr>
            <td>AAA</td>
            <td>BBB</td>
            <td>CCC</td>
        </tr>
    </tbody>
</table>

y listo... encabezado fijo.