Diez errores comunes de CSS

Recientemente he estado modificando el código en un sitio web diseñado por alguien más, cuando vi a varios errores comunes en la hoja de estilos. Pensé que sería útil

Como incluir jQuery usando los host de google

Actualmente hay dos maneras de incluir la librería jQuery en nuestras paginas. La primera opción es bajar una copia desde su sitio Web enjQuery.com e incluirla en nuestro código; pero veamos como hacerlo también usando la copia que Google nos hace el favor de tener siempre disponible en su propio servidor web.

combinando MS Access con Oracle

Combinando Microsoft Access y Oracle
En este artículo vamos a ver cómo implementar una sencilla aplicación que trabaje sobre una base de datos Oracle para actualizar datos y generar reportes, usando una herramienta amigable y disponible en la mayoría de los ordenadores como lo es Microsoft Access.

La idea es, en 5 pasos crear una interfase gráfica con poco esfuerzo y en tiempo récord, que facilite la vida de muchos usuarios no IT, como por ejemplo la del Gerente del Area de Recursos Humanos que necesita ingresar y consultar datos en su base de datos corporativa. No hay necesidad de comprar un caro producto comercial para esa sencilla tarea.

Qué software necesitamos para desarrollar y ejecutar nuestra aplicación?

- Microsoft Access, sino nuestro archivo .mdb no será reconocido por Windows.
- Un cliente Oracle, para que podamos conectarnos con la base de datos de destino.

(Este software debe estar presente ya sea en la máquina que usemos para desarrollar como en la máquina destino donde va a correr el programa. No está en el alcance de este artículo explicar cómo instalar estos dos productos)

Los 5 pasos para crear la aplicación

1) Crear una conexión ODBC
2) Vincular en Access las tablas de Oracle
3) Crear las relaciones existentes
4) Crear formularios
5) Crear un reporte

Nuestra aplicación va a conectarse y trabajar con el usuario Oracle SCOTT. Uso Windows Vista, Access 2003 y un cliente Oracle 10g.

Disculpas por las pantallas de Access en portugués y Windows en inglés, pero es todo lo que tengo en la vuelta :)

Paso 1. Crear una conexión ODBC

- En Windows, vamos al menú Start, Control Panel, Administrative Tools y seleccionamos Data Sources (ODBC)

- En la lengueta User DNS, presionar sobre el botón Add. Una lista de drivers disponibles aparecerá en un diálogo. Tenemos dos posiblidades para seleccionar, una es elegir el driver de Microsoft para Oracle (Microsoft ODBC for Oracle), y la otra es elegir el driver de Oracle que fue instalado con nuestro cliente (en mi caso Oracle em OraClient10g). Recomiendo usar el driver nativo de Oracle, ya que está optimizado y se corresponde exactamente con la versión de Oracle que acabamos de instalar.

Nota: En caso que se nos presente un mensaje de error con el título SQORAS32 y el mensaje An unsupported operation was attemped, se trata de un bug conocido cuya solución está en Metalink nota NR.5699495. Será necesario descargar un patch y reemplazar algunos archivos en el cliente Oracle. Es aplicable a los clientes 10.2.0.3.0 a 10.2.0.3.7 y las instrucciones vienen con el propio patch.

- En el diálogo siguiente, ingresar los datos de la conexión:

Data Source Name: Un nombre cualquiera describiendo nuestra conexión
Description: Opcional, puede ser nada
TNS Service Name: El mismo nombre de servicio en nuestro tnsnames.ora
User ID: Opcional, puede ser nada



- Pulsar Test Connection para ver si nuestra conexión funciona. Aparecerá un diálogo solicitando usuario y password. En mi caso colocaré scott/tiger. El mensaje Connection successfull deberá aparecer para poder continuar. De lo contrario, revisar el tnsnames.ora que está siendo usado, para ver si tiene la entrada correcta.

Luego de seleccionar OK en el diálogo principal, nuestra conexión ODBC está lista para ser usada.

Paso 2. Vincular en Access las tablas de Oracle

- Ingresar a Access y comenzar un nuevo proyecto en blanco.

- En el menú Insertar, elegir Tabla y Vinculación de tabla.



Aparecerá un diálogo como los de seleccionar archivos, pero tenemos primero que elegir en el combo Tipos de archivos, la opción Bases de datos (ODBC).

Luego se muestra el diálogo Select Data Source. Ir a la lengueta Machine Data Source y seleccionar la conexión ODBC creada en el paso anterior.



Somos solicitados para informar el usuario y password de la base de datos Oracle (scott/tiger).

Observar que se nos presentan todas las tablas y vistas a las que el usuario scott tiene acceso. Buscar aquellas que comienzan con el prefijo SCOTT y marcarlas: BONUS, DEPT, EMP y SALGRADE. Seleccionar OK.

