• No results found

Guia Avanzada Del Programador

N/A
N/A
Protected

Academic year: 2021

Share "Guia Avanzada Del Programador"

Copied!
30
0
0

Loading.... (view fulltext now)

Full text

(1)

MyBusiness POS

Curso de Programador Avanzado

(2)
(3)

DINTELSIS, S.A. DE C.V.

MyBusiness DELTA

Apuntes del curso de programador avanzado

1.- Ejemplo de cómo exportar datos a un archivo de texto

Los siguientes ejemplos se ejecutan desde rutinas o procedimientos de usuario.

01 Sub Main() 02 Dim rstProductos, a, c 03 04 a = “c:\test.cvs” 05 06 If ExisteArchivo( a ) Then 07 EliminaArchivo a 08 End If 09

10 Set rstProductos = CreaRecordSet( _

11 “SELECT artiulo, descrip, existencia FROM prods”, _ 12 Ambiente.Connection )

13

14 While Not rstProductos.EOF 15 c = “”

16 c = c & rstProductos(“articulo”) & “,” 17 c = c & rstProductos(“descrip”) & “,” 18 c = c & rstProductos(“existencia”) & vbCrLf 19 20 OutLine a, c 21 22 rstProductos.MoveNext 23 Wend 24

25 MyMessage “Procesamiento de exportación completado” 26

(4)

Análisis del ejemplo:

01 la instrucción Sub Main( ) es obligatoria e indica el inicio del programa o punto de entrada del programa.

02 Declaramos las variables que vamos a ocupar dentro del programa con el comando DIM esto le dice al método que estas variables y el espacio en memoria que ocupan sean destruidos al llegar a la instrucción End Sub.

04 En la variable a colocamos el nombre del archivo que vamos a usar en todo el programa. 06 Aquí usamos la funcion ExisteArchivo( a ) esto devuelve un valor Falso si el archivo no fue localizado.

07 Si el archivo fue localizado entonces eliminamos el archivo con la instrucción

EliminaArchivo( a ).

10 Creamos un RecordSet del catalogo de productos.

Un RecordSet es un subconjunto de una o varias tablas de una base de datos, esto se debe de imaginar como una tabla o matriz en la memoria de la computadora.

La función CreaRecordSet tiene dos parámetros, el primero es una cadena de caracteres que representa una instrucción del SQL (Structred Query Language), el segundo es un objeto que representa la conexión física con la base de datos.

14 Iniciamos un ciclo While (mientras) nos sea fin de archivo, la propiedad EOF indica si ya estamos en el final de la matriz o RecordSet.

15 Inicializamos la variable c con un cadena vacía.

16 Concatenamos el valor de la columna o campo articulo a la variable c y le agregamos al final una coma.

17 Concatenamos el valor de la columna o campo descrip a la variable c y le agregamos al final una coma.

18 Concatenamos el valor de la columna o campo existencia la variable c y le agregamos al final una coma, al final le agregamos, al final le agregamos la constante vbCrLf que es una constante de vbScript que representan los caracteres 10 y 13 que la los programas interpretan como una línea nueva y salto de carro.

20 Utilizamos la función OutLine que utiliza los siguientes parámetros: 1.- El nombre del archivo donde deseamos agregar los datos 2.- El dato que deseamos agregar al archivo

La función OutLine crea el archivo si este no existe, y si el archivo no existe agrega los datos al final de este.

22 El método MoveNext mueve el cursor de la matriz o RecordSet al siguiente renglón o registro, así nos aseguramos que en algún momento este va a llegar al final, cuando se usa un ciclo es importante colocar esta instrucción o el programa se puede trabar (ciclar).

23 Wend Indica el fin de la estructura While (mientras).

25 MyMessage es un método o rutina que despliega mensajes en la pantalla se puede usar en lugar de MsgBox, esta rutina despliega los mensajes con fuentes grandes lo que permite su mejor visualización.

(5)

2.- Ejemplo de cómo exportar a *EXCEL™

01 Sub Main()

02 Dim oXLS, oWB, oSheet, rstTemp

03 Set oXLS = CreateObject( "Excel.Application" ) 04 oXLS.UserControl = True

05 oXLS.Visible = True 06

07 Set oWB = oXLS.WorkBooks.Add 08 Set oSheet = oWB.Sheets("hoja1") 09

10 oSheet.Cells( 1, 1 ).Value = "Hola Mundo" 11 oSheet.Cells( 1, 1 ).Font.Name = "Arial" 12 oSheet.Cells( 1, 1 ).Font.Size = 24 13 oSheet.Cells( 1, 1 ).Font.Bold = True 14

15 oSheet.Range( "A2:Z1000" ).NumberFormat = _ 16 "##,##0.00"

17

18 Set rstTemp = CreaRecordSet( _

19 "SELECT vend, nombre FROM vends", _ 20 Ambiente.Connection )

21

22 For n = 0 To rstTemp.Fields.Count - 1 23 oSheet.Cells( 2, n + 1 ).Value = _

24 rstTemp.Fields(n).Name 'Indica el nombre de la columna 25 Next

26

27 oSheet.Cells( 3, 1 ).CopyFromRecordSet rstTemp 28

29 End Sub

Dentro de Windows existe una forma de usar todos sus recursos por medio de programación, para esto todos los programas ofrecen una capa que permite visualizar sus propiedades y métodos a esta interfase le llamamos API o Interfase para el programador de la aplicación, aunque en este caso vamos a ver un ejemplo que utiliza una interfase simplificada llamada OLE.

03 Utilizamos la función CreateObject esta función crea cualquier objeto que acepte una interfase para programación, en este caso creamos una aplicación de *Excel™ y lo asignamos a una variable llamada oXLS, cuando se asignan objetos a variables es necesario iniciar con el comando Set.

04 La propiedad UserControl si es verdadera permite que el usuario pueda usar la aplicación de *Excel™ que hemos activado (Instanciado).

