Archivos para 28 septiembre 2009

28
sep
09

ADO.NET.- Conectar Base de Datos SQL con VB.NET

Bueno, esta vez hablaremos sobre ADO.NET, la evolución de la arquitectura de acceso a datos de Micro$oft…

ADO = ACtiveX Data Objects, ADO.NET provee a los programadores .NET de un acceso a las fuentes de datos relacionales, XML y aplicaciones de datos, es una gran herramienta que puede trabajar con diversos proveedores de datos, desde Sql Server, hasta Oracle y MySql…

Esta vez voy a mostrarles como crear procedimientos con los objetos básicos de ADO.NET para conectarse y trabajar con una base de datos hecha en Sql Server…

Primero pasarémos a revisar los principales objetos de ADO.NET:

Objeto DataReader: proporciona un acceso rápido y unidireccional (solo hacia adelante) a los datos, es de solo lectura.

Objeto DataSet: proporciona una representación relacional de los datos en memoria, es decir, es capaz de crear tablas y relaciones en memoria para trabajar en ellas.

Objeto DataAdapter: sirve como un puente entre el DataSet y el origen de los datos.

Objeto Command: proporciona lo que Micro$oft llama Funcionalidad Explícita, que consiste en los métodos ExecuteNonQuery para las operaciones que no devuelven un resultado a la consulta, (Insert, Update, Delete), y ExecuteScalar para funciones que devuelven un único valor en lugar de un conjunto de filas.

Ahora, una forma de optimizar nuestro trabajo es identificar el tipo de cosulta que haremos, a modo de ejemplo tomaremos tres casos:

  1. Consulta Lineal con un flujo de datos hacia adelante y de solo lectura: Puede utilizarse este modo para el tipo de consultas simples que no requieren de mucha interacción del usuario o de actualizarse o regresar a un registro anterior, esto lo hacemos con el objeto DataReader, que fue diseñado para mantener una conexión permanente con el origen de datos mientras este activo, su función, básicamente, es leer los registros de la consulta de a uno en uno y en dirección hacia adelante (Forward-Only).
  2. Consulta de tipo Desconectado: Puede proveer una representación totalmente desconectada de los datos, para que el usuario pueda manipularlos sin verse restringido por problemas de recursos del servidor o disponibilidad de la fuente de datos, podemos utilizar el objeto DataSet, dentro del cual podemos contener tablas con los resultados de nuestras consultas no importando el origen de estos, (base de datos, archivos xml, o datos que genera la aplicación), esto permite una flexibilidad mayor cuando se trabaja con datos relacionados y permite exportarlos como archivos Xml.
  3. Recuperar y actualizar desde una fuente de datos: Bueno, esto es medio sencillo si se ve así: el DataAdapter se conecta con el origen de datos y permite llenar el DataSet con los resultados, al manipular, modificar o/y actualizar los datos en el DataSet, también permite actualizarlos en el origen de datos.

Ahora, después de toda esta (necesaria) chachara, hemos de pasar a los ejemplos prácticos de utilización de los objetos de ADO.NET para establecer conexión y trabajar con un origen de Datos, (Micro$oft Sql Server)

Veremos primero como importar el espacio de nombre necesario para trabajar con los objetos para el servidor sql, luego, declarar los objetos y conectarse a la base de datos…

Imports System.Data.SqlClient

Luego necesitamos declarar una variable que nos diga dónde está el servidor y como se llama la base…

Public Conexion As String = “Server =Server_1;packet size=4096;integrated security=SSPI;data source=Server_1;persist security info=False;initial catalog=Estudiantes”

Esta es una de las cadenas más sencillas donde se establece el nombre del servidor y la base de datos, aunque si necesitamos declarar Usuario y Password utilicemos esta:

Public Conexion As String = “Server =Server_1;packet size=4096;User Id=Axl;Password=123;data source=Server_1;initial catalog=Estudiantes”

