viernes, 12 de febrero de 2016

¿Por qué programar del lado del del servidor?

En entradas anteriores he analizado como existen lenguajes que operan del lado del servidor al momento de cargar una página web.

Estos lenguajes tienen entre sus ventajas el que cuentan con acceso a la base de datos del servidor, y no son enviados al cliente como tal, sino sólo los resultados que generan.

¿Por qué existe este paradigma de programación?

Bueno la razón principal es la seguridad. Imagina que un lenguaje de scripting como JavaScript, pudiera acceder directamente a la Base de Datos del servidor. En un mundo donde la gente por lo general busca robar, incluso información, sería bastante inseguro.

El detalle con los lenguajes de scripting, es que el usuario puede verlos y modificarlos. Después de todo, se ejecutan en el navegador, y el usuario debe poder tener control en lo que pasa en el. Recuerda que son lenguaje más orientados a la interfaz gráfica. 

De modo que JavaScript es sensible  a ser modificado por el usuario. Y es usado por los hackers para hacer inyecciones de código Javascript. Por supuesto, al ser código que se ejecuta en el navegador, su alcance es limitado, y se necesita mucha habilidad para causar daño con esta técnica.

Pero si JavaScript tuviera acceso a la Base de Datos, cualquier usuario podría hacer llamadas a la información de tu servidor y con eso, básicamente podría tomar el control completo de tu sistema. Por eso los lenguajes de script del navegador, no pueden acceder a la Base de Datos del servidor. Aunque de hecho, solo pueden ejecutarse en tu navegador, así que mientras viven en el servidor están "dormidos". Y no se les permite establecer conexiones con el servidor.

Y también es una de las razones , por las que los lenguajes del lado del servidor no entregan código fuente. Siempre es posible para un usuario ver el código HTML y JavaScript que tiene la página. Pero PHP, no llega como tal hasta tu navegador.

Por supuesto, un usuario no podría ejecutar código PHP a menos que tuviera montado un servidor en su máquina. Pero podría ver cosas muy comprometedoras. Recuerda que en PHP se hacen las consultas a la Base de Datos, así que podría ver toda la estructura de tu base de datos, tablas, columnas, información de los registros, etc. 

Además podría ver la información que procesas con PHP. La cual dependiendo de tu sistema, puede ser muy sensible.

Es por eso que al navegador solo le entregas resultados, nada de código fuente. Pongamos un ejemplo. Digamos que utilizas una cadena como firma electrónica, para transacciones comerciales.

Digamos que es para el pago de un producto y la creas así:

$firma = sha1($nom_producto.$nombre_tienda.$monto.$id_pedido.$clave_secreta);

De estos datos el nombre del producto, el nombre de tu tienda, el monto o el id del pedido son datos que fácilmente se puede ver en el formulario que creaste en HTML. Por supuesto, el usuario debe tener acceso a estos datos. Pero no debe poder saber cómo creaste tu firma.

Lo que si puede ver es el resultado de la variable firma que sería:
Resultado SHA-1: 332de724dde0ed9e71d2d07cc5aaf3c49a526b58

Sin embargo, si fuera un atacante, el tener esta información le es inútil. ¿Por qué? En primera, porque no sabe cómo se construyó la firma, el solo ve el resultado. Por eso si obtuviera el código fuente sería peligroso.

Además la variable clave secreta, se consultó de tu base de datos, y a menos que tenga acceso al código PHP, tampoco sabe cómo acceder a ella. En ningún momento puede verla en el formulario, ya que solo forma parte del resultado compuesto firma.

Adicionalmente claro, le entregamos todo cifrado con SHA-1. No somos tontos, sabemos que la información importante debe ir cifrada. SHA-1 es irreversible, así que aunque lo vea ahí no sabe de donde salio.

Por supuesto como se ve solo el resultado, ni siquiera sabe si usamos SHA-1, MD5 u otro metodo de encriptacion.

Y por eso el código fuente PHP, no se entrega al navegador. A menos claro, que tengas un error

martes, 9 de febrero de 2016

NetBeans como IDE para desarrollo en JAVA y otros lenguajes, como un Visual Studio libre

Todo buen programador sabe la importancia de contar con buenas herramientas de diseño y desarrollo.  Es cierto, la herramienta no hace al programador, pero puede facilitarte mucho la vida.

