Guia Avanzada Del Programador
Short Description
Download Guia Avanzada Del Programador...
Description
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 oXLS.WorkBooks.Open( a ).
un
archivo
de
*Excel™
con
la
instrucción
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 = " & _ 34 fechaSQL( ParamData.FechaInicial ) & _ 35 " AND fecha 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 ParamData , con la propiedad ParamData.Todos1
rangos establecidos en
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.BusquedaIni & _ 25 " AND paciente = " & _ 30 fechaSQL( ParamData.FechaInicial ) & _ 31 " AND fecha 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
View more...
Comments