- Access solicitará indicar para algunas tablas las columnas identificadoras (clave primaria). Eso dependerá si la clave está definida en la tabla original o no. En este caso vamos a ignorar el aviso simplemente seleccionando OK.

Listo! Las tablas ya están vinculadas en nuestro proyecto. Notar que el nombre de cada tabla asignado automáticamente por Access es [ESQUEMA]_[TABLA].

Paso 3. Crear las relaciones

Cuando se vinculan las tablas del esquema Oracle en Access, no se crean los relacionamientos entre ellas. Es necesario hacerlo manualmente, si queremos mantener el esquema de integridad de datos.

- En el menú Herramientas, ingresar a Relaciones.

- En el diálogo Mostrar Tabla, en la lengueta Tablas, seleccionar (presionando Control) las tablas SCOTT_EMP y SCOTT_DEPT, y pulsar Agregar. Las tablas se mostrarán en la ventana de relacionamientos, y podremos cerrar el diálogo Mostrar Tabla.

- Si la tabla SCOTT_EMP no muestra todas las columnas, agrandarla desde el vértice inferior derecho para permitir ver la columna DEPT.



- Hacer click (izquierdo) sobre la columna DEPT de SCOTT_EMP, y sin soltar, arrastrar la columna hacia la tabla SCOTT_EMP, soltándola encima de la columna DEPTNO (clave primaria de SCOTT_DEPT). Un nuevo diálogo se abrirá con la definición de la relación.

- Podemos elegir las propiedades de esta relación, en nuestro caso vamos a dejar todo por defecto, que corresponde a un INNER JOIN entre ambas tablas. Luego de seleccionar Crear, la relación entre las tablas será visible gráficamente en pantalla.



- Cerrar la ventana de relacionamientos y elegir Sí para guardar los cambios.

Paso 4. Crear formularios

Tenemos las tablas vinculadas en Access con sus relaciones, y de aquí para adelante depende exclusivamente de nuestros conocimientos en Access. Da lo mismo que sean tablas propias de Access o de Oracle con las que estemos trabajando. Podemos inclusive usar este mismo esquema para importar datos desde una tabla Oracle a una local.

Crearemos un formulario para cada una de las tablas importadas, para facilitar el mantenimiento de los datos a través de la aplicación. Explicaré cómo hacer los formularios de DEPT y EMP; para el resto es el mismo procedimiento.

- En la ventana principal de Access, ir a Formularios, y elegir la opción Crear formulario usando el asistente.

- Seleccionar la tabla SCOTT_DEPT en el combo de tablas, y seleccionar todos los campos disponibles (DEPTNO, DNAME, LOC) con el botón >>.

- Presionar Avanzar, elegir el layout 'Columna', el estilo 'Standard', y escribir el título 'Departamentos'. Seleccionar Concluir.



Ya está listo nuestro primer formulario donde daremos mantenimiento a los departamentos. Por defecto, todas las operaciones sobre los datos están permitidas. Si se desea, se pueden alterar las propiedades del formulario activando la caja Propiedades con Alt-Enter.

Ahora vamos al formulario de empleados.

- En la ventana Formularios, elegir la opción Crear formulario usando el asistente.

- Seleccionar la tabla SCOTT_EMP en el combo de tablas, y seleccionar todos los campos disponibles con el botón >>.

- Elegir las mismas opciones que en la tabla anterior, excepto por el título 'Empleados'.

Nuestro formulario de empleados está listo, pero vamos a introducir una pequeña mejora: que el campo DEPTNO en lugar de un texto numérico sea un combo list con los nombres de los departamentos, para evitar tener que recordar los números.

- Seleccionar en el menú Exibir, el modo Diseño.

- Marcar el campo DEPTNO en el formulario y borrarlo (pulsando la tecla DELETE)

- En la caja de herramientas (lateral izquierda) seleccionar la herramienta Caja de Combinación.



- Crear el combo en el lugar que eliminamos el campo numérico DEPTNO. Se abrirá automáticamente el asistente para caja de combinación.

- Seleccionar la primera opción para que el combo busque los datos a partir de una consulta y Avanzar.

- Elegir la tabla SCOTT_DEPT y Avanzar.

- Seleccionar los campos DEPTNO y DNAME y Avanzar

- Definir el orden de ordenamiento por DNAME (creciente) y Avanzar.

- Dejar seleccionado el checkbox Ocultar llave primaria y Avanzar.

- Dejar la opción Recordar valor para uso posterior y Avanzar.

- Si se desea modificar el rótulo, puede alterarse para 'DEPTO'.

- Concluir la operación.



Terminamos nuestro formulario para dar mantenimiento a los empleados.
Ahora nuestro campo de departamentos se actualiza dinámicamente a partir de la tabla SCOTT_DEPT.