Entre las herramientas más esenciales, se encuentra el contar con un buen IDE. Un IDE es un Ambiente de Desarrollo Integrado (Integrated Development Environtment, en inglés), incluye un editor de código, así como compilador y entorno de ejecución. Por supuesto, puedes programar usando solo bloc de notas, o usar incluso editores potentes como el Notepad ++, y muchos programadores lo hacen así.

Pero usar un IDE te hará más fácil e intuitivo el trabajo, y más divertido el programar. Cuando piensas en un buen IDE, de seguro lo primero que se te viene a la mente es el profesional Visual Studio de Microsoft.Muchas generaciones de programadores han empezado sus primeros proyectos en este entorno, que te facilita enormemente las cosas. En mi caso particular empecé con Visual Basic,  y fue una delicia empezar a programar usando esta aplicación tan completa.  Objetos, librerías, bueno, Visual Studio tiene todo integrado y gráfico, convirtiendo la programación en algo sencillo y ameno. De hecho, yo había programado antes en COBOL, C++, BASIC y otros lenguajes, pero mi aprendizaje de Visual Basic marcó un antes y después en mi vida como programador. Aprendí que la programación puede ser aún más divertida y visual, y que el programador solo debería preocuparse por la lógica del código, y no por el diseño de los objetos o como va a compilar o a crear su ejecutable, o por cómo va a enlazar diversos componentes y librerías. Una ventaja de Visual Studio, es que está fabricado para productos de Microsoft, por lo que se integra naturalmente con toda la suite de Office, y con el sistema operativo Windows. Si vas a generar aplicaciones para Windows no hay nada mejor.

Pese a ser un producto de lo más profesional , intuitivo y robusto que existe, Visual Studio tiene algunas carencias. Todas ellas a causa de ser un producto de Microsoft. Primero que nada , el costo, sabemos que los productos de Microsoft son caros. Segundo, solo funciona con lenguajes de Microsoft, Visual Basic, C# o más bien ahora .NET, y solo pensando en plataformas Windows. Por supuesto, Windows es el sistema operativo por excelencia en el mundo del PC. Pero la programación moderna exige abrir tus horizontes. Por simple ejemplo, la mayoría de los servidores no utilizan Windows como sistema operativo, montan UNIX y Linux y debes ser capaz de generar aplicaciones para ellos.

¿Existe algun IDE tan profesional como Visual Studio, para otros lenguajes y que sea libre? Fue una pregunta que me hice por mucho tiempo. Después de todo, la tendencia moderna es el auge del software libre. Linux, Android, Java, PHP, mySQL, en fin, no todos tan libres pero enfocados más o menos a la misma filosofía. Y cuando tuve que programar en JAVA, me pregunté seriamente si podría encontrar un buen IDE para hacer mi desarrollo.

JAVA es un lenguaje que se ha vuelto omnipresente. Para mi no es tan sencillo, pero ha sido necesario que me adapte a su uso. Una de sus mayores ventajas es la portabilidad: creas un programa en JAVA, y podrás ejecutar tu aplicación en Linux, UNIX, Windows, básicamente cualquier sistema. Eso también trae una desventaja, que siempre será un poco más lento correr una aplicación JAVA que una hecha nativamente para tu arquitectura, ya que JAVA corre sobre una máquina virtual.

Anteriormente use Eclipse para desarrollar en JAVA. No tengo nada en lo personal contra Eclipse, es de hecho muy completo y tienes muchas herramientas, pero siempre me pareció demasiado pesado y lento. Quizá el problema, es que es demasiado completo, cargar Eclipse para que funcionara exigia mucho tiempo, y una buena dosis de memoria RAM.

Así que no, no quería volver a usar Eclipse, que además de lento me parecía algo complejo. Siempre pensé que Eclipse no está a la altura de Visual Studio, y no me gusta como IDE. Fue entonces cuando me topé con NetBeans. Decidí probarlo, ya que de todos modos, no me iba a adentrar en programar en JAVA sin un IDE. Y puedo decir que ha sido una de las experiencias más gratas de mi vida como programador. NetBeans as ágil, sencillo, visual, y robusto. Es como siempre soñé que sería un Visual Studio libre.

Veamos algunas de las características de este IDE, que me agradaron:

1.-Ligero


Como había dicho, Eclipse siempre me pareció pesado. Ahora que tengo NetBeans noto mucha diferencia.

NetBeans carga relativamente rápido, y en ningún momento he sentido que se me alente cuando esta en funcionamiento.

