jueves, 14 de abril de 2011

Abrir ejecutables (*.exe) desde javascript

Seguimos jugando con el mismo proyecto del artículo pasado, por lo que nuestro único amigo es javascript. En el caso de hoy, la idea es poder levantar un ejecutable (un archivo +.exe) desde el PC del usuario tras realizar ciertas acciones dentro de la WA (recuerden que WA es la WebApp).

Al igual que la funcionalidad de acceder a una base de dato usando ADODB, hoy utilizaremos otro ActiveX (nuevamente estamos limitados a que el usuario use IE), pero ésta vez será para poder realizar acciones del tipo shell ó comandos de consola.

Muchos se podrán preguntar, ¿y para que chucha quiere levantar éste tipo un *.exe si puede hacer todo en la WA?; Bueno, la respuesta es muy simple... En el *.exe ya tengo todas las instrucciones necesarias para comunicarme con un cliente vía DDE; y me hes más rápido levantar el *.exe que hacer todo de 0, donde igual será necesario utilizar un ActiveX y hasta donde se, es mucho más limitado de lo que requiero. Pero bueno, vamos a por "Abrir ejecutables desde javascript".

miércoles, 13 de abril de 2011

SQL + Javascript + IE. ¿Quien dijo que no se puede?

Antes de partir con este ejemplo les debo comentar que sólo lo deben hacer bajo su responsabilidad y, si y sólo si cuando no exista absolutamente ninguna alternativa para acceder a una base de datos. Les digo esto por que como bien sabrán es bastante fácil acceder a información residente en los script y violarla vulnerarla a gusto del consumidor.

Dicho lo anterior, les cuento que uno de los tantos productos que andan dando vuelta por ésta oficina tiene una WebApp (de ahora en adelante la "WA")para interactuar con el usuario. Esta WA está desarrollada utilizando VS2008 y tiene el 99.9% del código pre-compilado (esto quiere decir que no quieren que se modifique) por lo que las posibilidades quedan acotadas a ese 0.1% donde (y para nuestra buena suerte) podemos incluir código javscript.

En mi caso, se presentó la necesidad de guardar información que el usuario veía en su pantalla (pero que obviamente no se registraba en la base de datos - DAAAAH!) y almacenarla para luego utilizarla dentro de los distintos procesos de negocio.

martes, 12 de abril de 2011

Enviar mensaje UDP de forma asincrónica - C#

Bueno de unas merecidas vacaciones y luego de una semana con bastantes cosas entretenidas que hacer en la oficina, es que hoy les traigo un nuevo ejemplo para poder enviar mensaje UDP de forma asincrónica utilizando C#.

Como es costumbre, primero vamos a partir con la explicación de por que el ejemplo. Bueno, la verdad es bastante simple. Un cliente requería automatizar una serie de acciones de acuerdo a información que recibía una Web X. Esta información debía gatillar acciones relacionadas con una Pbx y está a su vez requería (hasta el momento acciones manuales) que recargaran la información almacenada en la base de datos y las informara a la Pbx. Hasta ahí todo bien, el tema es que sería necesario contratar una persona para que esté cada 5 segundos realizando esta acción manual para que se fueran procesando las solicitudes de la Web (obviamente no es rentable para nadie). Producto de ésto pasamos a la segunda fase que era evaluar la automatización de dicha acción; Me fui a ver la API y tras un rato de hacer pruebas sin sentidos vi que no es posible accionarlo desde ahí (obviamente la Pbx no me iba a permitir de forma fácil acceder a todas las funciones). Tras encontrarme con la problemática decidir descender a la capa de red y realizar capturas de red para tratar de identificar que era lo que hacía el equipo cuando se realizaba dicha acción. Tras varias horas (créanme que fueran VARIAS) logre identificar que la instrucción viajaba por UDP, por lo que llegamos al meollo del asunto. (lo de las capturas y luego que hacer con el mensaje cifrado se verá en otra oportunidad si es que a alguien le interesa).

miércoles, 9 de febrero de 2011

xp_cmdshell para copiar datos a un equipo fuera de un dominio T-SQL

