30 noviembre 2006

¡Concurso de Programación!

Les mando la convocatoria del concurso de programación 2007.

¡Anímense! Se va a poner chido. Para mayores informes e inscripciones, visita la página de la OMI.

SQL: SELECT, parte 8 - Eliminando a los repetidos

En el amplio mundo de las bases de datos, encontramos que lo que se repite es muy repetitivo. Bueno, en muchas ocasiones es inútil. Sin embargo, encontramos que en las consultas SELECT que hamos visto hasta ahorita es posilbe tener muchos registros con el mismo valor.

Por ejemplo, supongamos que un chavo tiene una base de datos para controlar sus citas amorosas. Este galán va a salir con una chica que acaba de conocer en el último concierto del grupo musical "Los asesinos del ritmo" y quiere apantallarla, por lo que no quiere ir a ninguno de los lugares donde ha ido con sus otras queridas (no vaya ser que lo cachen en la movida, jeje). En su tabla de Citas almacena, entre otras cosas, el lugar donde tuvo lugar cada cita. Por lo tanto, si hace un SELECT común y corriente para ver todos los lugares, obtendría algo así:

SELECT Lugar FROM Citas

¿Es útil esta información? Sí, pero puede mejorar. Lo puedo ordenar agregando un ORDER BY para obtener also así:

SELECT Lugar FROM Citas ORDER BY Lugar


Esto es un poco más fácil de comprender, pero de todos modos hay mucha repetición. Sería más útil y menos aburrido si pudiéramos quitar todos los duplicados de mi consulta. Para eso tenemos la poderosa cláusula DISTINCT que podemos ponerle a nuestras consultas para dejar los datos tal y como los quiero. Vamos escribiendo esto:

SELECT DISTINCT Lugar
FROM Citas
ORDER BY Lugar



¡Listo! Ahora si esto es tan útil para un galán, ¡imagínate para un usuario simple y mortal de un sistema que hagas! Recuerda que si dominas el SQL, podrás dominar el mundo. Bueno, tal vez exageré un poco.

28 noviembre 2006

SQL: SELECT, parte 7 - Ordenando el Caos

Ya casi agotamos las opciones que tiene la cláusula SELECT. Todo lo que puedo hacer con el WHERE me permite seleccionar solo los registros que me son útiles, pero falta todavía algo: ordenar la información obtenida. Como te podrás imaginar, esto te simplifica la vida un montón porque aunque obtengas solo los registros pertinentes, verlos a todos es un relajo, imprimirlos es un desmadre... en pocas palabras, si es posible, mejor ordénalos. No te cuesta nada y puede ayudar mucho.

Pero, ¿cómo los ordeno? Fácil. Usamos la cláusula ORDER BY de la instrucción SELECT. Para incluirlo, escribimos al final de la instrucción SELECT algo con la siguiente sintáxis (nota: lo que va entre corchetes cuadrados es opcional):

ORDER BY campo [ASC o DESC][,campo2 [ASC o DESC][,campo3 [ASC ó DESC][, ...]]]

Se ve medio raro, pero es fácil. En primer lugar, puedo ordenar por muchos campos. O sea, si ordeno una lista de alumnos por apellido paterno, es posible que tenga varios registros que tengan el mismo apellido. ¿Cómo los ordeno entre ellos? Puedo especificar un segundo campo, por ejemplo, el apellido materno. Y si ese también "empata" (por ejemplo hay dos o más hermanos en una escuela), podemos especificar que lo ordene por un tercer campo, como podría ser el nombre.

En este caso, podría escribir lo siguiente:

SELECT Nombre,ApellidoP,ApellidoM
FROM Alumnos
ORDER BY ApellidoP,ApellidoM,Nombre


¡Wow! Este aca un reporte de TODOS los alumnos (no tiene la cláusula WHERE, ¿recuerdas que dijimos que es opcional?) ordenados en primer lugar por el campo ApellidoP y, si hay varios con el mismo apellido paterno, ordena los "repetidos" por el campo ApellidoM. Y si hay algunos con el mismo apellido paterno y materno, los ordeno según el nombre.

Si no especifico nada, el ordenamiento se hace de manera ascendente (o sea de la A a la Z), pero puedo modificarlo si necesito que sea de forma descendente (de la Z a la A). Para esto sirve la parte DESC. Esto lo incluyo al final de cada campo. Por ejemplo, si quiero ordenar por apellido paterno de manera descendente y luego por el materno de forma ascendente, escribo esto:

SELECT Nombre,ApellidoP,ApellidoM
FROM Alumnos
ORDER BY ApellidoP DESC,ApellidoM


Como podrás imaginar, si le pongo ASC después del campoestoy especificando que va a ser de forma ascendente. Pero como es la opción por defáult, se puede omitir.

El uso del ORDER BY, como te habrás dado cuenta es muy fácil, así que ahora te dijo para que lo uses y juegues con él. ¡Se divierten!