Quizá porque no cargo tantos complementos, pero tampoco me consume demasiada memoria RAM. 


2.- Sencillez


Siempre me pareció un poco más complejo hacer las cosas en Eclipse, desde cargar una librería hasta agregar un componente.

Netbeans hace los procesos más sencillos y sobre todo su interfaz es mas sencilla y limpia. La interfaz de Eclipse me parece un poco recargada.

Por eso NetBeans me ha hecho más rápido y ágil el desarrollo de código, me parece más intuitiva su interfaz.


3.- Colores el código


En este punto todos los IDE te ofrecen un valioso apoyo, e incluso editores como el Notepad ++.

NetBeans soporta colores de código para múltiples lenguajes, si el lenguaje no se soporta de forma predeterminada, solamente tienes que instalar el plugin correspondiente. 


Para quien no está familiarizado con los colores de código, te diré que un IDE te hace la siguiente distinción: palabras reservadas del lenguaje, comentarios, constantes, cadenas de texto, entre otros.

De esa manera es mucho más fácil identificar los diferentes elementos de tu código y depurar errores.

4.-Indentación de código


Muchos de los elementos de la edición de código, están pensados para que se nos haga más fácil entender y modificar esa maraña que llamamos código.

Si , ya no programamos en 1 y 0 , pero aún la lógica de un programa puede hacerse tan complicada, que cuando intentas leerlo terminas perdiéndote sin entender nada.

El mejor código, entre otras cosas, es el que es legible y entendible, hasta para una persona que no fue el desarrollador. Tu código debe estar tan bien estructurado y presentado, que una persona que no tiene conocimiento de tu programa en particular, debe poder ser capaz de leerlo y modificarlo.

Tu mismo te ahorrarás dolores de cabeza si lo pones presentable. Una técnica muy usada para esto, es la indentación.  Esto consiste simplemente en alinear los bloques de código de manera horizontal para que sean más entendibles para el ser humano.

Entre las reglas básicas de la identación, es que si abres una condición, o un ciclo, el código que esté dentro debe estar indentado (cargado ciertas columnas a la derecha). Si dentro de ese ciclo o condición, metes otra, a su vez el código que esté dentro debe estar indentado.

En el caso de una condición, el código que esté dentro la parte positiva del if, debe ir al mismo nivel que el código que esté dentro de la parte negativa o else.

De esa manera la identación nos permite reconocer a primera vista los bloques de código, ciclos, condiciones, y la lógica general y flujo del programa. Para mas información, lee aqui.

NetBeans y otros editores saben que necesitas indentar, y te lo hacen fácil. En el caso de NetBeans, basta con seleccionar el texto a indentar, y pulsar el indentado a la izquierda o derecha en la barra de herramientas. Automáticamente, insertará o quitará espacios para desplazar tu código un número fijo de posiciones. Y así lo va alineando.



5.-Comentar /Descomentar código


Los comentarios son parte esencial de un programa. Le explican al ser humano que hace el programa.Y como el programa debe ser mantenido y modificado por un ser humano, es importante que lo entienda correctamente.

Ahora bien, tienen otro uso esencial. Generalmente al programar, terminamos arrepintiendonos de cierto código, O nos piden un cambio, Pero como el código es una bella obra de arte, que además podemos volver a utilizar, no nos gusta borrar código. Mas si aún estamos probando y no sabemos que desastre se hará y cómo regresar al estado anterior.

Por eso mientras estamos en desarrollo, es una práctica muy común comentar/descomentar código. Comentar el código es la forma mas sencilla de eliminarlo. NetBeans nos facilita este trabajo.

Igual que con la indentación, solo tienes que seleccionar un bloque de texto, y en la barra de herramientas la opción Comment, para comentar el texto, o Uncomment para descomentarlo. Bien por NetBeans.


6.- Autocompletar


Una de las cosas que más me gustaba de Visual Studio, es que pensaba por ti. Es decir, tienes un objeto, una función, o alguna de esas cosas que no sabes que tantos atributos o propiedades tiene, y deseas hacerle algo. Y no sabes que. Y de repente, tú ponías un . y en automático Visual Studio reconocía que querías hacerle algo y desplegaba una lista de todos los métodos y propiedades de dicho objeto.

Y decías !magia! piensa por mí. Bueno es una característica que facilita mucho el desarrollo. Y si, NetBeans también la incluye. Al poner punto, te despliega la lista completa de lo que puedes poner como código válido a continuación, puedes seleccionar una opción y te la pone.

