Cur So Basic Oad Vpl

37
ADVPL BASICO Fabrica de Software Elaboro: Ing. Guadalupe Santacruz A. 15/01/2022 1 Curso Básico de ADVPL

Transcript of Cur So Basic Oad Vpl

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