27 noviembre 2006

SQL: SELECT, parte 6 - ¿Estás IN o solo te encuentras entre muchos? ¿O acaso no existes?

Otros operadores del WHERE que pueden ser muy útiles son el IN, el BETWEEN y los que tienen que ver con el NULL, los cuales sirven para ver si un valor dado se encuentra en un conjunto de opciones, entre dos valores o sin valor respectivamente. ¿Cómo funcionan? Vamos primero a hablar sobre el IN.

Creo que se entiende mejor con ejemplos, así que hay va uno. Quiero obtener el nombre de todas las compañías de mi tabla Proveedores que sean de Japón, Italia, Francia y Timbuktú. Esta consulta quedaría así:

SELECT Nombre,Pais
FROM Proveedores
WHERE Pais IN ('Japón','Italia','Francia','Timbuktú')


Bien, hasta aquí podemos buscar registros que tienen un campo que tiene valores que pertenecen a cierto conjunto, especificado después de la palabra IN en la cláusula WHERE.

Algo muy similar sucede con la palabra BETWEEN. Este sirve para obtener los registros que tienen un campo que se encuentra en un rango dado. Por ejemplo, si quiero ver todos los platillos de mi tabla Menu que cuestan entre $50 y $150, escribiría la siguiente instrucción SQL:

SELECT Platillo,Precio
FROM Menu
WHERE Precio BETWEEN 50 AND 150


¿Pero qué sucede si estoy buscando los registros que carecen de un valor? A lo mejor el usuario no capturó uno o varios campos y quiero saber cuáles son (no necesariamente tiene que ser un error, a lo mejor el programa está diseñado para dejar valores por defáult o lo usan para indicar otros procesos, etc.). Para esto me sirven las opciones IS NULL e IS NOT NULL. Nota: los únicos campos de una tabla que no pueden dejarse en blanco son los que componen la llave primaria.

Supongamos que ando actualizando mi base de datos de alumnos para completar sus datos personales. Particularmente quiero ver todos los alumnos que no tienen teléfono dado de alta. Para saber quienes son, escribo la siguiente instrucción:

SELECT Nombre,ApellidoP,ApellidoM
FROM Alumnos
WHERE Tel IS NULL


También puedo poner el NOT en la instrucción para obtener todo lo contrario. Es poco usado, pero es posible poner NOT NULL en lugar del puro NULL.

En fin, por ahi lo dejo hoy. Estoy a sus órdenes si no comprendieron algo. ¡Saludos!

26 noviembre 2006

Menus en Visual Basic .net y 2005

Hay dos tipos de menus que se pueden poner en aplicaciones hechos en Visual Basic .NET: el menú principal (MenuStrip) y el contextual (ContextMenuStrip). Como dijo Jack el destripador, vámonos por partes...
El menú principal es el que aparece en las aplicaciones abajo de la barra de la ventana (o sea, la tirita que dice "Archivo, Edición, etc."). Para crear uno, se tiene que arrastrar el objeto MenuStrip a la ventana. El ambiente de diseño cambia un poco: el "control" aparece en la parte inferior, fuera de la ventana y en la parte superior de la ventana (o forma) que estás creando, aparece una cajita que dice "Escriba aquí". La pantalla se ve algo así:


Al darle click sobre ese mensaje, te permite escribir un texto (el letrero del primer menú) y aparecen "huecos" para escribir más opciones.


Las siguientes imágenes muestran el efecto que tiene ir tecleando opciones del menú.


Visualmente quedó muy padre. Ahora, ¿qué hacemos? Programar las opciones se hace como con cualquier otro control. En este caso, le dí un doble click sobre la leyenda "Famous Star" y me aparece la ventana de código así:


Ya que solo es un ejemplo y no quiero complicarme la vida, solo voy a hacer que aparezca una ventana que diga lo que eligió, así que agrego el código que hace aparecer un MessageBox de la siguiente manera:


Al correr el programa y al seleccionar la hamburguesa "Famous Star", aparece esta ventana:


Fácil, ¿no? Ahora toca retar a un menu contextual a un duelo. Bueno, exageré. Pero de todos modos vamos a crear un menu contextual. Es muy similar al menú principal, con algunas pequeñas variantes que iré detallando. Para empezar, tenemos que añadir el control ContextMenuStrip a la ventana para que quede abajo de la ventana que estoy diseñando. Algo así:


Como observarás es casi idéntico que el menú principal, solo que aquí no puedes cambiar el texto ContextMenuStrip1. Ahora puedes escribir las diferentes opciones de la misma manera en que lo hice con el menú principal. A mí me quedó así:


No te vayas a sacar de onda: si le das click afuera de la ventana del menú contextual que aparece, desaparece. Para volverlo a abrir, haz un doble click sobre el ContextMenuStrip1 (suponiendo que no le has cambiado el nombre) que está abajo de la ventana.


