viernes, 5 de marzo de 2010

insertar, modificar, eliminar registros de una BD

Hola que tal como estan? continuando con el tutorial anterior donde recuperabamos los registros de la Base de datos con PHP y los mostramos en un DataGrid en Flex ahora lo que sigue es hacer las operaciones basicas como son la alta, la modificiacion y la eliminacion de dichos registros comenzamos..

nota: vamos a utilizar los mismos archivos del tutorial anterior incluido la tabla de usuarios que creamos asi esque si no entiendes este tutorial te recomiendo leas el primero.

1.-A la clase php que hicimos en el tutorial anterior solo le vamos a agregar los siguientes metodos..

antes que nada para tener mejor control sobre los registros a la tabla usuarios le vamos a agregar un campo que se llame status y que sea booleano ya veremos mas adelante para que..ese campo lo podemos agregar a la tabla mediante phpMyAdmin o con el siguiente codigo:

  1. ALTER TABLE `usuariosFlex` ADD `status` INT NOT NULL ;  

lo declare entero porque my gestor de base de datos no trae el tipo booleano o no lo encontre para el fin es lo mismo cualquiera de los dos nos sirve y se tratan de la misma manera, nunca contraten triara je

bien para que todo funcione bien tendriamos que agregarle esto a la consulta de sql que ya tenemos en la clase de php "where status=1" con lo cual el metodo quedaria asi:

  1. function getUsuarios()   
  2.     {  
  3.           
  4.      $dbhost="xx";  // host del MySQL (generalmente localhost)  
  5.      $dbusuario="xx"// aqui debes ingresar el nombre de usuario  
  6.                               // para acceder a la base  
  7.      $dbpassword="xx"// password de acceso para el usuario de la  
  8.                               // linea anterior  
  9.      $db="xx";        // Seleccionamos la base con la cual trabajar  
  10.        
  11.      $mysql = mysql_connect($dbhost$dbusuario$dbpassword);  
  12.           
  13.      mysql_select_db( $db ); //acemos que la bd que queremos sea la activa  
  14.               
  15.      $sql = "select * from usuariosFlex where status=1";   
  16.              $Result = mysql_query( $sql );  
  17.              while ($row = mysql_fetch_object($Result)) {  
  18.                      $return[] = $row;  
  19.              }  
  20.           
  21.     return$return );//regresamos el arrego como tal..  
  22.     }  



