Programando con Café

Programando con Café es el lugar de encuentro de todos sus tutoriales de programación que usted necesita en diferentes lenguajes de programación y base de datos

viernes, diciembre 31, 2010

Feliz Año Nuevo

Ya faltan pocas horas para comenzar el año 2011 .... Espero que todos los buenos y malos momentos que pasaron en el 2010 les ayude para lograr que el año 2011 sea mucho mejor que el año 2010.

Henry Wong 
Les desea un Feliz Año Nuevo 2011

jueves, diciembre 30, 2010

Java - Tetris con Java ME


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

1. Entorno

  • JDK 1.6.0 update 22
  • Netbeans 6.9.1.

2. Introducción


Este tutorial presenta de una forma amena, gráfica y fácil los pasos para la creación de una aplicación (juego, programa, etc…) en J2ME. Desde la instalación de los componentes necesarios, hasta la ejecución y trabajo con los mismos, en las siguientes lecciones aprenderás a moverte fácilmente por una herramienta de desarrollo Java como es NetBeans. Obviaremos lo que es y la explicación del profile MIDP para J2ME, puesto que existen multitud de artículos en Internet que lo explican claramente. Lo que no abundan son ejemplos concretos sobre una herramienta RAD para el desarrollo en J2ME, que es lo que vamos a tratar aquí. El fin es conseguir, en pocos pasos, la familiaridad con estas herramientas para que fácilmente puedas ir desarrollando tus propias aplicaciones.  Como es habitual en todos mis tutoriales, nos apoyaremos sobre todo en imágenes, que es la forma mas visual, didáctica y fácil de aprender. Recordar que este ejemplo es solamente para caso practico, ya que falta agregar mas cosas, como subir la velocidad, score, etc. Que ya queda a su criterio para que lo mejoren.

3. Desarrollo



3.1. Creando el Proyecto

Debemos de crear un proyecto del tipo Java ME y Mobile Application desde Netbeans














Como nombre al proyecto le pondremos "Tetris"














Después que le ponemos el nombre a nuestro proyecto, nos saldrá un formulario como el que sigue. Y seleccionamos la opción por defecto, debido a que ahí solamente seleccionamos que tipo de celular vamos a ejecutar la aplicación















3.2. Creación de clases

Debemos añadir a nuestro proyecto 5 clases y una imagen donde se va a mostrar las figuras del Tetris si es que no la conocen (pero es de forma opcional). La distribución de las clases se mostrara a continuación



















3.2.1. Clase Rejilla

Sirve para dibujar el limite donde se van a mostrar las figurar de Tetris.

package TetrisMidlet;

//@author hwongu

public class Rejilla {

    static final int VACIA = 0;
    static final int BLOQUE = 1;
    static final int PIEZA = 2;
    private int anchura;
    private int altura;
    private int[][] celdas;

    public Rejilla(int w, int h) {
        anchura = w;
        altura = h;
        celdas = new int[anchura][altura];
        initRejilla();
    }

    public int getAnchura() {
        return anchura;
    }

    public int getAltura() {
        return altura;
    }

    public void assignTipoCelda(int x, int y, int valor) {
        celdas[x][y] = valor;
    }

    public int getTipoCelda(int x, int y) {
        return celdas[x][y];
    }

    public void initRejilla() {
        int i, j;

        for (i = 0; i < anchura; i++) {
            for (j = 0; j < altura; j++) {
                celdas[i][j] = VACIA;
            }
        }
        // Añadimos los muros exteriores
        for (i = 0; i < anchura; i++) {
            //celdas[i][0]=BLOQUE;
            celdas[i][altura - 1] = BLOQUE;
        }
        for (j = 1; j < altura - 1; j++) {
            celdas[0][j] = BLOQUE;
            celdas[anchura - 1][j] = BLOQUE;
        }
    }

    boolean copiaFiguraEnRejilla(Figura fig) {
        Elemento elemento;
        boolean valorDevuelto = false;

        for (int i = 0; i < fig.cantidadElmentos(); i++) {
            elemento = fig.getElementoPos(i);
            if (elemento.getFila() + fig.getYOrigen() < 4) {
                valorDevuelto = true;
            }
            celdas[elemento.getColumna() + fig.getXOrigen()][elemento.getFila() + fig.getYOrigen()] = PIEZA;
        }
        return valorDevuelto;
    }

    boolean seChoca(Figura fig, int direccion) {
        Elemento elemento;
        for (int i = 0; i < fig.cantidadElmentos(); i++) {
            elemento = fig.getElementoPos(i);
            if (direccion == Figura.ABAJO) {
                if (celdas[elemento.getColumna() + fig.getXOrigen()][elemento.getFila() + fig.getYOrigen() + 1] != VACIA) {
                    return true;
                }
            } else if (direccion == Figura.IZQUIERDA) {
                if (celdas[elemento.getColumna() + fig.getXOrigen() - 1][elemento.getFila() + fig.getYOrigen()] != VACIA) {
                    return true;
                }
            } else if (direccion == Figura.DERECHA) {
                if (celdas[elemento.getColumna() + fig.getXOrigen() + 1][elemento.getFila() + fig.getYOrigen()] != VACIA) {
                    return true;
                }
            }
        }
        return false;
    }

    int primeraFilaLlena(int desdeFila) {
        boolean encontrada = false;

        while (desdeFila < altura - 1 && !encontrada) {
            if (filaLlena(desdeFila)) {
                encontrada = true;
            } else {
                desdeFila++;
            }
        }
        if (encontrada) {
            return desdeFila;
        } else {
            return -1;
        }
    }