Repetir el proceso de creación de formularios para el resto de las tablas, y estaremos aptos para insertar, borrar y alterar registros completamente a través de nuestra interface gráfica.

Paso 5. Crear un reporte

Crearemos un reporte para mostrar un ejemplo más de funcionalidad.

- En la ventana principal de Access, ir a Consultas, y elegir la opción Crear consulta en modo diseño.

- Cerrar la ventana Mostrar tabla y en el menú Exibir seleccionar SQL.

- Escribir la query:

SELECT e.empno, e.ename, e.job, e.sal, d.dname, s.grade
FROM scott_emp e, scott_dept d, scott_salgrade s
WHERE e.deptno=d.deptno
AND e.sal BETWEEN s.losal AND s.hisal

- Cerrar la ventana query y elegir Sí para grabar los cambios, asignando un nombre cualquiera para la consulta, por ejemplo 'Salarios de empleados por departamento'.

- En la ventana principal de Access, ir a Reportes, y elegir la opción Crear reporte usando el asistente.



- En el combo Tablas/Consultas elegir la consulta creada anteriormente, junto con todas las columnas disponibles en la consulta, y avanzar.

- En el nivel de agrupamiento, elegir DNAME (el departamento) y avanzar.



- Elegir el ordenamiento por orden de ENAME creciente.

- Dejar las opciones de diseño por defecto y avanzar hasta visualizar el reporte.



Nuestro reporte está listo luego de 10 minutos con cero esfuerzo de programación, simplemente usando una sencilla consulta SQL.

Combinamos la facilidad de uso y versatilidad de una herramienta como Access con el potencial de una base de datos Oracle. Las posibilidades dependen sólo de nuestra voluntad, pudiendo integrar planillas de Excel, gráficos, multimedia y mejorar la lógica de nuestra aplicacion con VBA (Visual Basic for Applications).

PD: hago mención de que esta tuto no es mio,, es publicad por Ifer de este blog, solo para que no digan repost o lammer o demas tonterias,, ahi se los dejo,, es bueno hacer este tipo de post xDXDXDXDXD KDSDSDSD

see u next time

Convertir campos públicos en propiedades publicas usando Expresiones Regulares

Buen día lectores ya llevaba algo de tiempo sin presentar nada en el blog, salvo, las intervenciones del Kellogs, que ha sido muy amable al postear varios artículos, ahora me encuentro

Aprendiendo Script en InDesign CS4 - Learning Script in ID CS4

bueno,, por motivos mas complejos e internos,, deje de postear hace mucho tiempo,, pero no he dejado de ver los post,, ya que me gusta ir aprendiendo cosas nuevas,, aki les traigo un pequeño manual que encontre en la red, con ejemplos muy practicos, para algunos puede ser muy fácil pero puede que vean puntos más claros o comprendan aun más algo que ya sabían.

Todo es en base a JavaScript,, pero pueden manejar apple o visualscript,, depende de cada uno,, lo cual se le haga más fácil,, de uno a otro no hay mucha diferencia de sintaxis XDXD asi que comenzamos:

manejando el ejemplo más auditable y común entre los newbies es un "Hola Mundo" jeje,, muchos van a decir,, "ahh ese es fácil con java o cualquier otro" pues sí, es fácil,, pero lo pongo :@ :P

var myWindow = new Window ("dialog"); ---> creamos una nueva ventana de tipo dialogo
var myMessage = myWindow.add ("statictext"); ---> la cual agregamos un elemento "myMessage" el cual tiene texto
myMessage = "Hola, Mundo"; ---> texto
myWindow.show (); ---> mostrando la ventana