Por supuesto la descripción del método incluye el tipo que es y los parámetros de entrada que recibe.


Otro detalle es cuando pones una llave { debajo de un if, o un while, o for y das enter, en automático te pone llave de cierre }. Si pones un  paréntesis ( después de un if o un while o for, en automático te pone el paréntesis de cierre ) para que puedas cerrar la condición. Si pones un corchete [ de inmediato te pone el corchete de cierre ]. Vaya va escribiendo por ti a poco a poco haciéndote más rápida y ágil la edición del código.


7.-Ayuda en línea.


Muy ligado al concepto de autocompletar, está la ayuda que nos proporciona el editor. Por ejemplo, si pones un punto y debes elegir entre diversos métodos, no solo te aparece la lista de estos, si no además en la parte superior un cuadro con ayuda en línea que contiene información sobre los mismos.

Es muy útil porque contiene información detallada sobre el método a utilizar.  En especial si utilizas JAVA la documentación es bastante completa y ayuda bastante a tu aprendizaje. !Que bueno que alguien te explica mientras programas!



8.- Detección de errores.


Una de las razones básicas para usar un IDE, es que en automático va revisando la sintaxis de tu programa mientras lo escribes.

¿Recuerdas cuando programabas en COBOL u otro lenguaje en un editor, y luego el compilador te arrojaba chorrocientos mil errores? Bueno con NetBeans , eso casi no pasa.

Todo buen IDE debe ir revisando tus errores, y te va marcando el código que está mal escrito. NetBeans tiene 3 variantes: un color rojo para los crasos errores sintácticos (no corre porque no corre, porque no le pusiste punto y coma),  un amarillo con sugerencias para hacer más legible y eficiente tu código, y un gris para recomendaciones semánticas para el mejor uso de variables (por ejemplo: declaraste esta variable y nunca la usaste).

Ligado a esto, si posicionas el cursor sobre el código que está en error, NetBeans te muestra un mensaje de ayuda que te dice precisamente porque está equivocado.


La ayuda complementaria es muy útil, las sugerencias muestran que NetBeans es muy quisquilloso a la hora de evaluar tu código. Por ejemplo, en el caso de la revisión en JAVA te marca error si no pones ciertas instrucciones dentro de un bloque try-catch.

En el caso de las sugerencias, te indica si asignas 2 veces una variable, si declaras una variable que después no utilizas, si un método nunca es invocado e incluso te sugiere que siempre uses llaves en tus bloques condicionales o en los ciclos. En fin todo un maestro corrigiendo tu código.


9.- Tener organizado y estructurado tu proyecto.


Cuando trabajas con lenguajes orientados a objetos, lo más común es tener múltiples clases y librerías dentro del mismo proyecto.

NetBeans te hace muy fácil el agregar clases, y también el importar librerías para tu proyecto. Una forma de hacerlo es de archivos JAR que se van agregando a tu proyecto.

Y cuando finalmente generas tu ejecutable, te lo empaca todo junto en un archivo JAR que está listo para ser utilizado en cualquier máquina, con todas sus librerías y dependencias incluidas.




9.- Compilar y Ejecutar.


Una de las ventajas de usar un IDE es que puedes compilar y ejecutar tu programa, todo en el mismo entorno. Atrás quedaron los días de editar con un editor de textos, luego compilar, y luego ejecutar. Eso es obsoleto.

Los IDES como NetBeans o Visual Studio te permiten compilar el código y ejecutarlo con solo oprimir un botón. 




NetBeans de inmediato compilara y ejecutará el programa. Por supuesto si lo deseas, esta la opción de solo compilarlo.

Por supuesto, NetBeans también incluye una de las herramientas mas poderosas de Visual Studio: el correr paso a paso.

Imagina tu programa como una gran caja negra. Cuando está en tiempo de ejecución simplemente hace lo que le ordenaste hasta que truena por algún error o termina por una ejecución exitosa ¿Como saber que paso en medio? ¿Como saber exactamente por qué trono? Si no llego a arrojar resultados en pantalla es desesperante.

Bueno con los lenguajes visuales y los IDE no tienes por que adivinar qué ocurre. Puedes saberlo. Para hacer esto, en lugar de ejecutar de forma normal tu programa, puedes ejecutarlo una instrucción a la vez. En NetBeans simplemente con pulsar F7.