    int ultimaFilaVacia(int fvacia) {
        boolean encontrada = false;

        while ((fvacia < altura - 1) && !encontrada) {
            if (!filaVacia(fvacia)) {
                encontrada = true;
            } else {
                fvacia++;
            }
        }
        return fvacia - 1;
    }

    boolean filaVacia(int fila) {
        int i = 1;
        boolean vacia = true;
        while ((i < anchura - 1) && vacia) {
            if (celdas[i][fila] != VACIA) {
                vacia = false;
            }
            i++;
        }
        return vacia;
    }

    boolean filaLlena(int fila) {
        int i = 1;
        boolean llena = true;
        while ((i < anchura - 1) && llena) {
            if (celdas[i][fila] != PIEZA) {
                llena = false;
            }
            i++;
        }
        return llena;
    }

    void eliminarFilasLlenas() {
        boolean hayfilasllenas = true;
        int filavacia = ultimaFilaVacia(0);
        int filallena = 0;

        while (hayfilasllenas) {
            filallena = primeraFilaLlena(filallena);
            if (filallena >= 0 && filallena < altura) {
                for (int i = filallena - 1; i >= filavacia; i--) {
                    if (i == -1) {
                        for (int j = 0; j < anchura; j++) {
                            celdas[j][0] = VACIA;
                        }
                    } else {
                        copiarFilas(i, i + 1);
                    }
                }
                filavacia++;
                filallena++;
            } else {
                hayfilasllenas = false;
            }
        }
    }

    void copiarFilas(int forigen, int fdestino) {
        for (int i = 0; i < anchura; i++) {
            celdas[i][fdestino] = celdas[i][forigen];
        }
    }
}

3.2.2. Clase Elemento

Muestra en que posición se encuentra la figura que se esta moviendo o ya esta dentro de la rejilla.

package TetrisMidlet;

//@author hwongu

public class Elemento {

    private int fila;
    private int columna;

    public Elemento(int f, int c) {
        fila = f;
        columna = c;
    }

    public int getFila() {
        return fila;
    }

    public int getColumna() {
        return columna;
    }

    public void setFila(int valor) {
        fila = valor;
    }

    public void setColumna(int valor) {
        columna = valor;
    }
}

3.2.3. Clase Figura

Esta clase es la encargada de dibujar la figura que deseamos mostrar.

package TetrisMidlet;

import java.util.Vector;

//@author hwongu

public class Figura {

    static final int IZQUIERDA = 0;
    static final int DERECHA = 1;
    static final int ABAJO = 2;
    static final int ARRIBA = 3;
    static java.util.Random rand = new java.util.Random();
    private Vector elements;
    private int xorigen;
    private int yorigen;

    public Figura(int fila0, int fila1, int fila2, int fila3) {
        elements = new Vector();
        agregarFigura(0, fila0);
        agregarFigura(1, fila1);
        agregarFigura(2, fila2);
        agregarFigura(3, fila3);
    }

    public static Figura nuevaFigura() {
        Figura fig = null;
        int tipoFigura = rand.nextInt(7);
        if (tipoFigura == 0) {
            fig = new Figura(
                    0x0000,
                    0x0FF0,
                    0x0FF0,
                    0x0000); 
        } else if (tipoFigura == 1) {
            fig = new Figura(
                    0x0F00,
                    0x0F00,
                    0x0FF0,
                    0x0000); 
        } else if (tipoFigura == 2) {
            fig = new Figura(
                    0x00F0,
                    0x00F0,
                    0x0FF0,
                    0x0000); 
        } else if (tipoFigura == 3) {
            fig = new Figura(
                    0x0000,
                    0x0F00,
                    0xFFF0,
                    0x0000);
        } else if (tipoFigura == 4) {
            fig = new Figura(
                    0x0F00,
                    0x0F00,
                    0x0F00,
                    0x0F00);
        } else if (tipoFigura == 5) {
            fig = new Figura(
                    0x0F00,
                    0x0FF0,
                    0x00F0,
                    0x0000);
        } else if (tipoFigura == 6) {
            fig = new Figura(
                    0x00F0,
                    0x0FF0,
                    0x0F00,
                    0x0000);
        }
        fig.xorigen = 3;
        fig.yorigen = 0;

        return fig;
    }

    private void agregarFigura(int fila, int valor) {
        if ((valor & 0xF000) > 0) {
            elements.addElement(new Elemento(fila, 0));
        }
        if ((valor & 0x0F00) > 0) {
            elements.addElement(new Elemento(fila, 1));
        }
        if ((valor & 0x00F0) > 0) {
            elements.addElement(new Elemento(fila, 2));
        }
        if ((valor & 0x000F) > 0) {
            elements.addElement(new Elemento(fila, 3));
        }
    }

    public int cantidadElmentos() {
        return elements.size();
    }

    public Elemento getElementoPos(int pos) {
        return (Elemento) elements.elementAt(pos);
    }

    public int getXOrigen() {
        return xorigen;
    }

    public int getYOrigen() {
        return yorigen;
    }

    public void mueve(int direccion) {
        int c, d, i, j;
        if (direccion == ABAJO) {
            yorigen++;
            ;
        } else if (direccion == IZQUIERDA) {
            xorigen--;
        } else if (direccion == DERECHA) {
            xorigen++;
        }
    }

    public void rotar(Rejilla rej) {
        Elemento elemento;
        int x, y, i;
        boolean sepuederotar = true;
        Vector newelements = new Vector();

        i = 0;
        while (i < cantidadElmentos() && sepuederotar) {
            elemento = getElementoPos(i);
            x = elemento.getColumna();
            y = elemento.getFila();
            if (rej.getTipoCelda(y - 1 + getXOrigen(), -x + 3 + getYOrigen()) != Rejilla.VACIA) {
                sepuederotar = false;
            } else {
                newelements.addElement(new Elemento(-x + 3, y - 1));
            }
            i++;
        }
        if (sepuederotar) {
            elements = newelements;
        }
    }
}

