15 nov 2012

Manejo avanzado de Microsoft Access 2007. Las consultas e informes con parámetros y el panel de control

Puede resultar raro que hable de temas relacionados con la suite ofimática de Microsoft en este blog, y es que ciertamente no la utilizo (utilizo libreoffice). Sin embargo, mi hermano me preguntó unas dudas sobre Access 2007 y traté de ponerme al día con esta aplicación. Si bien no conseguí resolver sus dudas (más bien me las resolvió el a mí), pudimos lograr alcanzar algunos de los objetivos fijados.
Los videotutoriales que muestro a continuación tratan de explicar diferentes aspectos de nivel medio-avanzado de Access, ya que no logré encontrar mucha información al respecto ni en Internet ni en tutoriales.
El primer videotutorial explica cómo crear consultas con parámetros y crear informes asociados a esas consultas.

El enlace al que hago referencia en el vídeo es éste

En este segundo videotutorial se explica cómo introducir los parámetros deseados en un formulario para posteriormente ejecutar la consulta


Y en este último se explica la herramienta de "panel de control" de Access.


Espero que os sirva y os haya resultado de interés.
¿Tienes linux y quieres utilizar la suite de Microsoft? Quizá te interese éste enlace o éste otro.

13 nov 2012

Videodemostración de Lubuntu

Lubuntu, como ya comenté en otra entrada, está pensado para ser ligero y rápido, incluyendo aplicaciones que cumplan con ese cometido. Pero ¿cómo de rápido se ejecuta este sistema operativo? La respuesta la podéis ver en el vídeo a continuación, en el que el sistema se ejecuta en un netbook de recursos limitados. Tiempos de arranque inferiores a 30 segundos, de apagado inferiores a 5 y ejecución de múltiples apliaciones sin resentirse...

11 nov 2012

Crear una base de datos de clientes en Gambas

Continuo mi andadura con la programación en Gambas, y esta vez le toca el turno a las bases de datos, con las que también estoy trabajando en Java. Siguiendo el libro de Gambas de Daniel Campos y José Luis Redrejo he creado una base de datos para clientes. Utiliza una SQLite aunque cuando realice la aplicación en Java lo haré con MySQL, que parece más extendida y trabaja utilizando un servidor.
La aplicación se encarga de mostrar una lista de los clientes actuales en una ventana principal y añade las opciones de añadir, modificar o borrar. Para la opción añadir se abre una nueva ventana para introducir los caracteres. 
Con respecto al libro citado anteriormente tuve que realizar distintas modificaciones, bien porque la versión actual de Gambas (3.3.3) difiere de la utilizada para el libro, o bien porque mi aplicación, aunque parecida, tiene algunas diferencias. En el siguiente vídeo se muestra el proceso de creación de una nueva base de datos, que parece ser una opción que a muchos usuarios les cuesta encontrar

El aspecto de la ventana principal cuando aún no hay datos de ningún cliente es
Aspecto general de la aplicación

Mientras que con datos ya introducidos pasa a ser
Aspecto con datos introducidos

Esta es la ventana para añadir o modificar de la base los datos de un cliente
Ventana para añadir o modificar cliente
Podéis descargar el código fuente y el archivo ejecutable aquí

8 nov 2012

Tratando de entender y utilizar alguna API

Desde hace tiempo llevo leyendo el blog de atareao, que es un blog dedicado a Ubuntu y software libre. Uno de los logros que me parecen más interesantes de entre los que este bloguero ha creado son las lentes para Ubuntu, entre ellas Yavol. Tan interesantes me parecieron, que quise informarme sobre cómo las había hecho. Fue ahí donde conocí el concepto de API, que me interesó tanto que quedó en mi recámara guardado para cuando tuviese tiempo, intentar usar alguna.
Actualmente estoy en la parte final de un curso de programación Java utilizando el entorno de programación multiplataforma Netbeans. Así que se me ocurrió la idea de generar una aplicación gráfica con netbeans utilizando la API de Google Translate. Busqué algo de información que me sirviese como punto de partida y encontré información tan interesante como la que podéis ver aquí en un screencast. Así que me puse manos a la obra y pronto obtuve resultados, pero no los esperados (más adelante comentaré por qué). En la siguiente imagen podéis ver el aspecto gráfico de la apliación creada
Aspecto gráfico de la aplicación

El código tuve que modificarlo con respecto al que se incluye en el screencast del enlace anterior, ya que utilicé una versión de la API  más reciente. El código completo lo podéis encontrar debajo

import com.google.api.translate.*;  //Importa todas las clases de la api

public class ApiJava extends javax.swing.JFrame {

    /**
     * Creates new form ApiJava
     */
    public ApiJava() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        panelContenedor = new javax.swing.JPanel();
        txtEspanol = new javax.swing.JTextField();
        btnTraducir = new javax.swing.JButton();
        txtIngles = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        panelContenedor.setName("Traductor básico"); // NOI18N

        txtEspanol.setPreferredSize(new java.awt.Dimension(40, 20));

