miércoles, 28 de octubre de 2015

Sintaxis del ciclo WHILE en SP's y Fn's

Bien, entre las curiosidades que hay en SQL Anywhere  está la diferencia de sintaxis que existe al desarrollar Stored Procedures, y Funciones, ya que, aunque ambos son objetos programables en el motor de base de datos de SQL Anywhere, tienen sus diferencias.

En esta ocasión hablaré sobre la sintaxis del ciclo WHILE, el cual mayormente se usa para navegar entre cursores que traen información de una consulta... pues bien, la sintaxis del ciclo WHILE cambia dependiendo si lo vamos a usar dentro de un Stored Pocedure, o dentro de una Función, a continuación muestro el ejemplo de ambas sintaxis:

Funcion:
        WHILE [condicion] LOOP
            [contenido...]
        END LOOP;

Stored Procedure:
        WHILE [condicion]
        BEGIN
            [contenido...]
        END

Como podemos observar, para la Función se usa la palabra reservada LOOP al final de la declaración del WHILE y de la declaración del fin de ciclo (END), mientras que en el caso del Stored Procedure, no se usa la palabra reservada LOOP pero el contenido del ciclo se delimita por las palabras reservadas BEGIN y END.

Otra de las diferencias que hay entre estas dos sintaxis, es que en el caso de la Función, al concluir la linea de fin de ciclo (END LOOP), lleva el signo ";" (punto y coma), mientras que en la sintaxis para el Stored Procedure no lleva éste signo.

lunes, 26 de octubre de 2015

Clases (class) en PowerBuilder

Quienes llevamos tiempo programando en lenguajes como c, c#, php, java y otros, estamos acostumbrados a que, para crear una clase solo necesitas escribir y escribir mucho, ya que las clases son "técnicamente hablando" archivos de texto... pues en Power Buider cambian un poco las reglas del juego, ya que para crear una clase, lo que debemos hacer es "crear un objeto clase" (valga la redundancia) en el cual declararemos nuestros eventos y funciones... bueno, hasta el momento nada nuevo bajo el cristal, ¿No?, pues bien, la diferencia está mayormente en la interfaz, ya que, a diferencia de c# (por ejemplo), donde nosotros escribimos de arriba hacia abajo la clase, con sus eventos, funciones, propiedades, etc, en Power Builder la interfaz esta divida por secciones (pestañas), donde en una se escriben los eventos (incluyendo el constructor), en otra las funciones, y en otra las variables de interfaz, las cuales juegan el rol de "propiedades de la clase".


Sin embargo ésto no significa que la clase ha dejado de ser un archivo de texto, ya que Power Builder también nos ofrece la vista de "Código Fuente" (source code):
Así que podemos elegir la vista que más nos guste, aunque la vista de interfaz PB tiene las ventajas de que valida ciertos errores en la estructura mientras escribes o al guardar tus cambios, en tanto que la interfaz de solo texto, no realiza estas validaciones hasta que hagamos click derecho sobre el objeto de clase y seleccionemos la opción "regenerar".

Para concluir con éste artículo, debo mencionar que una de las desventajas de las clases en Power Builder es que NO se puede hacer sobrecarga de eventos, es decir, que no pueden existir dos eventos con el mismo nombre aunque la cantidad, tipos y/o nombres de parámetros sea distinta... la buena noticia es que ésto no aplica para las funciones, esas si podemos sobrecargarlas tanto como queramos.

martes, 13 de octubre de 2015

"IF" Ternario en power builder