3.2.4. Clase Mueve

Esta clase es la encargada de mover la figura, acá utilizamos hilos para si es que en algún caso ustedes quieren agregar la opción de pausa lo puedan implementar, también en esta clase se muestra la velocidad con la cual bajan las figuras, les dejo para su investigación para que puedan subirle el nivel de velocidad conformen ganen en el juego.

package TetrisMidlet;

//@author hwongu

public class Mueve implements Runnable {

    private int delay;
    private boolean continuar = true;
    private boolean suspendFlag = true;
    private TetrisMidlet tetrisMidlet;

    public Mueve(TetrisMidlet tetris, int nivel) {
        tetrisMidlet = tetris;
        delay = actualizaRetardo(nivel);
        Thread t = new Thread(this);
        t.start();
    }

    public void run() {
        try {
            while (continuar) {
                synchronized (this) {
                    while (suspendFlag) {
                        wait();
                    }
                }
                Thread.sleep(delay);
                if (!tetrisMidlet.getRejilla().seChoca(tetrisMidlet.getFigura(), Figura.ABAJO)) {
                    tetrisMidlet.getFigura().mueve(Figura.ABAJO);
                    if (tetrisMidlet.getCanvas() != null) {
                        tetrisMidlet.getCanvas().repaint();
                    }
                } else {
                    boolean valor = tetrisMidlet.getRejilla().copiaFiguraEnRejilla(tetrisMidlet.getFigura());
                    tetrisMidlet.getRejilla().eliminarFilasLlenas();
                    if (tetrisMidlet.getCanvas() != null) {
                        tetrisMidlet.getCanvas().repaint();
                    }
                    if (!valor) {
                        tetrisMidlet.nuevaFigura();
                    } else {
                        System.out.println("He llegado al final");
                        continuar = false;
                    }
                }
            }// end while(continuar)
        } catch (InterruptedException e) {
            System.out.println("Hilo MueveSerpiente interrumpido");
        }
    }

    
     // Detiene momentaneamente la ejecución de la hebra, haciendo que la Figura actual
     //quede parada.
     synchronized public void suspender() {
        tetrisMidlet.getCanvas().repaint();
        suspendFlag = true;
    }

    //Reanuda el movimiento de la hebra. La Figura actual vuelve  a moverse.
    public synchronized void reanudar() {
        tetrisMidlet.getCanvas().repaint();
        suspendFlag = false;
        notify();
    }

    
    //Termina la ejecución de la hebra.
    public void parar() {
        continuar = false;
    }


    //Nos dice si la hebra está o no parada.
    synchronized public boolean getParado() {
        return suspendFlag;
    }

    
    //La siguiente función actualiza el retardo que espera la hebra
    //para mover la Figura actual. El nivel más lento será
    //el 0 (retardo 700) y el más rápido el 10 (retardo 50)
    private int actualizaRetardo(int nivel) {
        if (nivel > 10) {
            nivel = 10;
        } else if (nivel < 0) {
            nivel = 0;
        }
        return (400 - (nivel * 35));
    }
}

3.2.5. Clase MiCanvas

Clase donde se mostraran todos los elementos del tetris

package TetrisMidlet;

import javax.microedition.lcdui.*;

// @author hwongu
public class MiCanvas extends Canvas implements CommandListener {

    private TetrisMidlet tetris;
    private Command exitCommand;
    private int anchoCelda = -1;