Tengo que recordarles, que en SQL, si utilizamos un usuario y password para entrar a la base, tenemos que darle permisos a ese usuario en todas las propiedades de las tablas que queramos que tenga acceso, en especial los Stored Procedures, que hay que marcarlos uno por uno :(

luego declaramos los objetos necesarios para empezar a trabajar…

Dim Cmd As New SqlCommand
Dim Cnn As New SqlConnection
Dim Sql As String
Dim Dr As DataRow
Dim Da As New SqlDataAdapter

Estos objetos los utilizaremos en cuatro procedimientos que crearemos a continuación, Consulta de Busqueda, Inserción, Actualización y Eliminación…

Busqueda:

Dim ds As New Data.DataSet
Sql = “Select * from Materias”
Cnn = New SqlConnection(Conexion)
Cnn.Open()
Da = New SqlDataAdapter(Sql, Cnn)
Da.Fill(ds)
Cnn.Close()

Explicación (línea por línea):

Declara un Objeto tipo Dataset para depositar los datos de la consulta.

Asigna la cadena de la consulta a la variable “Sql” (tipo string)

Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo

Abre la conexión con la propiedad .Open() del SqlCommand

Le da al SqlDataAdapter la cadena de consulta y el objeto de conexión

El SqlDataAdapter tiene la especial propiedad .Fill que vuelca todo lo que tiene en el objeto entre los paréntesis, (el dataset), y ojo que solo lo hace en un dataset.

Cuando has volcado el contenido de la consulta en el dataset simplemente cerras la conexión.

Ojo y doble ojo en esto, se debe cerrar cada conexión que se abra, no importa que tipo de consulta se haga, las conexiones abiertas se acumulan y pueden volar tu servidor y simplemente se quedará pegado.

Actualización:

Sql = “Update ” & tabla & ” Set ” & camposyvalores & ” Where ” & condicion
Cnn = New SqlConnection(Conexion)
Cnn.Open()
Cmd = New SqlCommand(Sql, Cnn)
Cmd.ExecuteNonQuery()
Cnn.Close()

Explicación (Línea por línea):

Asigna la cadena de la consulta a la variable “Sql” (tipo string)

Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo

Abre la conexión con la propiedad .Open() del SqlCommand

Le damos al SqlCommand el objeto de conexión y la cadena con la instrucción Sql

Aquí utilizamos la propiedad .ExecuteNonQuery del SqlCommand que permite ejecutar una instrucción sin arrojar ningún resultado.

Como ya lo he dicho antes, hay que cerrar la conexión.

Eliminación:

Sql = “Delete From ” & tabla & ” Where ” & condicion
Cnn = New SqlConnection(Conexion)
Cnn.Open()
Cmd = New SqlCommand(Sql, Cnn)
Cmd.ExecuteNonQuery()
Cnn.Close()

Explicación (Línea por línea):

Asigna la cadena de la consulta a la variable “Sql” (tipo string)

Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo

Abre la conexión con la propiedad .Open() del SqlCommand

Le damos al SqlCommand el objeto de conexión y la cadena con la instrucción Sql

Aquí utilizamos la propiedad .ExecuteNonQuery del SqlCommand que permite ejecutar una instrucción sin arrojar ningún resultado.

Como ya lo he dicho antes, hay que cerrar la conexión.

Inserción:

Sql = “Insert Into ” & tabla & ” (” & campos & “) Values (” & valores & “)”
Cnn = New SqlConnection(Conexion)
Cnn.Open()
Cmd = New SqlCommand(Sql, Cnn)
Cmd.ExecuteNonQuery()
Cnn.Close()

Explicación (Línea por línea):

Asigna la cadena de la consulta a la variable “Sql” (tipo string)

Le da al objeto SqlCommand la dirección de la base y lo instancia para poder utilizarlo

Abre la conexión con la propiedad .Open() del SqlCommand

Le damos al SqlCommand el objeto de conexión y la cadena con la instrucción Sql

Aquí utilizamos la propiedad .ExecuteNonQuery del SqlCommand que permite ejecutar una instrucción sin arrojar ningún resultado.

Como ya lo he dicho antes, hay que cerrar la conexión.

Ok, si han sido buenos observadores habrán descubierto que en los últimos tres procedimientos solo cambia la instrucción Sql, por lo demás son iguales, ¿Porque?, porque a mi juicio, hay dos tipos de instrucciones, Las que te devuelven algo y las que no te devuelven nada. El Select te devuelve algo, lo que sea, un campo, una fila, una columna, una tabla, cualquier cosa, los demás (Insert, Update, Delete) no te devuelven nada por eso usamos el .ExecuteNonQuery del amigo SqlCommand y podemos utilizar el mismo código para los tres.

Como lo he dicho desde la primera entrada que hice en nuestro blog, utilizaré los métodos más simples para hacer las cosas, porque bueno, Occam dijo que la respuesta más simple y obvia es casi siempre la mas probable, (en nuestro caso, no es solo la única), pero no siempre la correcta. Hay muchas formas de hacer las cosas, pero trataremos de tomar las más fáciles y las más prácticas.

Saludos…

21
sep
09

Que hacer en caso de un terremoto…. (Hecho por un Salvadoreño…)

Que hacer en caso de haber un terremoto???, bueno, primeramente ponga cara de vivo y diga: ‘¡Hey está temblando!’; después ‘tanteye’ si es conveniente salir dependiendo de la magnitud del sismo. Calle a los chuchos (si es que tiene) pues es mas el ajolote que le transmiten a uno. Chiflele a los cipotes para que esten listos y sáquelos ‘chiniados’. Cuando termine la réplica diga lo de siempre, ‘¿Hey sintieron?’.

QUE HACER SI LA REPLICA LO AGARRO EN EL BAÑO?. Cuando oiga los chuchos haciendo un gran ‘deschongue’, mejor corte su tirita de papel higiénico y téngala lista por si acaso, pues cuando los chuchos se ponen bulliciosos es porque va a temblar. Si se esta bañando y lo agarra una réplica de 7.3 grados aviéntese chulon directo a la puerta de salida y corra como nunca, mas vale que los vecinos hablen de su caso todo lo que resta del año por haberlo visto chulón, a que pasen todo el año diciendo, ‘tan bueno que era’.

QUE HAGO SI ESTOY EN UNA 4a. ó 6a.PLANTA?. Primero cálmese, después diga: ‘En tus manos encomiendo mi espíritu’….. y expire en paz.

SI ESTA EN UN CENTRO COMERCIAL?. Si el almacen es de ropa, agarre una mudada completa de su talla y corra a los vestidores, le aseguro que en el ajolote, nadie se dará cuenta que salió estrenando. Si es una tienda de electrodomésticos y estaba a punto de hacer un abono cuando empezó el agarrón, pues haga como que ya le había dado a la cajera los $100 y pida su vuelto de los $15.00 que iba a pagar.

QUE HACER SI LE AGARRA UNA REPLICA EN UN SOTANO?. Ni se preocupe por salir corriendo a las gradas o al ascensor, total ¿para qué quiere subir si ya todo el edificio viene para abajo? Mejor serenese, pongase en posicion horizontal viendo hacia arriba, cruce las manos encima del pecho y si por aquello de las casualidades anda un limón, cortelo por la mitad y pongaselo en la boca. Por lo menos cuando lo encuentren pensarán ‘este murió en paz, no corrió… no era impío’.

QUE HACER SI EL SAMAQUION ME AGARRA EN CASA DE MI NOVIA?. Antes que nada recuerde que debe demostrar que usted será el hombre de la casa algún día y sus suegros deben ver en usted a alguien sereno (calmaaaado…calmaaaado). Levántese y organice una salida ordenada, por nada del mundo vaya a olvidarse de la abuela, chinee al cuñadito de 5 años que le cae mal y finja preocupación por él, aproveche esta situación para meterle ese empujón (casi trompón) a su suegra asumiendo demencia y dígale después que era por salvarle la vida. Si su suegro le debe alguna también, sueeeeeeeneselo y ya sabe despues solo deselas de Superman…

QUE HAGO SI LA REPLICA ME AGARRO CABAL A MEDIA PELICULA EN EL CINE?. Para empezar, ¡¿quién lo manda ir al cine en esos momentos de tribulación?! Pero bueno, asumamos que fue lo suficientemente …. o mejor dicho valorudo (por no ofenderlo) y esta en el cine en medio de aquel ‘gentillal’ y en la oscuridad total. Si se va la luz no vaya a perder el tiempo gritando: ‘devuélvanme la cora’ o chiflando la vieja. ¡Coooooorra maestroooooo!, salte sobre las butacas si es necesario, empuje con todas sus fuerzas el nudo de gente que seguramente habrá en la puerta, grite, llore cuando le caiga el cielo falso en la cabeza y vea que todo el ripio se desprende… Total ¡QUIEN LO MANDA ANDAR EN ESAS ENCERRADERAS OSCURAS EN ESTOS DIAS! RECOMENDACIONES ADICIONALES: Si esta en un edificio o casa, ‘cargue’ siempre una bolsa plastica negra de su tamaño, y cuando comience a temblar métase en ella, ahorrele el trabajo a los chamacos de rescate. Siempre lleve una media libra de Purina (comida para chuchos), para que los perros de rescate lo localicen más rápido en medio de los escombros…

Saludos…

16
sep
09

Evento: Software Freedom Day! en El Salvador

Éste evento se llevará acabo en la UTEC…

evento-software-libre

Con respecto a la ponencia de IPCop, trataré de grabarlo en video y lo subiré en éste mismo blog.

Saludos!!!!!

12
sep
09

Copiar o duplicar disco duro virtual en VirtualBox

Hace poco virtualicé IPCop en mi laptop y, antes de hacer “destrozos” con ésta distro se me ocurrió hacer una copia del archivo VDI que es el archivo que utiliza VirtualBox como disco duro virtual, y éstos archivos se encuentra generalmente en /home/usuario/.VirtualBox/HardDisks.

Como paréntesis, Hay que tomar en cuenta que en Nautilus todas las carpetas que empiezan con “punto” son tratados como archivos ocultos y no se muestran así de entrada, por lo que se deberá presionar la combinación de teclas CTRL+H o dar clic en “Ver->Mostrar los archivos ocultos”

vbox01

Luego de hacer pruebas destructivas con la máquina virtual IPCop, decidí restaurar el sistema con la copia que había hecho del archivo VDI pero mi sorpresa es que, cuando quice poner como disco duro de la máquina virtual la copia que tenía del VDI me salió un mensajito así…

vbox3

Por lo que aprendí una lección: los archivos vdi no solo se deben copiar ya que éstos poseen un código UUID (Identificador Universalmente Unico) que se utilizan generalmente en dispositivos como discos duros. Ya que el archivo VDI es un disco duro “virtual”, éste también posee un UUID que no debe ser “único”.

Investigando encontré que, para hacer una copia de un archivo VDI, se debe de utilizar un comando que ya tiene VirtualBox. Básicamente la línea de comando para hacer la copia o clonado es la siguiente:

oscard@skrdz:~$ cd /home/oscard/VirtualBox/HardDisks/
oscard@skrdz:~$ VBoxManage clonehd demo-ipcop.vdi  demo-ipcop2.vdi

  • La primera para ubicarnos en donde se encuentran los archivos VDI
  • La segunda línea es el comando que nos permite clonar el disco duro asignándole un nuevo UUID. Donde dice “demo-ipcop.vdi” es el disco duro que quiero copiar/clonar y el que dice “demo-ipcop2.vdi” es el disco duro virtual resultante.

La salida que muestra el comando es:

vbox06

Y ya con ésto es suficiente. Al querer crear una nueva máquina virtual asigándole el disco duro que hemos clonado con diferente UUID, VirtualBox nos dejará pasar y tendrémos otro SO sin necesidad de volver a empezar de CERO.

Espero que le ayude a alguien así como me ayudo a mi jejejj XD

Saludos!

11
sep
09

Transact Sql Básico – Crear una Base de Datos con llaves primarias y relaciones en SQL-Server 2005

Bueno, creo que este es un buen tema para publicar, como hacer una base de datos en Sql Server con sus llaves primarias y relaciones pero a puro código, asi que comparto este código con ustedes, lo único que deben hacer es pegarlo en el editor de consultas de SQL y listo…

Lo primero es crear la base de datos…

Create Database Inscripciones
go

luego le decimos que cambie a la base que hemos creado

Use Inscripciones
go

Ahora creamos las tablas en nuestra base de datos:

Create Table Estudiantes
(IdEstudiante int,
Nombres VarChar(25),
Apellidos VarChar(25),
Direccion VarChar(50),
Telefono VarChar(8),
Primary Key (IdEstudiante))
go

Create Table Materias
(IdMateria int,
Materia VarChar(30),
Primary Key (IdMateria))
go

Create Table Notas
(IdEstudiante int,
IdMateria int,
Nota decimal (10,2))
go

Ahora que tenems nuestras tablas creadas con sus respectivas llaves primarias, procederemos a crear los constraint o relaciones para las tablas.

Alter Table Notas
add constraint fk_Notas_IdEstudiante
Foreign key (IdEstudiante)
References Estudiantes(IdEstudiante)
go

Alter Table Notas
add constraint fk_Notas_IdMateria
Foreign key (IdMateria)
References Materias(IdMateria)
go

ahora podemos perfectamente ver el diagrama de la base de datos que queda de esta forma:

Diagrama DB Inscripciones

Ahora nuestra base de datos está lista para que podamos trabajar con ella, y para que sea mas real, le agregaremos algunos registros y jugaremos con ella un poco…

Primero, agregaremos algunos estudiantes…

Insert Into Estudiantes Values (01, ‘Maria’, ‘Hernandez’, ‘Col. Santa Isabel’, ’22542121′)
Insert Into Estudiantes Values (02, ‘Oscar’, ‘Mejía’, ‘Final 4º calle ote.’, ’26098345′)
Insert Into Estudiantes Values (03, ‘Hilario’, ‘Urrutia’, ‘Final calle el progreso’, ’29078341′)
Insert Into Estudiantes Values (04, ‘José’, ‘Quezada’, ‘Mejicanos’, ’23456895′)
Insert Into Estudiantes Values (05, ‘Adriana’, ‘Urrutia’, ‘San Jacinto’, ’22204789′)

Ahora agregamos algunas materias…

Insert Into Materias Values(111, ‘Base de Datos II’)
Inset Into Materias Values(114, ‘Ingeniería del Software’)
Insert Into Materias Values(115, ‘SQL Server’)

Ahora algunos registros de notas…

Insert Into Notas Values (01, 111, 7)
Insert Into Notas Values (01, 115, 6.0)
Insert Into Notas Values (01, 115, 4)
Insert Into Notas Values (02, 111, 6)
Insert Into Notas Values (02, 114, 10)
Insert Into Notas Values (02, 115, 8.0)

Ahora, con la base creada y con registros en ella podemos modificar lo que queramos…

por ejemplo, borrar los registros de notas que correspondan a la materia ‘Base de Datos II’:

Delete From notas Where IdMateria = 111

Modificarle a 9.0 la nota a Oscar Mejía para la materia ‘Sql Server’:

Update notas Set nota = 9.0 Where IdEstudiante = 02 and IdMateria = 115

Modificar el nombre de la materia ‘Ingeniería del Software’ a ‘Desarrollo de Software:

Update Materias Set Materia = ‘Desarrollo del Software’ Where Materia = ‘Ingeniería del Software’

Borrar a los estudiantes que tengan apellido ‘Urrutia’:

Delete From Estudiantes Where Apellidos = ‘Urrutia’

Mostrar a todos los estudiantes:

Select * From Estudiantes

Mostrar el apellido y la dirección del estudiante 01

Select Apellidos, Direccion From Estudiantes Where IdEstudiante = 01

Seleccionar el código de materia, el nombre de materia y la nota de las materias que cursa el estudiante 02, (Este inner join esta bueno para los que nunca han consultado dos tablas a la vez).

Select Materias.IdMateria, Materias.Materia, Notas.Nota From Materias inner join Notas on Materias.IdMateria = Notas.IdMateria Where Notas.IdEstudiante = 02

Muestra la nota media de cada estudiante para las materias que cursa.

Select IdEstudiante, AVG(Nota) From Notas Group By IdEstudiante

bueno… espero que les sirva para crear bases de datos más grandes, completas y funcionales.

Creo que siempre es bueno saber como hacer las cosas a pie, es decir, con código, porque los nuevos lenguajes tratan de acostumbrar a los nuevos programadores a trabajar con los asistentes, cosa que no considero que este bién, es bueno conocer las herramientas, utilizarlas hasta cierto punto, pero no hay nada mejor que crear tu propio código sin que el sistema te diga como o con que elementos crearlo, sobre todo con sistemas de Micro$oft…

Saludos…

10
sep
09

El Software Freedom Day en El Salvador!

Amig@s!!!! el 19 de Septiembre 2009 se amenizará un evento en la Universidad Tecnológica de El Salvador (UTEC), cuyo tema eje es: La libertad del software o software libre (El Software Freedom Day!!). Si quieren mayor información, pueden visitar el sitio: http://www.opensuse.org.sv/wiki y http://www.danielsuarez.org

Yo realizaré la ponencia de: “Construyendo tu propio firewall con IPCop” y trataré de capturar el video de todo lo que haga en la laptop y lo que diga de tal manera que lo pueda subir a éste blog, así que esten pendientes y, para los que estan en El Salvador, estan invitados a éste evento y compartan ésta información con sus amig@s para que nos hagan barra y compartamos el amor al software libre.

Aqui les pongo más o menos la programación del día:

ACTIVIDAD EXPOSITOR Tiempo (min) INICIO FIN
Presentación Erick Garcia y Franklin Cisneros 10 09:30 09:40
Transición
La comunidad openSUSE de El Salvador y el proyecto openSUSE Jose Roberto Alas 30 9:45 10:15
Transición
Diseño gráfico con GIMP e INKSCAPE Walter Tobar y Manuel Guardado 60 10:20 11:20
Introducción a UBUNTU Mauricio Reyes 40 11:20 12:00
Transición
Instalación de Slackware GNU/Linux Daniel Suárez 40 12:05 12:45
GNU/Linux y TCP/IP Erick Garcia 60 13:00 14:00
Transición
Software libre y el proyecto FEDORA Andrés Pascasio 60 14:05 15:05
Transición
Construyendo tu propio firewall con IPCop SkrDz 60 15:10 16:10
Invitación a integrarse a openSUSE SV y UBUTEC Daniel Estevez 10 16:10 16:20
10
sep
09

La Nomenclatura Hungara

Creo que a todos nos ha pasado, que al darle mantenimiento a nuesto código nos topamos con nombres que no identificamos de que tipo de objeto se trata o si es alguna variable entre todo lo que hemos hecho. Una buena práctica como programadores es mantener un estándar de calidad, sea personal o a nivel de trabajo, pero es importante ser ordenado en lo que se hace, sobre todo porque no sabemos si en algún momento a alguien le tocará darle mantenimiento a alguna de nuestras aplicaciones, y a nosotros no nos gustaría encontrar alguna aplicación que alguien más haya hecho y nos topemos con una “Tripa chuca” (Los Salvadoreños entenderán), por lo que hay que empezar por ordenarnos nosotros mismos.

La Nomenclatura Hungara es un tipo de estándar, que consiste en colocar prefijos a los nombres de los objetos, pero que coincidan con el tipo de objeto con el que trabajamos, por ejemplo, al trabajar con un botón al cual le hayamos colocado como nombre “Guardar”, podremos colocarle el prefijo “Btn”, que nos indicará que el objeto con el que trabajamos es un botón.

Guardar ——-> BtnGuardar

De esta forma nos evitamos confusiones al momento de escribir código, ya que por ejemplo, puede que también necesitemos una etiqueta Guardar

Guardar ——-> LblGuardar

No hay cosa mejor que abrir un código que has hecho tiempo atrás y entenderlo a la perfección, sin quebrarte la cabeza adivinando que cosa es lo que estas viendo, aqui les dejo unos cuantos prefijos que podemos aplicar a cualquier lenguaje y un vínculo a una lista mas extensa en el sitio de Micro$oft.

Form                          Frm

Label                          Lbl

Button                       Btn

TextBox                   Txt

Listbox                     Lst

Image                       Img

CheckBox               Chk

Mas prefijos en http://support.microsoft.com/kb/173738/es

10
sep
09

Crear Formularios MDI

Weno, me gustaría comentar sobre los formularios MDI, ya que es un tema que cuando yo lo busque, me recorrí todo el google buscando y solo encontré documentos mediocres que trataban astralidades innecesarias, me han de disculpar los “Elite“, (mi amigo Skrdz), por lo básico de las entradas, pero me han llegado peticiones en otras páginas de que explique cosas básicas que, en realidad, la gente no comenta porque “asumen que los demás ya lo saben”….

MDI = Multiple Document Interface ó Interfaz de múltiples documentos, es básicamente, un contenedor, que te permite abrir dentro de él, multiples ventanas, muy útil para las aplicaciones que requieren utilizar muchos formularios y que no se pierda el control de estos.

La primer cosa que haremos es crear un proyecto de tipo Windows Application, en el proyecto recién creado nos dejará un formulario normal vacío.

Form Normal

Luego iremos a las propiedades del formulario y cambiaremos la propiedad “IsMdiContainer” de False a True

Propiedades IsMdiContainter

Luego de cambiar la propiedad, el cambio más significativo que veremos en el formulario será su color de fondo, que cambiará del clásico gris claro a uno más oscuro y con borde.

Form Mdi

Ahora tenemos un formulario MDI, el cual puede funcionar perfectamente para llamar desde él a otros formularios que se abrirán dentro de este, muy apropiado para aplicaciones grandes como por ejemplo sistemas contables, administrativos, y todo tipo de aplicaciones que puedan diseñarse y que requieran como un formulario raíz, que pueda controlar a todos los demás y controlar todo desde él, ahora, del Cuadro de Herramientas nos jalaremos un ToolStrip, que es una barra de herramientas en la que podemos colocar diversos objetos, nosotros colocaremos un botón…

Agrega Toolstrip

Ahora, para que todo esto tenga utilidad, agregaremos a nuestro proyecto un nuevo formulario que servirá como Hijo de nuestro MDI, y al evento Clic del botón que agregamos al ToolStrip, escribiremos este código…

codigo mdi

Las Líneas:

  • Dim FormHijo As New Form2 : Crea un objeto a partir del Form2 para que podamos utilizarlo, (esto no es estrictamente necesario, pero es para darle orden y no tener que usar nombres muy largos)
  • FormHijo.MdiParent = Me : Le define a FormHijo su formulario principal o padre, (Es como decirle, “Yo soy tu tata“).
  • FormHijo.Show() : despliega el FormHijo dentro del Mdi para poder ser utilizado.

Este sería nuestro Mdi en tiempo de ejecución:

Mdi en ejecución

Y al darle Clic al ToolStripButton1, esto es lo que obtendíamos:

Mdi con form abierto

Se puede jugar con las propiedades de los formularios hijos, como por ejemplo quitarles los botones de maximizar y minimizar, darles un tamaño específico, darles transparencia, etc, todo lo que se nos ocurra para que se vea estético, pero antes que ponerle las flores, debemos estar seguro que funcione bién y con el mínimo de errores, (porque siempre se le escapa algo a uno), o nuestro sistema será como los lindos senos falsos de las actrices porno, muy bonitos pero inútiles.

Saludos a todos y espero que les sirva esta información…

10
sep
09

Creando respaldos completos e incrementales con tar – Ubuntu

Muchas veces nos habremos encontrado con la necesidad de hacer un respaldo de nuestros documentos en nuestro Ubuntu, aunque también aplica para cualquier distribución GNU/linux ya que el comando tar esta presente en todas (hasta donde yo sé…), entonces empezamos a pensar qué lógica de respaldos harémos… si vamos a hacer respaldos totales, respaldos incrementales, diferenciales, etc. En ésta entrada de blog explicaré cómo podríamos hacer una lógica de respaldos creando reslpaldos completos e incrementales.

La lógica que yo propongo es la siguiente (aunque ustedes pueden hacer sus propias programaciones de respaldos según sus necesidades):

  1. Se realiza un respaldo completo el día 1 (ya sea el inicio de la semana o del mes)
  2. Se realizan respaldos incrementales en base a los nuevos archivos (o modificados)

Para hacer un respaldo completo mis Documentos, se puede realizar mediante la siguiente línea de comando:

tar cvzf /media/punto-de-respaldo/mi.tar.gz /home/oscard/Documentos

Ésta línea de comando empaqueta y comprime el directorio /home/oscard/Documentos y todo lo que se encuentre dentro de él, de tal forma que se genera el archivo comprimido mi.tar.gz en /media/punto-de-respaldo.

Ésto, se podría

tar –update -v -f /home/tenshi/bk/mi.tar /home/tenshi/Documentos

Ésto te creará (la primera vez) un archivo tar con el contenido de tus Documentos (ojo que no va comprimido… por lo que investigué, no permite hacer ésto cuando esta comprimido…), pero lo bonito de éste comando es que, si tu modificas o agregas archivos dentro de tu carpeta -Documentos- y luego ejecutas dicha linea de comando, el comando tar solo enviará los archivos actualizados o nuevos al archivo tar.

Si tu entras al archivo generado .tar, verás que ahí están varias versiones de tu archivo, pero sin embargo, si tu extraes dicho tar te darás cuenta de que te pondrá la última actualización de los archivos.

En síntesis, te podría quedar tu cron de ésta forma:

#Línea 1: Copia diferencia día a día
0 18 * * * tar –update -v -f /home/tenshi/bk/mi.tar /home/tenshi/Documentos

#Línea 2: Copia total el día 27 de cada mes
0 19 27 * * tar vzf /media/punto-de-respaldo/mi.tar.gz /home/tenshi/Documentos

Espero que les sirva la información.

09
sep
09

Preparar el disco duro para instalar juntos Ubuntu y Windows

Aunque éste manual lo hice ya hace uno o dos años (no recuerdo bien…), sigue aplicando para lo que el tema de ésta entrada busca… La verdad es que no nos podemos separar, dependiendo de nuestro entorno claro esta, del monopolio de Micro$oft.

Antes de continuar con la “chachara”, les pongo el vínculo para que puedan descargar el manual… Usando_GParted_para_particionar

Es cruel la realidad de que en mi país se trabaja muuucho con Visual Studio .NET, SQL Server, Visio, Office, Windows XP/Vista, etc. y pues, aunque hay equivalentes (Mono Developer {o cualquier otro lenguaje}, Oracle/MySQL, Dia, OpenOffice, Ubuntu, etc.) los usuarios finales se mueren antes de utilizarlos porque se sienten en “otro mundo”… Pero bueno, como a nosotros nos toca dar soporte o trabajar inclusive con éstas herramientas por necesidad ($$$), ni moodo… Éste es mi caso, en donde mi laptop esta básicamente “divida” en 2 grandes particiones: Una para Windows y otra para mi Ubuntu. Aunque también esta la opción de virtualizar guin2 en ubuntu (vease éste post), a veces no es suficiente porque hay aplicaciones que no se pueden instalar o que se necesitan de muchos recursos. A mi lo que me paso es que necesitaba, por un proyecto en la universidad, instalar VMWare Workstation ACE Edition y no hay un equivalente para distros GNU/Linux… ni modo… tuve que instalar windows para poder virtualizar un cluster.

Será que un día los usuarios finales no le darán mala cara al software libre? El sistema es el que hace que tengan esa actitud?

XD, no sé.

Saludos!




Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.