Es una delicia ver cómo se va ejecutando tu programa línea por línea. Incluso puedes ver que valores van tomando las diferentes variables que has utilizado. Sin duda facilita mucho la vida. Cuando estas corriendo paso a paso, en cualquier momento puedes dar F5 para correrlo de modo normal. O incluso detener la corrida, con el botón stop en la barra superior de herramientas.



Ahora bien otra herramienta muy útil para la depuración es el breakpoint. Un breakpoint es simplemente una línea de código que marcas para el programa detenga su ejecución al llegar a esa línea.

Para correr el programa de modo que respete los breakpoints, es importante hacerlo en modo Debug, con Control+F5 o seleccionando la opción en el menú.

Al llegar al breakpoint se detendrá la ejecución. Una vez allí, se puede reanudar de manera normal con F5, o incluso paso a paso con F7.

Para agregar un breakpoint basta con dar click secundario y elegir Breakpoint, y luego Enabled.



Una ventaja adicional es que en Netbeans en tiempo de ejecución puedes ver la consola,  e incluso te permite inspeccionar el valor que van tomando las diferentes variables de tu programa en tiempo de ejecución.

Todo esto en la ventana inferior, en la pestaña Output puedes ver las salidas que ha mandado la consola (aqui puedes imprimir con diversas instrucciones), y en la Pestaña Variables inspeccionar directamente el valor de las diversas variables de tu programa.




¿Todo esto se va pareciendo mucho a Visual Studio, no? Pues sí NetBeans es el IDE que más he encontrado parecido a este excelente producto.

Para más información sobre como ejecutar y debuguear en NetBeans lee el siguiente enlace.

Gracias a esta herramienta, ejecutar código JAVA es bastante amigable.

10.- Diseño Gráfico y Visual


Cuando probé por primera vez Visual Studio, algo que me encanto es que era todo gráfico y Visual. Para crear un objeto en pantalla no tienes que hacer cientos de líneas de código. Basta tomar de manera gráfica con el mouse una plantilla del objeto, arrastrar, acomodar en pantalla y soltar.

Visual Studio parece un programa de diseño, al que vas agregando código. Eso hace muy fácil la tarea de desarrollo. Siempre he dicho que el diseño de los objetos, debe ser independiente de su programación. El diseño me dice como es un objeto , y la programación que hace un objeto.

¿Pero existirá algún software libre que facilite tanto la tarea de desarrollo de sistemas gráficos como Visual Studio? Bueno para empezar, los lenguajes libres no están tan orientados al entorno gráfico. Baste decir que JAVA es anterior a Visual Basic. Y mientras JAVA es un lenguaje de propósito general, Visual Basic nació enteramente dedicado a la programación Visual. Aunque hereda la sintaxis del lenguaje BASIC, desde su mismo inicio fue creado como un lenguaje Visual pensado para aplicaciones de escritorio con las que el usuario interactúa mediante la interfaz gráfica. 

Por supuesto JAVA se ha hecho cada vez más Visual, y es considerado un lenguaje enteramente orientado a objetos. ¿Es posible que sea tan fácil programar en JAVA como en Visual Basic? Más allá de la sintaxis del lenguaje, NetBeans proporciona poderosas herramientas para facilitar el desarrollo en JAVA de programas con interfaces gráficas. 

Te proporciona un editor gráfico, que puedes utilizar en determinadas clases, como la JFrame por ejemplo.

La primera vez que lo vi me quede sorprendido. !Por fin un IDE que permite programar interfaces gráficas en JAVA de forma sencilla!

Su funcionamiento es básicamente el mismo que en Visual Studio: eliges, arrastras, posicionas y sueltas. 


Si deseas modificar las propiedades de un objeto, simplemente das click secundario y eliges Properties. Puedes cambiar el color, tipo de letra, si es editable, seleccionable, etc

Puedes dimensionar el objeto por medio de la interfaz gráfica. En fin es un completo editor de objetos.

Por supuesto, las interfaces gráficas en JAVA aún están un poquito debajo de la calidad que ofrece Visual Basic. Pero vaya que ahora es mucho más fácil construirlas. Recuerdo mis años mozos cuando todo era teclear un montó de líneas de código.

Sin duda NetBeans es el IDE más completo y bien logrado que he encontrado de software libre. Y ha hecho algo increíble, hizo que me gustara programar en JAVA. Al final, creo que JAVA solo era una chica incomprendida, a la que no me habían presentado ya arreglada y bonita.