    public MiCanvas(TetrisMidlet t) {
        try {
            setCommandListener(this);
            exitCommand = new Command("Exit", Command.EXIT, 1);
            addCommand(exitCommand);
            this.tetris = t;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void dibujaRejilla(Graphics g) {
        int i, j;
        Rejilla rejilla = tetris.getRejilla();
        int xoffset = (getWidth() - rejilla.getAnchura() * anchoCelda) / 2;
        for (i = 0; i < rejilla.getAnchura(); i++) {
            for (j = 0; j < rejilla.getAltura(); j++) {
                if (rejilla.getTipoCelda(i, j) == Rejilla.BLOQUE) {
                    g.setColor(0, 0, 0);
                    g.drawRect(xoffset + i * anchoCelda, j * anchoCelda, anchoCelda,
                            anchoCelda);
                } else if (rejilla.getTipoCelda(i, j) == Rejilla.PIEZA) {
                    g.setColor(255, 255, 0);
                    g.fillRect(xoffset + i * anchoCelda, j * anchoCelda, anchoCelda,
                            anchoCelda);
                    g.setColor(255, 0, 0);
                    g.drawRect(xoffset + i * anchoCelda, j * anchoCelda, anchoCelda,
                            anchoCelda);
                }
            }
        }
    }

    // Dibuja la Figura fig en el Graphics g pasado como par´ametro
    // (normalmente el asociado a este Canvas)
    // @param fig la Figura a dibujar
    // @param g el Graphics donde se dibujar´a
    public void dibujaFigura(Figura fig, Graphics g) {
        if (fig != null) {
            Elemento elemento;
            Rejilla rejilla = tetris.getRejilla();
            int xoffset = (getWidth() - rejilla.getAnchura() * anchoCelda) / 2
                    + fig.getXOrigen() * anchoCelda;
            int yoffset = fig.getYOrigen() * anchoCelda;
            for (int i = 0; i < fig.cantidadElmentos(); i++) {
                elemento = fig.getElementoPos(i);
                g.setColor(255, 255, 0);
                g.fillRect(xoffset + elemento.getColumna() * anchoCelda,
                        yoffset + elemento.getFila() * anchoCelda, anchoCelda,
                        anchoCelda);
                g.setColor(255, 0, 0);
                g.drawRect(xoffset + elemento.getColumna() * anchoCelda,
                        yoffset + elemento.getFila() * anchoCelda, anchoCelda,
                        anchoCelda);
            }
        }
    }

    public void paint(Graphics g) {
        if (anchoCelda == -1) {
            anchoCelda = Math.min(getWidth() / tetris.getRejilla().getAnchura(),
                    (getHeight() - 10) / tetris.getRejilla().getAltura());
        }
        g.setColor(255, 255, 255);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(0, 0, 0);
        g.translate(0, 12);
        dibujaRejilla(g);
        dibujaFigura(tetris.getFigura(), g);
        g.translate(0, -12);
    }

    protected void keyPressed(int keyCode) {
        if (keyCode == getKeyCode(LEFT)) {
            if (!tetris.getRejilla().seChoca(tetris.getFigura(),
                    Figura.IZQUIERDA)) {
                tetris.getFigura().mueve(Figura.IZQUIERDA);
                if (tetris.getCanvas() != null) {
                    tetris.getCanvas().repaint();
                }
            }
        } else if (keyCode == getKeyCode(RIGHT)) {
            if (!tetris.getRejilla().seChoca(tetris.getFigura(),
                    Figura.DERECHA)) {
                tetris.getFigura().mueve(Figura.DERECHA);
                if (tetris.getCanvas() != null) {
                    tetris.getCanvas().repaint();
                }
            }
        } else if (keyCode == getKeyCode(UP)) {
            tetris.getFigura().rotar(tetris.getRejilla());
            if (tetris.getCanvas() != null) {
                tetris.getCanvas().repaint();
            }
        } else if (keyCode == getKeyCode(DOWN)) {
            if (!tetris.getRejilla().seChoca(tetris.getFigura(),
                    Figura.ABAJO)) {
                tetris.getFigura().mueve(Figura.ABAJO);
                if (tetris.getCanvas() != null) {
                    tetris.getCanvas().repaint();
                }
            }
        }
    }

    protected void keyReleased(int keyCode) {
    }

    protected void keyRepeated(int keyCode) {
    }

    protected void pointerDragged(int x, int y) {
    }

    protected void pointerPressed(int x, int y) {
    }

    protected void pointerReleased(int x, int y) {
    }

    public void commandAction(Command command, Displayable displayable) {
        if (command == exitCommand) {
            javax.microedition.lcdui.Display.getDisplay(tetris).setCurrent(tetris.getForm());
        }
    }
}

3.3. Dibujando el Midlet

El Midlet esta conforma por Alert y por un Form, en este ultimo es donde se mostrara la opciones si vamos a jugar, ver el score, etc. Debemos elaborar el siguiente diseño















3.3.1. splashAlert

El "splashAlert" solo nos muestra una bienvenida al juego, el "okCommand" que se adiciona debe de dirigir hacia el form para que se muestre el formulario. Su diseño es el siguiente

















3.3.2. form

El "form" tiene el siguiente diseño
















Debemos de codificar el "okCommand1" para eso hacemos clic derecho en el "okCommand1" y seleccionamos la opcion "Go to source" y dentro de ese evento ponemos el siguiente codigo

public void commandAction(Command command, Displayable displayable) {                                               
        // write pre-action user code here
        if (displayable == form) {                                           
            if (command == exitCommand) {                                         
                // write pre-action user code here
                exitMIDlet();                                           
                // write post-action user code here
            } else if (command == okCommand1) {                                          
                // write pre-action user code here

                                           
                // write post-action user code here
                //Para q valla al boton
                if (choiceGroup.getSelectedIndex() == 0) {
                    System.out.println("Ha seleccionado Jugar");
                    javax.microedition.lcdui.Display.getDisplay(this).setCurrent(this.miCanvas);
                    inicializaJuego();
                    mueve.reanudar();
                } else if (choiceGroup.getSelectedIndex() == 1) {
                    System.out.println("Ha seleccionado Opciones");
                } else if (choiceGroup.getSelectedIndex() == 2) {
                    System.out.println("Ha seleccionado Ver records");
                }
            }                                           
        } else if (displayable == splashAlert) {
            if (command == okCommand) {                                         
                // write pre-action user code here
                switchDisplayable(null, getForm());                                           
                // write post-action user code here
            }                                                  
        }                                                
        // write post-action user code here
}                   

4. Ejemplo de la Aplicación


miércoles, diciembre 29, 2010

VB.Net - Aplicación Móvil con Data Local


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

1. Entorno

  • Visual Studio 2008

2. Introducción


ADO.NET proporciona acceso a diversas fuentes de datos. Estos incluyen Microsoft SQL Server, SQL Server CE, fuentes de datos expuestos a través   de OLE DB, y XML. Porque ADO.NET se basa en Microsoft. NET Framework, el acceso es el mismo para datos locales y remotos ADO.NET utiliza una arquitectura de datos desconectada. Los datos se almacenan y manipulado a nivel local en dataset. El dataset es un  base de datos virtual que contiene una o más tablas. En una aplicación móvil, los tablas del dataset  pueden ser pobladas por el usuario móvil de una bases de datos local o remota.


3. Desarrollo



3.1. Crear proyecto en Visual Studio 2008

Primero debemos de crear un proyecto del tipo Smart Device desde Visual Studio 2008, para eso abrimos el Visual Studio y seleccionamos la opción de crear un nuevo proyecto del tipo Smart Device y le ponemos como nombre "EjemploDataLocal"













Y de ahí seleccionamos la opción de crear un proyecto del tipo SmartPhone
















3.2. Agregando la Base de Datos Local

Para ello hacemos clic derecho en el proyecto de ahi seleccionamos "Agregar-->Nuevo Elemento"



















De ahí seleccionamos la categoría Datos, luego la opción de Archivo de Base de datos y finalmente le ponemos como nombre a nuestra base de datos "BDEmpleado"













De ahí nos sale la siguiente ventana y luego presionamos el botón Finalizar

















3.3. Crear las tablas

Para crear la tabla ir a la parte de "Explorador de Servidores" y hacer clic derecho en la carpeta que dice "Tabla" y seleccionamos la opción de "Crear tabla"
















Luego debemos de crear dos tablas Cargo y Empleado. La tabla Cargo tendra las siguiente columnas















Y la tabla Empleado tiene las siguiente columnas
















3.4. Llenar los datos de la tabla Cargo

Para eso hacemos clic derecho en la tabla Cargo y luego seleccionamos la opción "Mostrar Datos de Tabla"































3.5. Creando Clases

Debemos crear la clase que daran soporte al formulario que vamos a crear

3.5.1. Clase Conexion

Public Class Conexion

    Public cnn As String = "Data Source =" + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase) + "\BDEmpleado.sdf;"

End Class

3.5.2. Clase Cargo

Imports System.Data.SqlServerCe
Imports System.Data

Public Class Cargo