05 La propiedad Visible cuando tiene el valor verdadero muestra la ventana de *Excel™ y un valor falso la oculta.

07 Aquí asignamos al variable oWB una hoja de trabajo de *Excel™ esto lo hacemos con el Metodo oXLS.WorkBooks.Add.

08 Tomamos el control de una de las tres hojas que se crean cuando agregamos el libro de trabajo a la variable oSheet con la instrucción oWb.oSheets(“hoja1”) donde entre comillas se indica el nombre de la hoja, recuerde que si su *Excel™ esta en inglés este es “Sheet1”. 10 Una vez que tomamos el control de una hoja podemos trabajar con cada una de las celdas de la hoja, por medio de la propiedad Cells, esta propiedad funciona igual que una matriz ya

(6)

que tenemos que indicar el renglón y la columna con la que queremos trabajar, la propiedad

Value indica el dato que deseamos guardar en la celda de *Excel™.

11 Podemos cambiar el nombre de la fuente de la celda por medio de Font.Name, donde el nombre es una cadena de texto que indica el nombre de cualquier fuente disponible para Windows.

12 Font.Size el tamaño de la fuente.

13 Font.Bold Si la fuente va a estar en negritas o no.

15 También existe la opción para manejo de rangos de celdas que es la propiedad

oSheet.Range donde se indica el rango por medio de una cadena de texto al igual como se

haría en las funciones que maneja *Excel™ de manera predeterminada, a Range se le pueden asignar las misma propiedades y métodos que Cells.

18 Creamos un RecordSet de la tabla de vendedores.

22 Creamos un ciclo para todas las columnas o campos dentro del RecordSet para colocarlas como titulo de la columna en la hoja de *Excel™, para esto el RecordSet tiene un propiedad llamada Fields que indica las propiedades de las columnas del RecordSet y la cual a su vez contiene la propiedad Count que indica el total de columnas que tiene nuestro RecordSet, los RecordSets comienzan en la columna cero por lo que esta línea debe de leerse de n = 0 hasta el total de columnas del RecordSet.

23 Las columnas en Excel comienzan su conteo en uno por lo que tenemos que indicar n + 1 cuando hacemos referencia de la columna en la propiedad Cells, el valor que colocamos en la celda es igual a la propiedad Name de la Fields donde el subíndice que usamos es n.

25 Cerramos el ciclo For con al Instrucción NEXT.

26 CopyFromRecordSet es un método de Cells que permite copiar un RecordSet directamente en la hoja de *Excel™.

(7)

3.- Ejemplo de cómo importar datos a un archivo de *Excel™

01 Sub Main()

02 Dim oXLS, oWB, a, Query, rstCliente 03

04 a = "c:\miarchivo.xls" 05

06 If Not ExisteArchivo( a ) Then

07 MyMessage "No Existe el archivo: " & a 08 Exit Sub

09 End If 11

12 Set oXLS = CreateObject( "Excel.Application" ) 13 Set oWB = oXLS.WorkBooks.Open( a )

14 Set oSheet = oWB.Sheets( "hoja1" ) 15

16 Set Query = NewQuery()

17 Set Query.Connection = Ambiente.Connection 18

19 For n = 2 To 65536 20

21 If clEmpty( oSheet.Cells( n, 1 ).Value ) = True Then 22 Exit For

23 End If 24

25 Set rstCliente = CreaRecordSet( _

26 "SELECT cliente FROM clients WHERE cliente = '" & _ 27 oSheet.Cells( n, 1 ).Value & "'", Ambiente.Connection ) 28 29 Query.Reset 30 31 If rstCliente.EOF Then 32 Query.strState = "INSERT" 33 Else 34 Query.strState = "UPDATE" 35 Query.Condition = _

36 "cliente = '" & oSheet.Cells( n, 1 ).Value & "'" 37 End If

38

39 Query.AddField "clients", "cliente", _ 40 oSheet.Cells( n, 1 ).Value

41 Query.AddField "clients", "nombre", _ 42 oSheet.Cells( n, 2 ).Value 43 Query.Exec 44 Next 45 46 oWB.Close 47

48 MyMessage "Proceso de importación terminado" 49

(8)

13 En este momento abrimos un archivo de *Excel™ con la instrucción

oXLS.WorkBooks.Open( a ).

16 En este ejemplo vemos el uso del Objeto Query que es el que usa MyBusiness POS para todo proceso de Actualización o Inserción de datos, aquí la instrucción

Set Query = NewQuery() se utiliza únicamente para crear este objeto (instanciar).

17 El objeto Query necesita saber con que base de datos va a trabajar por lo que le asignamos este valor con la instrucción Set Query.Connection = Ambiente.Connection.

19 Creamos un ciclo que va a recorrer toda la hoja desde la celda 1 hasta la 65536 que es el total de celdas que puede contener una hoja.

21 La función clEmpty es una función que devuelve verdadero si el valor que pasamos esta vació o contiene solo espacios en blanco, en este caso la usamos para determinar si la celda donde estamos trabajando ya esta vacía para asumir que hemos llegado al final de la captura en la hoja de *Excel™.

22 La instrucción Exit For rompe el ciclo For sin llegar al final.

23 Creamos un RecordSet para buscar en la tabla de clientes el dato que estamos leyendo de la celda de *Excel™ ya que si el dato existe en la tabla solo tenemos que actualizar los datos y si no existe los insertamos.

29 Query.Reset es un método que limpia el Objeto de su estado y de la lista de campos que le agregamos, este método es mas rápido que crear un objeto vació.

31 Si el RecordSet nos devuelve EOF quiere decir que el cliente no existe en la base de datos. 32 Si el cliente no existe en el catalogo nuestro Objeto Query entra en modo de inserción por medio de la instrucción Query.strState = "INSERT".