Al hacerlo, vuelve a aparecer el menú para que puedas seguir trabajando en él.

Agregar código a las opciones del menú contextual es idéntico a la manera en que se agregan en el menú principal (cosa que ya expliqué más arriba). Pero para que funcione, tenemos que programar el momento en que queremos que aparezca ese menú. Lo más común es hacer aparecer un menú contextual al darle un click con el botón derecho del mouse. Así que hay que programar el evento MouseDown. Yo programé el evento MouseDown de una etiqueta (Label1) porque me interesa que abra cuando estoy sobre el label, pero si quieres que aparezca cuando le das click derecho sobre la ventana, pon este código bajo el evento MouseDown del Form.

Espero que se haya entendido porque lo estoy programando bajo Label1_MouseDown() y no bajo Form1_MouseDown() como probablemente harías en tu proyecto, así que ahora hay que decirle al programa que si el botón presionado es el derecho, que haga aparecer el menú contextual. Se supone que en otra parte ya programamos lo que va a hacer cada opción (de la misma manera en que lo hacíamos para las opciones del menú principal). Esto sería así:


¡Y ya! Usamos la función Show que sirve para mostrar el menú en las coordenadas dadas. En nuestro caso, le estamos pasando las coordenadas del lugar donde está el cursor de nuestro mouse (e.X y e.Y).

¡Hasta la próxima!

24 noviembre 2006

SQL: El tremendo SELECT parte 5 - Lo lógico de lo ilógico

