Upload
jcerecer
View
137
Download
10
Embed Size (px)
Citation preview
Mdulo de Arquitectura Organizacional
ADVPL BASICOFabrica de SoftwareMaterial de Apoyo para Curso
Contenido
1. IDE
1.1 Configuraciones y Preferencias
1.2 Proyectos
1.3 Editar/Localizar, sustituir lnea,
1.4 Instrucciones para debuguear
2. Programacin 2.1 Origen del lenguaje y evolucin
2.2 Variables
2.2.1 Tipos (caracter, numrica, fecha, lgica)
2.2.2 Alcance (locales y privadas)
2.2.3 Asignacin de valores
2.3 Arreglos o Matrices
2.3.1 Definicin
2.3.2 Mtodos para crear y asignar valores
2.4 Operadores y prioridad de ejecucin2.4.1 Operadores Matemticos2.4.2 Operadores de String2.4.3 Operadores Relacionales o Comparacin2.4.4 Operadores Lgicos2.4.5 Operadores de Asignacin2.4.6 Asignacin Simple2.4.7 Asignacin en Lnea2.4.8 Asignacin Compuesta2.4.9 Operadores de Incremento y Decremento2.4.10 Operadores Especiales2.4.11 Orden de Precedencia de Operadores de Asignacin en Lnea2.5 Macro sustitucin2.6 Bloques de Cdigo3. Funciones.3.1 Funciones de fecha y hora
3.2 Funciones de cadena3.3 Control de flujo
3.3.1 Desvi condicional
3.3.2 Do Case
3.3.3 Do While
3.3.4 For
4. Manejo de Tablas.4.1 ndices (con fechas, numricos, etc.)4.2 Funciones para Manejo de Tablas4.3 Lectura y actualizacin de datos
4.4 Instrucciones SQL
4.5 Concepto de Filial y archivos compartidos
4.6 Control de Transacciones
5. ADVPL y Configurador5.1 Gatillos
5.2 Funciones para Registro de Datos
5.2.1 AxCadastro
5.2.2 Pantalla Modelo2
5.2.3 Pantalla Modelo3
5.3 Validaciones de Campo (Valid y When)
5.4 Regla de avance (Processa(), IncProc(),etc.)5.5 Impresin en modo texto
5.6 Puntos de entradaround(3.141517,3)
3.142
1. IDE
En este capitulo , aprenderemos como debern ser hechas las configuraciones bsicas de herramientas IDE, para un mejor aprovechamiento de sus recursos.
1.1 Configuraciones y Preferencias.
En la opcin de Preferencias es donde se definen los parmetros que influyen en el comportamiento de Advance Protheus IDE, o sea, el Perfil de teclas utilizado, Colores de los Fuentes, Tabuladores, etc.Ejercicio 1. Como Parametrizar Herramienta IDE.1. Cargue el Advance Protheus Server, a travs del atajo en el escritorio.
2. Entre a la Herramienta IDE, de la misma manera.
3. Selecciona las opciones Arquivo + Preferencias
4. En la pasta General, en Estndar de Teclas Utilizadas, seleccione la opcin Visual C++.
5. En Configuraciones del Editor selecciones Idioma , Espaol
6. Marque la opcin Ignorar todos los fuentes no encontrados, que esta localizado en la parte inferior7. En la pasta de Cdigo, verifique los colores que sern utilizados durante la digitacin del Fuente.
8. En la pasta Control de Versin, informe el camino del Software utilizado para realizar el Control de Versin de los Fuentes, en caso de que sea utilizado alguno.
9. Confirme.
Despus de la definicin de las Preferencias que sern utilizadas, se debe configurar el Ambiente de Trabajo que ser utilizado por el compilador, o sea, la ruta que deber ser usada por la herramienta IDE para actualizar un determinado RPO durante la compilacin de los fuentes.Ejercicio 2. Como Configurar Herramienta IDE.
1. Seleccionar Archivos + Configuraciones
2. Clic en la opcin Adicionar
3. En el campo Descripcin, informe el nombre del ambiente a ser utilizado, puede ser Environment, o un nombre relacionado al curso, como Curso ADVPL.
4. En la pasta Compilacin, informe en el campo Ambiente el Nombre del Ambiente a ser utilizado por el compilador. Deber ser un ambiente vlido que se encuentre dentro del Advance Protheus Server MP8SRV.INI, que en este caso sera Environment.
5. En el campo Conexin informe el protocolo vlido, para la conexin con el Advance Protheus Server, que deber ser TCP.6. Por ltimo, en el campo Directorio de Includes, informe el camino de los directorios donde se encuentran la bibliotecas de los programas (*.CH), esa ruta podra ser C:\mp8\include, despus confirme la Configuracin de Ambientes
1.2 Proyectos.
Para compilar un programa ser necesario utilizar un proyecto de Trabajo.
Ejercicio 3. Generando un Proyecto de Trabajo.1. Seleccione Proyectos + Nuevo, proporcione un nombre al proyecto, por ejemplo Curso
2. Adicione un programa al proyecto en uso, haga clic con el botn derecho del Mouse sobre la pasta de Fontes del mismo, seleccione la opcin Adicionar Archivos, posicionando el cursor sobre el programa y confirme.
3. Compile clicando con el botn derecho del Mouse sobre el programa en cuestin y seleccione la opcin compilar archivo.
4. Ser solicitado el Usuario, en este caso admin. Con Password en blanco.
2. Programacin2.1 Origen del Lenguaje y EvolucinEl lenguaje de programacin ADVPL tiene el objetivo de permitir al usuario de Advance Protheus construir sus propios programas, agregarlos a los Mens de los mdulos y ejecutarlos de una forma transparente al operador.De forma anloga, las rutinas escritas por el usuario tambin pueden ser ejecutadas por medio de la funcin ExecBlock() o U_, donde el Advance Protheus acepta una expresin que es ejecutada en tiempo real.
El lenguaje ADVPL tiene su inicio en 1994, siendo en verdad una evolucin en el uso de lenguajes en el estndar xBase por Microsiga Software, S.A. (Clipper, Visual Objects y despus FireWin).Con la creacin de la tecnologa Protheus, era necesario crear un lenguaje que soportara el estndar de funciones de xBase para el mantenimiento de todo el cdigo existente del sistema ERP SIGA Advanced.Fue entonces creado el lenguaje llamado Advanced Prothues Lenguage.
El ADVPL es una extensin del estndar xBase de comandos y funciones, operadores, estructuras de control de flujo y palabras reservadas, contando tambin con comando y funciones disponible por Microsiga que lo transforma en un lenguaje completo para la creacin de aplicaciones ERP listas para Internet.
Tambin es un lenguaje orientado a objetos y eventos, permitiendo al programador desarrollar aplicaciones visuales y crear sus propias clases y objetos.Cuando son compilados todos los archivos del cdigo son transformados en unidades de inteligencia bsicas, llamados APOs (advanced Protheus Objects).Tales APOs son mantenidos en un repositorio y cargados dinmicamente por el Advanced Prothues Server para su ejecucin. Como no existen encadenamientos (Links), o unin fsica del cdigo compilado a un determinado modulo o aplicacin, funciones creadas en ADVPL puede ser ejecutada en cualquier punto de ambiente Advanced Protheus.El compilador y el interpretador del lenguaje ADVPL es el propio servidor Advanced Protheus y existe un ambiente visual para el desarrollo (IDE), donde el cdigo puede se creado, compilado y depurado.2.2 Variables.
2.2.1 Tipos
Existe un estandard estndar que se maneja en Microsiga para la definicin de la nomenclatura de los Tipo de Variables, como por ejemplo:
cVarCarcter
nVarNumrico
dVarFecha
lVarLgico
mVarMemo
aVarArray
uVarSin definicin
oVarObjeto
2.2.2 Alcance
PUBLIC: Esta variable ser inicializada en un valor lgico falso (.F.), hasta que sea atribuido un valor especifico. Esta variable permanece definida por toda la duracin de la aplicacin y puede ser vista por cualquier funcin. Esta variable genera un token en la tabla de smbolos, esto significa que el modulo principal contendr smbolos para esta clase de variables, lo que a su vez, ocupa mas espacio de memoria, debe evitar el uso de este tipo, use solo en casos extremos.
PRIVATE: Esta variable ser inicializada en valor nulo (NIL) y una vez declarada, permanecer as durante toda la duracin de el flujo de la funcin, hasta que este regrese al procedimiento inicial que la llamo. En esencia, una variable de memoria Private inicializada despus del inicio del Protheus, actuara como variable Public.
LOCAL: Esta variable ser inicializada con valor nulo (NIL) y solo es visible dentro de la funcin que la inicializa.
STATIC: Es idntica a la Local, con una excepcin, es retenido dentro de su subrutina despus que el flujo de la funcin es liberado. De tal forma que cuando la funcin vuelve a tomar control del programa, esas variables contienen su ltimo valor.Cuando no atribuimos ningn valor a una variable en el momento de su declaracin, corremos el riesgo de utilizarla con el valor NIL y causar errores fatales. Por eso, la inicializacin de una variable es de extrema importancia.
2.2.3 Asignacin de Valores o Declaracin.
Deben ser hechas siempre en el inicio de la rutina que la utilizara, por ejemplo:
Static Function a910VerCod()
Local cCod910 := 001
Return2.3 Matrices (Array)2.3.1 DefinicinConjunto de variables de memoria con un mismo nombre, que tienen un ndice para diferenciar un elemento del otro.Algunas veces el tamao de la matriz es conocido previamente. Otras veces el tamao de la matriz solo ser conocido en tiempo de ejecucin.2.3.2 Mtodos para crear y asignar valores
Si el tamao de la matriz es conocido, puede ser declara de las formas siguientes:Local aX[10]
Local aZ:={0,0,0,0,0,0}
Local aB:= Array(10)
Si el tamao de la matriz NO es conocido, puede ser declarado de las formas siguientes:
Local aX[0]
Local aZ:={}
Local aB:= Array(0)
Existen diferentes funciones relacionadas con las matrices. Una descripcin breve de la finalidad de cada una de esas funciones se muestra a continuacin. Adems de esas funciones especificas para el manejo de matrices, pueden usurase otras funciones sobre una matriz, tales como LEN(), para verificar el tamao o numero de elementos, TYPE() o VALTYPE(), para verificar el tipo de elemento de la matriz.
AADD()Agrega, un elemento al final de la matriz especificada.
ACLONE() Duplica es decir, crea una nueva matriz que es idntica, en tamao y contenido, a la matriz fuente.
ACOPY()Copia los elementos de una matriz a otra
ADELBorra un elemento de la matriz
ADIR()Llena una o mas matrices con los datos de un directorio.
AEVAL() Evala un bloque de cdigo para cada elemento de la matriz.
AFIELDS()Llena una o mas matrices con el nombre y la descripcin de los campos de un archivo
AFILL()Llena una matriz con un valor determinado.
AINS()Inserta, un elemento en una posicin determinada de la matriz.
ASCAN()Busca, un determinado valor dentro de la matriz.
ASIZE()Redimensiona, el tamao de una matriz.
ASORT()Coloca en orden creciente o decreciente los elementos de una matriz.
2.4 Operadores y Prioridad de Ejecucin2.4.1 Operadores Matemticos
+Adicin
-Resta
*Multiplicacin
/Divisin
** o ^Exponenciacion
%Mdulo o Residuo de la divisin
2.4.2 Operadores de String
+Concatenacin de strings
-Concatenacin de strings con eliminacin de los blancos finales de los strings intermediarios
$Comparacin de Substrings (contenido en)
2.4.3 Operadores de ComparacinMayor que
= Igual
==Exactamente Igual (para caracteres)
= Mayor o Igual
# != Diferente
2.4.4 Operadores Lgicos.And.Y
.Or.O
.Not. !Negacin
2.4.5 Operadores de Asignacin=Asignacin simple
:=Asignacin en lnea
+=Adicin de asignacin en lnea
-=Sustraccin de asignacin en lnea
*=Multiplicacin de asignacin en lnea
/=Divisin de asignacin en lnea
**= ^=Exponenciacion y de asignacin en lnea
%=Mdulo (residuo) de asignacin en lnea
2.4.6 Asignacin simple
El sigo de igual es utilizado para asignar valor a una variable de memoria. nVariavel = 10
2.4.7 Asignacin en LneaEl operador de asignacin es caracterizado por 2 puntos y el signo de igual. Tiene la misma funcin del signo de igualdad solo, sin embargo con el se puede asignar un valor a ms de una variable al mismo tiempo:nVar1 := nVar2 := nVar3 := 0
Local nVar1 := 0, nVar2 := 0, nVar3 := 0por
Local nVar1 := nVar2 := nVar3 := 0
2.4.8 Asignacin Compuesta
Son una facilidad del lenguaje ADVPL para expresiones de clculo y atributos. Con ello se puede economizar la digitacin.OperadorExemploEquivalente a
+=X += YX = X + Y
-=X -= YX = X Y
*=X *= YX = X * Y
/=X /= YX = X / Y
**= o ^=X **= YX = X ** Y
%=X %= YX = X % Y
2.4.9 Operadores de Incremento y Decremento
++Incremento
--Decremento
Ejemplos:Local nA := 10
Local nB := nA++ + nA
.
2.4.10 Operadores Especiales
Adems de los operadores comunes, el AdvPl posee algunos otros operadores o identificadores. ()Agrupamiento o Funcin
[]Elemento de Matriz
{}Definicin de Matriz, Constante o Bloque de Cdigo
->Identificador
&Macro substitucin
@Paso de parmetros por referencia
2.4.11 Orden de Precedencia de Operadores de Asignacin en Lnea1. Operadores de pre-Incremento / pre-Decremento 2. Operadores de String
3. Operadores Matemticos
4. Operadores Relacionales5. Operadores Lgicos
6. Operadores de Asignacin7. Operadores de pos-Incremento / pos-Decremento En expresiones complejas:
1. Exponenciacin2. Multiplicacin y divisin3. Adicin y substraccinConsidere o ejemplo:
Local nResultado := 2+10/2+5*3+2^3
El resultado de esta expresin es 30, pues primeramente es calculada la exponenciacion 2^3(=8), entonces son calculadas las multiplicaciones y divisiones 10/2(=5), 5*3(=15), y finalmente las adiciones resultando en 2+5+15+8(=30).
2.5 Macro sustitucinEl operador de macro substitucion simbolizado por (&), es utilizado para la aplicacin de expresiones en tiempo de ejecucin. Funciona como si una expresin almacenada fuese compilada en tiempo de ejecucin, antes de ser de hecho, ejecutada. Por ejemplo:
01 X := 10
02 Y := "X + 1"
03 B := &Y //El contenido de B ser 11
La variable X es asignada con el valor 10, en tanto la variable Y es asignada con el string de caracteres conteniendo "X + 1".
La tercera lnea utiliza el operador de macro. Esta lnea hace que el nmero 11 sea asignado a la variable B. Se puede ver que ese es el valor resultante de la expresin en formato caracter contenida en la variable Y.
Utilizando una tcnica matemtica elemental, la substitucin, tenemos que en la segunda lnea, Y es definido como "X + 1", entonces se puede sustituir Y en la tercera lnea:03 B := &"X + 1"
El operador de macro cancela las dobles comillas:
03 B := X + 1
El operador macro tiene una limitacin: variables referenciadas dentro del string de caracteres (X en los ejemplos anteriores) no pueden ser locales.
2.6 Bloques de CdigoLos bloques de cdigo se parecen a una macro, solo que con algunas importantes diferencias. En una macro una expresin es un valor literal que solo se conoce durante la ejecucin del programa, cuando el macro se procesa. Si existiera un error de sintaxis, o cualquier otro tipo, este error ocurrir en el proceso de runtime.
El compilador por otra parte, compila el bloque de cdigo. Cualquier error se identifica a nivel de compilacin. Adems de eso el bloque de cdigo solo se compilara la primera vez. Si usted utiliza una macro, cada vez que tenga necesidad de utilizar la expresin, la macro tendr que compilarse, lo que demuestra que la macro ser mas lenta en un proceso intenso.
Una lista de expresiones es como un pequeo programa o funcin. Con pocos cambios, una lista de expresiones se pueden transformar en un bloque de cdigo.
( X := 10 , Y := 20 ) // Lista de Expresiones{|| X := 10 , Y := 20 } // Bloque de Cdigo
Note las llaves {} utilizadas en el bloque de cdigo. O sea, un bloque de cdigo es como una matriz. Sin embargo no lo es, y s una lista de comandos, una lista de cdigo.
// Esto es una matriz de datosA := {10, 20, 30}
// Esto es un bloque de cdigo, sin embargo funciona como
//si fuese una matriz de comandos.
B := {|| x := 10, y := 20}
Ejecucin de un Bloque de CdigonRes := Eval(B) ==> 20
La funcin Eval recibe como parmetro un bloque de cdigo y ejecuta todas las expresiones contenidas, retornando el resultado de la ltima expresin ejecutada.Pasando ParmetrosComo el bloque de cdigo son como pequeas funciones, tambin es posible el pase parmetros. Los parmetros deben ser informados entre las barras verticales (||) separados por comas, igual que una funcin.
B := {| N | X := 10, Y := 20 + N}
En la siguiente expresin se muestra el pase del parmetro, donde enva un 1 a N, y entonces ejecuta el bloque B.C := Eval(B, 1) ==> 21
Utilizando Bloques de Cdigo
Los bloques de cdigo pueden ser usados en diversas situaciones. Generalmente son utilizados para ejecutar tareas en los eventos de objetos accionados o para modificar el comportamiento estndar de algunas funciones.
Por ejemplo, considere la matriz:A := {"GARY HALL", "FRED SMITH", "TIM JONES"}
Esta matriz puede ser ordenada por el primer nombre, utilizando la funcin asort(A), resultado la matriz de la forma:
{"FRED SMITH", "GARY HALL", "TIM JONES"}
El orden por default en la funcin asort ascendente. Este comportamiento puede ser modificado a travs de un bloque de cdigo que ordena la matriz en forma descendente:
B := { |X, Y| X > Y }
aSort(A, B)El bloque de cdigo (de acuerdo con la documentacin de la funcin asort) debe ser escrito para aceptar 2 parmetros que son los dos elementos de la matriz para comparacin. Note que el bloque de cdigo no conoce que elementos se estn comparando.Entonces si la comparacin X > Y es verdadera los elementos estn en orden descendente, lo que significa que el primer valor es mayor que el segundo.
Para ordenar la misma matriz por el ltimo nombre, tambin en orden descendente, se puede utilizar el siguiente bloque de cdigo:
B := { |X, Y| Substr(X,At(" ",X)+1) > Substr(Y,At(" ",Y)+1) }
Note que este bloque de cdigo busca y compara las partes de los caracteres inmediatamente despus de un espacio en blanco. Despues de utilizar ese bloque para la funcin asort, la matriz contendr:
{"GARY HALL", "TIM JONES", "FRED SMITH"}
Finalmente, para ordenar un sub-elemento (columna) de una matriz por ejemplo, se puede usar el siguiente bloque de cdigo:
B := { |X, Y| X[1] > Y[1] }
3. Funciones
Durante el desarrollo de los programas ADVPL, se debe considerar que existen dos tipos de Funciones:
User Function y Static Function.
Cuando una funcin es declarada tipo User, esta deber ser invocada de la forma:
U_NomFunc()
Y podr ser usada en cualquier programa o mdulo del Protheus, entonces cuando declaramos una funcin como User, la estamos declarando tipo Publica.
Si fuese Static, sta deber ser llamada de la forma:
NomFuncSta()
Al ser declarada como Static solo podr ser usada dentro del mismo programa en donde fue desarrollada, pudiese decirse que entonces acta de forma local.
A continuacin mencionaremos algunas de la funciones utilizadas por ADVPL propias del Standard xBase, que a nuestra consideracin son las que debemos tener mas en cuenta.
3.1 Funciones de Fecha y HoraCDOW()Retorna el nombre del da de la semana (ingls).
CMONTH()Retorna el nombre del mes (ingls).
CTOD()Convierte una cadena en fecha.
DATE()Retorna fecha del sistema.
DAY()Retorna el da del mes.
DOW() Retorna el da del sistema.
DTOC()Transforma la fecha en cadena.
DTOS()Transforma la fecha en formato cadena para ndices AAAAMMDD.
DMY()Transforma la fecha en formato DD/MM/AA.
MDY()Transforma la fecha en formato MM/DD/AA.
MONTH()Retorna el nmero de mes.
TIME()Retorna la hora del sistema.
YEAR()Retorna el ao.
Para inicializar una variable que ser de tipo fecha se hace:Local dFecNew := CTOD( / / )
3.2 Funciones de Cadena
AT()Bsqueda de Cadena
LEFT()Retorna una subcadena de la parte izquierda del texto
LEN()Retorna el nmero de caracteres en el texto
LOWER()Transforma el texto en minscula
LTRIM()Remueve espacios iniciales en blanco
PADC) Centra la variable dentro de un espacio
PADL()Ajusta la variable a la izquierda dentro de un espacio
PADR()Ajusta la variable a la derecha dentro de un espacio
REPLICATE()Repite un texto un nmero determinado de veces
RIGHT()Retorna una subcadena de la parte derecha del texto
RTRIM()Remueve espacio finales en blanco
SPACE()Genera una cadena de espacios en blanco
STUFF()Sustituye una parte de la cadena
SUBSTR()Extrae una subcadena
TRANSFORM()Retorna el argumento en un formato especificado
TRIMRemueve espacios en blanco finales e iniciales
UPPER()Transforma el texto en maysculas
3.3 Control de Flujo
3.3.1 Desvio condicional
La estructura se representa por el comando IF...ENDIF
SintaxisIF lExpresion //Comandos &&Si es verdadera
ELSE
//Comandos &&Si es falsa
ENDIF
Formas mas simples:
IF
//Comandos &&Si es verdadera
ENDIF
ParmetroslExpresionEspecifica una expresin lgica que es vlida. Si lExpresion resulta verdadera (.T.), cualquier comando que sigue al IF y antecede al ELSE o IF (o lo que ocurra primero) ser ejecutado.
Si lExpresion resulta falso (.F.) y la clusula ELSE fue definida, cualquier comando despus de esa clusula y antes del ENDIF sera ejecutada.
ComandosConjunto de comandos ADVPL que sern ejecutados dependiendo del resultado en lExpresion.
3.3.2 Do Case
Ejecuta el primer conjunto de comandos cuya expresin condicional resulta en verdadero (.T.).
Sintaxis
DO CASE
CASE lExpresion1 [CASE lExpresion2]
//Comandos
[CASE lExpresionN]
//Comandos
[OTHERWISE]
//Comandos
ENDCASE
Parmetros
CASE
lExpresion1Comandos..Cuando la primer expresin CASE resulta verdadera (.T.) el conjunto de comandos siguiente es ejecutado. La ejecucin del conjunto de comandos continua hasta que la prxima clusula CASE, OTHERWISE o ENDCASE sea encontrada. Al terminar de ejecutar ese conjunto de comandos, la ejecucin contina con el primer comando siguiente al ENDCASE.
OTHERWISEComandosSi todas las expresiones CASE fueron ejecutadas como falso (.F.), la clusula OTHERWISE determina si un conjunto adicional de comandos debe ser ejecutado. Si esa clusula fue incluida, los comandos siguientes sern ejecutados y entonces el programa continuar con el primer comando siguiente al ENDCASE. Si la clusula OTHERWISE fue emitida, la ejecucin continuar normalmente despus de la clusula ENDCASE.
El comando DO CASE..ENDCASE es utilizado en lugar del comando IF..ENDIF cuando un nmero mayor de una expresin debe ser validada, sustituyendo la necesidad de mas de un comando IF..ENDIF anidados.3.3.3 Do While
La estructura de control WHILE..ENDDO, repite una seccin de cdigo en tanto una determinada expresin resulta en verdadero (.T.).Sintaxis
WHILE lExpresion1
//Comandos
[EXIT]
[LOOP]
ENDDO
Parmetros
lExpresion
Especifica una expresin lgica cuyo valor determina cuando los comandos entre el WHILE y el ENDDO son ejecutados. Mientras el resultado de lExpresion sea verdadero (.T.) el conjunto de comandos ser ejecutado.
ComandosUna o mas instrucciones en ADVPL .
EXITSale de ciclo While.
LOOPRetorna el control directamente a la clusula WHILE.
3.3.4 For
La estructura de control FOR..NEXT, o simplemente el loop FOR, repite una seccin de cdigo en un nmero determinado de veces.
Sintaxis
FOR Variable:=nValorInicial TO nValorFinal [STEP nIncremento]
//Comandos
[EXIT]
[LOOP]
NEXT
Parmetros
VariableEspecifica una variable o un elemento de una matriz para actuar como contador.
nValorInicial TO nValorFinalnValorInicial es un valor inicial para el contador; nValorFinal es el valor final para el contador. Es posible usar valores numricos literalmente, variables o expresiones, teniendo en cuenta que el resultado del tipo de dato sea numrico.
STEP nIncrementeCantidad que ser incrementada o decrementada en el contador despus de cada ejecucin. Si el valor de nIncremento fuera negativo, el contador ser decrementado. Si la clusula STEP fuese omitida, el contador ser incrementado en 1. El tipo de datos aqu debe ser numrico.
LOOPRetorna el control directamente a la clusula FOR
EXITSale del ciclo FOR.
4. Manejo de Tablas
4.1 ndices.
El uso de ndices para la bsqueda, debe ser bien analizada con la finalidad de evitar alentar o redundar en procesos en los reportes o procesos.
Los ndices ayudan a optimizar las bsquedas y ciclos de procesos, por eso no deben ser subutilizados o utilizados en forma errnea.
Es necesario advertir, que al crear un ndice, los datos que lo construyen deben ser del mismo tipo. Por ejemplo, si la tabla X contiene los campos:
cFilial C(2)
cClave C(2)
dFecha D(8)
nNum n(2)
Pueden armarse los ndices:
cFilial+cClave+DTOS(dFecha)+str(nNum)
Observe que los datos que no son tipo carcter, fueron transformados con las funciones DTOS y STR respectivamente.Para poder crear un indice temporal se utiliza la funcion de INDREGUA(alias,archivo temporal)
Ejemplo: indice: FILIAL+TIPO+CODIGO
cTemp := CriaTrab(Nil, .F.) // Crea un nombre de tabla temporal
INDREGUA(SZ2,cTemp,FILIAL+TIPO+CODIGO) //indice creado4.2 Funciones para el manejo de Tablas.
DBSELECTAREA(cAlias)Abre una tabla.
DBSEEK(cLlave)Se posiciona en el primer registro que tenga el mismo contenido que cLlave.
DBSKIP()Brinca al siguiente registro.
EOF()Fin de Archivo cuando el resultado es verdadero.
RECLOCK(cAlias,lVal,.t.)Bloquea registro, de la tabla cAlias, si lVal es verdadera (.T.), estar abriendo un registro en blanco y bloqueado, listo para insertarle datos. Si lVal fuese falso (.F.), solo estar bloqueando el registro, para hacer alguna modificacin, borrado o consulta del mismo.
MSUNLOCK() Desbloque registro bloqueado por instruccin RECLOCK.
DBSETORDER(nIndice)Abre el ndice nIndice, este dato es el nmero de orden del ndice segn el configurador.
RETORDEM(cAlias,cLlave)Funcin que regresa el nmero de orden del ndice del cAlias donde cLlave, es el ndice tal cual esta creado en el configurador.
POSICIONE(cAlias,nOrden,cLlave,cCampo)Localiza un registro en la tabla .
cAlias, tabla en la que buscar. nOrden, Numero de Orden del ndice con el que buscar. cLlave, Datos con los que buscar (segn ndice). cCampo, Nombre de algn campo de la tabla, cuyo contenido ser el resultado de POSICIONE.
EXISTCPO(cAlias,cLlave,nOrden)Retorna si determinada llave existe o no en la tabla.
cAlias, tabla en la que buscar. nOrden, Numero de Orden del ndice con el que buscar. cLlave, Datos con los que buscar (segn ndice) .
GETAREA()Almacena el ambiente del rea de trabajo anterior.
RESTAREA()Restaura el ambiente del rea de trabajo segn el ltimo GetArea usado.
DBDELETE()Elimina el registro actual.
DBGOTOP()Se coloca al inicio de la tabla.
DBBOTTOM()Se coloca en el ltimo registro de la tabla.
4.3 Lectura y actualizacin de Archivos.
En versiones anteriores era preciso usar el comando APPEND FROM para la insercin de un registro, aunque este comando puede seguir siendo usado actualmente se utiliza la funcin RECLOCK(), la cual permite insertar un nuevo registro y al mismo tiempo bloquearlo.
Analicemos el ejemplo de insertar un registro en la tabla SB1:
//ABRE REGISTRO EN BLANCO Y LO BLOQUEA, ESTO ULTIMO LO HACE POR QUE EL 2DO. PARAMETRO ESTA EN .T.
RECLOCK(SB1,.T.)
//ASIGNA VALOR AL CAMPO B1_COD
SB1->B1_COD:=BF1234
//DESBLOQUE EL REGISTRO
SB1->(MSUNLOCK())
Si se tratara de eliminar o modificar un registro el comando RECLOCK, tendr su segundo parmetro en .f., lo cual estar indicando que solo bloque el registro y que no est abriendo registro en blanco, entonces el ejemplo quedara://SELECCIONA EL INDICE POR EL QUE REALIZARA LA BUSQUEDA
SB1->(DBSETORDER(RETORDEM(SB1,B1_FILIAL+B1_COD))//Busca el registro IF SB1->(DBSEEK(XFILIAL(SB1)+cCodBus))
//BLOQUEA EL REGISTRO
RECLOCK(SB1,.F.)
//ACTUALIZA INFORMACION
SB1->B1_NOME:=Nuevo producto
//DESBLOQUEA REGISTRO
SB1->(MSUNLOCK())
ENDIF
4.4 Instrucciones SQL.
ADVPL no es un lenguaje que actu de forma nativa sobre las tablas de bases de datos pero lo puede hacer a travs de TOP CONNECT. Para ello tambin existen funciones especiales que permitirn la ejecucin de consultas o ejecucin de query con eliminacin o actualizacin.Para el uso de estos comando los programas debern contener la biblioteca:#INCLUDE "TOPCONN.CH"
Aqu solo hablaremos de las instrucciones mas usuales en ADVPL para el manejo de informacin de bases de datos. Para mayor profundidad en el tema puede hacer referencia a los manuales Programao_SQL_Intermediario y Programao_SQL_Avancado. Sin embargo aqu destacaremos con ejemplos muy completos el uso del manejo de instrucciones para SQL..Consulta
Deber usar el comando ChangeQuery y dbUseArea, donde el primero interpreta la consulta lanzada y el segundo coloca el resultado de la consulta en una tabla temporal.
Ejemplo:
//GENERA UN NOMBRE ESPECIAL PARA LA TABLA TEMPORALcAliasBus:=criatrab(nil,.f.) //RECUPERA EL NOMBRE FISICO DE LAS TABLA EN LA BASE
cSC7RetSqlName := InitSqlName( "SC7" )
cSB1RetSqlName := InitSqlName( "SB1" )
//RECUPERA LA FILIAL DE LA TABLA
cFilSc7:=xfilial("SC7") cFilSB1:=xfilial("SB1")
//A CONTINUACION COLOCA EN UNA VARIABLE LA SENTENCIA DE CONSULTA
cQuery := "Select C7_EMISSAO,C7_FORNECE,C7_PRODUTO "
cQuery += " FROM " + cSC7RetSqlName + " SC7,"+ cSB1RetSqlName + " SB1"
cQuery += " WHERE C7_FILIAL = '"+cFilSc7+"'"
cQuery += "AND B1_FILIAL = '"+cFilSB1+"'"
cQuery += " AND C7_PRODUTO = B1_COD "
cQuery += " AND C7_PRODUTO >= '"+alltrim(cProdi)+"'
cQuery += " AND C7_PRODUTO (!eof())
cTmpPrv:=(cAliasBus)->C7_FORNECE
cTmpCod:=(cAliasBus)->C7_PRODUTO
(cAliasBus)->(dbskip()) //SALTA AL SIGUIENTE REGISTRO
enddo
(cAliasBus)->( dbCloseArea() ) //CIERRA TABLA TEMPORAL E INTERNAMENTE LA ELIMINA
Eiminacion o ActualizacinDeber usar el comando TcSqlExec para la ejecucin del query, esta es una funcin que retorna un cero si fue ejecutado con xito el comando y retorna resultados negativos si no fue as.
Ejemplo:
//COLOCA EN UNA VARIABLE EL COMANDO SQL PARA ELIMINACION DE REGISTROScStrQty := "DELETE FROM "
cStrQty += RetSqlName("SZ2") " //RECUPERA NOMBRE FISICO DE LA TABLA ACTUA IGUAL AL COMANDO InitSqlNamecStrQty += " WHERE Z2_FILIAL='"+cFilSA1+"' AND Z2_CODCLI = '"+alltrim(cCodSA1)+ "'"
//EJECUTA ACCCION DEL QUERY
nResultado:=TcSqlExec(cStrQty) //AVISO SI HUBO ERROR EN QUERY
if nResultado 0
msgAlert(No logro eliminar datos de la tabla SZ2)
endif
Para este tipo de instrucciones es necesario poner cuidado cuando el borrado o actualizacin de registro es muy grande, y enviar las actualizaciones o eliminaciones por bloques.
A continuacin con el ejemplo de Actualizacin aprovecharemos un ejemplo con envo en bloques de registros.Ejemplo:
//GENERA UNA CONSULTA CONDICIONADO DE LA MISMA FORMA COMO ESTARA EL QUERY DE ACTUALIZACION, CON EL OBJETIVO DE SACAR EL NUMERO DE REGISTRO FISICO MAXIMO Y MINIMO QUE PARTICIPARAN EN EL PROCESO
cAliasSB2 := "SB2MA215PROC"
cQuery := "SELECT MIN(R_E_C_N_O_) MINRECNO,"
cQuery += "MAX(R_E_C_N_O_) MAXRECNO "
cQuery += "FROM "+RetSqlName("SB2")+" "
cQuery += "WHERE B2_FILIAL='"+xFilial("SB2")+"' AND "
cQuery += "D_E_L_E_T_=' '"
cQuery := ChangeQuery(cQuery)
dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cAliasSB2)
nMax := (cAliasSB2)->MAXRECNO
nMin := (cAliasSB2)->MINRECNO
cAliasSB2->(dbCloseArea())
//UNA VEZ OBTENIDAS LAS POSICIONES DELOS REGISTROS MAXIMO Y MINIMO PROCEDE ELABORAR EL QUERY
dbSelectArea("SB2")
cQuery := "UPDATE "
cQuery += RetSqlName("SB2")+" "
cQuery += "SET B2_RESERVA = 0,"
cQuery += "B2_RESERV2 = 0,"
cQuery += "B2_QEMP = 0,"
cQuery += "B2_QEMP2 = 0,"
cQuery += "B2_QEMPN = 0,"
cQuery += "WHERE B2_FILIAL='"+xFilial("SB2")+"' AND "
cQuery += "D_E_L_E_T_=' ' AND "
//EN ESTE CICLO ES DONDE ESTAR EJECUTANDO POR BLOQUES LAS ACTUALIZACIONES ALOS REGISTROS
For nX := nMin To nMax+4096 STEP 4096
cChave := "R_E_C_N_O_>="+Str(nX,10,0)+" AND R_E_C_N_O_????? da Enchoice
//
RegToMemory(SC5,(cOpcao==INCLUIR))
//
// Cria aHeader e aCols da GetDados
//
nUsado:=0
dbSelectArea(SX3)
dbSeek(SC6)
aHeader:={}
While !Eof().And.(x3_arquivo==SC6")
If Alltrim(x3_campo)==C6_ITEM
dbSkip()
Loop
Endif
If X3USO(x3_usado).And.cNivel>=x3_nivel
nUsado:=nUsado+1
Aadd(aHeader,{ TRIM(x3_titulo), x3_campo, x3_picture,;
x3_tamanho, x3_decimal,AllwaysTrue(),;
x3_usado, x3_tipo, x3_arquivo, x3_context } )
Endif
dbSkip()
End
If cOpcao==INCLUIR
aCols:={Array(nUsado+1)}
aCols[1,nUsado+1]:=.F.
For _ni:=1 to nUsado
aCols[1,_ni]:=CriaVar(aHeader[_ni,2])
Next
Else
aCols:={}
dbSelectArea(SC6)
dbSetOrder(1)
dbSeek(xFilial()+M->C5_NUM)
While !eof().and.C6_NUM==M->C5_NUM
AADD(aCols,Array(nUsado+1))
For _ni:=1 to nUsado
aCols[Len(aCols),_ni]:=FieldGet(FieldPos(aHeader[_ni,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
If Len(aCols)>0
//
// Executa a Modelo 3
//
cTitulo:=Teste de Modelo3()
cAliasEnchoice:=SC5"
cAliasGetD:=SC6"
cLinOk:=AllwaysTrue()
cTudOk:=AllwaysTrue()
cFieldOk:=AllwaysTrue()
aCpoEnchoice:={C5_CLIENTE}
_lRet:=Modelo3(cTitulo,cAliasEnchoice,cAliasGetD,aCpoEnchoice,cLinOk,cTudOk,nOpcE,nOpcG,cFieldOk)
//
// Executar processamento
//
If _lRet
Aviso(Modelo3(),Confirmada operacao!,{Ok})
Endif
Endif
Return
5.3 Validaciones de Campo (Valid y When o Modo Edicin)
Este tipo de validaciones son registradas en el configurador, cuando las validaciones son ser mas complejas entonces quizs sea necesario generar una funcin de usuario, de tal forma que en la validacin del campo solo sea llamada tal funcin y en el IDE desarrollar dicha funcin, la cual deber retornar un valor lgico Falso o Verdadero.
5.4 Regla de avance (Processa, IncProc(),etc.)
Existe un conjunto de instrucciones ADVPL que permiten enviar a pantalla una ventana mostrando una regla de avance segn se aumente el nmero de registros procesados o la cantidad de iteraciones hechas en un ciclo determinado.Regla de avance para procesos.
Processa(bAccion,cTitulo,cMsg,lAborta)
Despliega una pantalla inicial con mensaje de de espera, para un proceso, donde:bAccion: Bloque de cdigo. cTitulo : Titulo de Pantalla. cMsg: Mensaje de espera. lAborta: Coloca opcin de Cancelar en la pantalla de espera.
ProcRegua(nCuantos) Inicializa barra de avance. Donde nCuantos es el nmero de procesos a ejecutar.
IncProc()Incrementa barra de avance.
Ejemplo:
User Function ( )
Local bAcao := {|lFim| Exemplo(@lFim) }
Local cTitulo := ''
Local cMsg := 'Processando'
Local lAborta := .T.
Processa( bAcao, cTitulo, cMsg, lAborta )
Return
Static Function Exemplo(lFim)
Local nI
ProcRegua(10000)
For nI := 1 To 10000
If lFim
Exit
EndIf
IncProc()
Next nI
Return
Regla de avance para Reportes.
SetRegua(nRegs)Inicializa regla de avance, donde nReg es el nmero de registros a procesar.
IncRegua()Incrementa regla de avance.
Ejemplo:DbSelectArea(SA1)
SetRegua(LastRec())
While ( ! Eof() )
@ Li, 001 PSAY SA1->A1_NOME
DbSkip()
IncRegua()
End5.5 Impresin en modo texto
Dentro de IDE en la opcin Herramientas/Asistente de cdigo, es posible generar en forma automtica el cuerpo de un reporte con sus respectivos comentarios.Diferencia entre modo grafico y modo texto es en que en texto es de modo fijo courier 10-17cpp
Rutina opcional de encabezamiento
Se debe hacer un control mandual de renglones impresos
Ancho fijo de columna de 8.5 hasta 15
Anchos posibles 80,120, 132 caracteres
Numero de renglones por hoja fijo de 66;
Para romper los estandares se pueden utilizar codigos de control donde se pueden alterar atravez de secuencias de control que son:
Comandos directos a la impresora
Impresin en modo grafico:
Se puede controlar el tamano
El font
Familia de caracteres
Manejop de objetos con sus respectivas propiedades
Dimensiones de la pagina no son rigidos
Se lleva un control mas libre de lo que el ancho y largo de la paginaUna de las cosas mas es que se lleva mas labor de pruebas
Transform (valor,mascara) esto aplica para un stringLa mascara se forma de 2 partes:
@ una funcin y smbolos
Donde la funcion son =mayusculas, R=insertar caracter, Z= o blanco, (= ### o (###)
Ejemplo:
Donde el smbolo son X=cualquier caracter, g=numero, #=char o numero, =Mayusculas, $= 0->$, *= o->.*, punto(.), o coma(,)
Ejemplo: @! Todas mayusculas
@rengln, columna PSAY
@rengln, columna PICTURE 5.6 Puntos de entrada
Son rutinas de programas colocadas en puntos estratgicos en las funciones del estndar del sistema y que originalmente no hacen nada.As que el desarrollador identificar la necesidad de una intervencin en estos puntos, basta crear la rutina, darle el nombre especfico citado en el documento de Advance Protheus y compilarla.
En el momento que la rutina del estndar fuera disparada y pasara por el punto de entrada ya personalizado, el mismo ser ejecutado.
Se podra decir que esta es la manera mas practica de intervenir en los programas del estndar del sistema sin la necesidad de una alteracin directa de los mismos, haciendo que estas implementaciones pasen desapercibidas por el usuario al momento de la ejecucin.
Sin embargo es necesario saber mucho a cerca de la lgica del programa en cuestin, as como tambin la situacin de memoria utilizada en aquel momento.
Existe un documento y programa (Quark) que nos permiten identificar algunos de los puntos de entrada existentes y su funcionalidad.
Ejercicio 1.- Como Crear Punto de Entrada
1.Accese a la Herramienta IDE
2.Realice el siguiente programa:#include Rwmake.ch
User function m030inc()
msgBox (El Cliente fue registrado con xito!!)
Return
3.Salve el programa con el mismo nombre que la funcion.4.Cargue al Proyecto el Programa y Compile Para probar este punto de entrada:
1. Accese al mdulo de Facturacin.2. Seleccione Actualizaciones/Archivos/Clientes.3. Clic en la opcin Incluir y registre un cliente.4. Al confirmar se dar cuenta que el punto de entrada fue ejecutado, pues desplegara el mensaje El Cliente fue registrado con xito!!.Puntos de entrada son puntos o funciones adicionales que se le pueden agregar al programa
Ejemplos los puntos de entrada se pueden aplicar:
Antes del browseGuas de Referencia:
Funes ADVPL (Microsiga)
Programao_SQL_Avancado (Microsiga)
Programao_SQL_Intermediario (Microsiga)manual-pe710.doc (Microsiga)Quark.exe (Microsiga)
Clipper 5.01 (Jos Antonio Ramalho Editorial McGraw-Hill)
Elaboro: Ing. Guadalupe Santacruz A.05/09/20074