34 Si el cliente existe entonces solo actualizamos los datos basados en la clave del cliente, esto lo hacemos indicando que se va a hacer un UPDATE con la instrucción Query.strState =

"UPDATE".

35 Cuando hacemos una actualización (UPDATE) es muy importante indicar el rango de datos que deseamos afectar, por medio de la propiedad Condition del objeto Query, la condición es una cadena de texto que indica una condición que sigue las mismas reglas del comando

WHERE de SQL, nótese que estamos concatenando el valor de la celda de Excel una comilla

sencilla al principio y al final esto se debe a que en SQL la comilla sencilla se usa como delimitador de las constantes de texto.

39 El método AddField de Query se usa para indicar las columnas o campos que se van a afectar con la inserción o la actualización, los parámetros de AddField son:

1.- El nombre de la tabla que vamos a afectar 2.- El nombre del campo que deseamos afectar 3.- El valor que vamos a insertar o actualizar

43 El método Exec del Objeto Query es el encargado de enviar la orden de SQL y ejecutarla en el servidor de la base de datos.

(9)

4. Ejemplo de cómo realizar un reporte con parámetros 01 Sub Main() 02 Dim condicion 03 04 ParamData.ParametrosRequeridos _ 05 "Pacientes", _ 06 "Paciente inicial", _ 07 "Pacientes", _ 08 "Paciente final" _ 09 , _ 10 , _ 11 , _ 12 , _ 13 , True 14 15

16 Rangos Ambiente, False 17 18 19 If Cancelado Then 20 Exit Sub 21 End If 22 23 condicion = "" 24

25 If Not ParamData.Todos1 Then 26 condicion = _

27 " AND paciente >= " & ParamData.BusquedaIni & _ 28 " AND paciente <= " & ParamData.BusquedaFin 29 End If

30 31

32 If Not ParamData.TodasLasFechas Then 33 condicion = condicion & " AND fecha >= " & _ 34 fechaSQL( ParamData.FechaInicial ) & _ 35 " AND fecha <= " & _

36 fechaSQL( ParamData.FechaFinal ) 37 End If

38

39 iniciaDocumento

40 Reporte.SQL = "SELECT * FROM imc WHERE paciente > 0 " & condicion 41 Reporte.SQL = "SELECT * FROM imc WHERE paciente = 1"

42 Reporte.RetrieveColumns 43 Reporte.ImprimeReporte 44

45 finDocumento 46 End Sub

04 ParamData es un objeto que abre una ventana para la selección de rangos de datos, o rangos de fechas, sus parámetros son:

Parámetro 1 nombre de la primera búsqueda, las comas que se encuentran en seguida indican parámetros que pueden incluir una segunda búsqueda pero que en este momento no se ocupan pero es necesario indicarlas como parte de la instrucción.

16 n este momento se muestra una ventana de rangos con el método Rangos que tiene dos parámetros:

(10)

21 Validamos si se presionó el CANCELADO de la ventana de rangos, si es verdadera entonces con la instrucción ExitSub nos salimos de la aplicación.

23 Aquí inicializamos la variable condición que nos servirá para guardar los datos que se seleccionen en la ventana de rangos.

27 Esta parte valida si se utilizara el primer parámetro de rangos establecidos en

ParamData , con la propiedad ParamData.Todos1

28 Si la condición es verdadera entonces le asignamos los datos de la ventana de rangos a la variable condicion.

35 " AND paciente >= " & ParamData.BusquedaIni & con esta instrucción estamos indicando que agregue a la búsqueda el dato seleccionado y se tomará como parámetro inicial. 36 " AND paciente <= " & ParamData.BusquedaFin con esta instrucción estamos indicando que se agruegue a la búsqueda el dato seleccionado, tomándolo como parámetro final.

32 En este momento validamos si se requiere el filtro de las fechas tomando la propiedad

ParamData.TodasLasFechas. Si la condición fue verdadera entonces se le asigna a la

variable condicion los parámetros inicial y final que se tomaran de referencia para la búsqueda.

40 SQL es una propiedad del objeto Reporte a la que se le puede asignar una consulta a la base de datos concatenando los rangos seleccionados.

42 Retrievecolumns ejecuta la consulta para obtener los datos.

43 ImprimeReporte es una función que permite ver los datos generados del reporte en pantalla.

(11)

Ambiente de Desarrollo

El Ambiente de Desarrollo es un Entorno de Desarrollo Integrado (IDE) compuesto por un conjunto de herramientas útiles para el programador.

Para ingresar al Ambiente de Desarrollo debemos dar clic en el menú Configuración, Ambiente

de Desarrollo.

El Ambiente de Desarrollo presenta la siguiente ventana:

Las partes de la ventana del área de desarrollo son:

(12)

Barra de herramientas

Barra de identificación

En esta barra podemos ingresarle un nombre a la forma que estamos diseñando, así como establecerle una descripción a la misma. También podemos acceder a los controles y a algunos de sus eventos. Los controles son objetos con los que pueden interactuar los usuarios para escribir o manipular datos. Los eventos son notificaciones que hacen que se ejecute un procedimiento.

Barra de Controles

En esta barra se encuentran los controles con los cuales podemos trabajar e implementarlos en el diseño de una forma.

Barra de Herramientas adicionales

En esta barra se encuentran herramientas que nos permiten eliminar un control del formulario, acceder a las propiedades de un control, bloquear los controles del formulario para que no se muevan por descuido cuando estamos diseñando una forma y también un icono para ejecutar la forma previamente diseñada.

Área de diseño

Para acceder a esta parte de la ventana del Ambiente de Desarrollo solamente debemos dar clic en la pestaña Diseño, esta área nos sirve para poder agregar controles a nuestra forma. Para colocar un control a la forma solo debemos arrastrar el control dentro de la misma, pulsando un clic izquierdo sobre el control deseado (etiqueta, caja de texto, botón, etc) sin soltarlo hasta que estemos posicionados en el formulario.

