CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática Visual Basic 6.0 Avanzado V is u a l B as ic a v an za d o Índice PRESENTACIÓN ............................................................................................... 3 INTRODUCCIÓN ................................................................................................ 4 MÓDULO I. PROCEDIMIENTOS Y FUNCIONES .............................................. 5 PROGRAMACIÓN ORIENTADA A EVENTOS ..................................................................... 5 PROCEDIMIENTOS .............................................................................................................. 6 Procedimientos Sub ............................................................................................................ 6 Funciones (Function) .......................................................................................................... 8 ARGUMENTOS ................................................................................................................... 10 Tipos de datos .................................................................................................................. 10 Paso de argumentos como valor: ByVal ........................................................................... 12 Paso de argumentos por referencia: ByRef ...................................................................... 12 COMENTARIOS .................................................................................................................. 13 ESTRUCTURAS DE CONTROL ......................................................................................... 14 Expresión condicional ....................................................................................................... 14 Estructura de decisión IF… THEN .................................................................................... 14 Estructura de decisión SELECT CASE ............................................................................. 15 Estructura de decisión DO ................................................................................................ 15 Estructura de decisión FOR… NEXT ................................................................................ 15 MÓDULO II. GESTIÓN DE BASES DE DATOS ............................................... 16 CONEXIONES CLIENTE – SERVIDOR .............................................................................. 16 ODBC (CONECTIVIDAD ABIERTA A BASES DE DATOS) .............................................. 16 ESTABLECIMIENTO DE CONEXIONES CLIENTE-SERVIDOR ........................................ 17 ActiveX Data Object: ADO ................................................................................................ 18 El control FlexGrid en la gestión de datos ........................................................................ 22 Objeto Recordset .............................................................................................................. 24 Instrucciones SQL en Visual Basic ................................................................................... 26 Exportación de Datos........................................................................................................ 28 PROYECTO PRINCIPAL .................................................................................. 32 FORMULARIOS Y PROGRAMACIÓN EN VISUAL BASIC ............................................... 32 CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 2 V is u a l B as ic a v an za d o PRESENTACIÓN El Instituto Mexicano del Seguro Social conjuntamente con el Sindicato Nacional de Trabajadores del Seguro Social comprometidos con la superación y actualización del personal, impulsan la Capacitación en materia de Informática, Humanística, Promocional y de Programas Institucionales que se vinculen a la solución de los problemas de la operación, favoreciendo el otorgamiento de servicios de calidad. En este contexto la Coordinación de Informática del Centro Nacional de Capacitación y Calidad, cumple con la tarea de elaborar los Materiales de Apoyo Didáctico del Participante para sustentar los cursos de los Planes de Capacitación en Informática que integran el programa de trabajo de esta Coordinación y que están abiertos a todos nuestros compañeros trabajadores. A continuación se presenta el Material de Apoyo Didáctico del Participante Visual Basic 6.0 Avanzado, que ha sido elaborado con información, actualizada y el sustento pedagógico y didáctico para que cumpla con el fin para el cual fue elaborado: conducir y apoyar el aprendizaje de los trabajadores. CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 3 V is u a l B as ic a v an za d o INTRODUCCIÓN El presente material de apoyo incluye una exposición detallada de las herramientas empleadas con mayor frecuencia en el desarrollo de aplicaciones con Visual Basic: términos, definiciones, ejemplos, ilustraciones y un proyecto cuyos contenidos permitirán a los participantes no sólo obtener una idea global sobre el empleo de estas, sino también la posibilidad de crear sistemas informáticos acordes a necesidades específicas en diversas áreas de trabajo, siguiendo los modelos aquí presentados. Visual Basic 6.0 Avanzado incluye dos módulos en los que se concentra la información necesaria para desarrollar aplicaciones, siendo estos los siguientes: MÓDULO I. ---------------------------------------- PROCEDIMIENTOS Y FUNCIONES MÓDULO II. ------------------------------------------ GESTIÓN DE BASES DE DATOS CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 4 Pr oc e d im ie nt o s MÓDULO I. PROCEDIMIENTOS Y FUNCIONES PROGRAMACIÓN ORIENTADA A EVENTOS Los programas se relacionan con el usuario, esperan una respuesta y procesan las entradas de datos de forma “predecible”. A esta manera de trabajar una aplicación, se le conoce como programación orientada a eventos. Esta es una característica fundamental de los programas creados en Visual Basic; éstos se construyen partiendo de un grupo de objetos “inteligentes” que saben cómo responder al darse la interacción con el usuario. La orientación a eventos de los programas desarrollados en Visual Basic, se traduce en que gran parte de las operaciones que pueden llevar a cabo las aplicaciones que construya, serán ejecutadas mediante procedimientos de evento. Estos bloques de código (orientados a evento) procesarán las entradas, calcularán valores, mostrarán la salida de datos y también serían capaces de realizar otras tareas. Cada objeto en Visual Basic tiene un conjunto predefinido de eventos, a los cuales puede responder; estos eventos se listan en el cuadro de lista desplegable Procedure (procedimiento) de la ventana Código para cada uno de los objetos contenidos en el formulario en uso. Es posible escribir un procedimiento de evento no sólo para cada objeto, sino también por cada uno de los eventos reconocidos por visual para los controles; y aunque es muy probable que no necesite programar más de un evento, considere que existe un amplio número de alternativas entre las cuales elegir para adecuar el funcionamiento y operatividad de sus programas según los requerimientos específicos que sea necesario satisfacer. CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 5 Pr oc e d im ie nt o s Ejemplo 1: al cargarse un formulario, se ejecutará el procedimiento que incluya el evento Form_Load(), en la pantalla de código. Private Sub Form_Load() txtUsuario.Text=”” txtContraseña.Text=”” cmdAceptar.Enabled=False cmdCancelar.Enabled=False txtUsuario.SetFocus End Sub Ejemplo 2: al hacer click en un command button nombrado cmdAgregar, el procedimiento del evento cmdAgregar_Click() es ejecutado. Private Sub cmdAgregar_Click() intInstruccion = Agregar P_Cambios txtArticulo.SetFocus End Sub De esta forma, la mayoría de los controles estarán vinculados a eventos concretos, a partir de los cuales tendrán efecto los procedimientos codificados. PROCEDIMIENTOS Procedimientos Sub Un procedimiento Sub no puede retornar un valor, así que es una completa declaración; La sintaxis para cualquier procedimiento Sub es la siguiente: Sub NombreProcedimiento(ArgList*) *véase el apartado de Argumentos Declaraciones o expresiones End Sub Los procedimientos Sub pueden ser de tipo Private o Public. Los procedimientos Private Sub tendrán efecto sobre el objeto o control al que se asocia el evento que desencadena el procedimiento. En el siguiente ejemplo se establece que el procedimiento se llevará a cabo cuando el usuario ejecute el evento doble clic sobre el objeto flxClientes. El código escrito no tendrá utilidad alguna si el evento no ocurre. Private Sub flxClientes_DblClick() Dim strSql As String Dim rstClieSel As New ADODB.Recordset flxClientes.Col = 0 strSql = "SELECT * FROM Clientes WHERE Clie_Clave= " & flxClientes.Text rstClieSel.Open strSql, strConexion, adOpenStatic, adLockReadOnly txtClave.Text = rstClieSel("Clie_Clave") txtNombre.Text = rstClieSel("Clie_Nombre") txtRfc.Text = rstClieSel("Clie_Rfc") Set rstClieSel = Nothing End Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 6 Pr oc e d im ie nt o s Los procedimientos Public Sub generalmente se utilizan o son llamados desde cualquier otro procedimiento público o privado (siempre y cuando ambos se encuentren cargados en memoria, es decir, cuando ambas pantallas que los contengan se encuentren en ejecución); si el procedimiento se describe dentro de la pantalla de código de alguno de nuestros formularios, todos los controles u objetos dentro del formulario podrán utilizarlo, con su evento respectivo, permitiendo ahorrar líneas de código con tan sólo nombrarlo. Observe el siguiente ejemplo, en el que se describe como un procedimiento el formato que debe tener un FlexGrid. Public Sub P_FormatoGrid() With flxClientes .Cols = 3 .Rows = 1 .Row = 0 .Col = 0 .Text = "Clave" .ColWidth(0) = 600 .Col = 1 .Text = "Nombre" .ColWidth(1) = 3500 .Col = 2 .Text = "R.F.C." .ColWidth(2) = 1600 End With End Sub Al cargarse el formulario en cuestión, el objeto flxClientes, referido en el procedimiento P_FormatoGrid(), deberá mostrarse con las características descritas; a continuación vea como es llamado este procedimiento desde el Private Sub Form_Load. Private Sub Form_Load() P_FormatoGrid End Sub Igualmente será posible declarar un procedimiento Sub en algún Módulo (o módulo estándar) del proyecto. Los módulos son archivos especiales con extensión .bas que contienen las variables y procedimientos que se desean compartir para todas las formas y controles del proyecto. Esto permite reducir líneas de código de programación y evita duplicar el código. Cada módulo puede contener: Declaraciones; es decir constantes y variables globales y Procedimientos generales. Los procedimientos que se encuentran en un módulo estarán disponibles en todo momento mientras se ejecuta nuestro programa (estarán n memoria todo el tiempo). Todos los procedimientos de un módulo, pueden ser llamados desde el código. Ejemplo: Código en el módulo: Sub P_Bienvenida() MsgBox "Bienvenido al Sistema de Administración Empresarial" End Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 7 Pr oc e d im ie nt o s Uso de este procedimiento en los menús del formulario principal en una aplicación: Private Sub mnuClientes_Click() frmClientes.Show P_Bienvenida End Sub Private Sub mnuProductos_Click() frmProductos.Show P_Bienvenida End Sub Private Sub mnuVentas_Click() frmVentas.Show P_Bienvenida End Sub Como se sugiere en el código para cada menú, al abrirse los formularios respectivos, se llama al procedimiento P_Bienvenida, que en pantalla mostrará el mensaje: "Bienvenido al Sistema de Administración Empresarial", que se ha descrito en el Msgbox del Sub P_Bienvenida, creado en el módulo. Es común también desarrollar procedimientos dentro del módulo principal del proyecto, que sean válidos para el arranque de la aplicación en uso, pudiera tratarse por ejemplo, del procedimiento en el que se detalla la información concerniente a la conexión del programa con una Base de Datos y tal vez la invocación de la primera pantalla que se mostraría al ejecutarse. Por ejemplo: Sub Main() Dim cntConexion As New ADODB.Connection With cntConexion .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\Visual Basic\Ejercicios\Empresa.mdb" .Open strConexion = .ConnectionString .Close End With Set cntConexion = Nothing mdiPrincipal.Show End Sub FUNCIONES (Function) Una función puede retornar un valor y deberá utilizarse como parte de una expresión; la sintaxis habitual de una función es la siguiente; Function NombreFunción (ArgList) [As tipo] Declaraciones End Function CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 8 Pr oc e d im ie nt o s Las Function, pueden declararse como Private o Public, tal y como sucede con los procedimientos Sub. Las Private Function pueden ser utilizadas dentro de un formulario, y por uno o varios controles en el mismo, mientras que las Public Function ofrecen la posibilidad de ser llamadas desde cualquier pantalla o control de la aplicación. Se puede utilizar la siguiente Private Function, definida como booleana, para exigir la captura de datos en una caja de texto llamada txtNombre.Text dentro de un formulario. Private Function F_ValidarDatos() As Boolean F_ValidarDatos = False If txtNombre.text = “” Then Msgbox “Debe capturar un nombre en la caja de texto” txtNombre.SetFocus Exit Function End if F_ValidarDatos = True End Function Ahora bien, la función F_ValidarDatos tiene que llamarse desde otro procedimiento dentro del código del formulario donde se ha creado, para así ejecutarse; en nuestro ejemplo, en una pantalla de captura, si el usuario no ha registrado el dato requerido en la caja de texto indicada en la función, al intentar aceptar la información, el programa exigirá la escritura de los datos requeridos antes de continuar con la secuencia de instrucciones codificadas en el procedimiento que invoca a la función: Private Sub cmdAceptar_Click() If Not F_ValidarDatos Then Exit Sub Msgbox “Los datos son válidos” Unload me frmSiguiente.Show End Sub Al describir alguna Function dentro de los módulos, ésta podrá invocarse desde cualquier forma o control del proyecto. Observe el desarrollo de la siguiente función: Public Function F_ClaveConsecutiva(astrTabla As String, astrCampo As String) As Long Dim rstConsecutiva As New ADODB.RecordSet Dim strSql As String strSql = “SELECT “& astrCampo & “ FROM “ & astrTabla & “ ORDER BY “ & astrCampo rstConsecutiva.Open strSql, strConexion, AdOpenStatic, AdLockReadOnly If rstConsecutiva.RecordCount = 0 Then F_ClaveConsecutiva = 1 Else rstConsecutiva.MoveLast F_ClaveConsecutiva = rstConsecutiva(0) + 1 End If Set rstConsecutiva = Nothing End Function CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 9 Pr oc e d im ie nt o s Tal y como ocurre con una Private Function, toda Public Function debe invocarse para ser ejecutada. Recuerde que las Function son parte de una expresión, y no pueden devolver un valor por sí solas. Observe cómo la función anterior (F_ClaveConsecutiva) se utiliza en el código de un procedimiento Sub. Private Sub cmdAceptar_Click() Dim cntClientes As New ADODB.Conection Dim strSql As String If intInstruccion = Agregar Then If Not F_ValidarDatos Then Exit Sub strSql = “INSERT INTO Clientes “ strSql = strSql & “(Clie_Clave, Clie_Nombre, Clie_Rfc) ” strSql = strSql & VALUES („“ strSql = strSql & F_ClaveConsecutiva (“Clientes”, “Clie_Clave”) & “‟, „” strSql = strSql & txtNombre.Text & “„, „” strSql = strSql & txtRfc.Text & ”‟)” With cntClientes .ConnectionString = strConexion .Open .Execute (strSql) .Close End with Msgbox “El registro se agregó correctamente” intInstrucción = Inactivo P_ActualizarGrid P_Inicial End If End Sub ARGUMENTOS Un procedimiento puede obtener datos externos necesarios para su propia ejecución. Esta información se contiene en variables que se cargan o transfieren al procedimiento cuando es invocado. Para ello se utilizan los argumentos. En el apartado de la sintaxis de los procedimientos Sub y Function se menciona el término Arglist, que no es otra cosa más que la lista de argumentos que emplea cada procedimiento, separados por comas (,) si hay más de uno, o bien vacío si no se considera necesario incluirlos. La sintaxis de un argumento es: ([ByRef|ByVal] Nombre_de_variable As Tipo) Tipos de datos Los argumentos de los procedimientos tienen el tipo de dato Variant de forma predeterminada, es decir que puede asumir prácticamente cualquier tipo de dato reconocido en Visual Basic. Sin embargo, es posible declarar otros tipos de datos para los argumentos, según se requiera, como se deja ver en los ejemplos siguientes: CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 10 Pr oc e d im ie nt o s Public Function F_ClaveConsecutiva(astrTabla As String, strCampo As String) As Long Dim rstConsecutiva As New ADODB.RecordSet Dim strSql As String strSql = “SELECT “& astrCampo & “ FROM “ & astrTabla & “ ORDER BY “ & astrCampo rstConsecutiva.Open strSql,strConexion,AdOpenStatic,AdLockReadOnly If rstConsecutiva.RecordCount = 0 Then F_ClaveConsecutiva = 1 Else rstConsecutiva.MoveLast F_ClaveConsecutiva = rstConsecutiva(0) + 1 End If Set rstConsecutiva = Nothing End Function En este ejemplo, astrTabla y astrCampo son los argumentos, definidos ambos con String como el tipo de dato. Su uso se muestra en otro procedimiento dentro de la aplicación: Private Sub cmdAceptar_Click() Dim cntClientes As New ADODB.Conection Dim strSql As String If intInstruccion = Agregar Then If Not F_ValidarDatos Then Exit Sub strSql = “INSERT INTO Clientes “ strSql = strSql & “(Clie_Clave, Clie_Nombre, Clie_Rfc) ” strSql = strSql & VALUES („“ strSql = strSql & F_ClaveConsecutiva (“Clientes”, “Clie_Clave”) & “‟, „” strSql = strSql & txtNombre.Text & “„, „” strSql = strSql & txtRfc.Text & ”‟)” With cntClientes .ConnectionString = strConexion .Open .Execute (strSql) .Close End with Msgbox “El registro se agregó correctamente” intInstrucción = Inactivo P_ActualizarGrid P_Inicial End If End Sub En este caso la expresión F_ClaveConsecutiva (“Clientes”, “Clie_Clave”), describe con claridad la información que contendrán las variables, en cuyo caso hacen referencia al nombre de una tabla y al nombre de un campo de la misma, respectivamente. Sub P_Calculo (asngPrecio As Single, aintCantidad As Integer) lblTotal.Caption = asngPrecio * aintCantidad End Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 11 Pr oc e d im ie nt o s En donde asngPrecio y aintCantidad son los nombres de los argumentos; y Single e Integer determinan el tipo de dato al que se refiere cada variable. La siguiente tabla muestra los distintos tipos de datos que podrán asignarse a las variables en Visual Basic. Nombre Integer (entero) Descripción Numérico, entero Rango de valores de -32768 a 32767 Espacio requerido 16 bits (2 bytes) Long (largo) Numérico, entero de -21474836 48 a 2147483647 32 bits (4 bytes) texto de 0 a 65500 caracteres aprox. 8 bits (1 byte) por String (cadena) carácter Currency (moneda) Numérico, decimal de -922337203685477,5807 a fijo 64 bits (8 bytes) 9223372036854777,5807 Single (simple) Numérico real 45 38 de +- 1.40x10 a +-3.40x10 32 bits (4 bytes) Double (doble) Numérico, real 324 308 de +- 4.94x10 a +- 1.79x10 64 bits (8 bytes) Byte Carácter 0 a 255 1 byte Boolean Boleano True False 2 bytes 1/01/100 al 31/12/9999 8 bytes Cualquiera de los anteriores Depende del valor Date Variant Fecha/Hora Adaptable (variable) Paso de argumentos como valor: ByVal ByVal es una expresión clave que indica a Visual Basic que debe gestionar una copia del argumento original y devolverlo sin modificar cuando el procedimiento termina, aún cuando durante la ejecución del mismo el valor de la variable haya sido actualizado; el cambio afecta sólo a la copia y no a la variable original. La forma predeterminada de pasar valores en Visual Basic es por valor. ByVal se utiliza dentro de una lista de argumentos tal y como se muestra en el ejemplo: Private Function Operacion(ByVal adblIncremento As Double) adblIncremento = adblIncremento * 1.05 adblIncremento = adblIncremento / 2 Operación = adblIncremento End Function Al terminar, la variable que se haya utilizado como argumento contendrá el valor original sin sufrir ningún cambio. Paso de argumentos por referencia: ByRef Al pasar argumentos por referencia se permite al procedimiento el acceso al contenido real de la variable en su dirección de memoria (ByRef significa por referencia, esta referencia es hacia la ubicación de la variable original en la memoria). Como resultado, el CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 12 Pr oc e d im ie nt o s procedimiento al que se haya pasado la variable como argumento, puede modificar el valor de la misma. Esta expresión se empelará cuando sea necesario actualizar el valor de una variable al ejecutarse un procedimiento. Function F_OpcionCombo(ByRef acboCombo As ComboBox, alngIndice As Long) Dim intContador As Integer For intContador = 0 To acboCombo.ListCount – 1 With acboCombo If .ItemData(intContador) = alngIndice Then F_OpcionCombo = intContador Exit For End If End With Next End Function Si el argumento no estuviera definido ByRef, no se realizarían los cambios en el combo. COMENTARIOS En Visual Basic el apóstrofe (‘) se utiliza para agregar líneas de comentario, las cuales generalmente contendrán notas explicativas. El hecho de incluir comentarios en el código de un programa permite describir la función que cumplen las sentencias más importantes; estas notas no se procesan durante la ejecución de los procedimientos, simplemente facilitan la relectura y revisión del código en sesiones posteriores. En la pantalla de Visual se distinguen además por mostrarse en color verde. Ejemplo: Public Function F_ClaveConsecutiva(Astr_Tabla As String, Astr_Campo As String) As Long 'se dimensiona el RecordSet Dim RSTConsecutiva As New ADODB.Recordset 'se dimensiona la variable SQL Dim strsql As String 'instrucción que extraerá información desde la base de datos strsql = "SELECT " & Astr_Campo & " FROM " & Astr_Tabla & " ORDER BY " & Astr_Campo 'expresión que crea el RecordSet RSTConsecutiva.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly 'el siguiente If determina el número consecutivo con el que un nuevo registro se agregará a la base de datos If RSTConsecutiva.RecordCount = 0 Then F_ClaveConsecutiva = 1 Else RSTConsecutiva.MoveLast F_ClaveConsecutiva = RSTConsecutiva(0) + 1 End If Set RSTConsecutiva = Nothing End Function CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 13 Pr oc e d im ie nt o s ESTRUCTURAS DE CONTROL Como ya se ha descrito al comienzo de este primer módulo, al activarse un evento o suceso, Visual Basic responde llamando al procedimiento asociado con el objeto que reconoce tal evento. La orientación a eventos, característica de los programas desarrollados en Visual Basic, se traduce en que la mayoría de las operaciones disponibles en las aplicaciones, serán ejecutadas mediante procedimientos de eventos. El código permite procesar la entrada de datos, el cálculo de nuevos valores y la salida de información, entre otras tareas. Podrá crear procedimientos capaces de responder a cualquier situación en la medida en que conozca y aplique las estructuras de control: las estructuras de decisión, que se utilizan para comparar variables, propiedades y valores, y los bucles, que nos dan la posibilidad de ejecutar un grupo de sentencias una y otra vez un número determinado de veces o hasta que se cumpla una condición Expresión condicional Una de las herramientas más útiles en el procesamiento de información es la expresión condicional, que forma parte de una sentencia de programa que realiza preguntas que requieren respuestas del tipo True o False sobre una propiedad o variable en el código del programa. La siguiente expresión condicional: Precio = 180 Resultará verdadera si la variable precio contiene un valor similar a 180, en caso contrario resultará falsa. En este tipo de expresiones se utilizan los operadores de comparación que se muestran a continuación: OPERADOR DE COMPARACIÓN SIGNIFICADO = Igual que… <> Distinto de… > Mayor que… < Menor que… >= Mayor o igual que… <= Menor o igual que… BETWEEN Entre… (intervalos) Estructura de decisión IF… THEN La estructura If… Then permite evaluar una condición en el programa y llevar a cabo una serie de instrucciones, según sea el resultado de dicha condición. La sintaxis habitual en esta estructura es la siguiente: CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 14 Pr oc e d im ie nt o s IF <<condición>> THEN <<instrucciones>> (verdadero) ELSE <<instrucciones>> (falso) END IF Estructura de decisión SELECT CASE Funciona de manera similar a la estructura anterior, pero resulta más conveniente cuando se debe evaluar la bifurcación de una variable clave en varias cláusulas. La sintaxis empleada se muestra en la página siguiente. SELECT CASE <<objeto>> CASE x <<instrucciones>> CASE y <<instrucciones>> CASE z <<instrucciones>> CASE ELSE <<instrucciones>> END SELECT Estructura de decisión DO Permite ejecutar un grupo de sentencias hasta que cierta condición del bucle o ciclo sea verdadera; los bucles con DO se utilizan cuando no se conoce con exactitud el número de ocasiones en las que se repetirá el conjunto de instrucciones. La sintaxis habitual es la siguiente: DO WHILE <<condición>> <<instrucciones>> LOOP Estructura de decisión FOR… NEXT Permite crear bucles para ejecutar un conjunto de sentencias contenidas en un procedimiento un número determinado de veces. FOR <<contador>> inicial TO final <<instrucciones>> NEXT CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 15 G es t i ó n de B a s e d e Da tos MÓDULO II. GESTIÓN DE BASES DE DATOS Visual Basic es compatible con una gran variedad de formatos de bases de datos, pues permite utilizar gestores tales como Access, FoxPro, Paradox, Dbase o SQL Server. Con las potentes herramientas que posee Visual Basic, podrá mejorar la presentación de la información contenida en sus bases de datos y simplificar, simultáneamente, la administración de la misma. CONEXIONES CLIENTE – SERVIDOR Los sistemas Cliente-Servidor, se refieren elementalmente a aquellos equipos de cómputo que contienen al mismo tiempo bases de datos (servidores) y la o las aplicaciones que utilizan precisamente esas bases de datos (clientes). En una red, el concepto ClienteServidor hace alusión a la conexión entre estaciones de trabajo (clientes) y un servidor de archivos (bases de datos, aplicaciones); en este caso cada conexión permite un enlace individual entre ambos. (Como recomendación por demás necesaria, cuando desarrolle una aplicación que tenga acceso a una base de datos remota, debe implementar un modelo relacional bien diseñado). Antes de tomar la decisión final sobre el modelo de programación que va a implementar, debe tener en cuenta una serie de aspectos que afectan al diseño independientemente del modelo: para tener acceso a un servidor remoto, su aplicación tiene que establecer una conexión. Esta conexión crea un vínculo de comunicaciones en la red entre el servidor y el cliente. A su aplicación se le pasa un controlador de esta conexión. Una vez creada, la conexión proporciona acceso a un servidor específico, a una de las bases de datos del servidor y a cualquiera de los objetos temporales específicos de la conexión que su aplicación cree en el servidor. ODBC (CONECTIVIDAD ABIERTA A BASES DE DATOS) La tecnología ODBC (Conectividad abierta a bases de datos) proporciona una interfase común para acceder bases de datos heterogéneas basadas en SQL. ODBC esta basado en el lenguaje Estructurado de consultas (SQL) como una norma para acceder a los datos. Esta interfase proporciona interoperabilidad al máximo: no solo la aplicación puede acceder bases de datos de diferentes Sistemas basados en SQL, a través de un juego común de código. Esto le permite a un diseñador construir y distribuir una aplicación cliente/servidor sin tener un DBMS específico. Se agregan drivers para unir la aplicación, a la base de datos destino, con el fin de que el usuario elija el DBMS deseado. ODBC es un intermediario entre bases de datos y aplicaciones, cuya tarea es sostener una conversación de preguntas y respuestas entre dos "sujetos" que no hablan el mismo idioma y que gestionan sus recursos de forma diferente, esto es una abstracción de un concepto muy tecnificado. Concretando, puedes tener un CAD, una hoja de calculo, un editor de texto, etc., cuyas finalidades son las que quieras, menos gestionar datos en la forma que lo hace un sistema de base de datos; estas aplicaciones no saben como se obtienen y se guardan datos en, por ejemplo, un archivo MDB de Microsoft Access, o en un DBF, o en SQL Server, o en algún otro. Por otra parte, pero en lo mismo, que tal si un usuario de Paradox quiere extraer información de SQL Pato, un nuevo sistema de lo más avanzado que nadie conoce pero que CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 16 G es t i ó n de B a s e d e Da tos alguien uso para guardar información que resulta necesaria (no sabes cuántas veces sucede), ambos son sistemas de bases de datos, Paradox conoce la forma de leer los archivos de los sistemas conocidos, pero no los de SQL Pato. En el ambiente Windows, Microsoft creó la tecnología ODBC pensando en este problema. No es una solución de la comunidad informática del orbe, es de Microsoft, y por eso se basa en los impulsos estomacales del corazón de Microsoft; esto quiere decir que no se esta recomendando esta tecnología, sino que mientras sea en Windows, hay que usarla cuando no hay algo mejor, punto. ODBC es una utilería que alberga controladores. La utilería sirve para gestionar los controladores, y los controladores son los que saben "hablar" con las bases de datos. Entonces el "acuerdo" entre Microsoft y los fabricantes de software para Windows fue: "Ustedes, que hacen software no especifico para bases de datos, enseñen, si quieren, a sus aplicaciones a comunicarse con el armatoste llamado ODBC; y ustedes, fabricantes de bases de datos, hagan controladores de sus sistemas para ponerlos en la utilería, si quieren que otras aplicaciones puedan acceder su información". Así Excel puede leer una base de datos en Access o SQL Server, incluso SQL Pato (si es que alguien fabricó un controlador de ODBC). Siendo sinceros, esas no son todas las razones ni los intereses por los que ODBC fue implementado, hay cierta oscuridad por ahí. En ODBC no se tiene que hacer gran cosa, es una simple tarea, se llama crear un origen de datos, otros le denominan fuente en vez de origen. Un origen o fuente de datos consiste en el nombre, el controlador y la base de datos. Por ejemplo, si un usuario quiere tener acceso a una base de datos de Access, digamos que se llama Negocio.mdb, desde una hoja de cálculo de Excel para consultar su volumen de ventas por país, este usuario crea un nuevo origen de datos en ODBC llamado Volumen_Ventas (este es, pues, el nombre), después selecciona un controlador para Microsoft Access e indica el archivo de base de datos está en "c:\LaEmpresa\Administración\Negocio.mdb". Eso es básicamente de lo que se trata. ESTABLECIMIENTO DE CONEXIONES CLIENTE-SERVIDOR Dependiendo del modelo de programación cliente-servidor de acceso a datos que elija, puede establecer una conexión con un servidor remoto desde el código con los siguientes métodos descritos. En Visual Basic, existen tres formas de acceso a datos: ActiveX Data Objects (ADO), Remote Data Objects (RDO) y Data Access Objects (DAO). Una interface de acceso a datos es un modelo de objetos que representan una forma de accesar datos desde una BD. La última versión de conexión es ADO, que resulta simple y muy flexible, además de que contiene la facilidad de uso de DAO y la robustes de RDO. DAO - Data Access Objects (Objetos de Acceso a Datos) es el método anterior (VB 5) para programar bases de datos. DAO usa la antigua tecnología OLE para conectarse con las bases de datos. RDO - Remote Data Objects (Objetos de Datos Remotos) es el método usado para conectar PC‟s con bases de datos remotas en un ambiente cliente-servidor (por ejemplo una base de datos Oracle en un equipo remoto Unix), Usa la ODBC (Open Data Base Conectivity, o Conectividad Abierta de Bases de Datos), puesto que los controladores OBDC son el método que emplea en general Windows 9x para conectarse con bases de datos externas. CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 17 G es t i ó n de B a s e d e Da tos ADO - Activex Data Object (Objetos de Datos Activos) ADO es un elemento de la API (Application Program Interface) de Microsoft que le permite escribir aplicaciones para Windows que acceden a bases de datos relacionales y no-relacionales provenientes tanto de Microsoft como de cualquier otro proveedor. Una aplicación para ADO es por ejemplo cuando se tiene una Sitio WEB y se desea tener una base de datos que los usuarios puedan examinar y actualizar. Si la página posee una archivo de tipo IBM DB2 o de Oracle entonces podremos escribir un programa con instrucciones en ADO dentro del archivo HTML que lo identifique como un ASP (Active Server Page). Cuando el usuario haga la petición de la página ASP, ésta devolverá los datos pedidos por el usuario por medio de las Instrucciones en ADO. Al igual que otras interfaces de Microsoft, ADO esta orientado a objetos y es parte de una estrategia de Microsoft llamada UDA (Universal Data Access) que consiste en intentar crear un puente entre los diferentes formatos de archivos de los Sistemas Manejadores de Bases de Datos para lograr una estandarización de la información y a su vez crear nuevos drivers para los formatos de archivos venideros. En este curso aprenderemos a manejar conexiones con bases de datos utilizando la interfase ADO, para lo cual describiremos los procedimientos necesarios para crear la referencia conveniente, la definición de la conexión con sus características básicas, y la ejecución y cierre de la base de datos mientras el programa esté en uso. ActiveX Data Object: ADO Para crear la referencia a ADO, es decir activar la disponibilidad de las funciones y propiedades de esta interfase, deberá llevar a cabo el siguiente procedimiento: 1. Menú Project 2. Opción References 3. Seleccionar de la lista Microsoft ActiveX Data Objects 2.5 Library (o la versión disponible) 4. Presionar OK CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 18 G es t i ó n de B a s e d e Da tos Una vez que se ha referenciado la librería ADO, será posible dimensionar la conexión, para ello considere la ubicación de la base de datos; ésta puede localizarse en servidor, en la misma ruta de la aplicación que se está desarrollando, o bien, en un directorio distinto al de la aplicación dentro del equipo de cómputo. Al crear la conexión con la base de datos tendrá que determinar si la conexión permanecerá abierta permanentemente o si estará disponible sólo cuando la aplicación necesite de acudir a la base de datos para gestionar la información de la misma (actualizar, agregar, consultar, eliminar… registros). Por defecto, la aplicación reconocerá la conexión con la base de datos al haber sido definida en el módulo principal, desde el arranque de la misma, siempre que no haya olvidado establecer como objeto inicial al procedimiento principal. (Startup Object: Sub Main) CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 19 G es t i ó n de B a s e d e Da tos 1. CONEXIONES PERMANENTES a. EN EL MISMO EQUIPO Y UBICACIÓN En primer lugar deberá dimensionar una variable global que identifique la nueva conexión, como nueva conexión ADO, dentro del módulo principal del proyecto. Global CNTventas As ADODB.Connection Enseguida creará el procedimiento en el que se instancie o active la nueva conexión, definiendo las propiedades principales para la misma, como son: el motor del gestor de la base de datos y la ruta del origen de datos. Sub Main() Set CNTventas = New ADODB.Connection With CNTventas .Provider = "Microsoft.jet.oledb.4.0" .ConnectionString = "Data Source=" & App.Path & "\BD_Procedimientos.mdb" .Properties(15) = "PASSWORD" .Open End With End Sub La propiedad .Provider permite establecer el motor del DBMS, en este caso Microsoft.Jet.Oledb.4.0 que es el motor de Microsoft Access XP, por lo cual recomendamos utilizar tal versión de Access para verificar los ejercicios incluidos en este material. .ConnectionString nos da la posibilidad de establecer la ubicación en disco de la base de datos; Data Source = App.Path sugiere que el archivo de base de datos se localiza en el mismo directorio que el proyecto desarrollado en Visual Basic (App = Application). Por último, se incluye el nombre del archivo de base de datos, BD_Procedimientos.mdb. Si ha definido algún password para ingresar al archivo de base de datos (recomendable), deberá indicarlo en Visual Basic, utilizando la propiedad 15, describiendo el password correspondiente, .properties(15) = “password”. Finalmente, abra la conexión declarando la sentencia .open. Será necesario después de establecer la conexión, determinar qué formulario se mostrará en pantalla al iniciar su aplicación. b. EN EL MISMO EQUIPO Y DISTINTA UBICACIÓN Lo único que deberá hacer es redireccionar la propiedad .ConnectionString, eliminando la cadena App.Path y describiendo en su lugar la ruta completa que define la ubicación de la base de datos y su nombre: .ConnectionString = "Data Source=C:\Visual Basic\Mis Proyectos\Empresa.mdb" CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 20 G es t i ó n de B a s e d e Da tos c. CONEXIÓN A SERVIDOR Para establecer una conexión permanente a servidor (DNS), bastará con modificar también la propiedad .ConnectionString, de la siguiente forma: .ConnectionString = "Data Source” & “\\Servidor\Carpeta1\Carpeta2\Archivo.mdb" 2. CONEXIONES PURAS (recomendadas) Cuando ha establecido una conexión permanente, la carga de la aplicación en memoria se torna pesada y como usted sabe, la velocidad de respuesta de su programa se reduce y si lo que pretendemos es simplificar y agilizar la operación de aplicaciones, entonces tendríamos que establecer un tipo de conexión que se abra y cierre sólo cuando exista la necesidad de consultar o actualizar la base de datos. Hacer esto implica posiblemente más líneas de código en Visual Basic, pero más eficiencia en el tiempo de respuesta del programa desarrollado. Dimensione en el módulo principal una variable global como cadena de texto, que servirá posteriormente para identificar la ruta de la base de datos. Global STRconexion As String Ahora dimensione, instancie y abra la nueva conexión ADO dentro del procedimiento principal en el módulo, señalando las propiedades principales. Sub main() Dim CNTconexion As New ADODB.Connection With CNTconexion .Provider = "Microsoft.jet.oledb.4.0" .ConnectionString = "Data Source=” & App.Path & “\Empresa.mdb" .Properties(15) = "PASSWORD" .Open Después de abrir la conexión asigne la variable que definió para identificar la ruta de la base de datos y cierre la conexión. STRconexion = .ConnectionString .Close End With En último lugar desactive la conexión y finalice el procedimiento. Set CNTconexion = Nothing End Sub Una vez concluido el procedimiento, la definición de la nueva conexión ADO se vería de la siguiente forma: Sub main() Dim CNTconexion As New ADODB.Connection CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 21 G es t i ó n de B a s e d e Da tos With CNTconexion .Provider = "Microsoft.jet.oledb.4.0" .ConnectionString = "Data Source=” & App.Path & “\Empresa.mdb" .Properties(15) = "PASSWORD" .Open STRconexion = .ConnectionString .Close End With Set CNTconexion = Nothing End Sub La sentencia Dim CNTconexion As New ADODB.Connection, permite simultáneamente dimensionar e instanciar la nueva conexión ADO. Ahorramos una de las siguientes líneas de código… Global CNTconexion As ADODB.Connection Set CNTconexion = New ADODB.Connection El control FlexGrid en la gestión de datos El FlexGrid (rejilla flexible en español) es uno de los controles ActiveX que posee Visual Basic, que se utilizan con el propósito de añadir nuevas funciones a los programas que desarrollamos para el ambiente Windows. Con este control podremos administrar datos en una especie de tabla o rejilla de celdas, de manera similar a como se visualizan en una hoja de trabajo en Excel… Observe los grids siguientes: CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 22 G es t i ó n de B a s e d e Da tos Cada vez que abre un nuevo proyecto, Visual Basic muestra un conjunto básico de controles de la interfaz en el cuadro de herramientas; el control FlexGrid constituye una herramienta avanzada y por tal razón debe habilitarla mediante el siguiente procedimiento: 1. Menú Project 2. Opción Components 3. Activar de la lista de Controls la casilla de Microsoft FlexGrid Control 6.0 o la versión existente y Aceptar. En el cuadro de herramientas se mostrará un icono similar a este . A partir de entonces tendremos la posibilidad de insertar en los formularios del proyecto en uso, los FLexGrid que sean convenientes y comenzar a gestionar la información contenida en nuestra base de datos: mostrar los registros de alguna tabla, agregar registros, buscar registros, eliminar registros, consultar o exportar información. Al trazarse sobre el formulario, todos los FlexGrid mostrarán solamente y por defecto dos columnas y dos filas en la esquina superior izquierda del mismo. CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 23 G es t i ó n de B a s e d e Da tos Defina el formato de un FlexGrid tomando como ejemplo la descripción de código que a continuación se muestra. Sub P_FormatoGrid() With FLX_nombre .Cols = 3 .Rows = 1 .Row = 0 .Col = 0 .Text = "CLAVE" .ColWidth(0) = 600 .Col = 1 .Text = "NOMBRE" .ColWidth(1) = 3500 .Col = 2 .Text = "R.F.C." .ColWidth(2) = 1600 End With End Sub Las propiedades descritas se refieren a los siguientes elementos: .cols .rows .row .col .text .colwidth „determina el número de columnas en el grid „fija el número de filas „posiciona el cursor en el número de columna especificado „posiciona el cursor en el número de fila indicado „sugiere el texto que contendrá la columna como encabezado „determina el ancho de la columna Objeto Recordset En Visual Basic un Recordset es un objeto que representa el bloque de información de una base de datos con la que se está trabajando en el programa en un momento determinado. El objeto Recordset posee propiedades y métodos con los cuáles es posible buscar, ordenar, agregar y eliminar registros. Algunas de las propiedades que manejará de un Recordset en el desarrollo de los proyectos contemplados en este material son: .close (cierra el Recordset) .movefirst (se mueve al primer registro) .movelast (se mueve al último registro) .movenext (se mueve al siguiente registro) .moveprevious (se mueve al registro anterior) .open (abre el Recordset) .recordcount (cuenta el número de registros que contiene el Recordset) Cuando se disponga a utilizar el Recordset, deberá dimensionarlo e instanciarlo, ejemplos: Dim rst_nombre As ADODB.Connection Set rst_nombre = New ADODB.Recordset CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 24 G es t i ó n de B a s e d e Da tos O bien, ahorre una línea de código… Dim rst_nombre As New ADODB.Recordset Después de haber creado el Recordset podrá cargar en él la información que contenga la base de datos, comenzando con una sentencia como la siguiente: rst_nombre.open Strsql,Cnt_conexion,AdOpenStatic,AdLockReadOnly …en donde rst_nombre describe el nombre del Recordset y la expresión .open indica la apertura del mismo; en seguida se muestra la cadena Strsql (vea el apartado de instrucciones SQL) que invoca las operaciones que se llevarán a cabo con la instrucción SQL empleada en el Recordset y que además define el origen o fuente de datos; Cnt_conexion, que señala el nombre de la conexión activa; AdOpenStatic, que define el Recordset como estático y AdLockReadOnly, utilizado para activar la propiedad de sólo lectura. Al finalizar la definición del Recordset y al asegurarse también de que la gestión de la información de la base de datos ha concluido en el desarrollo del procedimiento, tendrá que cerrarlo… Rst_nombre.close Y destruirlo: Set Rst_nombre = Nothing Verifique el manejo del Recordset en este procedimiento: Sub P_ActualizaGrid() Dim RSTClientes As ADODB.Recordset Dim strsql As String Dim IntFila As Integer Set RSTClientes = New ADODB.Recordset strsql = "SELECT * FROM CLIENTES" RSTClientes.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly If RSTClientes.RecordCount = 0 Then Exit Sub RSTClientes.MoveFirst IntFila = 1 Do Until RSTClientes.EOF = True With FLXClientes .Rows = IntFila + 1 .Row = IntFila .Col = 0 .Text = RSTClientes("CLIE_CLAVE") .Col = 1 .Text = RSTClientes("CLIE_NOMBRE") .Col = 2 .Text = RSTClientes("CLIE_RFC") End With IntFila = IntFila + 1 CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 25 G es t i ó n de B a s e d e Da tos RSTClientes.MoveNext Loop RSTClientes.Close Set RSTClientes = Nothing End Sub Instrucciones SQL en Visual Basic SQL, Structured Query Language, es un lenguaje interactivo que permite realizar consultas a bases de datos. Actualmente es el protocolo para gestión de bases de datos en la mayoría de las plataformas y proporciona diversas ventajas, tanto para la administración de las bases de datos y la interacción con éstas mismas, como en el desarrollo de sistemas de información con bases de datos. El SQL nació como un lenguaje para usuario final, aunque con las facilidades gráficas actuales, existen herramientas aún más intuitivas que “ocultan” al usuario final los comandos SQL involucrados. Puede ser considerado como un lenguaje de programación y puede ser infiltrado en algún otro lenguaje como Visual Basic, Java, C++, etc. SQL es un lenguaje no sólo para consultas sino para definición y administración de bases de datos. También provee de las facilidades para el control a los datos par parte de varios usuarios en un ambiente de transacciones concurrentes. Las cuatro sentencias principales de manejo de datos son: Select, Insert, Update, Delete. S e l e c t . Es un comando que consulta los registros de una o varias tablas y que puede enviar los resultados de la misma directamente a una matriz. Sintaxis: SELECT campo1, campo2... FROM tabla1, tabla2… WHERE condición 1, condición2… ORDER BY campo1, campo2… En donde campo1, campo2… hacen referencia al nombre de las columnas que contienen la información a consultar; si se desean todos los campos de una tabla se escribe asterisco (*) delante de SELECT. Tabla1, tabla2… señala el nombre de las tablas de la base de datos desde donde serán extraídos los registros. Condición1, condición2… definen los criterios de selección de los registros en la tabla. Los registros seleccionados serán aquellos registros que cumplan la condición especificada con WHERE; si se omite WHERE, se retornan todos los registros. CAMPO X CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática OPERADORES DE COMPARACIÓN VALOR DEL CAMPO = <= >= <> > < LIKE X PÁGINA 26 G es t i ó n de B a s e d e Da tos OPERADORES DE COMPARACIÓN CAMPO VALOR DEL CAMPO BETWEEN OPERADORES LÓGICOS NOT OR AND La cláusula ORDER BY permite al usuario especificar si requiere los registros ordenados por algún campo en particular, de manera ascendente o descendente utilizando los operadores de modo ASC y DESC. Ejemplo: strsql = "SELECT * FROM CLIENTES" I n s e r t . Anexa un registro al final de una tabla que contiene los valores de campo especificados. Sintaxis: INSERT INTO nombre_dbf [(fnombre1 [, fnombre2, ...])] VALUES (eExpresión1 [, eExpresión2,...]) Ejemplo: strsql = "INSERT INTO CLIENTES" strsql = strsql & "(CLIE_CLAVE, CLIE_NOMBRE, CLIE_RFC)" strsql = strsql & "VALUES ('" strsql = strsql & F_ClaveConsecutiva("CLIENTES", "CLIE_CLAVE") & "', '" strsql = strsql & TXTNombre.Text & "', '" strsql = strsql & TXTRfc.Text & "')" U p d a t e . Actualiza registros de una tabla con nuevos valores. Sintaxis: UPDATE [NombreBaseDatos1!]NombreTabla1 SET Nombre_Columna1 = eExpresión1 [, Nombre_Columna2 = eExpresión2 ...] WHERE CondiciónFiltro1 [AND | OR CondiciónFiltro2 ...]] Ejemplo: strsql = "UPDATE CLIENTES " strsql = strsql & "SET CLIE_NOMBRE = '" & TXTNombre.Text & "', " strsql = strsql & "CLIE_RFC = '" & TXTRfc.Text & "' " strsql = strsql & "WHERE CLIE_CLAVE =" & TXTClave.Text D e l e t e . Marca registros para eliminarlos. Sintaxis: DELETE FROM [NombreBaseDatos!]NombreTabla [WHERE CondiciónFiltro1 [AND | OR CondiciónFiltro2 ...]] Ejemplo: strsql = "DELETE FROM CLIENTES WHERE CLIE_CLAVE = " & TXTClave.Text CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 27 G es t i ó n de B a s e d e Da tos Exportación de Datos Se pueden generar informes por medio de los distintos reporteadores hechos específicamente para ese propósito, sin embargo, también podemos reportear hacia herramientas poderosas tales como Word o Excel. Por medio de objetos en Visual Basic podemos ejecutar Word o Excel (entre otros), crear o abrir archivos, modificarlos y guardarlos, todo a través de código. EXPORTAR DATOS A WORD: En primer lugar tenemos que hacer la referencia: 1. Menú Project 2. Opción Referentes 3. Seleccionar de la lista Microsoft Word 11.0 Object Library (o la versión disponible) 4. Presionar OK Creamos e instanciamos el objeto que nos permitirá manipular a Word como una aplicación. Dim docInforme as New Word.Application Set docInforme = CreateObject("Word.Application") Se recomienda crear un documento en Word que sirva como plantilla, puede protegerlo contra escritura. Teniendo esto en cuenta, abrimos el archivo con la siguiente instrucción: .Application.Documents.Open "\\Servidor\Carpeta1" & "\Archivo.doc" CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 28 G es t i ó n de B a s e d e Da tos La siguiente instrucción permite colocar datos en un marcador predefinido llamado MARCA: docInforme.Documents(1).Bookmarks("MARCA").Range.Text = “Dato” Esto escribe la palabra Dato, recordando que cualquier texto entre comillas lo toma directamente como cadena. Se puede colocar en vez del texto entrecomillado, también una variable, o un elemento de un Recordset, o una función, etc. La siguiente instrucción permite colocar texto en una celda de una tabla creada previamente en el archivo: docInforme.Documents(1).Tables(1).Cell(2, 1).Range.Text = “Dato” Coloca en la fila 2, columna 1 la palabra Dato, teniendo en cuenta las mismas opciones de la instrucción anterior. La siguiente instrucción agrega una fila en la tabla: docInforme.Documents(1).Tables(1).Rows.Add La siguiente instrucción hace visible la aplicación: docInforme .Application.Visible = True El usuario podrá guardar el archivo utilizando las herramientas propias de Word. EXPORTAR DATOS A EXCEL: Hacemos la referencia: 1. Menú Project 2. Opción Referentes CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 29 G es t i ó n de B a s e d e Da tos 3. Seleccionar de la lista Microsoft Excel 11.0 Object Library (o la versión disponible) 4. Presionar OK En este caso necesitamos dos objetos principales, el objeto que manejará a la aplicación, y el objeto que utilizaremos para manipular la hoja: Dim xlsApp As Object Dim xlsSheet As Object Luego instanciamos el objeto para la aplicación: Set xlsApp = CreateObject("Excel.Application") La siguiente instrucción abre un archivo de Excel creado previamente, puede protegerse contra escritura: xlsApp.Workbooks.Open FileName:="" & "\\Servidor\Carpeta1" & "\Archivo.xls", ReadOnly:=True Luego instanciamos el objeto para la hoja: Set xlsSheet = xlsApp.Worksheets(1) La siguiente instrucción, coloca texto en una celda: xlsSheet.Cells(2, 1).Value = “Dato” Esto escribe la palabra Dato en la celda “A2”, recordando que cualquier texto entre comillas lo toma directamente como cadena. Se puede colocar en vez del texto entrecomillado, también una variable, o un elemento de un Recordset, o una función, etc. La siguiente instrucción hace visible la aplicación: xlsApp.Visible = True El usuario podrá guardar el archivo utilizando las herramientas propias de Excel. Ejemplo de exportación de datos a Excel: Private Sub CMDExportar_Click() Dim XlsAplicacion As Object Dim XlsHoja As Object Dim IntFila As Integer Dim IntFactura As Integer Screen.MousePointer = vbHourglass FLXFacturas.Row = 1 Set XlsAplicacion = CreateObject("Excel.Application") XlsAplicacion.Workbooks.Open FileName:="" & App.Path & "\Reporte1.XLS", ReadOnly:=True Set XlsHoja = XlsAplicacion.Worksheets(1) XlsAplicacion.Range("A2", "G1000") = "" IntFila = 2 For IntFactura = 1 To FLXFacturas.Rows - 1 With XlsHoja FLXFacturas.Col = 0 .Cells(IntFila, 1).Value = FLXFacturas.Text FLXFacturas.Col = 1 CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 30 G es t i ó n de B a s e d e Da tos .Cells(IntFila, 2).Value = FLXFacturas.Text FLXFacturas.Col = 2 .Cells(IntFila, 3).Value = FLXFacturas.Text FLXFacturas.Col = 3 .Cells(IntFila, 4).Value = FLXFacturas.Text End With IntFila = IntFila + 1 If IntFactura <> FLXFacturas.Rows - 1 Then FLXFacturas.Row = IntFactura + 1 Next Screen.MousePointer = vbDefault XlsAplicacion.Visible = True Set XlsAplicacion = Nothing End Sub Formato del archivo de reporte generado en Excel: CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 31 Pr o yec t o Pr i nc i pa l PROYECTO PRINCIPAL FORMULARIOS Y PROGRAMACIÓN EN VISUAL BASIC FORMULARIO PRINCIPAL (FORMULARIO MDI) CÓDIGO PARA LOS MENÚS EN EL FORMULARIO INICIAL Private Sub MNUClientes_Click() FRMclientes.Show P_Bienvenida End Sub Private Sub MNUProductos_Click() FRMProductos.Show P_Bienvenida End Sub Private Sub MNUVentas_Click() FRMVentas.Show P_Bienvenida End Sub MÓDULO PRINCIPAL DECLARACIONES Global INTINSTRUCCION As Integer Global STRCONEXION As String Global Const AGREGAR = 1 Global Const MODIFICAR = 2 Global Const BUSCAR = 3 Global Const INACTIVO = 0 CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 32 Pr o yec t o Pr i nc i pa l PROCEDIMIENTO DE ARRANQUE DE LA APLICACIÓN (CONEXIÓN CON LA BASE DE DATOS Y EJECUCIÓN DE LA PANTALLA PRINCIPAL) Sub main() Dim CNTCONEXION As New ADODB.Connection With CNTCONEXION .Provider = "Microsoft.jet.oledb.4.0" .ConnectionString = "Data Source=" & App.Path & "\Base de Datos.mdb" .Properties(15) = "PASSWORD" .Open STRCONEXION = .ConnectionString .Close End With Set CNTCONEXION = Nothing MDIPrincipal.Show End Sub FUNCIÓN QUE INSERTARÁ CLAVES CONSECUTIVAS EN LAS TABLAS DE LA BASE DE DATOS AL AGREGAR NUEVOS REGISTROS Public Function F_ClaveConsecutiva(Astr_Tabla As String, Astr_Campo As String) As Long Dim RSTConsecutiva As New ADODB.Recordset Dim strsql As String strsql = "SELECT " & Astr_Campo & " FROM " & Astr_Tabla & " ORDER BY " & Astr_Campo RSTConsecutiva.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly If RSTConsecutiva.RecordCount = 0 Then F_ClaveConsecutiva = 1 Else RSTConsecutiva.MoveLast F_ClaveConsecutiva = RSTConsecutiva(0) + 1 End If Set RSTConsecutiva = Nothing End Function FUNCIÓN QUE LOCALIZARÁ EL REGISTRO QUE CUMPLA CON EL CRITERIO INDICADO EN UN CUADRO COMBINADO Function F_OpcionCombo(ByRef CboCombo As ComboBox, LngIndice As Long) Dim IntContador As Integer For IntContador = 0 To CboCombo.ListCount - 1 With CboCombo If .ItemData(IntContador) = LngIndice Then F_OpcionCombo = IntContador Exit For End If End With Next End Function CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 33 Pr o yec t o Pr i nc i pa l PROCEDIMIENTO DEFINE EL MENSAJE DE BIENVENIDA A CADA VENTANA Sub P_Bienvenida() MsgBox "Ha iniciado el sistema de administración empresarial" End Sub FORMULARIO DE CLIENTES (FORMULARIO SDI) PROCEDIMIENTO QUE SE EJECUTA AL CARGARSE EL FORMULARIO CLIENTES Private Sub Form_Load() P_FormatoGrid P_ActualizaGrid P_INICIAL End Sub PROCEDIMIENTO QUE DEFINE EL FORMATO DEL FLEXGRID DE CLIENTES Sub P_FormatoGrid() With FLXClientes .Cols = 3 .Rows = 1 .Row = 0 .Col = 0 .Text = "CLAVE" .ColWidth(0) = 600 CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 34 Pr o yec t o Pr i nc i pa l .Col = 1 .Text = "NOMBRE" .ColWidth(1) = 3500 .Col = 2 .Text = "R.F.C." .ColWidth(2) = 1600 End With End Sub PROCEDIMIENTO QUE ACTUALIZA EL CONTENIDO DEL FLEXGRID DE CLIENTES DE ACUERDO A LA BASE DE DATOS Sub P_ActualizaGrid() Dim RSTClientes As ADODB.Recordset Dim strsql As String Dim IntFila As Integer Set RSTClientes = New ADODB.Recordset strsql = "SELECT * FROM CLIENTES" RSTClientes.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly If RSTClientes.RecordCount = 0 Then Exit Sub RSTClientes.MoveFirst IntFila = 1 Do Until RSTClientes.EOF = True With FLXClientes .Rows = IntFila + 1 .Row = IntFila .Col = 0 .Text = RSTClientes("CLIE_CLAVE") .Col = 1 .Text = RSTClientes("CLIE_NOMBRE") .Col = 2 .Text = RSTClientes("CLIE_RFC") End With IntFila = IntFila + 1 RSTClientes.MoveNext Loop RSTClientes.Close Set RSTClientes = Nothing End Sub PROCEDIMIENTO QUE DEFINE EL ESTADO INICIAL DE LOS CONTROLES EN EL FORMULARIO CLIENTES Sub P_INICIAL() TXTClave.Text = "" TXTNombre.Text = "" TXTRfc.Text = "" TXTNombre.Enabled = False TXTRfc.Enabled = False CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 35 Pr o yec t o Pr i nc i pa l CMDAceptar.Enabled = False CMDAceptar.Visible = False CMDCancelar.Enabled = False CMDCancelar.Visible = False CMDAgregar.Enabled = True CMDAgregar.Visible = True CMDModificar.Enabled = False CMDModificar.Visible = True CMDEliminar.Enabled = True CMDEliminar.Visible = True FLXClientes.Enabled = True End Sub PROCEDIMIENTO DEFINIDO AL EJECUTARSE EL EVENTO DOBLE CLICK SOBRE ALGUNO DE LOS REGISTROS EN EL FLEXGRID Private Sub FLXClientes_DblClick() Dim strsql As String Dim RSTClieSel As New ADODB.Recordset FLXClientes.Col = 0 strsql = "SELECT * FROM CLIENTES WHERE CLIE_CLAVE= " & FLXClientes.Text RSTClieSel.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly TXTClave.Text = RSTClieSel("CLIE_CLAVE") TXTNombre.Text = RSTClieSel("CLIE_NOMBRE") TXTRfc.Text = RSTClieSel("CLIE_RFC") Set RSTClieSel = Nothing P_CONSULTA End Sub PROCEDIMIENTO DE CONSULTA QUE DEFINE EL ESTADO DE LOS CONTROLES EN EL FORMULARIO Sub P_CONSULTA() TXTNombre.Enabled = False TXTRfc.Enabled = False CMDAceptar.Enabled = False CMDAceptar.Visible = False CMDCancelar.Enabled = False CMDCancelar.Visible = False CMDAgregar.Enabled = True CMDAgregar.Visible = True CMDModificar.Enabled = True CMDModificar.Visible = True CMDEliminar.Enabled = True CMDEliminar.Visible = True P_ActualizaGrid FLXClientes.Enabled = True End Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 36 Pr o yec t o Pr i nc i pa l INSTRUCCIONES CODIFICADAS AL PRESIONAR EL BOTÓN AGREGAR Private Sub CMDAgregar_Click() INTINSTRUCCION = AGREGAR P_CAMBIOS TXTNombre.SetFocus End Sub PROCEDIMIENTO CAMBIOS QUE MODIFICA EL ESTADO DE LOS CONTROLES AL AGREGAR O MODIFICAR UN REGISTRO Sub P_CAMBIOS() If INTINSTRUCCION = AGREGAR Then TXTClave.Text = "" TXTNombre.Text = "" TXTRfc.Text = "" End If TXTNombre.Enabled = True TXTRfc.Enabled = True CMDAceptar.Enabled = True CMDAceptar.Visible = True CMDCancelar.Enabled = True CMDCancelar.Visible = True CMDAgregar.Enabled = False CMDAgregar.Visible = False CMDModificar.Enabled = False CMDModificar.Visible = False CMDEliminar.Enabled = False CMDEliminar.Visible = False FLXClientes.Enabled = False End Sub FUNCIÓN QUE ESTABLECE COMO REQUERIDOS LOS DATOS NOMBRE DE CLIENTE Y RFC PARA ACTUALIZAR CORRECTAMENTE LA BASE DE DATOS Private Function F_ValidaDatos() As Boolean F_ValidaDatos = False If TXTNombre.Text = "" Then MsgBox "escriba un nombre en el campo cliente" TXTNombre.SetFocus Exit Function End If If TXTRfc.Text = "" Then MsgBox "escriba el RFC del cliente" TXTRfc.SetFocus Exit Function End If F_ValidaDatos = True End Function CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 37 Pr o yec t o Pr i nc i pa l INSTRUCCIONES CODIFICADAS AL PRESIONAR EL BOTÓN MODIFICAR Private Sub CMDModificar_Click() INTINSTRUCCION = MODIFICAR P_CAMBIOS End Sub INSTRUCCIONES DEL PROCEDIMIENTO CAMBIOS, QUE DEFINE EL ESTADO DE LOS CONTROLES AL AGREGAR O MODIFICAR REGISTROS Sub P_CAMBIOS() If INTINSTRUCCION = AGREGAR Then TXTClave.Text = "" TXTNombre.Text = "" TXTRfc.Text = "" End If TXTNombre.Enabled = True TXTRfc.Enabled = True CMDAceptar.Enabled = True CMDAceptar.Visible = True CMDCancelar.Enabled = True CMDCancelar.Visible = True CMDAgregar.Enabled = False CMDAgregar.Visible = False CMDModificar.Enabled = False CMDModificar.Visible = False CMDEliminar.Enabled = False CMDEliminar.Visible = False FLXClientes.Enabled = False End Sub PROCEDIMIENTO DEL EVENTO CLICK EN EL BOTÓN ACEPTAR QUE ACTUALIZARÁ LA BASE DE DATOS, AL AGREGAR O MODIFICAR ALGÚN REGISTRO Private Sub CMDAceptar_Click() Dim CNTCLIENTES As New ADODB.Connection Dim strsql As String If INTINSTRUCCION = AGREGAR Then If Not F_ValidaDatos Then Exit Sub strsql = "INSERT INTO CLIENTES" strsql = strsql & "(CLIE_CLAVE, CLIE_NOMBRE, CLIE_RFC)" strsql = strsql & "VALUES ('" strsql = strsql & F_ClaveConsecutiva("CLIENTES", "CLIE_CLAVE") & "', '" strsql = strsql & TXTNombre.Text & "', '" strsql = strsql & TXTRfc.Text & "')" With CNTCLIENTES .ConnectionString = STRCONEXION .Open .Execute (strsql) CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 38 Pr o yec t o Pr i nc i pa l .Close End With MsgBox "el registro se agregó correctamente" INTINSTRUCCION = INACTIVO P_ActualizaGrid P_INICIAL End If If INTINSTRUCCION = MODIFICAR Then strsql = "UPDATE CLIENTES " strsql = strsql & "SET CLIE_NOMBRE = '" & TXTNombre.Text & "', " strsql = strsql & "CLIE_RFC = '" & TXTRfc.Text & "' " strsql = strsql & "WHERE CLIE_CLAVE =" & TXTClave.Text With CNTCLIENTES .ConnectionString = STRCONEXION .Open .Execute (strsql) .Close End With Set CNTCLIENTES = Nothing INTINSTRUCCION = INACTIVO P_ActualizaGrid P_INICIAL End If End Sub CÓDIGO QUE SE EJECUTA AL CANCELAR LA INSERCIÓN DE UN NUEVO REGISTRO O LA EDICIÓN DE UNO EXISTENTE EN EL FLEXGRID Private Sub CMDCancelar_Click() P_INICIAL End Sub CÓDIGO QUE SE EJECUTA AL ELIMINAR UN REGISTRO Private Sub CMDEliminar_Click() Dim CNTCLIENTES As New ADODB.Connection Dim strsql As String Dim IntRespuesta As Integer If TXTClave.Text = "" Then MsgBox "selecciona un registro para eliminar" Exit Sub End If IntRespuesta = MsgBox("¿deseas dar de baja al cliente?", vbYesNo) If IntRespuesta = vbYes Then strsql = "DELETE FROM CLIENTES WHERE CLIE_CLAVE = " & TXTClave.Text With CNTCLIENTES .ConnectionString = STRCONEXION .Open CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 39 Pr o yec t o Pr i nc i pa l .Execute (strsql) .Close End With Set CNTCLIENTES = Nothing P_ActualizaGrid P_INICIAL End If End Sub FORMULARIO DE PRODUCTOS (FORMULARIO SDI) DECLARACIÓN DE VARIABLE GESTIONABLE EN EL FORMULARIO DE PRODUCTOS Y SUS CONTROLES Dim CLAPROD As Integer PROCEDIMIENTO AL CARGARSE EL FORMULARIO Private Sub Form_Load() P_FormatoGrid P_ActualizaGrid P_INICIAL End Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 40 Pr o yec t o Pr i nc i pa l PROCEDIMIENTO QUE DEFINE EL FORMATO DEL FLEXGRID DE PRODUCTOS Sub P_FormatoGrid() With FLXProductos .Cols = 3 .Rows = 1 .Row = 0 .Col = 0 .Text = "CLAVE" .ColWidth(0) = 600 .Col = 1 .Text = "DESCRIPCIÓN" .ColWidth(1) = 3500 .Col = 2 .Text = "PRECIO $" .ColWidth(2) = 1000 End With End Sub PROCEDIMIENTO QUE ACTUALIZA LA INFORMACIÓN DEL FLEXGRID PRODUCTOS Sub P_ActualizaGrid() Dim RSTArticulos As ADODB.Recordset Dim strsql As String Dim IntFila As Integer Set RSTArticulos = New ADODB.Recordset strsql = "SELECT * FROM PRODUCTOS" RSTArticulos.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly If RSTArticulos.RecordCount = 0 Then Exit Sub RSTArticulos.MoveFirst IntFila = 1 Do Until RSTArticulos.EOF = True With FLXProductos .Rows = IntFila + 1 .Row = IntFila .Col = 0 .Text = RSTArticulos("PROD_CLAVE") .Col = 1 .Text = RSTArticulos("PROD_NOMBRE") .Col = 2 .Text = RSTArticulos("PROD_PRECIO") End With IntFila = IntFila + 1 RSTArticulos.MoveNext Loop RSTArticulos.Close Set RSTArticulos = Nothing End Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 41 Pr o yec t o Pr i nc i pa l PROCEDIMIENTO QUE DETERMINA EL ESTADO INICIAL DE LOS CONTROLES Sub P_INICIAL() TXTArticulo.Text = "" TXTPrecio.Text = "" TXTArticulo.Enabled = False TXTPrecio.Enabled = False CMDAceptar.Enabled = False CMDAceptar.Visible = False CMDCancelar.Enabled = False CMDCancelar.Visible = False CMDAgregar.Enabled = True CMDAgregar.Visible = True CMDModificar.Enabled = False CMDModificar.Visible = True CMDEliminar.Enabled = True CMDEliminar.Visible = True FLXProductos.Enabled = True End Sub PROCEDIMIENTO DEFINIDO AL EJECUTARSE EL EVENTO DOBLE CLICK SOBRE ALGUNO DE LOS REGISTROS EN EL FLEXGRID Private Sub FLXProductos_DblClick() Dim strsql As String Dim RSTProdSel As New ADODB.Recordset FLXProductos.Col = 0 CLAPROD = FLXProductos.Text Strsql = "SELECT * FROM PRODUCTOS WHERE PROD_CLAVE= " & FLXProductos.Text RSTProdSel.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly TXTArticulo.Text = RSTProdSel("PROD_NOMBRE") TXTPrecio.Text = RSTProdSel("PROD_PRECIO") Set RSTProdSel = Nothing P_CONSULTA End Sub ESTADO DE LOS CONTROLES AL EFECTUAR LA CONSULTA DE ALGÚN REGISTRO Sub P_CONSULTA() TXTArticulo.Enabled = False TXTPrecio.Enabled = False CMDAceptar.Enabled = False CMDAceptar.Visible = False CMDCancelar.Enabled = False CMDCancelar.Visible = False CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 42 Pr o yec t o Pr i nc i pa l CMDAgregar.Enabled = True CMDAgregar.Visible = True CMDModificar.Enabled = True CMDModificar.Visible = True CMDEliminar.Enabled = True CMDEliminar.Visible = True P_ActualizaGrid FLXProductos.Enabled = True End Sub PROCEDIMIENTO CORRESPONDIENTE AL BOTÓN AGREGAR Private Sub CMDAgregar_Click() INTINSTRUCCION = AGREGAR P_CAMBIOS TXTArticulo.SetFocus End Sub PROCEDIMIENTO QUE DETERMINA EL ESTADO DE LOS CONTROLES AL AGREGAR O MODIFICAR UN REGISTRO Sub P_CAMBIOS() If INTINSTRUCCION = AGREGAR Then TXTArticulo.Text = "" TXTPrecio.Text = "" End If TXTArticulo.Enabled = True TXTPrecio.Enabled = True CMDAceptar.Enabled = True CMDAceptar.Visible = True CMDCancelar.Enabled = True CMDCancelar.Visible = True CMDAgregar.Enabled = False CMDAgregar.Visible = False CMDModificar.Enabled = False CMDModificar.Visible = False CMDEliminar.Enabled = False CMDEliminar.Visible = False FLXProductos.Enabled = False End Sub PROCEDIMIENTO EN EL BOTÓN ACEPTAR QUE ACTUALIZARÁ LA BASE DE DATOS, AL AGREGAR O MODIFICAR ALGÚN REGISTRO Private Sub CMDAceptar_Click() Dim CNTPRODUCTOS As New ADODB.Connection Dim strsql As String If INTINSTRUCCION = AGREGAR Then If Not F_ValidaDatos Then Exit Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 43 Pr o yec t o Pr i nc i pa l strsql = "INSERT INTO PRODUCTOS" strsql = strsql & "(PROD_CLAVE, PROD_NOMBRE, PROD_PRECIO)" strsql = strsql & "VALUES ('" strsql = strsql & F_ClaveConsecutiva("PRODUCTOS", "PROD_CLAVE") & "', '" strsql = strsql & TXTArticulo.Text & "', '" strsql = strsql & TXTPrecio.Text & "')" With CNTPRODUCTOS .ConnectionString = STRCONEXION .Open .Execute (strsql) .Close End With MsgBox "el registro se agregó correctamente" INTINSTRUCCION = INACTIVO P_ActualizaGrid P_INICIAL End If If INTINSTRUCCION = MODIFICAR Then strsql = "UPDATE PRODUCTOS " strsql = strsql & "SET PROD_NOMBRE = '" & TXTArticulo.Text & "', " strsql = strsql & "PROD_PRECIO = '" & TXTPrecio.Text & "' " strsql = strsql & "WHERE PROD_CLAVE =" & CLAPROD With CNTPRODUCTOS .ConnectionString = STRCONEXION .Open .Execute (strsql) .Close End With Set CNTPRODUCTOS = Nothing MsgBox "los datos del artículo se han modificado" INTINSTRUCCION = INACTIVO P_ActualizaGrid P_INICIAL End If End Sub CÓDIGO QUE SE EJECUTA AL CANCELAR LA INSERCIÓN DE UN NUEVO PRODUCTO O LA MODIFICACIÓN DE UN REGISTRO EXISTENTE Private Sub CMDCancelar_Click() P_INICIAL End Sub CÓDIGO QUE SE EJECUTA AL ELIMINAR UN PRODUCTO Private Sub CMDEliminar_Click() Dim CNTPRODUCTOS As New ADODB.Connection Dim strsql As String CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 44 Pr o yec t o Pr i nc i pa l Dim IntRespuesta As Integer If TXTArticulo.Text = "" Then MsgBox "SELECIONA UN ARTÍCULO PARA ELIMINAR" Exit Sub End If IntRespuesta = MsgBox("¿REALMENTE DESEA ELIMINAR EL ARTÍCULO?", vbYesNo) If IntRespuesta = vbYes Then strsql = "DELETE FROM PRODUCTOS WHERE PROD_CLAVE = " & CLAPROD With CNTPRODUCTOS .ConnectionString = STRCONEXION .Open .Execute (strsql) .Close End With Set CNTPRODUCTOS = Nothing P_ActualizaGrid P_INICIAL End If End Sub FORMULARIO DE VENTAS (FORMULARIO SDI) CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 45 Pr o yec t o Pr i nc i pa l VARIABLE DESCRITA EN EL BLOQUE GENERAL DE LA VENTANA DE CÓDIGO Dim IntFila As Integer ACCIONES AL CARGARSE EL FORMULARIO Private Sub Form_Load() Dim strsql As String Dim RSTCOMBO As New ADODB.Recordset P_INICIAL strsql = "SELECT CLIE_CLAVE, CLIE_NOMBRE FROM CLIENTES" RSTCOMBO.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly If RSTCOMBO.RecordCount <> 0 Then Do Until RSTCOMBO.EOF = True With cbocliente .AddItem RSTCOMBO("CLIE_NOMBRE") .ItemData(.NewIndex) = RSTCOMBO("CLIE_CLAVE") End With RSTCOMBO.MoveNext Loop End If RSTCOMBO.Close strsql = "SELECT PROD_CLAVE, PROD_NOMBRE FROM PRODUCTOS" RSTCOMBO.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly If RSTCOMBO.RecordCount <> 0 Then Do Until RSTCOMBO.EOF = True With cboproducto .AddItem RSTCOMBO("PROD_NOMBRE") .ItemData(.NewIndex) = RSTCOMBO("PROD_CLAVE") End With RSTCOMBO.MoveNext Loop End If RSTCOMBO.Close Set RSTCOMBO = Nothing End Sub PROCEDIMIENTO QUE DEFINE EL ESTADO INICIAL DE LOS CONTROLES Sub P_INICIAL() txtfactura.Enabled = False txtfactura.Visible = True txtfactura.Text = "" cmdbuscar.Enabled = True cmdbuscar.Visible = True cbocliente.Enabled = False cbocliente.Visible = True cbocliente.ListIndex = -1 cboproducto.Enabled = False CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 46 Pr o yec t o Pr i nc i pa l cboproducto.Visible = True cboproducto.ListIndex = -1 txtcantidad.Enabled = False txtcantidad.Visible = True txtcantidad.Text = "" cmdmas.Enabled = False cmdmas.Visible = True flxproductos.Enabled = False flxproductos.Visible = True cmdnueva.Enabled = True cmdnueva.Visible = True cmdmodificar.Enabled = False cmdmodificar.Visible = True cmdeliminar.Enabled = True cmdeliminar.Visible = True cmdaceptar.Enabled = False cmdaceptar.Visible = False cmdcancelar.Enabled = False cmdcancelar.Visible = False cmdquitar.Enabled = False cmdquitar.Visible = True P_FormatoGrid End Sub PROCEDIMIENTO QUE DEFINE EL FORMATO DEL GRID EN VENTAS Sub P_FormatoGrid() With flxproductos .Rows = 1 .Cols = 5 .Row = 0 .Col = 0 .Text = "CLAVE" .Col = 1 .Text = "PRODUCTO" .Col = 2 .Text = "PRECIO" .Col = 3 .Text = "CANTIDAD" .Col = 4 .Text = "SUBTOTAL" .ColWidth(0) = 50 .ColWidth(1) = 3000 .ColWidth(2) = 1000 .ColWidth(3) = 1000 .ColWidth(4) = 1000 End With End Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 47 Pr o yec t o Pr i nc i pa l PROCEDIMIENTO QUE DEFINE AL BOTÓN DE COMANDO NUEVA VENTA Private Sub cmdnueva_Click() INTINSTRUCCION = AGREGAR P_CAMBIOS End Sub PROCEDIMIENTO CAMBIOS (DEFINE EL ESTADO DE LOSCONTROLES AL PEDIR UNA NUEVA VENTA) Sub P_CAMBIOS() If INTINSTRUCCION = AGREGAR Then txtfactura.Text = "" 'listindex=-1 limpia el combobox cbocliente.ListIndex = -1 lblrfc.Caption = "" cboproducto.ListIndex = -1 lblprecio.Caption = "" txtcantidad.Text = "" P_FormatoGrid End If txtfactura.Enabled = False txtfactura.Visible = True cmdbuscar.Enabled = False cmdbuscar.Visible = False cbocliente.Enabled = True cbocliente.Visible = True cboproducto.Enabled = True cboproducto.Visible = True txtcantidad.Enabled = True txtcantidad.Visible = True cmdmas.Enabled = True cmdmas.Visible = True flxproductos.Enabled = True flxproductos.Visible = True cmdnueva.Enabled = False cmdnueva.Visible = False cmdmodificar.Enabled = False cmdmodificar.Visible = False cmdeliminar.Enabled = False cmdeliminar.Visible = False cmdaceptar.Enabled = True cmdaceptar.Visible = True cmdcancelar.Enabled = True cmdcancelar.Visible = True cmdquitar.Enabled = True cmdquitar.Visible = True End Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 48 Pr o yec t o Pr i nc i pa l PROCEDIMIENTO QUE CARGA AL COMBO CLIENTE Private Sub cbocliente_Click() Dim strsql As String Dim RSTClientes As New ADODB.Recordset strsql = "SELECT CLIE_RFC FROM CLIENTES WHERE CLIE_CLAVE = " & cbocliente.ItemData(cbocliente.ListIndex) RSTClientes.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly lblrfc.Caption = RSTClientes("CLIE_RFC") Set RSTClientes = Nothing End Sub PROCEDIMIENTO QUE CARGA AL COMBO PRODUCTO Private Sub cboproducto_Click() Dim strsql As String Dim RSTPRODUCTOS As New ADODB.Recordset strsql = "SELECT PROD_PRECIO FROM PRODUCTOS WHERE PROD_CLAVE = " & cboproducto.ItemData(cboproducto.ListIndex) RSTPRODUCTOS.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly lblprecio.Caption = RSTPRODUCTOS("PROD_PRECIO") Set RSTPRODUCTOS = Nothing End Sub PROCEDIMIENTO QUE DEFINE AL BOTÓN MÁS (AGREGAR EL PRODUCTO SELECCIONADO AL FLEXGRID) Private Sub cmdmas_Click() Dim SNGSUBTOTAL As Single Select Case INTINSTRUCCION Case AGREGAR If cboproducto.ListIndex = -1 Then MsgBox "SELECCIONA UN PRODUCTO" Exit Sub End If If txtcantidad.Text = "" Then txtcantidad.Text = 1 With flxproductos .Rows = .Rows + 1 .Row = .Rows - 1 .Col = 0 .Text = cboproducto.ItemData(cboproducto.ListIndex) .Col = 1 .Text = cboproducto.Text .Col = 2 .Text = lblprecio.Caption .Col = 3 .Text = txtcantidad.Text .Col = 4 SNGSUBTOTAL = CSng(lblprecio.Caption) * CInt(txtcantidad.Text) CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 49 Pr o yec t o Pr i nc i pa l .Text = SNGSUBTOTAL End With cboproducto.Text = "" lblprecio.Caption = "0.00" txtcantidad.Text = "" Case BUSCAR If cboproducto.ListIndex = -1 And txtcantidad.Text = "" Then MsgBox "SELECCIONE UN PRODUCTO O ESCRIBA UNA CANTIDAD" cboproducto.SetFocus Exit Sub End If With flxproductos .Rows = .Rows + 1 .Row = .Rows - 1 .Col = 0 If cboproducto.ListIndex <> -1 Then .Text = cboproducto.ItemData(cboproducto.ListIndex) .Col = 1 .Text = cboproducto.Text .Col = 2 .Text = lblprecio.Caption End If If txtcantidad.Text <> "" Then .Col = 3 .Text = txtcantidad.Text End If End With cboproducto.Text = "" lblprecio.Caption = "0.00" txtcantidad.Text = "" End Select End Sub PROCEDIMIENTO QUE DEFINE AL BOTÓN QUITAR (ELIMINAR UN PRODUCTO DEL FLEXGRID) Private Sub cmdquitar_Click() On Error GoTo ManejaError flxproductos.RemoveItem (IntFila) cmdquitar.Enabled = False Exit Sub ManejaError: Select Case Err.Number Case 30015 P_FormatoGrid Case Else MsgBox "ERROR :" & Err.Number & " " & Err.Description & Chr(13) & _ CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 50 Pr o yec t o Pr i nc i pa l "CONSULTE AL PROVEEDOR DEL SISTEMA" End Select End Sub ACCIONES QUE OCURREN AL SITUAR EL CURSOR EN EL FLEXGRID Private Sub flxproductos_GotFocus() cmdquitar.Enabled = True IntFila = flxproductos.Row End Sub PROCEDIMIENTO QUE DEFINE AL BOTÓN CANCELAR Private Sub CMDCancelar_Click() Unload Me End Sub FUNCIÒN QUE EXIGE LA CAPTURA DE DATOS ANTES DE GRABAR LA VENTA Private Function F_Validaventa() As Boolean F_Validaventa = False If cbocliente.ListIndex = -1 Then MsgBox "selecciona un cliente" cbocliente.SetFocus Exit Function End If If flxproductos.Rows < 2 And txtcantidad.Text = "" Then MsgBox "selecciona un producto, si omites la cantidad, se asignará el valor 1" cboproducto.SetFoc0us Exit Function End If F_Validaventa = True End Function PROCEDIMIENTO QUE DEFINE AL BOTÓN ACEPTAR Private Sub CMDAceptar_Click() Dim CNTCARGAR As New ADODB.Connection Dim strsql As String Dim CurTOTAL As Currency Dim IntCuentaproducto As Integer Dim LngClaveFactura As Long Dim RSTConsulta As New ADODB.Recordset Select Case INTINSTRUCCION Case AGREGAR If Not F_Validaventa Then Exit Sub LngClaveFactura = F_ClaveConsecutiva("FACTURAS", "FAC_CLAVE") strsql = "INSERT INTO FACTURAS" strsql = strsql & "(FAC_CLAVE, CLIE_CLAVE, FAC_TOTAL, FAC_FECHA) " strsql = strsql & "VALUES ('" & LngClaveFactura & "', '" CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 51 Pr o yec t o Pr i nc i pa l strsql = strsql & cbocliente.ItemData(cbocliente.ListIndex) & "', '" flxproductos.Col = 4 For IntCuentaproducto = 1 To flxproductos.Rows - 1 flxproductos.Row = IntCuentaproducto CurTOTAL = CurTOTAL + CCur(flxproductos.Text) Next strsql = strsql & CurTOTAL & "', #" strsql = strsql & Format(Now, "DD/MM/YY HH:NN:SS") & "# )" With CNTCARGAR .Open STRCONEXION .Execute (strsql) .Close End With For IntCuentaproducto = 1 To flxproductos.Rows - 1 flxproductos.Row = IntCuentaproducto strsql = "INSERT INTO VENTAS" strsql = strsql & "(VENTA_CLAVE, FAC_CLAVE, PROD_CLAVE, VENTA_CANTIDAD) " strsql = strsql & "VALUES ('" & F_ClaveConsecutiva("VENTAS", "VENTA_CLAVE") & "', '" strsql = strsql & LngClaveFactura & "', '" flxproductos.Col = 0 strsql = strsql & flxproductos.Text & "', '" flxproductos.Col = 3 strsql = strsql & flxproductos.Text & "')" With CNTCARGAR .Open STRCONEXION .Execute (strsql) .Close End With Next MsgBox "la factura y venta(s) correspondiente(s) se han registrado en la BD" cbocliente.Text = "" P_FormatoGrid Case BUSCAR Load FRMBusquedas strsql = "SELECT DISTINCT FACTURAS.FAC_CLAVE, CLIE_NOMBRE, FAC_TOTAL, FAC_FECHA " strsql = strsql & "FROM FACTURAS, VENTAS, CLIENTES " strsql = strsql & "WHERE FACTURAS.FAC_CLAVE=VENTAS.FAC_CLAVE " strsql = strsql & "AND FACTURAS.CLIE_CLAVE = CLIENTES.CLIE_CLAVE " If txtfactura <> "" Then strsql = strsql & "AND FACTURAS.FAC_CLAVE= " & txtfactura.Text & " " End If If cbocliente.ListIndex <> -1 Then strsql = strsql & "AND FACTURAS.CLIE_CLAVE = " & cbocliente.ItemData(cbocliente.ListIndex) & " " CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 52 Pr o yec t o Pr i nc i pa l End If If flxproductos.Rows <> 1 Then strsql = strsql & "AND ((" For IntCuentaproducto = 1 To flxproductos.Rows - 1 With flxproductos .Row = IntCuentaproducto .Col = 0 If .Text <> "" Then strsql = strsql & "PROD_CLAVE = " & .Text & " " End If .Col = 3 If .Text <> "" Then strsql = strsql & "AND VENTA_CANTIDAD = " & .Text & " " End If If IntCuentaproducto <> flxproductos.Rows - 1 Then strsql = strsql & ") OR (" Else strsql = strsql & "))" End If End With Next End If RSTConsulta.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly If RSTConsulta.RecordCount = 0 Then MsgBox "NO SE ENCONTRÓ FACTURA CON ESOS CRITERIOS" RSTConsulta.Close Else Do Until RSTConsulta.EOF With FRMBusquedas.FLXFacturas 'aumenta una fila .Rows = .Rows + 1 'se coloca en la última fila .Row = .Rows - 1 .Col = 0 .Text = RSTConsulta("FAC_CLAVE") .Col = 1 .Text = RSTConsulta("CLIE_NOMBRE") .Col = 2 .Text = RSTConsulta("FAC_TOTAL") .Col = 3 .Text = Format(RSTConsulta("FAC_FECHA"), "DD/MM/YY HH:NN:SS:") End With RSTConsulta.MoveNext Loop End If Set RSTConsulta = Nothing FRMBusquedas.Show CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 53 Pr o yec t o Pr i nc i pa l End Select End Sub PROCEDIMIENTO QUE DEFINE AL BOTÓN BUSCAR Private Sub cmdbuscar_Click() INTINSTRUCCION = BUSCAR P_CRITERIOS End Sub PROCEDIMIENTO CRITERIOS (ESTABLECE EL ESTADO DE LOS CONTROLES DURANTE LA BÙSQUEDA) Sub P_CRITERIOS() txtfactura.Enabled = True txtfactura.Visible = True txtfactura.Text = "" cmdbuscar.Enabled = True cmdbuscar.Visible = False cbocliente.Enabled = True cbocliente.Visible = True cbocliente.ListIndex = -1 cboproducto.Enabled = True cboproducto.Visible = True cboproducto.ListIndex = -1 txtcantidad.Enabled = True txtcantidad.Visible = True txtcantidad.Text = "" cmdmas.Enabled = True cmdmas.Visible = True flxproductos.Enabled = True flxproductos.Visible = True cmdnueva.Enabled = False cmdnueva.Visible = False cmdmodificar.Enabled = False cmdmodificar.Visible = False cmdeliminar.Enabled = False cmdeliminar.Visible = False cmdaceptar.Enabled = True cmdaceptar.Visible = True cmdcancelar.Enabled = True cmdcancelar.Visible = True cmdquitar.Enabled = True cmdquitar.Visible = True P_FormatoGrid End Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 54 Pr o yec t o Pr i nc i pa l FORMULARIO DE RESULTADOS DE BÚSQUEDA INSTRUCCIONES AL CARGARSE EL FORMULARIO Private Sub Form_Load() P_FormatoGrid End Sub PROCEDIMIENTO QUE DEFINE EL FORMATO DEL GRID DE CONSULTAS Public Sub P_FormatoGrid() With FLXFacturas .Rows = 1 .Cols = 4 .Row = 0 .Col = 0 .Text = "FACTURA N°" .Col = 1 .Text = "NOMBRE DEL CLIENTE" .Col = 2 .Text = "TOTAL" .Col = 3 .Text = "FECHA" .ColWidth(0) = 1000 .ColWidth(1) = 2500 .ColWidth(2) = 1000 .ColWidth(3) = 1000 End With End Sub CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 55 Pr o yec t o Pr i nc i pa l PROCEDIMIENTO QUE DEFINE EL FORMATO DEL GRID DE CONSULTAS Private Sub FLXFacturas_DblClick() Dim RSTBuscar As New ADODB.Recordset Dim strsql As String With FLXFacturas .Col = 0 strsql = "SELECT * FROM VENTAS, FACTURAS, PRODUCTOS WHERE FACTURAS.FAC_CLAVE = VENTAS.FAC_CLAVE AND VENTAS.PROD_CLAVE = PRODUCTOS.PROD_CLAVE " strsql = strsql & "AND VENTAS.FAC_CLAVE = " & .Text RSTBuscar.Open strsql, STRCONEXION, adOpenStatic, adLockReadOnly End With FRMVentas.txtfactura.Text = RSTBuscar("FACTURAS.FAC_CLAVE") FRMVentas.cbocliente.ListIndex = F_OpcionCombo(FRMVentas.cbocliente, RSTBuscar("CLIE_CLAVE")) FRMVentas.P_FormatoGrid Do Until RSTBuscar.EOF = True With FRMVentas.FLXProductos .Rows = .Rows + 1 .Row = .Rows - 1 .Col = 0 .Text = RSTBuscar("PRODUCTOS.PROD_CLAVE") .Col = 1 .Text = RSTBuscar("PROD_NOMBRE") .Col = 2 .Text = RSTBuscar("PROD_PRECIO") .Col = 3 .Text = RSTBuscar("VENTA_CANTIDAD") .Col = 4 .Text = CSng(RSTBuscar("PROD_PRECIO")) * CInt(RSTBuscar("VENTA_CANTIDAD")) End With RSTBuscar.MoveNext Loop Unload Me FRMVentas.Show FRMVentas.CMDModificar.Visible = True FRMVentas.CMDModificar.Enabled = True End Sub PROCEDIMIENTO QUE DEFINE AL BOTÒN EXPORTAR Private Sub CMDExportar_Click() Dim XlsAplicacion As Object Dim XlsHoja As Object Dim IntFila As Integer Dim IntFactura As Integer Screen.MousePointer = vbHourglass CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 56 Pr o yec t o Pr i nc i pa l FLXFacturas.Row = 1 Set XlsAplicacion = CreateObject("Excel.Application") XlsAplicacion.Workbooks.Open FileName:="" & App.Path & "\REPORTE1.XLS", ReadOnly:=True Set XlsHoja = XlsAplicacion.Worksheets(1) XlsAplicacion.Range("A2", "G1000") = "" IntFila = 2 For IntFactura = 1 To FLXFacturas.Rows - 1 With XlsHoja FLXFacturas.Col = 0 .Cells(IntFila, 1).Value = FLXFacturas.Text FLXFacturas.Col = 1 .Cells(IntFila, 2).Value = FLXFacturas.Text FLXFacturas.Col = 2 .Cells(IntFila, 3).Value = FLXFacturas.Text FLXFacturas.Col = 3 .Cells(IntFila, 4).Value = FLXFacturas.Text End With IntFila = IntFila + 1 If IntFactura <> FLXFacturas.Rows - 1 Then FLXFacturas.Row = IntFactura + 1 Next Screen.MousePointer = vbDefault XlsAplicacion.Visible = True Set XlsAplicacion = Nothing End Sub ARCHIVO DE EXPORTACIÓN A EXCEL (DE SÓLO LECTURA) PROCEDIMIENTO QUE DEFINE AL BOTÒN SALIR Private Sub Cmdsalir_click() Unload me End CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática Sub PÁGINA 57 No tas F i na l es Notas Finales Deseamos que el presente material de apoyo le haya facilitado el aprendizaje de los temas que componen cada módulo de este evento y que le sea útil para futuras consultas. Le felicitamos por haber concluido este curso de capacitación, continúe practicando; recuerde que su habilidad dependerá del manejo cotidiano de esta paquetería. También le reiteramos que el equipo de Instructores estará en la mejor disposición de apoyarle con cualquier asesoría en Informática, y le invitamos a que consulte el calendario de cursos y continúe con este proceso de capacitación, según sus necesidades, en el puesto que desempeña. Las puertas del Centro Nacional de Capacitación y Calidad estarán siempre abiertas para brindarle el servicio en Informática que requiera. Bibliografía: Microsoft Visual Basic 6.0 Enterprise, Michael Halvorson y Michael Young, Mc Graw Hill Microsoft Visual Basic 6.0 paso a paso, Halvorson Kinata, Mc Graw Hill Registrado ante la Secretaria de Educación Publica Obra Literaria Registró en Trámite CENTRO NACIONAL DE CAPACITACIÓN Y CALIDAD Coordinación de Informática PÁGINA 58