jueves, 4 de febrero de 2016

Llenar multiples filas de una tabla, de acuerdo al numero de filas de otra tabla mySQL


Supongamos que tienes una tabla en mySQL. Quieres usarla como base para construir otra tabla en mySQL, de modo que por cada fila de tu tabla 1, tengas n filas en una tabla 2.



Como ejemplo, tengo una tabla empleados, que contiene los empleados de mi empresa. A cada uno de estos empleados, quiero crearles un horario semanal. Para esto, el horario se guardará en otra tabla de mi base de datos, llamada Horarios. Por cada empleado, generare 7 filas en mi tabla de Horarios, ya que cada fila corresponde a un día de la semana, en el cual indicaré si es laboral o no, así como las horas de entrada, salida, salida a comer , etc.

Para lograr esto necesitare 2 cosas. 1) Usar variables en SQL. 2) Utilizar un stored procedure que en un ciclo, me inserte los registros necesarios.

Si amigo, recuerda, SQL también es un lenguaje de programación. Aunque está orientado a bases de datos, básicamente puedes hacer con él muchas de las cosas que haces con cualquier lenguaje.

En este caso el uso de variables es importante, porque debo obtener el número de empleados que tengo en mi base de datos.

Ese número lo guardaré en una variable, que le mandaré como parámetro al stored procedure.

¿Que es un stored procedure? No es más que un programa almacenado en la base de datos. Recuerda que cuando ejecutas querys SQL, generalmente desde un cliente SQL como MySQLWorckbench, por ejemplo, los comandos SQL los vas dando uno a la vez y ejecutando de inmediato, funcionando como un interpre.

Estos querys no siguen la estructura clásica de un programa. Pero digamos, que tu quieres tener un conjunto de código, que actué como una función, que puedas llamar y ejecutar en cualquier momento. Recuerda que lo que ejecutas en un cliente SQL, no se guarda en la base de datos, si no en tu máquina. Y tu deseas que ese código se guarde en la base de datos. Deseas que este procedimiento esté disponible para ti y todos los usuarios de la base de datos.

Es aquí donde entran los stored procedures. Estos se quedan almacenados en la  base de datos, por lo que son reutilizables. Mejor aún, cualquier usuario que se conecte de cualquier máquina cliente, con la debida autenticación, los puede utilizar.

Entonces la solución sería usar un stored procedure, que ejecute la inserción de los n registros, de acuerdo al número de registros de tu tabla 1.

Primero, necesitas calcular el número de registros de la tabla 1, guardarlo en una variable, y esa variable mandarla como parámetro al stored procedure, lo que quedaría así:

SET @times = (select count(nEmpleado) From Empleados);

 Select @times;

call insertaHorario(@times);

En este caso estoy contando todos los registros de la tabla Empleados, y ese número lo guardo en la variable @times. Por medio de la instrucción SET, defino el valor. Recuerda las variables en SQL deben ir precedidas de la @.

En la siguiente línea, simplemente imprimo el valor de mi variable en pantalla. Recuerda, SELECT no solamente imprime la salida de un query a la base de datos, en realidad es la instrucción que utilizas para visualizar cualquier cosa en pantalla son SQL. Prueba a ejecutar eso:

 select "hola";

¿Que te imprimió? Así es, SELECT imprimo un mensaje : "hola". En realidad imprimió una constante. Sería como mi "hola mundo" que imprimo cuando empiezo a conocer cualquier lenguaje de programación. Ahora lo sabes, con SELECT puedes imprimir variables y constantes.

La siguiente línea, es la que invoca a mi stored procedure. Utiliza la instrucción CALL. Como ves, igual que en cualquier lenguaje de programación, invoco a mi funcion/stored procedure, mandandole un parámetro de entrada (la variable @times).

Ahora veamos como quedo el stored procedure:

CREATE DEFINER=`root`@`localhost` PROCEDURE `insertaHorario`(IN `n` INT)
    MODIFIES SQL DATA