Si llevas algo de tiempo desarrollando en powerbuilder (y si has desarrollado antes en lenguajes como c++, c# o php) te habrás dado cuenta que en power builder no existe un IF ternario, es decir, el IF que se puede hacer en una sola linea estableciendo la CONDICION, el valor a devolver si la condicion es VERDADERA y el valor a devolver si la condición es FALSA... en c# un if ternario sería algo como esto:

integer i;
i = (a == true ? 1 : 0 );

Donde si el valor de la variable a es TRUE entonces i tomará el valor 1, de lo contrario i tomaría el valor 0... estos if ternarios ahorran bastante código, pero como mencioné anteriormente, en power builder no existe.... sin embargo emular el comportamiento de éste if ternario no es nada difícil, solo necesitamos crear un objeto "funcion"(que sería lo que llamamos una función global, accesible en cualquier momento), dicha función deberá devolver un valor de tipo ANY(en otro post hablare un poco mas a fondo de este tipo de variable) y tendrá como parámetros un boleano (el cual obtendría su valor de la condición del if) y dos variables de tipo ANY ; el cuerpo de la función es bastante sencillo:

if(condition)then
return true_value
else
return false_value
end if

Suponiendo que la función la llamamos "ift", para usarla haríamos algo como esto:

integer i
i = ift(a = true, 1, 0)

Ésta línea haría lo mismo que si escribiéramos:

integer i

if a= true then
    i = 1
else
    i = 0
end if

Como podemos ver, el ahorro de código es bastante significativo, como un PLUS de seguridad para que no nos marque alguna clase de error, podemos realizar un CAST del resultado para convertirlo de tipo ANY al tipo específico que esperamos obtener, es decir:

integer i
i = integer(ift(a = true, 1, 0))

viernes, 9 de octubre de 2015

Establercer un valor NULL en PB

¡La pregunta del millon en power builder!...

¿Como establecemos un valor NULL a una variable en power builder?... quien no ha programado en power builder se imaginará algo tan simple como:

[variable] = NULL

¡Pero no!, con power builder nunca algo es tan sencillo... aunque por otra parte, si es facil establecer un valor NULL, solo es saber que funcion usar XD... La instrucción que debemos usar es:

setNull([variable])

¿Facil cierto?,  pues bueno, ésto solo funciona cuando se trata de tipos "nativos", es decir, int, dec, date, string, etc; pero si hablamos de objetos como ventanas, estructuras, instancias de clases (objetos, valga la redundancia), en esos caso lo que hay que hacer es destruir el objeto, es decir:

Destroy [objeto]

viernes, 2 de octubre de 2015

Comillas simples y dobles

Consultas dinámicas, ese gran dolor de cabeza cuando necesitas colocar una consulta en una cadena y luego ejecutarla por medio de un comando en tiempo de ejecución... en esta ocasión publicaré un par de consejos útiles para el momento de hacer éste tipo de consultas:

  • Recordemos que en Power Builder (así como en otros lenguajes de programación) en indistinto asignar un string usando comillas dobles o simples (" o '), por cuestione de legibilidad y para facilitar la escritura de la consulta, es mas recomendable usar comillas dobles para definir la cadena principal y las comillas simples para definir las cadenas de la consulta, por ejemplo:
string miSql = " SELECT * FROM mi_tabla WHERE mi_campo = 'hola' "
  • Caracteres de escape... muy importante si lo que desean es almacenar la consulta en un campo de base de datos, para luego obtenerla en cualquier momento y usarla; en éste caso nos encontraremos con que si insertamos la consulta como el ejemplo anterior, al recuperarla y querer ejecutarla marcará un error indicando que no se encuentra la columna "hola" (a menos claro que tengamos una columa con ese nombre XD ), ésto ocurre por que al guardar la consulta en la base de datos, las comillas simples las desaparece ya que las interpreta como una cadena, y para que ésto no ocurra debemos usar un caracter de escape para indicar que la comilla simple solo es parte de la cadena principal y no que está abriendo una cadena (que complicado no?)... veamoslo de esta manera:

si usamos esta variable para guardar la consulta en la base de datos:
string miSql = " SELECT * FROM mi_tabla WHERE mi_campo = 'hola' "

lo que se guardará realmente en la base de datos es:

SELECT * FROM mi_tabla WHERE mi_campo = hola

notese que "hola" ya no tiene comillas, por lo tanto, al ejecutar dicha consulta lo mas seguro es que nos genere un error de sql, por lo tanto, lo que debemos hacer es lo siguiente:
string miSql = " SELECT * FROM mi_tabla WHERE mi_campo = ''hola'' "

Al parecer es algo confuso, pero lo que sucede es que en SQLANYWHERE el caracter de escape es una comilla simple, lo que significa que si colocamos dos comillas simples seguidas, lo que obtendremos es el caracter ' lo que dará como resultado que al obtener la consulta de la base de datos tengamos:

SELECT * FROM mi_tabla WHERE mi_campo = 'hola'

Espero que éste par de consejos hayan sido de utilidad, y bueno, cualquier duda pregunten en los comentarios o directamente a wilson.alcocer@gmail.com

Patrones de Diseño de Software

Lo más visto