    Public Function llenarCargo() As DataTable
        Dim dt As New DataTable
        Dim sqlcon As New SqlCeConnection
        sqlcon.ConnectionString = New Conexion().cnn
        Dim sqlcmd As New SqlCeCommand
        sqlcmd.Connection = sqlcon
        sqlcmd.CommandText = "select * from cargo"
        Dim sqldat As New SqlCeDataAdapter(sqlcmd)
        sqldat.Fill(dt)
        Return dt
    End Function

End Class

3.5.3. Clase Empleado

Imports System.Data.SqlServerCe
Imports System.Data

Public Class Empleado

    Private varCodigo As Integer
    Private varNombre As String
    Private varFechaNacimiento As DateTime
    Private varCodigoCargo As Integer

    Public Function insertarEmpleado(ByVal emp As Empleado) As String
        Dim sqlcon As New SqlCeConnection
        Try
            sqlcon.ConnectionString = New Conexion().cnn
            sqlcon.Open()
            Dim sqlcmd As New SqlCeCommand
            sqlcmd.Connection = sqlcon
            sqlcmd.CommandText = "INSERT INTO Empleado(Empleado_Nombre,Empleado_FecNac,Cargo_Codigo) VALUES(?,?,?)"
            sqlcmd.Parameters.Add("@Empleado_Nombre", SqlDbType.NVarChar, 100).Value = emp.Nombre
            sqlcmd.Parameters.Add("@Empleado_FecNac", SqlDbType.DateTime).Value = emp.FechaNacimiento
            sqlcmd.Parameters.Add("@Cargo_Codigo", SqlDbType.Int).Value = emp.CodigoCargo
            If sqlcmd.ExecuteNonQuery = 1 Then
                Return "OK"
            Else
                Return "No se pudo insertar al Empleado"
            End If
        Catch ex As Exception
            Return ex.Message
        Finally
            If sqlcon.State = ConnectionState.Open Then
                sqlcon.Close()
            End If
        End Try
    End Function


    Public Function actualizarEmpleado(ByVal emp As Empleado) As String
        Dim sqlcon As New SqlCeConnection
        Try
            sqlcon.ConnectionString = New Conexion().cnn
            sqlcon.Open()
            Dim sqlcmd As New SqlCeCommand
            sqlcmd.Connection = sqlcon
            sqlcmd.CommandText = "UPDATE Empleado SET Empleado_Nombre=? ,Empleado_FecNac=?, Cargo_Codigo=? WHERE Empleado_Codigo=?"
            sqlcmd.Parameters.Add("@Empleado_Nombre", SqlDbType.NVarChar, 100).Value = emp.Nombre
            sqlcmd.Parameters.Add("@Empleado_FecNac", SqlDbType.DateTime).Value = emp.FechaNacimiento
            sqlcmd.Parameters.Add("@Cargo_Codigo", SqlDbType.Int).Value = emp.CodigoCargo
            sqlcmd.Parameters.Add("@Empleado_Codigo", SqlDbType.Int).Value = emp.Codigo
            If sqlcmd.ExecuteNonQuery = 1 Then
                Return "OK"
            Else
                Return "No se pudo actualizar al Empleado"
            End If
        Catch ex As Exception
            Return ex.Message
        Finally
            If sqlcon.State = ConnectionState.Open Then
                sqlcon.Close()
            End If
        End Try
    End Function

    Public Function eliminarEmpleado(ByVal codigoEmp As Integer) As String
        Dim sqlcon As New SqlCeConnection
        Try
            sqlcon.ConnectionString = New Conexion().cnn
            sqlcon.Open()
            Dim sqlcmd As New SqlCeCommand
            sqlcmd.Connection = sqlcon
            sqlcmd.CommandText = "DELETE FROM Empleado WHERE Empleado_Codigo=?"
            sqlcmd.Parameters.Add("@Empleado_Codigo", SqlDbType.Int).Value = codigoEmp
            If sqlcmd.ExecuteNonQuery = 1 Then
                Return "OK"
            Else
                Return "No se pudo eliminar al Empleado"
            End If
        Catch ex As Exception
            Return ex.Message
        Finally
            If sqlcon.State = ConnectionState.Open Then
                sqlcon.Close()
            End If
        End Try
    End Function

