You are on page 1of 30

MyBusiness POS

Curso de Programador Avanzado

Septiembre de 2006

1
2
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
27 End Sub

3
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.

27 End Sub indica el final de la rutina Main().

4
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

5
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™.

6
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
50 End Sub

7
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.

46 El método Close cierra el archivo de Excel que abrimos previamente.

8
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:
Parámetro 1 Ambiente, Parametro2 el valor que se le otorga

9
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.

45 FinDocumento cierra la impresión de datos en pantalla.

10
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:

Barra de menús

11
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.

12
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.

13
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:

14
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.

15
Con esto terminamos el Tiempo de diseño de nuestra forma.

16
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.

17
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.

18
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
códigos ASCII, sino códigos de teclado.

19
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…

20
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:

21
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.

22
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.

23
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 ?

24
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.

25
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).

26
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.

15 Rangos Ambiente,True es un método que muestra la ventana de rangos.

27
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.

28
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:

29
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.

20 Terminamos el ciclo While con la instrucción Wend

30

You might also like