BEGIN
 set @i = 0;
 set @d = 0;


  REPEAT
     set @i = @i + 1;

   
     set @id = (select lBorrado From Empleados where nEmpleado  = @i);
     set @baja =  (select lBaja From Empleados where nEmpleado = @i);
   
     IF (@id=FALSE) THEN
     IF (@baja=FALSE) THEN
     set @d = @d + 1;
     insert into Horarios values ( @d, @i, 'Lunes','00:00:00','00:00:00','00:00:00','00:00:00',FALSE);
     set @d = @d + 1;
     insert into Horarios values ( @d, @i, 'Martes','00:00:00','00:00:00','00:00:00','00:00:00',FALSE);
     set @d = @d + 1;
     insert into Horarios values ( @d, @i, 'Miercoles','00:00:00','00:00:00','00:00:00','00:00:00',FALSE);
     set @d = @d + 1;
     insert into Horarios values ( @d, @i, 'Jueves','00:00:00','00:00:00','00:00:00','00:00:00',FALSE);
     set @d = @d + 1;
     insert into Horarios values ( @d, @i, 'Viernes','00:00:00','00:00:00','00:00:00','00:00:00',FALSE);
     set @d = @d + 1;
     insert into Horarios values ( @d, @i, 'Sabado','00:00:00','00:00:00','00:00:00','00:00:00',FALSE);
     set @d = @d + 1;
     insert into Horarios values ( @d, @i, 'Domingo','00:00:00','00:00:00','00:00:00','00:00:00',FALSE);
   
     END IF;
     END IF;
 
   UNTIL @i >= n END REPEAT;

 END


En la primera línea tenemos la definición de nuestro procedimiento. en la que se incluye que le mandamos un parámetro INT o integer como entrada. Algo muy importante es notar que va precedido de la IN, que indica que es un parámetro de entrada. Porque aquí mismo podemos definir parámetros OUT, es decir de salida. Así es, nuestro stored procedure puede arrojar un resultado, no solo ejecutar operaciones sobre la base de datos.

Realmente el procedimiento es muy sencillo, ejecutamos un ciclo que daría n vueltas de acuerdo a mi variable de entrada n.

Para ello son muy útiles las instrucciones de control. cómo REPEAT UNTIL, que me permite ejecutar un ciclo mientras se cumpla una condición. Utilizo el contador @i para llevar el conteo de las vueltas. Y como la tabla de Empleados tiene un campo de llave primaria que es un autoconsecutivo, mi variable i coincidirá con esta llave.

Ejecuto mi ciclo, de acuerdo al número de registro de la primera tabla. Esto porque el campo que uso como id de empleado, es un campo autoconsecutivo.

Ahora bien, para complicar las cosas, puse 2 condiciones. Por qué quizá algunos registros de empleados han sido borrados, y en mi tabla de empleados los marco con el campo lBorrado, que está en TRUE si el campo ha sido borrado. Asimismo, algún empleado puede haber causado baja de la empresa en cuyo caso tengo el campo lBaja que se marca como TRUE.

Es decir solo creare horarios para los empleados cuyo registro no ha sido borrado ni han sido dados de baja. Es decir solo cuando lBorrado=FALSE y lBaja=FALSE.

Para manejar esto, hago un query a mi tabla de empleados, y obtengo los valores de estos campos para cada empleado. Los guardo en las variables @id y @baja.

Después utilizó la instrucción de control IF THEN, para evaluar ambas condiciones. Solo aquellos registros que cumplen ambas condiciones, entran a las instrucciones de inserción.

Finalmente hago el INSERT, para cada empleado inserto el horario completo de la semana, incluyendo hora de entrada, hora de salida a comer, hora de entrada de comer , hora de salida, y si el día es de descanso o no. 

De esta manera el stored procedure ejecuta toda mi lógica de programación, de manera similar a como lo haría cualquier lenguaje procedural. Por supuesto quizá podría hacer esto con un lenguaje externo, como PHP, pero el tiempo de ejecución siempre será mejor con un stored procedure ya que es interno de la base de datos.

Para más información sobre stored procedures, este enlace.

Claro, mi código se puede mejorar y quizá hay otras formas de hacerlo. Pero espero esto te ponga en la dirección correcta. !A programar!





martes, 2 de febrero de 2016

Escribir código HTML con PHP, incluyendo las comillas simples ' ' y dobles comillas '' ''

Como he mencionado en otras entradas, PHP es usado frecuentemente como generador de código. Como HTML es la base de la web, a menudo genero código HTML con PHP. La ventaja de hacer esto, es que mi HTML es hasta cierto punto dinámico, pues lo genero en tiempo de ejecución, y no al momento de escribir el código.

Un código HTML generado con PHP, puede incluir los calores de diversas variables del sistema, que el usuario puede haber dado como entrada. De esta forma, mi página web es dinámica, cambia cada vez que es ingresada por el usuario de acuerdo a ciertos parámetros.