    Public Function todosEmpleados() As DataTable
        Dim dt As New DataTable
        Dim sqlcon As New SqlCeConnection
        sqlcon.ConnectionString = New Conexion().cnn
        Dim sqlcmd As New SqlCeCommand
        sqlcmd.Connection = sqlcon
        Dim sql As String = "SELECT Empleado.Empleado_Codigo AS Codigo, Empleado.Empleado_Nombre AS Empleado, Empleado.Empleado_FecNac AS FecNac, " & _
        "Cargo.Cargo_Nombre AS Cargo, Cargo.Cargo_Codigo as CodigoCargo " & _
        "FROM Cargo INNER JOIN " & _
        "Empleado ON Cargo.Cargo_Codigo = Empleado.Cargo_Codigo"
        sqlcmd.CommandText = sql
        Dim sqldat As New SqlCeDataAdapter(sqlcmd)
        sqldat.Fill(dt)
        Return dt
    End Function

    Public Property Codigo() As Integer
        Get
            Return varCodigo
        End Get
        Set(ByVal value As Integer)
            varCodigo = value
        End Set
    End Property

    Public Property Nombre() As String
        Get
            Return varNombre
        End Get
        Set(ByVal value As String)
            varNombre = value
        End Set
    End Property

    Public Property FechaNacimiento() As DateTime
        Get
            Return varFechaNacimiento
        End Get
        Set(ByVal value As DateTime)
            varFechaNacimiento = value
        End Set
    End Property

    Public Property CodigoCargo() As Integer
        Get
            Return varCodigoCargo
        End Get
        Set(ByVal value As Integer)
            varCodigoCargo = value
        End Set
    End Property

End Class

3.6. Diseño del Formulario

Debemos de diseñar el siguiente formulario



















Los nombre de los componentes que se han diseñado serán lo siguientes:

  • txtCodigo --> TextBox
  • txtNombre --> TextBox
  • dtpFechaNacimiento --> DateTimePicker
  • cboCargo --> ComboBox
  • btnRegistrar --> Button
  • brnActualizar --> Button
  • btnEliminar --> Button
  • btnLimpiar --> Button

Luego en la otra pestaña del TabControl



















En la siguiente pestaña lo componentes que estarán recibirán los siguientes nombres:

  • dgEmpleado --> DataGrid

3.7. Codigo del Formulario

El formulario debe de tener el siguiente codigo

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim c As New Cargo
        Me.cboCargo.DataSource = c.llenarCargo
        Me.cboCargo.DisplayMember = "Cargo_Nombre"
        Me.cboCargo.ValueMember = "Cargo_Codigo"
        Me.dgEmpleado.DataSource = New Empleado().todosEmpleados
    End Sub

    Private Sub limpiar()
        Me.txtCodigo.Text = ""
        Me.txtNombre.Text = ""
        Me.cboCargo.SelectedIndex = 0
        Me.dtpFechaNacimiento.Value = Date.Now
    End Sub

    Private Sub mOk(ByVal men As String)
        MessageBox.Show(men, "MENSAJE", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1)
    End Sub

    Private Sub mError(ByVal men As String)
        MessageBox.Show(men, "MENSAJE", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1)
    End Sub

    Private Sub btnRegistrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegistrar.Click
        Dim emp As New Empleado
        emp.Nombre = Me.txtNombre.Text.ToUpper
        emp.FechaNacimiento = Me.dtpFechaNacimiento.Value
        emp.CodigoCargo = CInt(Me.cboCargo.SelectedValue)
        Dim mensaje As String = emp.insertarEmpleado(emp)
        If mensaje = "OK" Then
            mOk("Se registro al Empleado de forma correcta")
            Me.limpiar()
            Me.dgEmpleado.DataSource = emp.todosEmpleados
        Else
            mError(mensaje)
        End If
    End Sub

    Private Sub brnActualizar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles brnActualizar.Click
        If Me.txtCodigo.Text <> "" Then
            Dim emp As New Empleado
            emp.Codigo = CInt(Me.txtCodigo.Text)
            emp.Nombre = Me.txtNombre.Text.ToUpper
            emp.FechaNacimiento = Me.dtpFechaNacimiento.Value
            emp.CodigoCargo = CInt(Me.cboCargo.SelectedValue)
            Dim mensaje As String = emp.actualizarEmpleado(emp)
            If mensaje = "OK" Then
                mOk("Se actualizo al Empleado de forma correcta")
                Me.limpiar()
                Me.dgEmpleado.DataSource = emp.todosEmpleados
            Else
                mError(mensaje)
            End If
        Else
            mError("Debe de buscar un empleado para actualizar")
        End If
    End Sub

    Private Sub dgEmpleado_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgEmpleado.DoubleClick
        Dim indice As Integer = Me.dgEmpleado.CurrentCell.RowNumber
        Dim dt As Data.DataTable = Me.dgEmpleado.DataSource
        Dim r As Data.DataRow = dt.Rows(indice)
        Me.txtCodigo.Text = r("Codigo")
        Me.txtNombre.Text = r("Empleado")
        Me.dtpFechaNacimiento.Value = r("FecNac")
        Me.cboCargo.SelectedValue = r("CodigoCargo")
        Me.TabControl1.SelectedIndex = 0
    End Sub

    Private Sub btnLimpiar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpiar.Click
        Me.limpiar()
    End Sub