(13)

Si deseamos hacer más grandes los controles basta con darles un clic derecho arrastrando y cuando tengan el tamaño deseado soltamos el botón del mouse.

Para poder establecer nombre, alto, ancho, posición superior e izquierda, texto y orden de cada uno de los controles que usamos solo debemos dar un clic en la herramienta Propiedades de la barra de herramientas adicionales.

Editor de código

Otra de las partes que se requieren para la creación de una forma es el “código” o conjunto de instrucciones que la computadora entiende para hacer determinadas acciones. Accedemos a esta área del Ambiente de Desarrollo dando un clic en la pestaña Código.

Debemos tener claro que aquí es donde programamos los eventos de los controles, subrutinas y estructuras de control necesarias para que una forma funcione adecuadamente de acuerdo a nuestros requerimientos.

(14)

Realizando un ejercicio

Ahora seguiremos paso a paso la manera de elaborar una forma de principio a fin. El ejemplo nos permitirá agregar, modificar y eliminar registros de una tabla que contiene los campos: paciente, nombre y teléfono.

1. Arrastraremos tres etiquetas, tres cajas de texto y tres botones de tal modo que el diseño de la forma se parezca a la siguiente.

Como podemos darnos cuenta todas las etiquetas se diferencian porque tienen como texto

Label, las cajas de texto; Fields y los botones Command.

2. Ahora procederemos a modificar los textos y los nombres de nuestros controles (etiquetas, cajas de texto y botones), para realizar esto debemos dar clic a la herramienta propiedades que se encuentra debajo de la barra de controles.

Para colocar un texto que queremos que se muestre en una etiqueta solo debemos modificar lo que dice en Texto, como lo muestra la siguiente imagen:

(15)

En el caso de la ventana anterior a la etiqueta que insertamos primero le dimos por texto Paciente.

3. Ahora procederemos a establecer texto a las etiquetas dos y tres, respectivamente, quitarle lo que tiene en texto a las cajas de texto y colocarles texto a los botones, de tal modo que nuestra ventana quede como la que mostramos en la imagen.

Hasta este momento solo hemos trabajado con la opción Texto de la ventana de propiedades de los controles. Ahora utilizaremos la opción Nombre que nos servirá para identificar que control desencadena un evento.

4. En la misma ventana de propiedades de los controles vamos a cambiar el Nombre de los mismos, por default, cuando insertamos una etiqueta, el nombre que se coloca es lblLabel0, lblLabel1,… lblLabeln, cuando insertamos una caja de texto, el nombre que tienen es txtFields0, txtFields1,… txtFieldsn y los botones llevan por nombre cmdButton0, cmdButton1, cmdButtonn.

A las etiquetas no es tan común modificarles el nombre que traen por default, en este ejemplo las dejaremos como están, solo a las cajas de texto y a los botones le cambiaremos el nombre siendo para las primeras txtPaciente, txtNombre y txtTelefono respectivamente, en cuanto a los botones les colocaremos de nombre cmdGuardar, cmdEliminar y cmdSalir.

(16)
(17)

Programando una forma de MyBusiness POS

Windows es un sistema operativo que maneja eventos esto es que no hace nada hasta que algo externo lo altera como un clic del Mouse, el presionar una tecla o una solicitud de la tarjeta de red, etc, para esto dentro de las ventanas existen eventos predefinidos que se ejecutan según su nombre.

Para agregarle eventos a nuestra ventana es necesario seleccionar el control o la ventana a la que deseamos programar el evento, de un clic en un área vacía de la ventana y en la parte superior donde dice Eventos seleccione Form_Load() este evento es el primero en ejecutarse antes incluso de que la ventana sea visible.

Evento Load

01 Sub Form_Load() 02

03 Me.Caption = "Calculo del Índice de masa corporal" 04 txtEstatura.TabIndex = 0 04 txtPeso.TabIndex = 1 05 cmdCalcular.TabIndex = 2 06 cmdSalir.TabIndex = 3 07 cmdSalir.Cancel = True 08 09 End Sub

01 Dentro del evento Load colocamos el código que necesitamos que se ejecute antes de que la ventana sea visible por ejemplo:

03 Me.Caption = “Cálculo del índice de masa corporal” .

En la instrucción cambiamos la propiedad Caption de la ventana que diseñamos previamente el objeto Me se refiere a esta ventana.

(18)

04 TabIndex indica el orden que van a seguir los controles para tomar el foco cuando se presiona la tecla TAB.

07 Cancel es una propiedad que tienen los botones esta propiedad indica que el código que tenga el botón se va a ejecutar cuando se presione la tecla ESCAPE.

Evento Click

Otro evento que usamos en prácticamente todos los formularios es el Button_Click. El cual se “dispara” o entra en funcionamiento cuando damos un click sobre algún control que acepte el evento clic como botones, cajas de texto, etc.

01 Sub Button_click() 02

03 If ControlEvento.Tag = "cmdCalcular" Then 04 txtIMC = _

05 Val2( txtPeso ) / ( Val2(txtEstatura) * _ 06 Val2(txtEstatura) )

07 End If 08

09 If ControlEvento.Tag = "cmdSalir" Then 10 descargaForma

11 End If 12

13 If ControlEvento.Tag = "cmdAlta" Then

14 Script.RunForm "CGDL008", Me, Ambiente,, True 15 End If

16

17 End Sub

01 Dentro del evento click de un botón colocamos el código que se va a ejecutar cuando pulsemos un clic sobre el mismo.

03 ControlEvento.Tag sirve para validar que control disparó el evento click, en este caso la condición If verifica si el botón fue el que tiene el nombre cmdCalcular.

04 a 06 Realiza el cálculo del Índice de Masa Corporal el cual se vera reflejado en la caja de texto llamada txtIMC.

07 End If Cierra la condicional de la línea 03.