Ahora voy a hablar del uso de operadores lógicos. Éstos son 3: el AND (devuelve los registros que cumplan con todos los criterios de selección), el OR (devuelve los registros que cumplan cualquiera de los criterios de selección) y el NOT (niega la expresión que viene después del operador.

Algo que resulta muy útil al crear condiciones del WHERE, y muy en especial cuando estamos trabajando con operadores lógicos (también conocidos como booleanos) es el uso de paréntesis. El uso de estos te permiten:
  • Agrupar expresiones
  • Cambiar el órden en que se evalúan las condiciones
  • Hacer que las expresiones sean más claras, más fáciles de leer y entender
Ejemplos:

SELECT IdProducto,NombreProducto,IdProveedor,PrecioUnitario
FROM Productos
WHERE (NombreProducto LIKE 'T*' OR IdProducto=46) AND (PrecioUnitario > 16.00)


Este busca todos los productos cuyos nombres comienzan con la letra T o tienen un identificador de 46 y que su precio sea mayor a $16.00.

El resultado sería este:

IdProducto, NombreProducto, IdProveedor, PrecioUnitario
14, Tofu, 6, 23.25
29, Tomate, 12, 123.79
62, Tarte au sucre, 29, 49.3


Otro ejemplo:

SELECT IdProducto,NombreProducto,IdProveedor,PrecioUnitario
FROM Productos
WHERE (NombreProducto LIKE 'T*') OR (IdProducto=46 AND PrecioUnitario > 16)


Este devuelve los registros de todos los productos cuyo nombre empieza con T o que su numero de identificación es 46 y su precio es mayor a $16.00.

El resultado sería este:

IdProducto, NombreProducto, IdProveedor, PrecioUnitario
54, Tourtiére, 25, 7.45
62, Tarte au sucre, 29, 49.3
23, Tunnbröd, 9, 9
19, Teatime Chocolate Biscuts, 8, 9.2
14, Tofu, 6, 23.25
29, Tomate, 12, 123.79

Compara las dos consultas anteriores. Fíjate que devuelven diferentes resultados y son procesados de diferente manera porque son agrupados de manera diferente.

¡Hasta la próxima!

23 noviembre 2006

SQL: El tremendo SELECT parte 4 - el WHERE se encadena

El trabajo con texto en una base de datos es todo un relajo. Si estás buscando un texto, pero no le pusiste acento, te equivocaste con una letra u otro error de dedo, obtienes una consulta de datos que no querías o diste de alta un registro con datos erróneos.

Por eso, cuando trabajamos con texto, usamos fragmentos de texto (llamadas subcadenas por lo pipirisnais informáticos) para la búsqueda. Usamos parte del texto, algo que estamos seguros que está bien.

Para poder manejar esto, exiten los operadores LIKE y NOT LIKE, las cuales me permiten buscar subcadenas dentro de un campo de tipo texto. Por ejemplo, si quiero buscar a todos los registros cuyo nombre comience con las letras "Hern" sin importar los caracteres que estén a la derecha de este texto, escribiría la siguiente instrucción SELECT:

SELECT Nombre,ApellidoP,ApellidoM,Edad
FROM Alumnos
WHERE Nombre LIKE 'Fer*'


El asterisco sirve para indicar cualquier conjunto de caracteres (incluyendo una subcadena vacía). En algunos "dialectos" de SQL (o sea, en diferentes manejadores de bases de datos o DBMS), se usa el signo de porciento (%) en lugar del asterisco (*).

Por ejemplo, la sentencia SQL anterior devolvería los registros cuyo campo Nombre fuera Fernando, Fernanda, Fercho, Fermín, etc.

Ahora, si quiero que tenga la subcadena "Fer" en cualquier parte del campo, podría escribir la siguiente instrucción:

SELECT Nombre
FROM Alumnos
WHERE Nombre LIKE '*Fer*'


Lo cual me devolvería los nombres de Fernanda, Fernando, María Fernanda, MaFer, Fercho, Fermín, Ana Fernanda, Juan Fermín, etc.
Puedo jugar con el asterisco de diferentes maneras y estoy seguro que a partir de los ejemplos que escribí, no tendrás problemas en aplicarlos a diferentes consultas.

Dreamweaver: Propiedades de las imágenes y mapas de imagen

Uno de los elementos más importantes de una página web, después del contenido de la misma, son lo elementos visuales, las imágenes. Por eso, en este artículo o post o como se te pegue la gana llamarlo, voy a hablar acerca de las propiedades de las imágenes que insertamos en una página Web.

Cuando seleccionamos una imágen que incluimos en nuestra página, la barra de propiedades es algo similar a este:



Como con cualquier otro objeto, desde este barra tengo acceso a las propiedades de la imágen. En este momento solo quiero resaltar dos propiedades que podemos manipular. El primero (o los primeros) son los íconos que permiten alinear la imágen en la página. Son los botones que se encuentran a un lado de la propiedad Border (que permite especificar el tamaño de un borde que vaya alrededor de la imágen). Este de aquí permite que la imágen esté a la izquierda, al centro o a la derecha de la página. La otra propiedad que quiero resaltar es el Align, la cual nos permite alinear el texto de tal manera que fluya alrededor de la imágen. No hay que confundirlo con los botones de alineación ya que estos sirven para posicionar la imagen en la página y las opciones de la propiedad Align sirve para alinear el texto con respecto a la imagen. En la siguiente imagen se ven todas las opciones para alinear el texto que va alrededor de la imagen.


La opción default (que es igual al baseline) hace que la imagen sea parte del texto de tal manera que el texto que le sigue a la imagen aparece a un lado de la esquina inferior derecha de ella. Te invito a que experimentes con las otras opciones para que veas la diferencia entre ellos.

Las demás propiedades que tienen las imágenes son muy sencillas, así que voy a mencionar algunos de ellos de manera rápida. Las propiedades W y H son del ancho y alto de la imagen respectivamente. VSpace y HSpace establece el espacio que debe existir alrededor de la imágen (o sea, el espacio entre la imágen y su alrededor como el texto). Src es el nombre de la imágen, link es una dirección de otra página (o sea, hace que la imágen sea un vínculo hacia otra) y target establece dónde va a aparecer la liga (ese lo vamos a explicar más adelante).

Para tener compasión de todos aquellos que tenemos conexiones lentas al internet, podemos crear imágenes con menor resolución para que le aparezcan al navegante antes de cargar la imagen chida. El nombre de esa imagen va en la propiedad Low Src. Puedo desplegar un texto en el lugar de la imagen para que se vea mientras se carga la imagen y esto se escribe bajo la propiedad Alt.

Para editar la imagen sin tener que salir de Dreamweaver puedes presionar algunos de botones que aparecen a un lado de Edit. Puedes abrir la imagen el Fireworks (otro programa de Macromedia, ahora Adobe, que sirve para optimizar imágenes para su uso en internet), comprimir la imagen (o sea, dejarlo del menor tamaño posible), cortar la imagen (definir una parte de la imagen que es la que se va a mostrar), girar la imagen, ajustar su brillo y su nitidez.

Ahora sí, ya entrados en gastos, vamos a ver la manera de hacer un mapa sobre una imagen. Pero antes de explicar el procedimiento, ¿qué $%#"&!¡ es un mapa de imagen? Un mapa de este tipo permite definir ciertas áreas de una imagen que funcionen como ligas a otras páginas. O sea que el navegangster, al pasar su mouse sobre diferentes partes de la imagen puede dar un click sobre diferentes zonas, definidas por el diseñador de la página, para "saltar" hacia otras páginas o zonas de la misma página, ya sea que estén en el sitio o sean externos a ella.

Ahora sí, ¿cómo defino esas zonas (llamadas HotSpots, o "puntos calientes")? En primer lugar debo darle un nombre al mapa, lo cual se hace en la propiedad Map.



Abajo de la propiedad Map tengo varias herramientas. Con ellas puedo definir las zonas "calientes" de la imagen. En el ejemplo que estoy presentando, la de una página con un mapamundi, comencé a definir una zona alrededor de Oceanía. Seleccioné la herramienta que tiene forma de círculo y dibujé un círculo sobre Oceanía. Aparece un círculo en color azul claro que delimita el área la cual no aparece al visualizar la página con algún navegador. La pantalla con el círculo oceánico se ve así:

Como podrás imaginar, la propiedad link tiene la dirección de la página que se va a abrir al darle click en esa zona caliente. Abajo de esta propiedad, existe la propiedad target con la cual podemos definir donde queremos que se abra la página. Por ejemplo, si selecciono la opción _blank la página ligada aparecerá en una ventana nueva.

Algunas zonas no pueden ser definidas con un círculo o cuadrado, por la que se puede dibujar un polígono alrededor de la zona caliente que quieres definir. Para crear uno, basta seleccionar la herramienta de polígono y dar click alrededor del área que se desea definir. Mientras vas dando clicks, se va sombreando el área "caliente". Dibujé un área irregular alrededor de Groenlandia para ilustrar esto.

Y para ilustrar el funcionamiento de la herramienta rectángulo, dibujé un cuadrado alrededor de Cuba. La página quedó así:



Creo que con esta breve explicación no tendrás problema para trabajar con imágenes. ¡Nos vemos!

22 noviembre 2006

SQL: El tremendo SELECT parte 3 - El WHERE continúa

Y con el SQL sigue la buena vida...

Ahora voy a hablar (bueno escribir) acerca de otras cláusulas que tiene el WHERE.

Los operadores más fáciles de usar son los de comparación. Creo que son bastante sencillos porque todo lenguaje de programación los tienen y son simbolitos que aprendimos desde la primaria. Para que se entienda como se aplican en una sentencia SELECT, voy a escribir algunos ejemplos.

SELECT ApellidoP, ApellidoM, Nombres
FROM Alumnos
WHERE ApellidoP='López'


Esta instrucción va a desplegar los campos del apellido paterno, materno y nombres de la tabla Alumnos, pero solo de los alumnos cuyo apellido paterno sea López.

No es necesario que el o los campos que intervienen en la parte WHERE tengan que ser parte de la consulta, o sea, no tienen que ir en la lista de campos después del SELECT. Por ejemplo, si escribo

SELECT ApellidoP,Ciudad
FROM Empleados
WHERE Pais='USA'


muestra el apellido paterno y la ciudad de todos los empleados cuyo país es USA. El campo Pais no viene en la lista de campos que se están consultando (no viene después del SELECT), pero sirve para restringir los registros de la consulta.

Ahora voy a escribir un ejemplo usando otros operadores. Como son tan simples, ya no voy a explicar cada uno de ellos.

SELECT ApellidoP,ApellidoM,Nombres
FROM Alumnos
WHERE Edad >= 19


SELECT NoMaterial,Descrip
FROM Productos
WHERE Precio<1250


SELECT Platillo,Precio
FROM Menu
WHERE Platillo <> 'Hamburguesa con queso'


¿Todo bien? Si tienes dudas, deja un comentario o mándame un emilio.

21 noviembre 2006

Peint - Programa mexicanizada del Paint que viene con Windows hecho solo para demostrar el uso de funciones gráficas usando VB .NET

Si quieres hacer un programa que sea una especie de "Paint" sencillo usando VB .NET, sigue leyendo porque voy a explicar como hacerlo.

Esta es la ventana del programa en ejecución. En la parte superior de la ventana puedes elegir la herramienta con la que se va a dibujar, el color a usar y el tamaño de la "brocha". Y hay dos botones: uno que borra la ventana y la otra para salir del programa.


En primer lugar, hay que dibujar la interfaz. Este es muy sencillo, ya que solo hay que dibujar una ventana (o Form) con el fondo de color blanco, un panel color gris en la parte superior, 3 combo box de estilo lista para el color, herramienta y tamaño, y dos botones. Así se ve el ambiente de desarrollo:


Ahora vamos viendo el código. Necesito declarar una pluma (System.Drawing.Pens) y una brocha (System.Drawing.Brushes) para poder dibujar las figuras. También declaro un entero para guardar el tamaño de la figura que se dibujará.

En el Form1_Load se llenan los comboboxes de las figuras, colores y tamaños posibles.


Tengo que validar el evento Form1_MouseDown. Tiene que pintar la figura si da un solo click sobre la forma. Como en el evento MouseDown hago toda la dibujadera, lo ejecuto desde aquí sin ninguna bronca.

La función Form1_MouseMove se ejecuta cada vez que se mueve le cursor del mouse. Aquí solo reviso que esté apretando el botón izquierdo del mouse y, si es que está presionado, dibuja la figura seleccionada. Por medio de un SELECT CASE decide la figura.

Otra cosa que tengo que programar es el cambio de color. Si el usuario selecciona un elemento del Combobox de colores, hago que tanto la pluma como la brocha sean de ese color. Todo esto lo hago dentro del evento Combobox2_SelectedIndexChanged.


Cambiar el tamaño es fácil. En Combobox3_SelectedIndexChanged asigno el valor numérico del combobox a la variable global del tamaño. Aquí también programo a los botones que borran la pantalla (Button1_Click), el cual solo pinta de un color la forma (ActiveForm.BackColor tiene ese valor) y el que sale del programa (Button2_Click).
Parece que así funciona muy bien. Solo toma nota que si se tiene que redibujar la ventana, lo que se ha dibujado se pierde. Esto se debe a que las ventanas (o formas) se están redibujando constantemente: cada vez que son minimizadas, maximizadas, que otra ventana se pone arriba de ellas, etc. Para esto, se tendría que interrumpir el evento PAINT (WM_PAINT en VC++) para volver a pintar todo, lo cual implica tener alguna manera de "recordar" lo pintado. Tal vez eso lo podrás hacer más adelante...

Dreamweaver: Propiedades de una página

Cuando quieres cambiar los colores que usa una página (ya sea de fondo, tipo de letra, vínculos, etc.) o se te pega la gana poner una imagen al fondo, cambiar el estilo del encabezado u algún otro detalle que afecte a toda la página, tienes que editar sus propiedades.

¿Y cómo se lleva a cabo este proceso tan misterioso y trascendental? ¡Fácil! Cuando abres una página del sitio, la barra de propiedades es como la que se ve en esta figura. Haz click sobre el botón Page Properties.


Una vez presionado este botón, aparece la ventana desde donde puedo cambiar las propiedades generales de la página. La primera categoría seleccionada es la de Apperance (las categorías son las que están listadas en la caja de lado izquierdo).



Ahora, ¿qué puedes modificar desde esta categoría? Para empezar, Page Font te permite especificar el tipo de letra ue se va a usar en la página por defáult. Es posible poner diferentes tipos de letra en la página, pero si vas a usar puro Arial, por ejemplo, puedes ahorrarte trabajo si lo especificas desde aquí en lugar de estar haciendo el cambio para cada palabra o párrafo. Size te permite especificar el tamaño defáult de ese tipo de letra. Text color te permite especificar el color del texto defáult (obvio). Background color te permite poner el color del fondo de la página, mientras que Background image te permite especificar una imagen que quieres que aparezca cono el papel tapiz de la página. ¿Cuántas veces quieres que se repita la imágen? Eso lo puedes especificar en el campo Repeat, el cual te da la opción de que no se repita (solo aparece la imagen y ya), que se repita (o sea que si la página es más grande que la imágen, se vuelva a mostrar como si fueran mosaicos) o se repita solo en el eje x o el eje y. También puedo especificar márgenes para el contenido de la página en los campos left, top, right y bottom margin.

La siguiente categoría es la de Links que al darle click, aparecen las opciones de esta ventana:


Las opciones que aparecen aquí también son muy sencillas: puedo cambiar el tipo, tamaño y estilo (negritas y/o cursiva) de la letra de los vínculos (Link font, Size, B, I), el color de las ligas (link color), de las ligas visitadas (visited links), de las ligas "rollover" que son las que cambian de imágen cuando pasa el cursor del mouse sobre ellas (rollover links) y las ligas activas (active links). Y al final puedes especificar el estilo de subrayado (underline style).

La siguiente categoría es la de Headings que me deja definir como van a ser los 6 estilos de encabezado.


El último que nos interesa, el Title/Encoding, no tiene cosa del otro mundo. Sólo puedes cambiar el título (title) de la página y otro par de detalles que no nos interesan en el momento presente (solo especifican el "formato" del archivo en document type y el lenguaje del que se van a usar los tipos de letra en encoding).



¡Listo! Con eso ya configuramos nuestra página, o por lo menos una página del sitio.

¡Hasta la próxima!

SQL: El tremendo SELECT, parte 2 - Usando el WHERE para decidir con quien

Es muy útil usar el famosísimo SELECT para consultar ciertas columnas de una tabla (o varias tablas, como veremos más adelante). Sin embargo, en muy pocas ocasiones vas a querer leer datos de todos los registros de una tabla ya que generalmente son muchísimos registros. Por lo tanto, para hacer una consulta que resulte útil para el usuario, es necesario contar con algo que me permita filtrar los registros para ver solamente los registros que quiero ver.

Para eso existe la cláusula WHERE, la cual me permite establecer una condición que deben cumplir todos los registros para poder aparecer en la consulta.

La sintáxis de una consulta SELECT que use la cláusula WHERE será como sigue:

SELECT campos
FROM tabla
WHERE condición

Como te habrás dado cuenta, existe la parte "obligatoria" del SELECT (SELECT campos FROM tabla), pero ahora al final le agregamos la palabra WHERE seguido por una condición. De esta manera solamente los registros que cumplan con esta serán accesados.

Ejemplo: para ver el número de empleado, su apellidos paternos y maternos y su número telefónico de todos los empleados cuyo apellido paterno sea "López", escribiría la siguiente instrucción (suponiendo, obviamente, que la tabla Empleados y los campos existan):

SELECT NoEmp,Nombre,ApellidoPat,ApellidoMat,Tel
FROM Empleados
WHERE ApellidoPat="López"


Y, ¿qué tipo de condiciones (u operadores condicionales) puedo usar? Aquí va una tabla con los operadores lógicos que pueden ser usados en una condición WHERE.


Más adelante hablaré de la manera de usar estos operadores con más ejemplos, así que no te pierdas el siguiente episodio del SQL SELECT con el WHERE misterioso...

16 noviembre 2006

SQL: El tremento SELECT, parte 1

El lenguaje SQL es interesante e importante de aprender, ya que si lo conoces, puedes dominar el universo (universo de los manejadores de bases de datos).

SQL (pronunciado SICUAL) es un lenguaje creado en los 70's por IBM para comunicarse con su sistema manejador de bases de datos. De hecho SQL es el acrónimo de Structured Query Language (lenguaje estructurado de consultas). ¿Por qué de consultas? Es la operación más frecuente que haces con un DBMS (otro acrónimo: DataBase Management System).

Si quieres más información acerca del SQL, revisa este artículo en Wikipedia, o consulta este libro.

Como la consulta es la operación más frecuente, vamos a comenzar con la instrucción SELECT, el rey de las consultas.

Como es una instrucción muy compleja (tiene muchas opciones para hacer un chorro de cosas), voy a comenzar de los más sencillo e ir avanzando poco a poco para ir viendo más y más y más opciones hasta llegar a un dominio chipocludo del arte oscuro de las consultas en SQL.

La sintáxis básica es:

SELECT lista de campos separados por coma ó *
FROM tabla

Para ver un ejemplo, supongamos que tengo una tabla llamada Productos con estos campos y datos:


Ahora vamos a usar una instrucción SQL que muestre el contenido del campo Descrip (que contiene las descripciones de los productos) y la cantidad que tienen en el inventario. El comando SQL sería esta:

SELECT Descrip,Cantidad
FROM Productos

*NOTA: Por claridad y fines didácticos, escribo los comandos en mayúsculas y divido la instrucción en diferentes líneas, sin embargo a SQL no le impora si va en una sola línea ni que las instrucciones estén en mayúscula o minúscula.

El resultado de esta operación sería esta:


Puedo consultar todos los campos que quiera, siempre y cuendo separe con comas sus nombres. Pero si quieres consultar todos los campos y te da mucha flojera escribir una listota de campos, puedes poner un asterisco en lugar de la lista y la consulta te devuelve los valores de todos los campos. Por ejemplo, si quiero consultar todos los campos de la tabla Productos, puedo escribir la siguiente instrucción:

SELECT *
FROM Productos

¡Y listo!

Esta es la sintáxis más sencilla del SELECT. En otras entradas (que haré más adelante) iré explicando los diferentes opciones que puede usar la sentencia SELECT.

Concurso: Multimedia

Para que se animen, está este concurso entre las escuelas incorporados al AJIEMS. Es la primera vez en que se realiza este concurso y hay cosas muy interesantes. Este es el cartel con la convocatoria.



Para mayores informes, visita la página de la OMIJAL.

15 noviembre 2006

Dreamweaver: Diseñando tablas

Me puse a diseñar una página güev y quise ver cómo se pueden usar las tablas. Me interesan mucho las tablas porque son el elemento principal para el diseño de una página, bueno yo creo que son fundamentales, a lo mejor otros opinan lo contrario. Pero como este es mi blog, puedo expresar lo que se me pegue la gana :)