    Private Sub btnEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEliminar.Click
        If Me.txtCodigo.Text <> "" Then
            Dim emp As New Empleado
            Dim mensaje As String = emp.eliminarEmpleado(CInt(Me.txtCodigo.Text))
            If mensaje = "OK" Then
                mOk("Se elimino al Empleado de forma correcta")
                Me.limpiar()
                Me.dgEmpleado.DataSource = emp.todosEmpleados
            Else
                mError(mensaje)
            End If
        Else
            mError("Debe de buscar un empleado para eliminar")
        End If
    End Sub
    
End Class


4. Ejemplo de la Aplicación


PHP - Clases y Registrar a BD MySQL usando Transacciones


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

1. Entorno

  • Netbeans 6.9.1.
  • WAMP Server

2. Introducción


PHP no es un lenguaje netamente orientado a objetos, el inicio de este lenguaje fue pensado para realizar una programación del tipo estructurada, pero con el tiempo PHP incorporo a su lenguaje el uso de clases. Para asi poder realizar aplicaciones orientadas a objetos usando PHP.

3. Desarrollo


3.1. Crear proyecto en Netbeans

Debemos de crear un proyecto en Netbeans 6.9.1. ya que este IDE nos da soporte para poder desarrollar aplicaciones basándose en PHP.













La copia de los archivos deben de apuntar a la carpeta "www" del "WAMP"












3.2. Crear las clases

Vamos a crear una clase llamada Conexion donde se centrara el modo de como conectarnos a la base de datos y otra clase que se llamara Alumno donde estará un método para registrar a la base de datos, usando transacciones para que tambien pueda ver como es el manejo de transacciones, de la forma mas sencilla sin usar el método propio de PHP, y otro método donde obtener la información de todos los alumnos. La forma como agrego una clase a nuestro proyecto en Netbeans es hacer clic derecho en el proyecto y luego seleccionar la opción New-->PHP Class

















3.3. Codificación de la clase alumno

3.3.1. Clase Conexion

<?php

class Conexion {

 private $BaseDatos;
 private $Servidor;
 private $Usuario;
 private $Clave;
 private $Conexion_ID;
 private $Error = "";

 function Conexion() {
  $this->BaseDatos = "bdejemplos";
  $this->Servidor = "localhost";
  $this->Usuario = "root";
  $this->Clave = "";
 }

 function conectarClasico() {
  $this->Conexion_ID=mysql_connect($this->Servidor, $this->Usuario, $this->Clave);
  if (!$this->Conexion_ID) {
   $this->Error = "Ha fallado la conexión.";
   return 0;
  }
  if (!@mysql_select_db($this->BaseDatos, $this->Conexion_ID)) {
   $this->Error = "Imposible abrir " . $this->BaseDatos;
   return 0;
  }
  return $this->Conexion_ID;
 }
}
?>

3.3.2. Clase Alumno

<?php

include_once 'Conexion.php';

class Alumno {

    private $codigo;
    private $nombre;
    private $apellido;
    private $escuela;
    private $categoria;
    private $monto;

    private function insertarAlumno() {
        $rpta = false;
        try {
            $miconexion = new conexion();
            $cn = $miconexion->conectarClasico();
            //Inicia la transacción
            mysql_query("BEGIN", $cn);
            $sql = "INSERT INTO alumno(nombre,apellido,codigoEscuela,categoria,monto) VALUES ('$this->nombre','$this->apellido',$this->escuela,'$this->categoria',$this->monto)";
            $result = mysql_query($sql, $cn);
            if (!$result) {
                //Niega la insercion
                mysql_query("ROLLBACK", $cn);
            } else {
                //Realiza el commit
                mysql_query("COMMIT", $cn);
                $rpta = true;
            }
            mysql_close($cn);
        } catch (exception $e) {
            try {
                mysql_query("ROLLBACK", $cn);
            } catch (exception $e1) {
                
            }
            try {
                mysql_close($cn);
            } catch (exception $e1) {
                
            }
            $rpta = false;
        }
        return $rpta;
    }

    public function todosAlumnos() {
        $sql = "SELECT * FROM alumno ORDER BY nombre";
        $registros = array();
        try {
            $miconexion = new conexion();
            $cn = $miconexion->conectarClasico();
            $rs = mysql_query($sql, $cn);
            while ($reg = mysql_fetch_array($rs)) {
                array_push($registros, $reg);
            }
            mysql_free_result($rs);
            mysql_close($cn);
        } catch (exception $e) {
            try {
                mysql_free_result($rs);
            } catch (exception $e) {
                
            }
            try {
                mysql_close($cn);
            } catch (exception $e) {
                
            }
            $registros = array();
        }
        return $registros;
    }

    public function getCodigo() {
        return $this->codigo;
    }

    public function setCodigo($codigo) {
        $this->codigo = $codigo;
    }

    public function getNombre() {
        return $this->nombre;
    }

    public function setNombre($nombre) {
        $this->nombre = $nombre;
    }

    public function getApellido() {
        return $this->apellido;
    }

    public function setApellido($apellido) {
        $this->apellido = $apellido;
    }

    public function getEscuela() {
        return $this->escuela;
    }

    public function setEscuela($escuela) {
        $this->escuela = $escuela;
    }

    public function getCategoria() {
        return $this->categoria;
    }

    public function setCategoria($categoria) {
        $this->categoria = $categoria;
    }

    public function getMonto() {
        return $this->monto;
    }