Para insertar un registro en la base de datos:aqui solo necesitamos un metodo que nos reciba como parametros el nombre y la edad del nuevo usuario ya que los demas campos como el id y el status son los mismos para todos los usuarios nuevos asi que los dejamos como constantes desde el sql
  1. function addUsuario($nombre,$edad)   
  2.     {  
  3.           
  4.      $dbhost="xx";  // host del MySQL (generalmente localhost)  
  5.      $dbusuario="xx"// aqui debes ingresar el nombre de usuario  
  6.                               // para acceder a la base  
  7.      $dbpassword="xx"// password de acceso para el usuario de la  
  8.                               // linea anterior  
  9.      $db="xx";        // Seleccionamos la base con la cual trabajar  
  10.        
  11.      $mysql = mysql_connect($dbhost$dbusuario$dbpassword);  
  12.           
  13.      mysql_select_db( $db ); //acemos que la bd que queremos sea la activa  
  14.               
  15.      $sql = "INSERT INTO `usuariosFlex` ( `id_usuario` , `nombre_usuario`,  
  16.      `edad_usuario` , `status` )VALUES ('''$nombre'$edad, 1);";  
  17.      $Result = mysql_query( $sql );  
  18.                
  19.     }  


modificar el registro: para este paso vamos a necesitar el id del registro a modificar este nos lo vamos a ver y a seleccionar desde el dataGrid pero ese ya es codigo de flex por ahora solo lo vamos a recibir como parameto junto con el nombre y la edad que son los que se van a modificar. y quedaria de la siguiente manera:
  1. function updateUsuario($id$nombre$edad)  
  2.     {  
  3.           
  4.      $dbhost="xx";  // host del MySQL (generalmente localhost)  
  5.      $dbusuario="xx"// aqui debes ingresar el nombre de usuario  
  6.                               // para acceder a la base  
  7.      $dbpassword="xx"// password de acceso para el usuario de la  
  8.                               // linea anterior  
  9.      $db="xx";        // Seleccionamos la base con la cual trabajar  
  10.        
  11.      $mysql = mysql_connect($dbhost$dbusuario$dbpassword);  
  12.           
  13.      mysql_select_db( $db ); //acemos que la bd que queremos sea la activa  
  14. $sql = "UPDATE `usuariosFlex` SET `nombre_usuario` = '$nombre',  
  15.      `edad_usuario` = $edad WHERE `id_usuario` = $id;";  
  16. }  


Eliminar el registro:para realizar esta operacion solo vamos a cambiar el status de dicho registro a un valor falso o cero de esta manera en flex no nos mostrara dicho registro y nosotros sabres que esta marcado como eliminado esto es porque si alguien elimina los registros por error podramos recuperarlos despues..para ello solo vamos a necesitar el Id del registro a eliminar quedaria de la siguiente manera:
  1. function deleteUsuario($id)  
  2.     {  
  3.           
  4.      $dbhost="xx";  // host del MySQL (generalmente localhost)  
  5.      $dbusuario="xx"// aqui debes ingresar el nombre de usuario  
  6.                               // para acceder a la base  
  7.      $dbpassword="xx"// password de acceso para el usuario de la  
  8.                               // linea anterior  
  9.      $db="xx";        // Seleccionamos la base con la cual trabajar  
  10.        
  11.      $mysql = mysql_connect($dbhost$dbusuario$dbpassword);  
  12.           
  13.      mysql_select_db( $db );   
  14.      $sql = "UPDATE `usuariosFlex` SET `status` = 0  
  15.      WHERE `id_usuario` = $id;";  
  16. }  


2.- Con esto tendriamos completa la clase php y los metodos que nos va a servir para modificar la tabla de nuestra base ahora les recomiendo que chequen que todo funcione bien en el browser del amfPHP ya hice las pruevas y todo funciona pueden ver mi browser con dicha clase y los metodos funcionando desde aqui: http://logix.com.mx/robert/amfphp/browser/ y ya que todo funciona en php y en amfPHP pasamos al paso numero 3.

3.-Vamos a retomar el ejemplo del tutorial anterior con el DataGrid y el boton que habiamos puesto le vamos a cambiar el nombre al boton que tenias en lugar de Consultar se va a llamar Actualizar ojo solo el nombre todo el codigo queda igual ahora vamos a agregar otros botones y dos campos de texto como vemos en la siguiente imagen:



4.-Ahora pondre el codigo para las funciones en AS3 y como llamarlas desde flex lo voy a comentar pero ya menos dado que es el mismo proceso del codigo que comente a detalle en el tutorial anterior si algo no entienden y es referente al codigo revisen el tuto anterior y si aun asi no entienden posteen la duda como comentario ok

  1. <!--xml version="1.0" encoding="utf-8"?-->  
  2. <mx:application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="iniciar();">  
  3.   
  4. <mx:script>  
  5.  <!--[CDATA[<br /-->    
  6.   import mx.controls.Alert; //para mensajes en ventanitas  
  7.   //******************USO DEL AMFPHP*****************   
  8.   //declara una variable de la clase conexion remota  
  9.         private var miConexion : conexionRemota;  
  10.     
  11.   //arreglo que recibira el contenido devuelto por el metodo php  
  12.   //(en este caso el contenido sera todos los registros de la tabla usuariosFlex)  
  13.   [Bindable]           
  14.   private var datos:Array;  
  15.     
  16.   private function iniciar():void  
  17.   {  
  18.    //ruta del archivo gateway del amfPHP  
  19.             miConexion = new conexionRemota( "http://logix.com.mx/robert/amfphp/gateway.php" );  
  20.               
  21.               
  22.   }  
  23.         
  24.   public function cargarUsuarios():void  
  25.   {   //nombre de la clase php "punto" invocamos al metodo deseado  
  26.    miConexion.call( "miClasePHP.getUsuarios"new Responder(exitoFuncion,errorFuncion));  
  27.     /*podemos ver que dentro de Responder tenemos dos opciones  
  28.     exito y error las cuales debemos crearlas aqui en AS y seran  
  29.     invocadas dependiendo si tuvo exito o no la llamada al metodo  
  30.     getUsuarios*/  
  31.          
  32.   }  
  33.     
  34.   /*funcion que se invoca cuando tenga exito la llamada  
  35.   al metodo getUsuarios recibimos un parametro el cual 
  36.   debe conicidir con el parametro que regrese php en esa 
  37.   funcion en este caso nuestro metodo php nos devuelve 
  38.   un arreglo que es el equivalente a Array en Flex*/   
  39.   private function exitoFuncion(resultado:Array):void  
  40.   {  
  41.    /*lo unico que vamos a hacer es asignar ese  
  42.    arreglo devuelto por php a nuestro arreglo 
  43.    de Flex y magia*/  
  44.    datos=resultado;  
  45.   }  
  46.   /*funcion que se invoca cuando tenga error la llamada  
  47.   al metodo getUsuarios aqui tambien recibimos un parametro 
  48.   de tipo String que contendra la cadena de error enviada 
  49.   por el php en caso de que haya error*/   
  50.   private function errorFuncion(error:String):void  
  51.   {  
  52.    //aqui solo vamos a mostrar el error en un Alert  
  53.    Alert.show(error);  
  54.   }  
  55.     
  56.     
  57.   //***********TODO LO ANTERIOR ES PARTE DEL TUTO 1  
  58.   //AQUI EMPIEZA CODIGO DE ESTE TUTO  
  59.     
  60.   /*PARA AGREGAR USUARIO RECUERDEN QUE ESTA FUNCION REQUIERE  
  61.   PARAMETROS ESTOS LOS TOMAOS DESDE LOS TEXTIMPUT Y SE LOS  
  62.   PASAMOS AL PHP DE LA SIGUIENTE MANERA:*/  
  63.   public function addUsuarios():void  
  64.   {     
  65.    miConexion.call( "miClasePHP.addUsuario"new Responder(exitoFuncionAdd,errorFuncion),  
  66.    txtUsuario.text, txtEdad.text);  
  67.     /*llamamos al metodo de la clase que nos inserta un nuevo usuario 
  68.     esta nos recibe dos parametros que son los txt aqui en flex 
  69.     y le cambiamos el nombre solo a la funcion de exito porque 
  70.     la de error se queda igual y puede utilizarse la misma ya que solo mostramos 
  71.     que hay error..*/  
  72.          
  73.   }  
  74.     
  75.   private function exitoFuncionAdd(parametro:String):void  
  76.   {  
  77.    /*vamos a mostrar un mensaje al usuario de que 
  78.    el nuevo registro a sido agregado para ello:*/  
  79.    Alert.show("Insercion Exitosa","EjemploFlex");  
  80.   }  
  81.     
  82.   public function updateUsuarios():void  
  83.   {     
  84.    miConexion.call( "miClasePHP.updateUsuario"new Responder(exitoFuncionUpdate,errorFuncion),  
  85.    dtaUsuarios.selectedItem.id_usuario,txtUsuario.text, txtEdad.text);  
  86.     /*aqui ademas de los parametros de nombre y usuario nos va 
  87.     a recibir el id del registro a editar ese lo vamos a tomar 
  88.     del DataGrid partiendo de que el registro seleccionado es 
  89.     aquel que queremos editar.*/  
  90.          
  91.   }  
  92.     
  93.   private function exitoFuncionUpdate(parametro:String):void  
  94.   {  
  95.    Alert.show("Edicion Exitosa","EjemploFlex");  
  96.   }  
  97.     
  98.   public function deleteUsuarios():void  
  99.   {     
  100.    miConexion.call( "miClasePHP.deleteUsuario"new Responder(exitoFuncionDelete,errorFuncion),  
  101.    dtaUsuarios.selectedItem.id_usuario);  
  102.     /*aqui solo necesitamos el id a eliminar*/  
  103.          
  104.   }  
  105.     
  106.   private function exitoFuncionDelete(parametro:String):void  
  107.   {  
  108.    Alert.show("Registro Eliminado","EjemploFlex");  
  109.   }  
  110.     
  111.     
  112.  ]]>  
  113. </mx:script>  
  114.   
  115.  <!--para mostrar los datos en la grilla solo bastaria con asignar   
  116.  nuestro arreglo a su propiedad dataProvider pero eso tendria un  
  117.  incoveniente ya que segun los desarrolladores de flex la manera  
  118.  en que los dataGrid cargan los datos es aleatoria en cuanto al orden  
  119.  de las columnas por lo que haremos que el orden sea como nosotros   
  120.  quieramos asignando manualmente las columnas para ello solo es  
  121.  necesario establecer en su propiedad dataField de cada columna el  
  122.  nombre del campo que queremos que se muestre-->  
  123.  <mx:datagrid x="170.5" y="207" width="447" dataprovider="{datos}" id="dtaUsuarios">  
  124.   <mx:columns>  
  125.    <mx:datagridcolumn headertext="ID " datafield="id_usuario">  
  126.    <mx:datagridcolumn headertext="Usuario" datafield="nombre_usuario">  
  127.    <mx:datagridcolumn headertext="Edad" datafield="edad_usuario">  
  128.   </mx:datagridcolumn></mx:datagridcolumn></mx:datagridcolumn></mx:columns>  
  129.  </mx:datagrid>  
  130.  <!--************************************  
  131.       desde nuetro boton solo vamos a llamar a la funcion cargar usuarios  
  132.           ***********************************-->  
  133.  <mx:controlbar x="206.5" y="357" width="375" horizontalalign="center">  
  134.   <mx:button label="Nuevo" width="79" id="btnNuevo" click="addUsuarios();">  
  135.   <mx:button label="Editar" id="btnEditar" click="updateUsuarios();">  
  136.   <mx:button label="Eliminar" id="btnEliminar" click="deleteUsuarios();">  
  137.   <mx:button label="Actualizar" click="cargarUsuarios();" id="btnActualizar">  
  138.  </mx:button></mx:button></mx:button></mx:button></mx:controlbar>  
  139.  <mx:label x="170" y="157" text="Usuario:">  
  140.  <mx:textinput x="243" y="155" id="txtUsuario">  
  141.  <mx:textinput x="518" y="155" width="99" id="txtEdad">  
  142.  <mx:label x="461" y="157" text="Edad:">  
  143.    
  144. </mx:label></mx:textinput></mx:textinput></mx:label></mx:application>  


ahi esta el codigo flex completamente funcional y de la siguiente manera primero denele actualizar para que vean lo que tienen en la tabla luego ponen nombre y edad y le dan nuevo ya que les salga el mensaje de insercion exitosa le dan actualizar y veran que si funciona y asi si quieren editar seleccionan un registro le ponen los nuevos datos nombre y edad y le dan editar despues que salga el mensaje le dan actualizar y ven que si hace los cambios y para eliminar lo mismo seleccionan la fila a eliminar y pulsan eliminar luego actualizar.. como ven es un poco dificil de manejar pero en la siguiente entrega optimizaremos eso lo importante por ahora es que aprendan el funcionamiento basico de las operaciones a una tabla espero les sirva y no olviden dejar sus comentarios.. enjoy

22 comentarios:

  1. Genial!!! nadie lo explico tan pero tan bien!!! lo probe local y anduvo de maravilla! Gracias!!! Una pregunta más y no quiero molestarte, si quisiera por ejemplo poder buscar en un txt un id de usuario; ingresar el Número y que después me traiga todos sus datos en unos txts, como sería la función? Para hacer algo así con HTTPService me volví loco y no pude...

    ResponderBorrar
  2. si yo tambien tuve problemas en ese aspecto pero lo solucione de una manera que se me ocurio esa fue la siguiente: hago mi funcion en php que me pide el parametro (id) luego consulto con sql y esa funcion me devuelve el array luego ese arra lo muestro en el DataGrid y ya nadams copio los campos al txt como cuando paso el id en las funciones de actualizar y eliminar.. ya de ultimo pongo el DataGrid invisible pero se puede haer desde el arreglo no comas ancias talvez mañana me aviento ese tuto solo talvez jaja gracias por comentar.

    ResponderBorrar
  3. Si sería buenísimo! Cuando tengas un tiempo... Gracias!

    ResponderBorrar
  4. Te hago una consulta, estoy viendo el tema de buscar usuario por el id, el php estaría bien así?
    function buscarUsuario($id)
    {
    $dbhost="localhost";
    $dbusuario="yo";
    $dbpassword="xxx";
    $db="test";
    $mysql = mysql_connect($dbhost, $dbusuario, $dbpassword);
    mysql_select_db( $db );
    $sql = "select * from usuariosflex where status=1";
    $Result = mysql_query( $sql );
    while ($row = mysql_fetch_object($Result)){
    $return[] = $row;
    }
    return( $return );
    }
    Me falta algo no?

    ResponderBorrar
  5. solo tienes que cambiar la consulta osea el sql y te quedaria de la siguiente manera


    $sql="select * from usuariosflex where id_usuario=$id";



    ya con eso debe funcionar. que te parecen los video tutoriales?

    ResponderBorrar
  6. el sql anterior te hace la busqueda tanto en usuarios eliminados como en usuarios activos si quieres que lo haga solo en activos seria asi:

    $sql="select * from usuariosflex where id_usuario=$id and status=1";

    ResponderBorrar
  7. Si me parecen bien los videos, yo estoy un poco mas avanzado, pero para el que recién comienza son muy útiles y se entienden bien. En poco tiempo hiciste una gran web de Flex!!! El tema de los skins también ayuda ya que aveces ni nos fijamos en esos detalles.
    Al margen te quería consultar algo más, el sql me anduvo lo mas bien, ahora como harías en el Flex para que si no lo encuentra o te trae vacio te mande un mensaje, tipo "no hay usuarios con ese id"? gracias una vez mas y disculpa que te moleste tanto!

    ResponderBorrar
  8. Estoy un poco confundido, estoy haciendo la función en Flex para que me busque el id y me lo muestre en la grilla...
    public function buscarUsuario():void{
    miConexion.call("usuariosD.buscarUsuario", new Responder(exitoFuncionB, errorFuncion),
    txtBuscar.text);

    con eso se supone que en el txtBuscar, ingreso el id que estoy buscando, esta bien asi? ahora como hago para que el array que me devuelve el php, me lo muestre en la grilla?

    ResponderBorrar
  9. mmm creo que hara falta una nueva continuacion con el tutorial escrito jaja que opinas que sea video tutorial o que sea tutorial ??

    ResponderBorrar
  10. Realmente creo que si! lo que mas prefieras o te sea mas cómodo, gracias una vez mas!

    ResponderBorrar
  11. ok esta bien hoy hare lo que me pides Chacal nadamas dame tiepo a que este solo en la oficina para poder trabajar sin interrupciones ok esperalo estara para hoy

    ResponderBorrar
  12. Una consulta soy nuevo en flex pero se de php y mysql.
    quisiera saber como hacen para mostrar la informacion devuelta desde la clase php la muestran en el datagrid. por lo que se se debe de colocar en el datasource del datagrid.

    Saludos.

    ResponderBorrar
  13. Gracias por el tuto ya pude solucionar mi problema, para los que tambien tenian lo mismo,
    solo coloque:
    dtaUsuarios.dataProvider=datos;
    dentro de la funcion
    exitoFuncion()
    dedajo de
    datos=resultado;

    y listo,

    saludos.

    ResponderBorrar
  14. gracias por el comentario Angel, veo que usaste el amfphp cualquier otra duda posteala y la resolvemos lo mas pronto posible, ayudanos recomendando el blog.

    ResponderBorrar
  15. ok ok, me parece interesante el flex seguire investigando, por ahora utilizare lo que aprendi en estos dias y ya preguntare si algo no entiendo jeje.

    Gracias por la ayuda de antemano

    Saludos.

    ResponderBorrar
  16. Amigos una consulta me podrian explicar como puedo llenar un combobox con una funcion desde php? algo parecido como se llena el datagrid en este tuto.

    Gracias.

    ResponderBorrar
  17. Saludos Angel, mira el combo box se trata de una manera especial y diferente a como se llena la grilla en este ejemplo, por lo que mejor hare el tutorial para que lo veas y espero te sirva tratare de hacerlo hoy

    ResponderBorrar
  18. Saludos AngelLittle espero no haberte echo esperar demaciado ya tienes aca el tutorial para llenar el combo box con datos jalados desde una base de datos http://www.jrlc.aprendiendoflex.com/2010/04/llenar-un-combobox-en-flex/ cualquier duda comentalo y te ayudamos.

    ResponderBorrar
  19. me funciono perfecto ..muchas gracias con esto podre empezar a trabajar..les comentare las dudas q me vayan surgiendo

    ResponderBorrar
  20. hola,
    soy nuevo en flex (estoy utilizando version 4.5), y necesito saber como declarar la siguiente linea
    //******************USO DEL AMFPHP*****************
    //declara una variable de la clase conexion remota
    private var miConexion : conexionRemota;


    el objeto conexionRemota no lo encuentro y no se como buscar el tuto anterior (puedes poner el link de donde explican esto?).

    gracias.

    ResponderBorrar