Así que voy a ir explicando paso a paso lo que fui haciendo. A grandes razgos, lo que hice fue crear un sitio, crear una nueva página, dibujar una tabla, agregar "cositas" a la tabla y darle formato a la tabla.

Antes de hacer lo que voy a explicar, hice un sitio llamado 1 TCB (le puse este nombre porque ese es uno de los grupos a los que les doy clase). Ya tengo una página nueva (archivo HTML) en la vista diseño y con los controles "common" seleccionados.

Esta es la herramienta para insertar tablas:


Una vez que se apachurra ese botón, aparece una ventana que te permite poner las propiedades de la tabla, tal y como la quieres tener.


Aquí hay varias opciones que vale la pena explicar. Las propiedades Rows y Columns permiten asignar el número de filas y columnas respectivamente. Sigue Table width la cual contiene el ancho de la tabla. Hay dos maneras de esepcificar el ancho: de manera fija (donde especificas cuántos pixeles tiene de ancho) y de manera variable (donde especificas el porcentaje que medirá). La diferencia de estas dos maneras es que en la primera, si la ventana del navegador (dícese Internet Explorer, Mozilla Firefox u otro) es más pequeño que la tabla, no puedes ver la totalidad de él. En cambio, si especificas un porcentaje, te dice que porcentaje del ancho del navegador se puede ver. Así, si la ventana del navegador cambia de tamaño, también cambia el ancho de la celda.