10 descargaForma sirve para descargar el formulario activo o para cerrarlo.

14 Script.RunForm sirve para ejecutar una forma que hayamos diseñado, los parámetros son: 1. Nombre de la forma: "CGDL008"

2. Objeto Padre: Me 3. Objeto Ambiente: Ambiente 4. Valores que se pasan

5. Si es modal o no, si es Modal le colocamos Trae

Evento LostFocus

El evento LostFocus se produce cuando un objeto pierde el enfoque. Un control pierde el enfoque por la acción del usuario, por ejemplo, cuando se hace una tabulación o un clic en otro control.

(19)

01 Sub Text_LostFocus() 02

03 If ControlEvento.Tag = "txtPaciente" Then 04

05 If clEmpty(txtPaciente) = False Then 06 Dim rstPaciente

07

08 Set rstPaciente = CreaRecordSet("SELECT paciente FROM " & _ 09 "pacientesgdl WHERE paciente = " & txtPaciente & "", _ 10 Ambiente.Connection)

11

12 If rstPaciente.EOF Then

13 MyMessage "El paciente no esta registrado" 14 cmdAlta.SetFocus

15 End If

16 Else 17

18 MyMessage "Escribe la clave del paciente" 19 txtPaciente.SetFocus 20 21 End If 22 23 End If 24 25 26 End Sub

01 Dentro del evento LostFocus de una caja de texto colocamos el código que se ejecutará cuando una caja de texto pierda el enfoque o foco.

14 SetFocus es un método que asigna el enfoque a un control, en nuestro ejemplo se le asigna el enfoque o foco al botón llamado cmdAlta.

Evento DblClick

Este evento se dispara cuando damos doble clic sobre un control, este evento lo podremos encontrar en el control caja de texto o textBox.

01 Text_DblClick() 02

03 Label0.caption = "Nombre" 04

05 End Sub

Este código nos indica que al dar doble clic sobre la caja de texto el titulo de nuestra etiqueta lblLabel0 cambiara a “Nombre”. Así también podemos colocar las sentencias que deseemos se realicen al dar doble clic sobre ele control.

Eventos KeyDown y KeyUp

Para tener un mayor control en las teclas pulsadas, se suelen comprobar en los eventos

KeyDown y KeyUp, la principal diferencia con el evento KeyPress es que en este caso no son

(20)

KeyCode es el código de la tecla, no el código ASCII, aunque en la mayoría de los casos

coincide, aunque no en todos.

Entre otras teclas, además de las normales, se pueden detectar las teclas de función (F1, F2, etc), las teclas de bloqueo de mayúsculas, bloque numérico, etc.

Debemos tener en cuenta que el evento KeyDown se produce cuando se presiona la tecla y KeyUp cuando se suelta.

Uso de MySQL Front

Mysql es un Sistema manejador de base de datos o como su nombre en ingles indica (DataBase Managment System). El DBMS es conocido también como Gestor de Base de datos.

Su función es manejar los datos de acuerdo a las peticiones de los usuarios.

MySQL es un sistema de administración de bases de datos. Una base de datos es una colección estructurada de datos.

MySQL Front es una herramienta para visualizar los datos almacenados en las tablas de una base de datos de MyBusiness POS, aquí podemos trabajar de manera directa con dichos datos sin que MyBusiness POS intervenga, sin embargo es de vital importancia que los “usuarios comunes” no hagan modificación alguna de los datos, ya que si llegará a hacerlo, la base de datos usada en MyBusiness POS podría perder integridad, por tal motivo, es recomendable que solamente utilicen este Front personas que tengan conocimiento y la responsabilidad para hacerlo.

MySQL Front se encuentra en el disco de instalación de MyBusiness POS, lo podemos encontrar en una carpeta comprimida en formato zip llamada MySQL Front.zip, para poder utilizarla basta con descomprimir dicha carpeta en cualquier ubicación de nuestro disco duro y dar doble clic sobre el archivo ejecutable llamado mysqlfront.exe.

Al haber dado doble clic sobre el icono anteriormente mencionado aparecerá la siguiente ventana:

Procederemos ahora a crear una conexión que nos permitirá ver las bases de datos de MYSQL que se encuentran en nuestro disco duro, para tal efecto, debemos pulsar el botón New de la ventana Connection to MySQL Host…

(21)

En la casilla de Description podemos establecer cualquier nombre que nosotros deseemos para identificar la conexión.