no es necesario hacer una explicación,, ya que esto es fácil de comprender para cada uno de los que lee este post, prosigamos (en las lineas principales coloco un comentario hacer de "que hace" ,,,

Puedo imaginar que saben que existen los tipos de ventana, los cuales son "dialog" y "palette"

para crear el ejemplo anterior en una ventana de tipo palette agregamos el siguiente codigo:

#targetengine "session";

var myWindow = new Window ("palette");
var myMessage = myWindow.add ("statictext");
myMessage = "Hola, Mundo";
myWindow.show ();


eeee,,, "no me vengas con tonterías, es muy fácil", jaja pues si, really easily

ok,, continuemos,, ahora iremos complementando el pequeño app, agregando controles XDXD:
pues ya lo hemos echo,, jeje,, en la linea var myMessage = myWindow.add ("statictext") esto es el control --> statictext

complementando lo anterior al código, sería algo como esto:

var myWindow = new Window ("dialog", "Form");
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext");
myWindow.show ();


si se dan cuenta,, despues de "dialog" agrege "Form", esto hace que le de un nombre visible.
Además,, si ponen atención,, la orientación de los elementos es en columna,, extraño no,, pues no,, por default esta de esta manera en columna, pero podemos cambiarla a fila,, digamos que son un poco mas quisquillosos en este sentido, pues sería algo así:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext");
myWindow.show ();


agregamos el control orientation XDXDXD, ahora digamos que debe tener un texto cuando corra la aplicación pero que sea editable, con una longitud limitada, seguimos con el código de esta manera:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext", undefined, "Hector F.");
myText.characters = 30;
myWindow.show ();


pueden editar la longitud a su gusto manejando los controles de characters, ahora digamos, que queremos que cuando ejecutemos la aplicación quede activa la parte del texto,, es decir,, cuando este visible el cursor este en la parte del campo de texto, jojo,, :

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext", undefined, "Hector F.");
myText.characters = 30;
myText.active = true;
myWindow.show ();


mmm, divertido,, interesante y motivador,, agregemos unos botones de acción (asi me gusta nombrarlos XDXD):

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.add ("statictext", undefined, "Name:");
var myText = myWindow.add ("edittext", undefined, "Hector F.");
myText.characters = 30;
myText.active = true;
myWindow.add ("button", undefined, "OK");
myWindow.add ("button", undefined, "Cancel");
myWindow.show ();


ejecuten la aplicación, al parecer todos los elementos estan orientados en fila, esto es porque la ventana esta orientada a esa posición, para cambiar la orientación, usaremos unos items,, group y panel, estos dos hacen lo mismo, agrupar los controles, pero difieren de la siguiente manera, group tiene bordos, el panel no, para no afectar a todo lo que concierne a esa ventana en la orientación, agregaremos esto XDXD:

var myWindow = new Window ("dialog", "Form");
var myInputGroup = myWindow.add ("group");
myInputGroup.add ("statictext", undefined, "Name:");
var myText = myInputGroup.add ("edittext", undefined, "John");
myText.characters = 20;
myText.active = true;
var myButtonGroup = myWindow.add ("group");
myButtonGroup.alignment = "right";
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");
myWindow.show ();


he agregado dos grupos, myInputGroup y MyButtonGroup, fijense que he eliminado la linea que setea la orientacion, esto es por que ya no es necesario, por que lo he divido en dos grupos,, digamo que juan es programador,, y botanas es analista, cada quien esta orientado a una funcion diferente aunque esten en la misma empresa, otro punto agregado es ".aligment = right", fácil de deducir :P XDXD, claro esta que si te gusta experimentar más a fondo puedes hacer lo siguiente,, no explicare porque es muy deducible:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
var myInputGroup = myWindow.add ("group");
myInputGroup.add ("statictext", undefined, "Name:");
var myText = myInputGroup.add ("edittext", undefined, "John");
myText.characters = 20;
myText.active = true;
var myButtonGroup = myWindow.add ("group");
myButtonGroup.orientation = "column";
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");
myWindow.show ();


un poco de lucides al app, pondremos la ventana hacia arriba, podemos agregar el siguiente código antes o después de la segunda linea,, no importa:

var myWindow = new Window ("dialog", "Form");
myWindow.orientation = "row";
myWindow.alignChildren = "top";
var myInputGroup = myWindow.add ("group");
myInputGroup.add ("statictext", undefined, "Name:");
var myText = myInputGroup.add ("edittext", undefined, "John");
myText.characters = 20;
myText.active = true;
var myButtonGroup = myWindow.add ("group");
myButtonGroup.orientation = "column";
myButtonGroup.add ("button", undefined, "OK");
myButtonGroup.add ("button", undefined, "Cancel");
myWindow.show ();


hasta aqui es bueno, pero los botones ok y cancel no hacen nada, pues utilizariamos funciones como if else, si se presiona ok que vuelva a mostrar el app, en caso contrario que salga, algo por el estilo sería asi:

if (myWindow.show () == 1)
var myName = myText.text;
else
exit ();


bueno,, seguire en otra ocasión, esto salio por un rato de ocio en la oficina, pero como ya tengo trabajo que hacer, pues hasta aqui le dejo,, ahi cualquier cosa comenten,, no he agregado algo hacia indesign,, pero el punto principal era que tomaran en cuenta que hacer script es dirigido para cualquier cosa que quieras hacer, bla bla,, jaja, k cosas, después pondre scripts dedicados al soft de indesign,, pero son algos complejos,, algo como agregar grids, o posicionar una imagen, hacer un resize de imagens, recolocar texto, cortar texto, y demás, se oye interesante, pero aun no hago algo concreto, he practicado pero necesito mas tiempo para postear un ejemplo práctico funcionable, jeje, suerte nenas, besos.