Es posible hacer un marco que vaya alrededor de la tabla. En lo particular, se me hace bastante feo, pero, como dice un amigo mío, como en gustos se rompen madres, asi que ahi ca' quien. Para los que quieren experimentar con el borde, deben poner un valor en la propiedad Border thickness (ancho del borde).

Muchos necesitan dejar cierto espacio adentro de cada celda. Por lo tanto, el espacio que deja entre el contenido de la celda y su límite, es el Cell padding. Haz de cuenta que estás fabricando un marco para una foto que quieres colgar en la sala de tu penthouse. El marco se parece a una celda de una tabla. Tu puedes hacer tu marco de tal manera que exista 5 cm entre la foto y la orilla del marco. Esos 5 cm de espacio vacío alrededor de la foto sería el cell padding.

También se puede especificar el espacio entre celdas. Este valor se escribe en Cell spacing.

Si estás usando una tabla para mostrar una hoja de datos, es útil poner encabezados en la primera columna, fila o ambas. En la sección Header se puede especificar si deseas un encabezado y en dónde lo quieres meter. En los dibujitos, las celdas oscuras serían las celdas de la tabla que llevaran encabezados.

La última sección (Accessibility) está diseñada para proveer ayuda para todos aquellos que tenemos una velocidad lenta al interet. Gracias a las nuevas tecnologías en redes y la competencia entre proveedores de servicio internet, o ISP, está cayendo en desuso estos parámetros opcionales (gracias a la ley de la oferta y la demanda, entre más proveedores hay, deben competir entre ellos por dar un mejor servicio a un menor precio). En la propiedad Caption se puede escribir un título que aparece en el lugar de la pantalla donde se va a poner la tabla. De esta manera, un fulandango que abra la página puede ver de qué se trata la tabla mientras espera que aparezca. En caso que no le sea útil, puede regresar a la página donde estaba o detener al navegador.