Siguiendo con los post de "tips" producto de mis constantes perdidas de tiempo en buscar alguna solución a un tema que me obligó a consumir más horas de las necesarias en algo, es que hoy les traigo este pequeño mecanismo para poder realizar una copia de un servidor a otro a través de consultas con la particularidad de que este mecanismo permite pegar información en equipos que se encuentran fuera del dominio.

Primero lo primero, xp_cmdshell es un procedimiento almacenado que permite ejecutar instrucción del tipo command (cmd para los amigos). Con este procedimiento nosotros podemos básicamente realizar cualquier operación DOS (mkdir, dir, cd xx, etc.) así como tambien la de ejecutar aplicaciones por consola o archivos .bat, el cual será nuestro caso.

viernes, 4 de febrero de 2011

BoundField dinámicos con C# y ASP

Hola gente! espero que estén igual de contentos que yo este día viernes!. Bueno, la verdad yo no estaba contento producto de un problema con un GridView, cuyo DataSource traía campos de forma dinámica según los parámetros que se le pasaban al procedimiento. Si bien eso es bastante fácil de hacer (AutoGenerateColumns="True"), el problema se presento cuando mi Jefe me dice... "Raymond, ¿es muy complejo hacer que los sólo valores queden alineados a la derecha y el resto a la izquierda?; a lo que yo respondo con toda seguridad "No! es bastante sencillo". Bueno, la verdad es que si los campos no fueran dinámicos hubiese sido bastante sencillo, sin embargo éste no era el caso.

Sin mas preámbulos vamos al caso en concreto. Tenemos un procedimiento que dependiendo de sus parámetros el resultado puede tener de 2 a 5 columnas.

jueves, 3 de febrero de 2011

Corregir formato de un CalendarExtender .NET

Después de bastante tiempo sin decir nada por culpa del estúpido cargador del notebook que se quemo!, hoy les traigo una de las última experiencias relacionadas con mi querido amigo .NET+Ajax; La famosa perdida de formato del calendar extender cuando tenemos algún tipo de Style para una elemento contenedor.

En el caso de que aún no les ocurra (suertudos!), si por ejemplo dentro de nuestro .css tenemos propiedades establecidas para una tabla (th, tr, td, etc.) y dentro de nuestra tabla alojamos un TextBox que levanta un CalendarExntender al ser cliqueado observaremos con horror que el formato de nuestro calendario adquirió los atributos de la tabla y se ve como el forro!. Bueno, para corregir esto de una forma muy sencilla y evitar que vuelva a ocurrir lo mismo con otros controles que utilizaremos se me ocurrió la brillante idea de:

jueves, 20 de enero de 2011

Exportar datos a Excel de forma fácil! T-SQL

Por lo general cuando necesitamos exportar una serie de datos desde una tabla o grilla de resultados hacemos un copy&paste o en su defecto usamos el tipico wizzard que trae el manager, pero... y si lo queremos hacer de forma automática??

Siguiendo con mi lógica de hacer las cosas directo por consulta, (o evitar usar asistentes), hoy vamos a ver la forma más sencilla que existe para crear un archivo excel y poblarlo con datos a partir de una consulta o la ejecución de un procedimiento almacenado.

viernes, 7 de enero de 2011

Ejecutar un método de otro formulario Visual C#

Muchas veces he visto preguntas en diversos foros y sitios web la pregunta de "¿Como puedo ejecutar un método de otro formulario?". Bueno, en la práctica no había tenido que hacerlo nunca, sin embargo y por flojera poco antes de que terminara el año me encontré con ésta necesidad.

En la práctica el dilema era más o menos así:
  • Form1 tenia el método getContactNameByRUT(int rut) el cual retorna obviamente recupera el nombre de la persona.
  • Form2 se crea en función a ciertos elementos ingresados en el Form1 pero éste es totalmente independiente se sus atributos. Donde uno de los eventos del Form2 requiere llamar al método getContactNameByRUT por equis motivo.
Muchos dirán ¿hey!, por que no estructuras las clases y heredas lo que necesitas!? o ¿y por que no usas propiedades para recuperar el valor?. Puesto bueno, a todos ellos les digo pudranse! que muchas veces y sobretodo por temas de tiempo es más rápido parchar y avanzar, aunque conozco el dicho de "Un buen programador es aquel que elimina el código defectuoso, mientras que un mal programado agrega código para parchar".