Siempre que queramos utilizar MySQL deberemos hacer login como usuarios en el servidor. Ahora solo debemos indicar los datos de la conexión como nombre del servidor o host al que nos conectaremos, esto es, si la base de datos se encuentra en nuestra máquina el dato que capturaremos es localhost, si fuese la conexión remota es necesario que en el campo se ecriba el nombre de la máquina o bien su direccion IP (Una dirección IP es un número que identifica de manera lógica y jerárquicamente a una interfaz de un dispositivo (habitualmente una computadora) dentro de una red que utilice el protocolo IP (Internet Protocol). ¿Dónde la puede encontrar? Puede entrar al símbolo del sistema (MS-DOS) y teclear el comando ipconfig, el cual le desplegara las siguientes líneas:

(22)

El siguiente dato que debemos capturar es el nombre del servidor de base de datos, al instalar MySQL, por defecto se crea el usuario root, sin ninguna contraseña. Este el usuario más importante, ya que posee total control sobre las bases de datos, por lo que lo primero que debemos hacer es proporcionarle una contraseña(es solo recomendable para conexiones remotas).

El puerto de comunicación siempre será el 3306. El último dato es el nombre de la base de datos.

Al dar aceptar nos aparecerá la siguiente ventana:

Tenemos una barra de menús en los cuales podremos encontrar opciones para guardar información, copiar, pegar, hacer un diagnostico de las tablas, ayuda, etc.

La segunda es la barra de herramientas con lo que podremos verificar operaciones, actualizar datos, etc.

Del lado derecho podemos ver el nombre de la base de datos a la que nos conectamos, si queremos ver las tablas que contiene debe dar clic sobre el signo (+). Al dar doble clic sobre cualquiera nos aparecerá la información que a continuación se presenta:

Como podemos observar aparecen 5 pestañas con los encabezados de Host, DataBase,Table, Data, Query al dar clic a cualquiera de ellas nos desplegará la información que le corresponde, esto es, la pestaña Tabla como se muestra contiene el nombre de cada campo, longitud ,etc.

(23)

En Data encontraremos los registros almacenados y en Query podremos realizar consultas a la base de datos (entiendase como consulta a aquella instrucción que utiliza el lenguaje de programación estructurado SQL) de la siguiente manera:

En la parte derecha tenemos un botón que dice Run(F9) con el cual podremos checar la consulta que escribimos, si no tiene errores debe mostrarnos información como se muestra en la parte inferior de la ventana. Esta parte es muy útil ya que podremos hacer las pruebas necesarias hasta obtener los resultados esperados.

Tipos de tablas en MySQL

1. ISAM.- es el formato de almacenaje mas antiguo, y posiblemente pronto desaparecerá.

Presentaba limitaciones (los ficheros no eran transportables entre máquinas con distinta arquitectura, no podía manejar ficheros de tablas superiores a 4 gigas). Si aun tienes tablas tipo ISAM, cambialas a MYISAM ya!

2. MYISAM.- es el tipo de tabla por defecto en MySQL desde la versión 3.23. Optimizada para sistemas operativos de 64 bits, permite ficheros de mayor tamaño que ISAM. Además los datos se almacenan en un formato independiente, con lo que se pueden copiar tablas de una máquina a otra de distinta plataforma. Posibilidad de indexar campos BLOB y TEXT

3. HEAP.- Crea tablas en memoria. Son temporales y desaparecen cuando el servidor se cierra; a diferencia de una tabla TEMPORARY, que solo puede ser accedida por el usuario que la crea, una tabla HEAP puede ser utilizada por diversos usuarios.

4. BDB.- Base de datos Berkeley. TST. Solo en MySQL MAX

5. INNODB.- TST, ACID, con posibilidad de commit, rollback, recuperación de errores y bloqueo a nivel de fila.

6. MERGE mas que un tipo de tabla es la posibilidad de dividir tablas MYISAM de gran tamaño (solo útil si son verdaderamente de GRAN tamaño) y hacer consultas sobre todas ellas con mayor rapidez. Las tablas deben ser myisam e idénticas en su estructura.

Tipos de datos

Al diseñar nuestras tablas tenemos que especificar el tipo de datos y tamaño que podrá almacenar cada campo.

Una correcta elección debe procurar que la tabla no se quede corta en su capacidad, que destine un tamaño apropiado a la longitud de los datos, y la máxima velocidad de ejecución.

(24)

Básicamente mysql admite dos tipos de datos: números y cadenas de carácteres. Junto a estos dos grandes grupos, se admiten otros tipos de datos especiales: formatos de fecha, etc. datos numéricos

En este tipo de campos solo pueden almacenarse números, positivos o negativos, enteros o decimales, en notación hexadecimal, cientifica o decimal.

Los tipos numéricos tipo integer admiten los atributos SIGNED y UNSIGNED indicando en el primer caso que pueden tener valor negativo, y solo positivo en el segundo.

Tipos más usados por MyBusiness

TINYINT es un número entero con rango de valores válidos desde -128 a 127. Si se configura

como unsigned (sin signo), el rango de valores es de 0 a 255.

INT para almacenar números enteros, en un rango de -2147463846 a 2147483647. Si

configuramos este dato como unsigned, el rango es 0 a 4294967295.

DOUBLE Número de coma flotante de precisión doble.( (m,d) representa números decimales.

Podemos especificar cuantos dígitos (m) pueden utilizarse (término también conocido como ancho de pantalla), y cuantos en la parte decimal (d). Mysql redondeará el decimal para ajustarse a la capacidad).

CHAR Este tipo se utiliza para almacenar cadenas de longitud fija. Su longitud abarca desde 1

a 255 caracteres.

VARCHAR Al igual que el anterior se utiliza para almacenar cadenas, en el mismo rango de

1-255 caracteres, pero en este caso, de longitud variable. Un campo CHAR ocupará siempre el máximo de longitud que le hallamos asignado, aunque el tamaño del dato sea menor (añadiendo espacios adicionales que sean precisos). Mientras que VARCHAR solo almacena la longitud del dato, permitiendo que el tamaño de la base de datos sea menor. Eso si, el acceso a los datos CHAR es mas rápido que VARCHAR.

LONGTEXT hasta máximo de 4.294.967.295 caracteres

Varios

DATE para almacenar fechas. El formato por defecto es YYYY MM DD desde 0000 00 00 a

9999 12 31.

DATETIME Combinación de fecha y hora. El rango de valores va desde el 1 de enero del 1001

a las 0 horas, 0 minutos y 0 segundos al 31 de diciembre del 9999 a las 23 horas, 59 minutos y 59 segundos. El formato de almacenamiento es de año-mes-dia horas:minutos:segundos

TIME almacena una hora. El rango de horas va desde -838 horas, 59 minutos y 59 segundos a

838, 59 minutos y 59 segundos. El formato de almacenamiento es de 'HH:MM:SS'

YEAR almacena un año. El rango de valores permitidos va desde el año 1901 al año 2155. El

campo puede tener tamaño dos o tamaño 4 dependiendo de si queremos almacenar el año con dos o cuatro dígitos.

INDICES

Un índice (o KEY, o INDEX) es un grupo de datos que MySQL asocia con una o varias columnas de la tabla. En este grupo de datos aparece la relación entre el contenido y el número de fila donde está ubicado.

Los índices -como los índices de los libros- sirven para agilizar las consultas a las tablas, evitando que mysql tenga que revisar todos los datos disponibles para devolver el resultado. ¿para que sirven ?

(25)

Los index permiten mayor rápidez en la ejecución de las consultas a la base de datos tipo SELECT ... WHERE

La regla básica es pues crear tus índices sobre aquellas columnas que vayas a usar con una cláusula WHERE, y no crearlos con aquellas columnas que vayan a ser objeto de un SELECT: SELECT texto from tabla_libros WHERE autor = Vazquez; En este ejemplo, la de autor es una columna buena candidata a un indice; la de texto, no.

Otra regla básica es que son mejores candidatas a indexar aquellas columnas que presentan muchos valores distintos,

Tipos de indice

En algunas bases de datos existen diferencias entre KEY e INDEX. No así en MySQL donde son sinónimos.

Un índice que sí es especial es el llamado PRIMARY KEY. Se trata de un índice diseñado para consultas especialmente rápidas. Todos sus campos deben ser UNICOS y no admite NULL Un indice UNIQUE es aquel que no permite almacenar dos valores iguales.

Los indices FULL TEXT permiten realizar búsquedas de palabras. Puedes crear indices FULLTEXT sobre columnas tipo CHAR, VARCHAR o TEXT.

Haciendo una tabla en Mysql

Para empezar hay que dar clic sobre la barra de herramientas en el botón crear tabla, enseguida aparecerá lo siguiente:

En el primer campo debemos capturar una clave única para la tabla y a continuación su descripción. Es importante que los nombres que se escojan sean claros y relacionados a los campos que se almacenarán, con el fin de que sea entendible para cualquier usuario.

Agregamos las columnas en el campo fields, colocando el nombre, tipo de dato, longitud, indice,etc.

Para terminar damos clic sobre el botón Create.

Como comentario, en la parte inferior de la ventana aparece un cuadro en blanco con algunas instrucciones SQL, las cuales se generan cada vez que damos clic sobre alguna tabla para ver sus campos, o bien cuando mostramos la información que contiene la base de datos. Sirven como referencia si quisiéramos realizar esas operaciones de forma directa usando código y no con la ayuda de la aplicación gráfica mysqlfront.

(26)

Para visualizar los cambios efectuados en nuestra base de datos presionamos la tecla F5. Algunas reglas que debemos tomar en cuenta al crear tablas son las siguientes:

Algunas reglas a recordar son las siguientes:

1.- longitud: es opcional SALVO para los campos tipo DECIMAL NUMERIC CHAR y VARCHAR.

Por ejemplo, CREATE TABLE mi_tabla (id_field INT(4));

Como sabemos, las columnas tipo INT pueden albergar desde -2147463846 a 2147483647 (unsigned). Al fijar el rango en 4, lo limitamos desde -999 a 9999. NOTA: MySQL guardará correctamente el dato fuera del rango especificado,

siempre que no esté, además, fuera del rango para ese tipo de columna.

Para datatypes no numéricos, el rango determina el número fijo de carácteres almacenados en cada caso (CHAR) o el número máximo permitido (p.e. VARCHAR).

2.-decimal: máximo número de decimales para aquellos datatypes que admiten decimales. Si el número a almacenar tiene mas, será redondeado:

FLOAT (5,2)

=> 2.14 se almacena como 2.14

=> 32.147 se almacena como 32.15 (5 caracteres en total) => 232.14 se almacena como 232.1

Es decir, un número máximo de 5 caracteres, un número máximo (si caben en el total) de 2 decimales.

El atributo BINARY puede usarse con CHAR y VARCHAR, con el único efecto de que en caso de búsqueda distinguirá mayúsculas y minúsculas.

3.- El atributo ZEROFILL solo puede emplearse con datos tipo numérico. El atributo

UNSIGNED solo puede emplearse con datos del tipo numérico entero.

4.- Cada columna (independientemente de su tipo) puede ser NULL o NOT NULL. Si no especificas nada, se asume que la columna es NULL

5.- Las columnas (salvo que sean AUTO_INCREMENT) siempre tienen un valor por defecto. Si la columna es tipo NULL el valor por defecto es justamente ese, NULL. Si es NOT NULL, y la columna numérica, el valor por defecto es 0. Si la columna no es tipo numérica el valor por defecto será "" (cadena vacia). Puede establecerse un valor por defecto propio con DEFAULT.

6.- Solo puede existir una columna AUTO_INCREMENT por tabla, que debe ser del tipo entero, y además NOT_NULL

7.- La columna AUTO_INCREMENT siempre será considerada como índice primario (PRIMARY KEY).

(27)

Ejemplo de reportes con Parámetros 01Sub Main() 02 Dim condicion 03 04 05 ParamData.ParametrosRequeridos _ 06 "Pacientes", _ 07 "Paciente inicial", _ 08 "Pacientes", _ 09 "Paciente final" _ 10 , _ 11 , _ 12 , _ 13 , _ 14 , True

15 Rangos Ambiente, True 16 If Cancelado Then 17 Exit Sub 18 End If 19 20 condicion = "" 21

22 If Not ParamData.Todos1 Then 23 condicion = _

24 " AND paciente >= " & ParamData.BusquedaIni & _ 25 " AND paciente <= " & ParamData.BusquedaFin 26 End If

27

28 If Not ParamData.TodasLasFechas Then 29 condicion = condicion & " AND fecha >= " & _ 30 fechaSQL( ParamData.FechaInicial ) & _ 31 " AND fecha <= " & _

32 fechaSQL( ParamData.FechaFinal ) 33 End If

34

35 iniciaDocumento

36 Reporte.SQL = "SELECT * FROM imc WHERE paciente > 0 " & condicion 37 'Reporte.SQL = "SELECT * FROM imc WHERE paciente = 1"

38 Reporte.RetrieveColumns 39 Reporte.ImprimeReporte 40

41 finDocumento

05 ParamData es un objeto que abre una ventana para la selección de rangos de datos, o bien

rangos de fechas. Contiene los siguientes parámetros:

1.-Nombre de la primera búsqueda, la cual fue previamente registrada en el sistema desde el asistente de búsquedas en la pestaña Programación (vease el apartado Editor de búsquedas). 2.-El título que parecerá en la ventana.

3.-nombre de la búsqueda.

4.- Titulo que aparecerá en la ventana.

Los parámetros 5, 6, 7,8 son para desplegar los rangos de fechas, la palabra reservada trae hace referencia a estos rangos.

(28)

En este momento validamos que el usuario cierre la ventana y no realice ninguna búsqueda. Es importante incluirla ya que de lo contrario marcara un error al cancelar la búsqueda.

22 ParamData.Todos1 indica si se va a utilizar el primer rango o no, si la condición se cumple entonces vamos a asignar el valor de los datos que el usuario haya seleccionado para tomarlos como referencia para mostrar la información.

28 ParamData.TodasLasFechas Indica si se requiere el filtro de fechas o no, es decir, si

nosotros queremos ver información que incluya todas las fechas o si queremos utilizar un filtro

para seleccionar sólo un rango. Es por ello que la condición inicia con IF NOT que significa si no se cumple la condición.

35 iniciaDocumento() es un método con el cual siempre iniciamos la salida de información en

pantalla.

El objeto Reporte solo es visible dentro de un Script del tipo reporte, el cual contiene diferentes propiedades que nos ayudarán a darle formato a nuestro documento.

36 La primer propiedad que veremos es Reporte.SQL, a la cual se le puede asignar cualquier consulta SQL (Lenguaje de Consulta Estructurado) que utilizaremos para generar el reporte.

38 Reporte.RetrieveColumns es un método del objeto Reporte, el cual nos permite obtener la

información que se haya obtenido de la consulta a la base de datos (Reporte.SQL).

39 Reporte.ImprimeReporte es un método del objeto Reporte que nos permite visualizar la información en la pantalla.

41 FinDocumento Indica el fin para mostrar los datos en pantalla.

(29)

Ejemplo de gráficos

01 Sub Main() 02 Dim rstIMC 03

04 Grafica.Header.Text(0) = "Comportamiento del IMC" 05

06 Set rstIMC = CreaRecordSet( _

07 "SELECT * FROM imc WHERE paciente = 1", _ 08 Ambiente.Connection )

09

10 Grafica.AddSeries 6 11 Grafica.AddSeries 6 12

13 While Not rstIMC.EOF 14 Grafica.Series(0).Add _

15 rstIMC("imc"), rstIMC("imc"), vbRed 16 17 Grafica.Series(1).Add 26, "", vbYellow 18 19 rstIMC.MoveNext 20 Wend 21 Me.Grafica.Panel.BackImageLoad "d:\xenical.jpg" 22 End Sub

02 Declaramos la variable a la que se le asignara el recordset de la base de datos.

04 Esta instrucción le asigna la cadena “Comportamiento del IMC” al encabezado de la ventana del grafico, asignada al objeto Grafica con la propiedad Header (encabezado).

06 Creamos el recordset para obtener la información que resulte de la consulta a la base de datos. La palabra reservada set nos permite asignarle un valor a la variable rstIMC y CreaRecordSet es la función que crea el recorset, esta se puede sustituir por la palabra rst. 10 En este momento definimos el tipo de grafico a utilizar, es decir podemos seleccionar entre 6 diferentes tipos preestablecidos en MyBusiness. Hacemos la asignación cambiando el valor numérico de la sentencia Grafica.AddSeries 6.

Valores:

0: Línea recta en tercera dimensión 1: Barras verticales

2: Barras horizontales 3: Triángulos

4: Intersecciones con rectángulos 5: En forma de pastel

6: Línea recta

Nota: Por cada grafico que deseemos ver en pantalla necesitamos incluir la línea de código Grafica.AddSeries 6 con el tipo de grafico.

13 Recorremos los registros del recordset y mientras no sea fin de archivo que realice la operación.

14 Le agregamos a la grafica los datos del recordSet para que se muestre en pantalla, con la sentencia Grafica.Series(0).Add rstIMC("imc"), rstIMC("imc"), vbRed que contiene los siguientes parámetros:

(30)

1._El valor del grafico 2._El encabezado

3._La variable que hace referencia al color

Nota: Es muy importante que depende de los gráficos que deseemos desplegar en pantalla le

asignemos un número consecutivo como índice como sigue: Grafica.Series (0) y el primero siempre iniciara en cero.

19 Nos dirigimos al siguiente registro del recordset.

21 Aquí llamamos una imagen como fondo del gráfico con la propiedad Panel.BackImageLoad del objeto grafica, como argumento solo se coloca la ruta de la ubicación de la imagen que pondremos en el grafico, todo entre comillas.

References

Related documents

Three research articles presented within this disquisition bring together an integrative review of educational policy that impacts the work of postsecondary institutions as

In this study, Youhanson long term convergence and Grangery cause tests utilized to relationship type and Iran’s macroeconomics variables (Gross National Product, Global Oil

Considering the fact of increasing demand of home security and automation, an Android based control system is presented in this paper where the proposed system can maintain

There are a variety of expressions of safety—were S to believe P, P would be true, S’s belief that P is not easily wrong, and so on—but they come down to the same thing

Our contribution is to motivate a new approach for fault tolerance in distributed sys- tems and to give a general concept for system design- ers which states what decision spaces can

The chief advan- tage of a discriminative framework is the ability to score alignments based on arbitrary features of the matching word tokens, including orthographic form,

Jahmese Myres and City Councilmembers Kalb and Campbell-Washington... Conceive of citywide greenway planning in terms of an urban greening retrofit design – We do not have the