Campus Elhysium
Curiosidades, code snipets y consejos para desarrollo en .Net, PowerBuilder y bases de datos
viernes, 5 de agosto de 2022
domingo, 19 de diciembre de 2021
Conversiones de enumeradores
Muchas veces nos hemos topado durante el desarrollo de nuestros sistemas con la necesidad de usar enumeradores, y parte de esa necesidad (en ocaciones), esta la de convertir texto a un valor de enumerador y viceversa (principalemente cuando trabajamos con valores desde una base de datos o desde xml/json).
Pues bien, hacer esto es realmente facil y útil, comencemos una conversión de texto a un valor de un enumerador... usemos como ejemplo el siguiente enumerador:
public enum Sexo{
Masculino = 1,
Femenino=2
}
Supongamos que tenemos un método en donde recibimos como parámetro el texto "Femenino", el cual lo necesitamos convertir a un enumerador para poder guardar en la base de datos su valor numérico, luego entonces lo que debemos hacer es lo siguiente:
public Sexo DevuelveEnumerador(string sexo){
try{
return (Sexo) Enum.Parse(typeof(Sexo), sexo);
}catch{
throw new Exception($"No se puede convertir el valor {sexo} a un valor de tipo 'Sexo' válido (Masculino/Femenino).") ;
}
}
Podemos observar que en la linea del "return", se está realizando la conversión por medio de la clase "Enum" usando el método "Parse", el cual recibe como primer parámetro el tipo del enumerador al cual se realizará la conversión y como segundo parámetro el valor que se pretende convertir; ahora bien, la conversión puede dar como resultado un error si es que el valor que se pretende convertir no se encuetra entre los valores del enumerador, por lo cual usamos los operadores "try/catch" para capturar dicho error y (en este caso), regresar un nuevo error, pero con un mensaje mas entendible para el usuario.
Cuando lo que necesitamos es obtener el valor de un enumerador y convertirlo a texto, es mucho mas sencillo ya que solo necesitamos recurrir al metodo ToString:
public string DevuelveTexto(Sexo sexo) => sexo.ToString();En el ejemplo anterior vemos como el único contenido de nuestra función "DevuelveTexto" es precisamente "sexo.ToString()" lo cual (para este ejemplo) nos devovlerá el valor "Masculino" o "Femenino" de acuerdo al valor que tenga el parámetro recibido por la función.
Para finalizar, otra función muy útil que tenemos para éstas conversiones, es justamente al momento de converir un objeto a otro... es decir, ¿cuántas veces no nos hemos topado con la necesidad de cambiar el valor tipo de nuestro enumerador al tipo de otro enumerador con los mismos valores, pero que, como viene de otro sistema, nos vemos obligados a hacer las conversiones?, bueno, supongamos que estamos consumiendo una librería de terceros en la cual la documentación nos indica que existe el siguiente enumerador:
public enum Genero{
Masculino = 1,
Femenino = 2,
Otro = 3
}
En éste caso nosotros podríamos implementar el siguiente método:
public Genero CovertirSexoGenero(Sexo sexo, bool esOtro){
if(esOtro) return Genero.Otro;
return (Genero) Enum.Parse(typeof(Genero), sexo.ToString());
}
En este método vemos que recibimos 2 parámetros, el primero es un Enumerador del tipo "Sexo" (el cual es el que nosotros definimos), el segundo valor es un boleano que nos indica si el valor que devolveremos es el que no se encuentra en nuestro enumerador (Otro)... lo primero que hacemos es precisamente evaluar el booleano, donde, si este tiene un valor vardadero entonces nuestro método devoverá directamente el valor "Otro" pero en forma de enumerador de tipo "Genero", en caso de que sea falso entonces se realizarán 2 conversiones, en primer lugar vemos que estamos tratando de usar nuestra conversión de texto a enumerador dentro de la cual (como recordamos), tenemos que pasar un valor de tipo texto en el segundo parámetro, por lo tanto usarémos segunda conversión para pasar de enumerador a texto y con eso alimentar el parámetro necesario para la primera converisión.
domingo, 12 de septiembre de 2021
Operadores ternarios en C#
Los operadores ternarios, en pocas palabras, son abreviaturas de una sentencia IF devolviendo un único resultado; es decir, que abreviaremos una sentencia IF de la cual se desprenda un resultado cuando el valor evaluado es TRUE y otro valor cuando cuando el valor evaluado es FALSE.
La representacion estandar de una sentencia IF simple con devolucion de valores sería la siguiente:
int resultado = 0;
if(x == "si")
resultado = 1;
else
resultado =0;
La expresión anterior se podría reducir con un operador ternario de la siguiente forma:
int resultado = x == "si" ? 1 : 0;
La forma de entender lo anterior es la siguiente:
- int resultado = Ésto quiere decir que el resultado de la operacion ternaria se almacenara en la variable de tipo entero llamada "resultado"
- x == "si" ? Ésta sección es donde se establece el criterio de evaluación, es decir, lo que va entre parentesis de nuestra sentencia IF estandar
- 1 Resultado cuando el criterio de evaluacion es verdadero (true)
- : Representa la palabra reservada else
- 0 Resutlado cuando el criterio de evaluación es falso (false)
Es decir que cuando se cumpla el criterio que se encuentra antes del simbolo de interrogación (?), nuestro operador ternario devolverá el valor que se encuentra antes de los dos puntos (:), y si el criterio no se cumple, nuestro operador devolverá el valor que se encuentra despues de los dos puntos (:).
Sin embargo ésta no es la única representación ternaria existente... imaginemos que tenemos el siguiente modelo de sentencia IF:
string resultado = null;
if(x == "si")
resultado = "hola mundo";
En el modelo anterior vemos que cuando el criterio de evaluación NO se cumple (es decir que da como resultado un valor false), se está manteniendo un valor null (el cual ha sido asignado como valor inicial a nuestra variable "resultado"), en éste caso el operador ternario resultante es mas sencillo:
int resultado = x == "si" ?? "hola mundo";
La forma de entender lo anterior es la siguiente:
- int resultado = Ésto quiere decir que el resultado de la operacion ternaria se almacenara en la variable de tipo entero llamada "resultado"
- x == "si" ?? Ésta sección es donde se establece el criterio de evaluación, es decir, lo que va entre parentesis de nuestra sentencia IF estandar
- "hola mundo" Resultado cuando el criterio de evaluacion es verdadero (true)
Como podemos observar, en éste caso el operador es mas compacto, debido a que solo devolverá un resultado (cuando el criterio de evaluación de como resultado true), si el criterio no se cumple (es decir que da como resultado false) entonces se asignará el valor null.
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
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
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
¿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
- 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:
- 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:
martes, 29 de septiembre de 2015
Tabla de Colores para propiedades de Datawindows
Es por ello que siempre es útil tener una tabla de colores contigo:
Funciones de columnas en Datawindows
Lo más visto
-
Es horrible tener que modificar los colores de letras y fondos en un Datawindow en tiempo de ejecución y darte cuenta que los códigos de col...
-
En ocasiones para poder hacer procesos automáticos requerimos cierta información sobre un Datawindow, pero es frustrante cuando no encuentr...
-
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 q...