        btnTraducir.setText("Spa->Eng");
        btnTraducir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnTraducirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelContenedorLayout = new javax.swing.GroupLayout(panelContenedor);
        panelContenedor.setLayout(panelContenedorLayout);
        panelContenedorLayout.setHorizontalGroup(
            panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelContenedorLayout.createSequentialGroup()
                .addComponent(txtEspanol, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnTraducir)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txtIngles, javax.swing.GroupLayout.DEFAULT_SIZE, 80, Short.MAX_VALUE))
        );
        panelContenedorLayout.setVerticalGroup(
            panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelContenedorLayout.createSequentialGroup()
                .addGap(15, 15, 15)
                .addGroup(panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtEspanol, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
                        .addComponent(btnTraducir))
                    .addComponent(txtIngles)))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(panelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 12, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void btnTraducirActionPerformed(java.awt.event.ActionEvent evt) {                                            
        
        try {
            String textoOriginal=(String)this.txtEspanol.getText(); //Recoge el texto
            Translator traslador=new Translator();  //Instancia un objeto de la clase Translator
            String textoTraducido=traslador.translate(textoOriginal, Language.SPANISH, Language.ENGLISH);
            //Convierte el texto original de Spanish a English y lo almacena
            //en textoTraducido
            this.txtIngles.setText(textoTraducido); //Enviamos el textoTraducido a la caja de texto
        }catch (Exception e){   //Chequea excepciones
            System.out.println("Error"+e.getMessage());
        }
    }                                           

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ApiJava().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton btnTraducir;
    private javax.swing.JPanel panelContenedor;
    private javax.swing.JTextField txtEspanol;
    private javax.swing.JTextField txtIngles;
    // End of variables declaration
}


Cuando todo estaba perfectamente compilado y parecía listo para funcionar, la ejecución de la aplicación me devolvió el siguiente error

Can't parse the response from Google Translate service into JSON object
org.json.JSONException: JSONObject["responseData"] is not a JSONObject.


Tras una búsqueda por internet averigué que este error está relacionado con que ahora la API  de Google Translate es de pago, así que todo mi esfuerzo se fue por la borda porque por simple curiosidad no voy a pagar para usarla.
En un futuro tengo pensado utilizar alguna otra, esta vez cerciorándome de que es gratuita. De momento he pensado en la de OpenStreetMap. ¿Me recomendáis alguna?

Mi Arduino ya está aquí... y qué es Dealextreme

Como comenté hace poco, estaba pensando en adquirir una tarjeta arduino para realizar algunos experimentos. El primero de ellos consistía en utilizar un LCD Hitachi. Pues después de una buena búsqueda de información sobre qué tipo de tarjeta de Arduino me convenía, me decanté por la Arduino Uno, que es básicamente la que más recomiendan para principiantes por su compatibilidad con complementos Arduino, y por la cantidad de información existente sobre ella. Aunque aún necesito algunas cosillas más (están en camino) ya tengo las piezas más importantes, como muestro en la siguiente imagen
Placa Arduino Uno, display Hitachi HD44780 y potenciómetro

Mencionar que los precios de estas tarjetas y sus accesorios (sensores y placas) pueden variar ostensiblemente dependiendo del proveedor. Aunque no es mi objetivo publicitar nada en este blog, ni obtengo ningún beneficio por ello, me siento en la tesitura de hablaros sobre Dealextreme, que es una web de ventas de gadgets a precios realmente interesantes. Proceden de china y al respecto tengo que comentar un punto a favor y otro en contra. Como punto a favor citar que los gastos de envío son totalmente gratuitos. Por contra el tiempo que tarda en llegar el producto puede estar comprendido entre 2 y 4 semanas (esto lo digo por experiencia propia). Como ejemplo de referencia de precios citar que la Arduino Uno la puedes encontrar en tiendas web habituales (incluyendo IVA y portes) por no menos de 30 €, mientras que una copia idéntica la tienes en Dealextreme por 15.20 $ (la puedes encontrar aquí). También disponen de multitud de sensores y complementos que seguro tendré en cuenta en próximas compras.
Aunque podría intentar realizar alguna prueba, estoy esperando una regleta de conexión, así que mientras tanto me centraré en la programación software. 

6 nov 2012

Comparativa de tarifas móviles en "En Naranja"

Desde el blog de Xakatamovil me he percatado de una comparativa actualizada de tarifas móviles, tanto para hablar y navegar como sólo para hablar. La podéis encontrar en la web de "En Naranja". Para ver la comparativa, haz click aquí.

5 nov 2012

Pensando en adquirir una tarjeta de Arduino

Arduino es una plataforma libre de hardware y software. Las placas hardware pueden ser hechas a mano o compradas directamente y el software para programarlas está disponible para Linux, Windows y Mac. Está muy extendida, y dispone de una gran cantidad de complementos que podemos adquirir para darle vida.
Placa Arduino MEGA

Como ya dispongo de un display LCD basado en el controlador Hitachi HD44780 que usé en mi etapa de estudios, he pensado que quizá podría trastear un poco y programar la placa para controlar el LCD (en su día lo hice, pero utilizando el puerto paralelo de un PC). 
Display LCD HD44780 de Hitachi

Para realizar todo esto tengo que elegir entre las diferentes placas de Arduino existentes, aunque para el control del LCD una placa básica puede ser suficiente. Con precios que varían desde los 16 € hasta los 90 € aproximadamente, ofrecen una buena variedad. 
Una búsqueda por internet ha servido para cerciorarme de que esta idea que acabo de tener ya ha sido llevada a cabo. Se puede realizar utilizando un PIC o utilizando Arduino. También podemos ver el funcionamiento en un vídeo aquí, así como un tutorial desde la propia web de Arduino 
Como manual para la programación del controlador del LCD voy a utilizar el tutorial que mi exprofesor Jose Ignacio Suárez Marcelo preparó para los alumnos.
Esquema de conexión entre la placa y el LCD
Os mantendré informados en cuanto tenga novedades.