¿Como logro esto? Muy sencillo, con el comando echo. Este comando lo único que hace, sencillamente, es mandar una salida de texto, en este caso lo imprime en mi página.

Por supuesto, cuando estas iniciando en la programación PHP, te imaginas que echo solo sirve para imprimir texto y los valores de las variables de tu programa.

Pero recuerda bien, estas en el mundo web. ¿Qué es HTML? Pues sí , básicamente es un conjunto de texto, como cualquier lenguaje de programación. ¿Que pasa si a tu navegador le entregas HTML? Pues si, lo interpreta y utiliza para construir una página web.

Es decir, que si con PHP imprimes lenguaje HTML, el navegador lo entenderá perfectamente, y en lugar de escribirte el código fuente, te lo va a ejecutar y creará una bella página.

¿Sencillo, no?

Bueno, no nos gustan las cosas sencillas. Bueno si, pero la vida no es sencilla. Recuerda que cuando envías tu HTML, estas enviando una cadena de texto. Podría ser algo así:

echo '<button /></button>';

Al leer ese texto, el navegador te creará un botón. Lo único que tienes que hacer es poner todo tu código HTML, encerrado entre comillas simples, ya que echo esta mandando una cadena de texto.

¿Ya notaste el problema verdad?

Así es, HTML es asu vez un lenguaje de programación, que utiliza cadenas de texto, encerradas en comillas simples o comillas dobles.

Es decir, estás escribiendo una cadena de texto, que a su vez contiene otras cadenas de texto, y tienes que entregarlo al navegador de tal manera que lo entienda. 

El problema es que tanto HTML, como PHP, utilizan las comillas y dobles comillas como separadores de texto. Es algo así como una doble redundancia. El problema de escribir código de un lenguaje de programación con otro lenguaje. Algo que prácticamente solo pasa en el mundo web.

Bueno, una primera solución, es usar comillas dobles para las cadenas HTML. Recuerda que si usas comillas simples en PHP como separador de cadena, automáticamente no toma en cuenta las comillas dobles dentro de esa cadena, y viceversa. Es decir que las comillas dobles no las toma como separador, y las envía tal cual. Por lo que forman parte de tu cadena HTML. Ejemplo:

echo '<button type="button" title="Imprimir Baja" class="botonFldset botonFldsetImprimirBaja" onClick="AppHrmImprimir()"/></button>';

Al enviar esta cadena al navegador , obtenemos un bonito botón, con las propiedades que le hemos mandado. El class botonFldsetImprimirBaja lo tengo definido en mi archivo css, que me define las propiedades del objeto. Además le indique que en caso de hacer click en el botón, ejecute la función de JavaScript AppHrmImprimir.

Al fin todo resuelto. Bueno, si eres inteligente, ya notaste otro problema. Si quiero mandar una cadena de texto, como argumento a la función AppHrmImprimir, necesito volver a usar las comillas.  En HTML simple la solucion seria:

onClick="AppHrmImprimir('RhmPdfBaja')"

Después de todo para HTML las comillas dobles son el delimitador, las comillas simples, simplemente son parte del texto y las envía tal cual. Así cuando, de click en mi botón, a la función AppHrmImprimir, le mandare como argumento el texto 'RhmPdfBaja', que casualmente es el nombre de otra función.

Pero no puedo hacer esto ahora, porque tengo mi HTML dentro de una cadena que usa como delimitador las comillas simples. ¿Que puedo hacer? Simplemente, escapar mi caracter comilla simple. ¿Que es 'escapar' un caracter? Simple, es decirle a mi interprete, que el siguiente caracter no es un metacaracter o caracter especial, que lo tome como un simple caracter de texto. De esta manera el caracter comilla simple, que actúa como separador de texto, sera ignorado en cuanto a su función especial y se mandará tal cual a la salida. Esto en PHP lo puedo hacer con la diagonal invertida \.


echo '<button type="button" title="Imprimir Baja" class="botonFldset botonFldsetImprimirBaja" onClick="AppHrmImprimir(\'RhmPdfBaja\')"/></button>';

De esta manera, mi elemento HTML aparecerá tal y como lo deseo. Le dije a PHP que ignore las comillas de enmedio como caracter especial, y se manden como texto.

Y si , esto es muy útil, cuando generas código de un lenguaje de programación, con otro lenguaje.