Bueno, una vez que usamos esa ventana, nuestra página queda así:


¡Qué chido! Bueno, ni tanto. Si colorcitos ni imágenes ni nada, no luce muy atractivo que digamos. Por lo pronto, quien vea la página lo va a ver en blanco, porque no le puse valores para el borde ni espacio entre celdas. Pero para verlos en la vista diseño, Dreamweaver pone los bordes como líneas grises intermitentes. Al poner el cursor sobre el límite entre celdas, puedo arrastrarlo para cambiar el alto o ancho de la fila o columna (dependiendo de donde ponga el cursor).

Otra cosa que ver: en el pallette de abajo, la de propiedades (Properties), aparecen opciones para cambiar el aspecto de la tabla. Así si quieres alterar algo de la tabla, lo puedes hacer con toda confianza y singular alegría. Ahora vamos a usar este palete para cambiar el color de la tabla.

En ese palette, hay un cuadrito a un lado del texto Bg color el cual permite seleccionar el color que tendrá la tabla. Si le picas al cuadrito, tu pantalla se ve algo así:


De la misma manera, pude haber editado la propiedad Brdr color para cambiar el color del borde (si es que le pusieron) y la Bg image para poner una imagen como el fondo de la tabla.

Todos los colores que aparecen en esta "ventanita" de los colores que aparece, son llamados "Web safe". Eso quiere decir que cualquier navegador puede mostrar a la perfección cualquiera de esos colores. Puede ser que te preguntes, ¿qué no puede mostrar todos los colores? No. Bueno, casi. Lo que pasa es que al mezclar colores a lo loco, puede que en una computadora se vea de un tono un poquitito diferente en otra máquina.

Es posible que quieras unir celdas adyacentes o dividir celdotototas. Para eso puedes usar dos botoncitos que están en el palette de propiedades. Selecciona varias celdas de la tabla (para seleccionarlas, solo das click en una celda y arrastras el cursor sobre todas las celdas que quieras seleccionar), presiona el botón de combinar celdas y ¡Pum! de la nada, todas esas celdas se hacen una.


Del mismo modo, puedes seleccionar una celdotototota y presionar el botón de dividir celdas y teabre una ventana como la de abajo que te preguntará en cuántas celdas quieres que se convierta. Pon el número y sé feliz.


Bueno, por ahorita es todo lo que se me ocurre acerca del diseño de tablas. PEro si se me ocurre algo al rato, se los hago saber.

¡Se divierten!

13 noviembre 2006

Líneas y cuadrados - Ejemplo del uso de funciones gráficas usando VB .NET

Este es un ejemplo simple que solo dibuja líneas y cuadrados al azar que ejemplifica el uso del objeto System.Drawing.Graphics. Al ejecutarse el programa, se ve así:

Como se ve, es una forma simple que no contiene nada. El diseño de la ventana es así:


La forma solamente tiene un Timer. El código es igual de sencillo:

Related Posts Plugin for WordPress, Blogger...