    public function setMonto($monto) {
        $this->monto = $monto;
    }

}

?>

martes, diciembre 28, 2010

PHP - Bienvenido PHP


Estoy preparando un tutorial sobre PHP que espero que sea de su agrado y lo puedan utilizar para sus proyectos. Así que desde hoy decimos Bienvenido PHP!!!! a Programando con Café :D

miércoles, diciembre 22, 2010

Feliz Navidad Programadores, Desarrolladores de Software, Ingenieros, etc

Quizás esta entrada no tenga nada que ver con Programación o algo por el estilo ... Pero es para desearle a todos ustedes una Feliz Navidad, ya se que aun puede faltar un par de días pero quiero anticiparme, y que el día 25 de diciembre lo pasen en compañía de todos sus queridos. Y que reine la paz, el amor y la armonía en su familia :D ... Si desean darme un regalo solo sígueme brindando su apoyo a este blog para que crezca poco a poco con su ayuda y los fans por FB crezcan xD ... Muchas gracias y nuevamente FELIZ NAVIDAD!!!!!!!!!!!

viernes, diciembre 17, 2010

Java - Obtener imagen desde Base de Datos


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

Metodo utilizado para obtener la imagen desde la Base de Datos, para eso elaboramos una sentencia como la siguiente: "select longitud, imagen from tabla where codigo=?"

public static Image obtenerImagenEnBD(Connection con, int codigoFila, String sentenciaSQL) {
ResultSet rs = null;
 PreparedStatement pstmt = null;
 // Ejecutamos la consulta SQL que se pasa como parámetro
 try {
            pstmt = con.prepareStatement(sentenciaSQL);
            //buscar por codigo la imagen
            pstmt.setInt(1, codigoFila);
            rs = pstmt.executeQuery();
            if (!rs.next()) {//si no encuentra la imagen
                return null;
            }
            int len = rs.getInt("longitud");//longitud de la imagen
            byte[] b = new byte[len];//array de bytes
            InputStream in = rs.getBinaryStream("imagen");//leemos la imagen
            int n = in.read(b);
            in.close();
            //Creamos una imagen a partir de un array de bytes
            Image img = Toolkit.getDefaultToolkit().createImage(b);
            rs.close();
            pstmt.close();
            return img;
 } catch (Exception e) {
            System.err.println("Error al acceder al registro: " + e.getMessage());
 }
 return null;
}

jueves, noviembre 25, 2010

Java - LLenar un JTable con ResultSet


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

1. Entorno


  • JDK 6 Update 21
  • Netbeans 6.9.1
  • MySQL 5.1.

2. Introducción


Lo que se desea demostrar en este tutorial es como mostrar los datos de una consulta en un JTable. Haciendo uso de la clase ResultSetMetaData que nos brinda la información de una tabla de la base de datos y la clase ResultSet que nos devuelve la data producto de una consulta hacia la base de datos.

3. Desarrollo


3.1. Crear el proyecto

Primero debemos de crear un proyecto en Netbeans para eso nos vamos a "File->New Project" y seleccionamos la opción de crear un "Java Application"














Y como nombre al proyecto le ponemos "LlenarJTable"














Al proyecto debemos de agregar un formulario (JFrameForm) que lo llamaremos "frmLlenarJtable". Para hacemos clic derecho en el paquete que se llama "llenarjtable" de ahí seleccionamos New y elegimos "JFrame Form"

















3.2. Diseño del Formulario

Debemos de diseñar el siguiente formulario:


















Donde:

El JTextBox: Recibe el nombre de txtQuery
El JTable: Recibe el nombre de jtQuery
El JButton: Recibe el nombre de btnConsultar

3.3. Crear base de datos en MySQL

Debemos de crear una base de datos en MySQL. A la base de la llamaremos "bdproductos" y también crearemos una tabla que se llamara "producto"

















3.4. Codificando el action del botón "Consultar"

Debemos de codificar la acción del botón "Consultar" que va a llenar al JTable con la data producto de la consulta que vamos a hacer a la base de datos bdproductos que esta en MySQL. No olvidar agregar el conector al Netbeans para poder comunicarnos con MySQL.























Para ir a la Action del botón debemos hacer clic derecho en el botón de ahí seleccionamos Events, luego Action y finalmente ActionPerformed















Y luego dentro de ese evento ponemos el siguiente codigo

try {
 //Para establecer el modelo al JTable
 DefaultTableModel modelo = new DefaultTableModel();
 this.jtQuery.setModel(modelo);
 //Para conectarnos a nuestra base de datos
 DriverManager.registerDriver(new com.mysql.jdbc.Driver());
 Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/bdproductos", "usuario", "clave");
 //Para ejecutar la consulta
 Statement s = conexion.createStatement();
 //Ejecutamos la consulta que escribimos en la caja de texto
 //y los datos lo almacenamos en un ResultSet
 ResultSet rs = s.executeQuery(txtQuery.getText());
 //Obteniendo la informacion de las columnas que estan siendo consultadas
 ResultSetMetaData rsMd = rs.getMetaData();
 //La cantidad de columnas que tiene la consulta
 int cantidadColumnas = rsMd.getColumnCount();
 //Establecer como cabezeras el nombre de las colimnas
 for (int i = 1; i <= cantidadColumnas; i++) {
  modelo.addColumn(rsMd.getColumnLabel(i));
 }
 //Creando las filas para el JTable
 while (rs.next()) {
  Object[] fila = new Object[cantidadColumnas];
  for (int i = 0; i < cantidadColumnas; i++) {
    fila[i]=rs.getObject(i+1);
  }
  modelo.addRow(fila);
 }
 rs.close();
 conexion.close();
} catch (Exception ex) {
 ex.printStackTrace();
}

4. Ejemplo de la aplicación

Sin poner etiquetas a la consulta
































Con etiquetas a la consulta