Beruflich Dokumente
Kultur Dokumente
PROGRAMACIÓN
ADVPL I
1. Lógica de Programación y Algaritmos .....................................................................................7
1.1. Lógica de Programación....................................................................................... 7
1.2. Desarrollo de algoritmos ...................................................................................... 9
1.2.1. Estudio de algoritmos................................................................................... 10
1.2.2. Prueba de mesa............................................................................................. 12
2. Estructuras de Programación ................................................................................................. 14
2.1. Diagrama de bloque............................................................................................ 14
2.2. Estructuras de decisión y repetición.................................................................. 18
2.2.1. Estructuras de decisión................................................................................. 18
2.2.2. Estructuras de repetición .............................................................................. 21
3. ESTRUCTURA DE UN PROGRAMA ADVPL ............................................................................ 28
3.1. Áreas de un Programa ADVPL ......................................................................... 30
4. DECLARACIÓN Y ATRIBUCIÓN DE VARIABLES..................................................................... 34
4.1. Tipo de Datos....................................................................................................... 34
4.2. Declaración de variables..................................................................................... 35
4.3. Alcance de variables ........................................................................................... 36
4.4. Cómo influye el alcance de las variables ........................................................... 41
4.5. Operaciones con Variables................................................................................. 42
4.5.1. Atribución de variables ................................................................................ 42
4.5.2. Operadores del lenguaje ADVPL................................................................. 44
4.5.3. Operación de Macrosustitución.................................................................... 50
4.5.4. Funciones de manipulación de variables...................................................... 51
5. ESTRUCTURAS BÁSICAS DE PROGRAMACIÓN..................................................................... 59
5.1. Estructuras de repetición ................................................................................... 59
5.1.1. Cómo influir en el flujo de repetición .......................................................... 63
5.2. Estructuras de decisión....................................................................................... 65
6. ARRAYS Y BLOQUES DE CÓDIGO ........................................................................................... 70
6.1. Arrays .................................................................................................................. 70
6.1.1. Iniciando arrays ............................................................................................ 73
6.1.2. Funciones de manipulación de arrays .......................................................... 74
6.1.3. Copia de arrays............................................................................................. 76
6.2. Listas de Expresiones y Bloques de Código ...................................................... 78
6.2.1. Premisas para utilización de Bloques de Código ......................................... 78
6.2.2. Lista de expresiones ..................................................................................... 80
6.2.3. Bloques de Código ....................................................................................... 82
6.2.4. Funciones para manipulación de bloques de código .................................... 85
7. FUNCIONES .............................................................................................................................. 86
7.1. Tipos y alcances de funciones............................................................................. 87
7.2. Paso de parámetros entre funciones.................................................................. 91
8. DIRECTIVAS DE COMPILACIÓN.............................................................................................. 98
9. ADVPL Y ERP MICROSIGA PROTHEUS................................................................................. 106
Al final del curso el participante debe haber desarrollado los siguientes conceptos,
habilidades y actitudes:
Con enfoque en esta necesidad, este tópico describirá resumidamente los conceptos
involucrados en el proceso de desarrollo de un programa, por medio de los
conceptos relacionados con:
; Lógica de programación
; Algoritmos
; Diagramas de bloques
Lógica
Secuencia Lógica
Algoritmo
Incluso las cosas más sencillas pueden describirse en secuencias lógicas, tales
como:
; “Chupar un caramelo”.
1. Agarrar un caramelo.
2. Retirar el papel.
3. Chupar el caramelo.
Pseudocódigo
El algoritmo debe ser fácil de interpretar y fácil de codificar. Es decir, debe ser
el intermediario entre el lenguaje hablado y el lenguaje de programación.
Fases
En este tópico se mostrarán algunos algoritmos del día a día, los cuales se
implementaron utilizando los principios descritos en los tópicos anteriores.
Masticar un chicle.
Utilizar un teléfono público – tarjeta.
Freír un huevo.
Cambiar focos.
Pelar papas.
Jugar al ahorcado.
Calcular el promedio de las notas.
Jugar el tres en raya – contra el algoritmo.
Masticar un chicle
1. Agarrar el chicle.
2. Retirar el papel.
3. Masticar.
4. Botar el papel en la basura.
1. Descolgar el teléfono.
2. Esperar el tono de línea.
3. Poner la tarjeta.
4. Marcar el número.
5. Hablar por teléfono.
6. Colgar el teléfono
Freír un huevo
Cambiar focos
Pelar papas
Jugar al ahorcado
1. Elegir la palabra.
2. Construir el diagrama del juego.
3. Mientras haya espacios vacíos y el cuerpo esté incompleto:
3.1. Si acierta la letra: escriba en el espacio correspondiente.
3.2. Si se equivoca de letra: dibujar una parte del cuerpo en la horca.
Prueba de mesa:
ID Nota
2. Al finalizar las notas, la tabla debe tener todas las notas informadas, como
se muestra a continuación:
ID Nota
1 8.0
2 7.0
3 8.0
4 8.0
5 7.0
6 7.0
Simbología
Símbolo Función
Procesamiento en general.
Procesamiento
; Estructuras de decisión
o IF...ELSE
o DO CASE ... CASE
; Estructuras de repetición
o WHILE...END
o FOR...NEXT
; IF...ELSE
; DO CASE ... CASE
IF...ELSE
Representación 02: IF...ELSE solamente con una acción para situación verdadera
DO CASE...CASE
; WHILE...END
; FOR...TO...NEXT
Representación: WHILE...END
Representación: FOR...TO...NEXT
En esta categoría están los programas desarrollados para ejecutarse por medio del
terminal remoto de Protheus: Protheus Remote. Protheus Remote es la aplicación
encargada de la interfaz y de la interacción con el usuario y todo el procesamiento
del código en ADVPL, el acceso a la base de datos y la administración de conexiones
se efectúa en el Protheus Server. El Protheus Remote es el principal medio de acceso
a la ejecución de rutinas escritas en ADVPL en el Protheus Server. En virtud de ello,
permite ejecutar cualquier tipo de código, tenga o no tenga interfaz con el usuario.
Sin embargo, en esta categoría sólo se consideran los programas que realizan algún
tipo de interfaz remota utilizando el protocolo de comunicación del Protheus.
Se pueden crear rutinas para la personalización del sistema ERP Microsiga Protheus,
desde procesos adicionales hasta informes. La gran ventaja es aprovechar el entorno
elaborado por los módulos del ERP Microsiga Protheus. Pero, con el ADVPL, es
Todo el código del sistema ERP Microsiga Protheus está escrito en ADVPL.
Las rutinas creadas sin interfaz se consideran en esta categoría porque generalmente
tienen una utilización más específica que un proceso adicional o un informe nuevo.
Dichas rutinas no tienen interfaz con el usuario por medio de Advanced Protheus
Remote y cualquier intento en este sentido (como la creación de una ventana
estándar) ocasionará una excepción en tiempo de ejecución. Estas rutinas son
solamente procesos, o jobs, ejecutados en Protheus Server. Algunas veces, la interfaz
de estas rutinas queda a cargo de aplicaciones externas, desarrolladas en otros
lenguajes, que son responsables por iniciar los procesos en el servidor Protheus, por
medio de los medios de integración y conectividad disponibles en Protheus.
De acuerdo con el uso y con el medio de conectividad utilizado, estas rutinas tienen
la siguiente división de categorías:
Rutinas escritas en ADVPL pueden iniciarse como procesos individuales (sin interfaz)
en el Protheus Server de dos maneras: por medio de otra rutina ADVPL, por medio
de la ejecución de funciones como StartJob() o CallProc() o automáticamente al
iniciar el Protheus Server (cuando esté correctamente configurado).
; Programación de RPC
Programación Web
; Programación TelNet
Líneas de Programa
; Líneas de Comando
Local nCnt
Local nSoma := 0
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
; Líneas de Comentario
Otra forma de documentar textos es utilizar las barras transversales junto con
el asterisco para comentar un bloque de texto, para que no sea necesario
comentar línea por línea:
/*
Programa para cálculo del total
Autor: Microsiga Software S.A.
Fecha: 2 de octubre de 2001
*/
Todo el texto que se encuentra entre la apertura (indicada por los caracteres
/*) y el cierre (indicado por los caracteres */) es el comentario.
; Líneas Mixtas
Local nCnt
Local nSoma := 0 // Inicia la variable con cero para la suma.
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
; Tamaño de la Línea
GravaDados(cNome,cEnd,cTel,cFax,cEmail)
Endif
En este ejemplo, hay una línea de comando para la verificación de las variables
utilizadas. Como la línea es muy grande, es posible dividirla en más de una
línea física utilizándose de punto y coma. Si se olvida un punto y coma en las
dos primeras líneas, ocurrirá un error durante la ejecución del programa, pues
se entenderá que la segunda línea física es una segunda línea de comando en
la compilación. Durante la ejecución, esta línea no tendrá sentido.
#include protheus.ch
/*
+===========================================+
| Programa: Cálculo del Factorial |
| Autor : Microsiga Software S.A. |
| Fecha : 02 de octubre de 2001 |
+===========================================+
*/
Local nCnt
Local nResultado := 1 // Resultado del factorial
// Termina el programa
Return
; Área de Identificación
9 Declaración de los includes
9 Declaración de la función
9 Identificación del programa
; Área de Finalización
Área de Identificación
No hay formato definido para este programa. Se puede colocar cualquier tipo
de información deseada y elegir la configuración apropiada.
#include “protheus.ch”
/*
+==========================================+
| Programa: Cálculo del Factorial |
| Autor : Microsiga Software S.A. |
Local nCnt
Local nResultado := 0 // Resultado del factorial
Local nFator := 10 // Número para el cálculo
If nFator <= 0
Alert(“Información inválida”)
Return
Endif
Área de Cierre
// Termina el programa
Return
Las variables también pueden contener objetos, pero los tipos primarios de
lenguaje son:
Numérico
2
43.53
0.5
0.00001
1000000
Lógico
Valores lógicos en ADVPL se identifican con .T. o .Y. para verdadero y .F. o .N.
para falso (independientemente de que los caracteres sean mayúsculos o
minúsculos).
Carácter
"¡Hola mundo!"
'Esta es una string'
"Esta es 'otra' string"
Una variable del tipo carácter puede contener strings con un máximo de 1MB,
Fecha
Variables del tipo de datos Data no pueden declararse directamente, sino por
medio de la utilización de funciones específicas como, por ejemplo, CTOD()
que convierte una string a data.
Array
Los Arrays deben utilizarse con cautela, porque si son muy grandes, pueden
consumir la memoria del servidor.
Bloque de Código
nTotalGeralMensal := 100
nTotalGeralAnual := 300
Alert("Valor mensual: " + cValToChar(nTotalGeralMensal))
Local nNúmero := 10
; Local
; Static
; Private
; Public
nNumero2 := 15
Function Principal()
Local nVar := 10, aMatriz := {0,1,2,3}
.
<comandos>
.
Secundaria()
.
<más comandos>
.
Return(.T.)
En este ejemplo, la variable nVar se declaró como static y se inició con el valor
10.
Function Principal()
Static nVar := 10
.
<comandos>
.
Secundaria()
.
<más comandos>
.
Return(.T.)
Es posible crear una nueva variable privada con el mismo nombre de una
variable que ya existe. Sin embargo, la nueva (duplicada) variable sólo puede
crearse en un nivel de activación inferior al nivel donde la variable se declaró
por primera vez (es decir, sólo en una función llamada por la función donde la
variable ya se había creado). La nueva variable privada esconderá cualquier
otra variable privada o pública (vea la documentación sobre variables
públicas) que exista con el mismo nombre.
Por ejemplo:
Function Principal()
Private nVar := 10
<comandos>
.
Secundaria()
<más comandos>
.
Return(.T.)
Es posible crear una variable de alcance private con el mismo nombre de una
variable de alcance public existente, sin embargo, no se permite crear una
variable de alcance public con el mismo nombre de una variable de alcance
private existente.
En este ejemplo, nVar se crea como public y se inicia con el valor 10. Cuando
se ejecuta la función Secundaria, nVar aún existe pero no puede accederse. A
diferencia de las variables locales o privates, nVar aún existe después de haber
terminado la ejecución de la función Principal.
Con excepción del caso de valor nulo, para los demás deben utilizarse
funciones de conversión, cuando es necesario concatenar tipo de datos
diferentes (por ejemplo, en las líneas 07 y 17).
Note también que cuando una variable es del tipo de dato lógico, puede
utilizarse directamente para verificación (línea 10):
Operadores comunes
Operadores Matemáticos
+ Adición
- Sustracción
* Multiplicación
/ División
** o ^ Exponenciación
% Módulo (Resto de la División)
Operadores de String
Operadores Relacionales
.And. Y lógico
.Or. O lógico
.Not. o ! NO lógico
Operadores de Atribución
:= Atribución Simple
+= Adición y Atribución en Línea
-= Sustracción y Atribución en Línea
*= Multiplicación y Atribución en Línea
/= División y Atribución en Línea
**= o ^= Exponenciación y Atribución en Línea
%= Módulo (resto de la división) y Atribución en Línea
; Atribución Simple
; Atribución en Línea
; Atribución Compuesta
Los operadores de atribución compuesta son una facilidad del lenguaje ADVPL
para expresiones de cálculo y atribución. Con ellos no es necesario realizar la
digitación:
Operadores de Incremento/Decremento
Local nA := 10
Local nB := nA++ + nA
Local nA := 10
Local nB := ++nA + nA
Operadores Especiales
() Agrupamiento o Función
[] Elemento de Matriz
{} Definición de Matriz, Constante o Bloque de Código
-> Identificador de Apodo
& Macrosustitución
@ Paso de parámetro por referencia
|| Paso de parámetro por valor
1. Exponenciación
2. Multiplicación y División
3. Adición y Sustracción
Considere el ejemplo:
; Modificación de la Precedencia
Si existen varios paréntesis anidados, es decir, colocados uno dentro del otro,
la evaluación ocurrirá del paréntesis más entero en dirección al más externo.
Considere el ejemplo:
01 X := 10
02 Y := "X + 1"
03 B := &Y // El contenido de B será 11
La tercera línea utiliza el operador de macro. Esta línea hace que el número 11
se atribuya a la variable B. Se puede percibir que este es el valor resultante de
la expresión en formato de carácter incluida en la variable Y.
03 B := &"X + 1"
El operador de macro anula las comillas:
03 B := X + 1
CTOD()
CVALTOCHAR()
DTOC()
DTOS()
STOD()
STR()
STRZERO()
VAL()
Sintaxis CTOD(cData)
Realiza la conversión de una información del tipo carácter en el formato
Descripción “DD/MM/AAAA”, para una variable del tipo data.
CVALTOCHAR()
Sintaxis CVALTOCHAR(nValor)
Realiza la conversión de una información del tipo numérico en una string, sin la
Descripción
adición de espacios a la información.
DTOC()
Sintaxis DTOC(dData)
Realiza la conversión de una información del tipo data a un carácter, que
Descripción resultará en un formato “DD/MM/AAAA”.
DTOS()
Sintaxis DTOS(dData)
Realiza la conversión de una información del tipo data a un carácter, que
Descripción resultará en un formato “AAAAMMDD”.
STOD()
Sintaxis STOD(sData)
Realiza la conversión de una información del tipo carácter, con contenido en el
Descripción
formato “AAAAMMDD” a data.
Sintaxis STR(nValor)
Realiza la conversión de una información del tipo numérico a una string,
Descripción
agregando espacios a la derecha.
STRZERO()
VAL()
Sintaxis VAL(cValor)
Descripción Realiza la conversión de una información del tipo carácter a numérica.
Manipulación de strings
ALLTRIM()
ASC()
AT()
CHR()
CSTUFF()
LEN()
RAT()
SUBSTR()
Sintaxis ALLTRIM(cString)
Devuelve una string sin los espacios a la derecha y a la izquierda, referente al
contenido informado como parámetro.
Descripción
La función ALLTRIM() implementa las acciones de las funciones RTRIM (“right
trim”) y LTRIM (“left trim”).
ASC()
Sintaxis ASC(cCaractere)
Convierte una información carácter en su valor, de acuerdo con la tabla ASCII.
Descripción
AT()
Sintaxis CHR(nASCII)
Convierte un valor número referente a una información de la tabla ASCII, en el
Descripción carácter que esta información representa.
LEN()
Sintaxis LEN(cString)
Descripción Devuelve el tamaño de la string especificada en el parámetro.
LOWER()
Sintaxis LOWER(cString)
Devuelve una string con todos los caracteres minúsculos, con base en la string
Descripción
considerada como parámetro.
RAT()
STUFF()
UPPER()
Sintaxis UPPER(cString)
Devuelve una string con todos los caracteres mayúsculos, con base en la string
Descripción
considerada como parámetro.
ABS()
INT()
NOROUND()
ROUND()
ABS()
Sintaxis ABS(nValor)
Devuelve un valor absoluto (independientemente del signo) con base en el valor
Descripción especificado en el parámetro.
INT()
Sintaxis INT(nValor)
Descripción Devuelve la parte entera de un valor especificado en el parámetro.
ROUND()
TYPE()
VALTYPE()
TYPE()
Sintaxis TYPE(“cVariavel”)
Determina el tipo do contenido de una variable, la cual no se definió en la
Descripción función en ejecución.
VALTYPE()
Sintaxis VALTYPE(cVariável)
Determina el tipo do contenido de una variable, la cual no se definió en la
Descripción función en ejecución.
En ADVPL, todas las estructuras de control pueden ser "anidadas" dentro de todas
las otras estructuras, siempre y cuando estén adecuadamente anidadas.. Las
estructuras de control tienen un identificador de inicial y final y cualquier estructura
anidada debe encontrarse entre estos identificadores.
; Estructuras de repetición
; Estructuras de decisión
El Comando FOR...NEXT
; Parámetros
Los comandos ADVPL después del FOR se ejecutan hasta que se alcance
el NEXT. Entonces, se aumenta o disminuye el contador (Variable) con
el valor en nIncremento (si se omitiera la cláusula STEP, el contador se
aumentará en 1). Entonces, se compara el contador con el valor en
nValorFinal. Si fuera menor o igual al valor de nValorFinal, los
comandos siguientes al FOR se ejecutarán nuevamente.
Ejemplo:
Local nCnt
Local nSomaPar := 0
For nCnt := 0 To 100 Step 2
nSomaPar += nCnt
Next
Alert( "La suma de los 100 primeros números pares es: " + ;
cValToChar(nSomaPar) )
Return
Este ejemplo imprime la suma de los 100 primeros números pares. La suma se
obtiene por medio de la repetición del cálculo, utilizando la propia variable de
contador. Como la cláusula STEP está en uso, siempre se aumentará en 2 la
variable nCnt. Y como el contador empieza con 0, su valor siempre será un
número par.
; Sintaxis
WHILE lExpressao
Comandos...
[EXIT]
[LOOP]
ENDDO
; Parámetros
lExpressao Especifica una expresión lógica cuyo valor determina cuándo se ejecutan
los comandos entre el WHILE y el ENDDO. Mientras el resultado de
lExpressao se considere verdadero (.T.), se ejecutará el conjunto de
comandos.
Comandos Especifica una o mas instrucciones de comando ADVPL, que se
ejecutarán mientras lExpressao se considere verdadero (.T.).
EXIT Transfiere el control de dentro del comando WHILE...ENDDO al comando
inmediatamente siguiente, el ENDDO, es decir, finaliza la repetición de la
sección de comandos inmediatamente. Se puede colocar el comando
EXIT en cualquier lugar entre el WHILE y el ENDO.
LOOP Devuelve el control directamente a la cláusula WHILE sin ejecutar el
resto de los comandos entre el LOOP y el ENDDO. La expresión en
lExpressao se reevalúa para decidir si los comandos continuarán
ejecutándose.
; LOOP
; EXIT
LOOP
Ejemplo:
aItens:= ListaProdutos() // función ilustrativa que devuelve un array con datos de los
productos.
nQuantidade := Len(aItens)
nItens := 0
nItens++
IF BLOQUEADO(aItens [nItens]) // función ilustrativa que verifica si el
End
EXIT
Ejemplo:
While .T.
MSGINFO(“Final de Juego”)
El Comando IF...ELSE...ENDIF
; Sintaxis
IF lExpressao
Comandos
[ELSE
Comandos...]
ENDIF
; Parámetros
El Comando IF...ELSEIF...ELSE...ENDIF
; Sintaxis
IF lExpressao1
Comandos
[ELSEIF lExpressaoX
Comandos]
[ELSE
Comandos...]
ENDIF
; Parámetros
El Comando DO CASE...ENDCASE
; Sintaxis
DO CASE
CASE lExpressao1
Comandos
[CASE lExpressao2
Comandos
...
CASE lExpressaoN
Comandos]
[OTHERWISE
Comandos]
ENDCASE
; Parámetros
Ejemplo:
DO CASE
CASE nMes <= 3
cPeriodo := "Primer Trimestre"
CASE nMes >= 4 . Piso. nMes <= 6
cPeriodo := "Segundo Trimestre"
CASE nMes >= 7 . Piso. nMes <= 9
cPeriodo := "Tercer Trimestre"
OTHERWISE
cPeriodo := "Cuarto Trimestre"
ENDCASE
Return
Ejercicio
Desarrollar un programa que implemente el algoritmo pelar papas, utilizando la
estructura de repetición While, para mostrar cuántas papas se pelaron:
Ejercicio
Desarrollar un programa que implemente el algoritmo pelar papas, utilizando la
estructura de repetición FOR, para mostrar cuántas papas se pelaron:
Ejercicios
Desarrollar un programa que implemente el algoritmo del Ahorcado:
Ejercicios
6.1. Arrays
aFunct1 := {"Pedro",32,.T.}
Este array contiene una string, un número y un valor lógico. En otros lenguajes
como C o Pascal, este "paquete" de informaciones puede denominarse "struct"
(estructura en C, por ejemplo) o un "record" (registro en Pascal, por ejemplo).
Como si fuera en verdad un registro de una base de datos, un paquete de
#define FUNCT_NOME 1
#define FUNCT_IDADE 2
#define FUNCT_CASADO 3
Alert(aFunct1[FUNCT_NOME])
Alert(aFunct2[FUNCT_NOME])
Alert(aFunct3[FUNCT_NOME])
aFuncts es un array con 3 líneas por 3 columnas. Como las variables separadas
se combinaron en un array, los nombres pueden mostrarse de esta manera:
Local nCount
For nCount := 1 To Len(aFuncts)
Alert(aFuncts[nCount, FUNCT_NOME])
// El acceso a elementos de un array multidimensional.
// también puede realizarse de esta manera:
// aFuncts[nCount][FUNCT_NOME]
Next nCount
01 Local nCnt
02 Local aX[10]
03 Local aY := Array(10)
04 Local aZ := {0,0,0,0,0,0,0,0,0,0}
05
06 For nCnt := 1 To 10
07 aX[nCnt] := nCnt * nCnt
08 Next nCnt
Este código rellena el array con una tabla de cuadrados. Los valores serán 1, 4,
9, 16 ... 81, 100. Note que la línea 07 se refiere a la variable aX, pero también
podría trabajar con aY o aZ.
3. El tercer método difiere de los anteriores porque inicia la matriz con los
valores definitivos. En los dos primeros métodos, cada posición de la matriz
contiene un valor nulo (Nil) y debe iniciarse posteriormente.
01 Local nCnt
02 Local aX[0]
03 Local aY := Array(0)
04 Local aZ := {}
05
06 For nCnt := 1 To nSize
07 AADD(aX, nCnt*nCnt)
08 Next nCnt
2. En la línea 03, la llamada de la función array crea una matriz sin ningún
elemento.
ARRAY()
AADD()
ACLONE()
ADEL()
ASIZE()
AINS()
ASORT()
ASCAN()
AADD()
ACLONE()
Sintaxis AADD(aArray)
La función ACLONE() realiza la copia de los elementos de un
Descripción
array a otro array integralmente.
ADEL()
ASIZE()
ASORT()
AINS()
Con base en este concepto, el array sólo puede considerarse como un “mapa”
o un “guía” de cómo está organizada la información y cómo puede
almacenarse o consultarse. Para copiarse un array debe tomarse en cuenta
este concepto, de lo contrario, no se obtendrá el resultado esperado al
ejecutar la “copia”.
nPessoas := 10
nAlunos := nPessoas
Por esta razón, debe utilizarse el comando ACLONE() cuando se desea obtener
un array con la misma estructura e información que compone otro array
existente.
Primera premisa
Z := Y := X := 0
Z := ( Y := (X := 0) )
Segunda premisa
En ADVPL se pueden juntar diversas líneas de código en una única línea física
de comando. Por ejemplo, el código:
If lAchou
Alert("¡Cliente encontrado!")
Endif
puede escribirse la siguiente manera:
If lAchou ; Alert("¡Cliente encontrado!").
Endif
El punto y coma indica al ADVPL que la nueva línea de código está por
empezar. Entonces, pueden colocarse diversas líneas lógicas de código en la
misma línea física, por medio del editor de texto utilizado.
Este es el mismo código que el anterior, pero escrito en una única línea:
A pesar de que este código se encuentra en una única línea física, existen dos
líneas lógicas separadas por el punto y coma. Es decir, este código equivale a:
Alert( cValToChar( x := 10 ) )
y := 20
X := 10 ; Y := 20
If X > Y
Alert("X")
Z := 1
Else
Alert("Y")
Z := -1
Endif
X := 10 ; Y := 20
iif( X > Y , ;
( Alert("X"), Z := 1 ) , ;
( Alert("Y"), Z := -1 ) )
Function Lista()
X := 10
Y := 20
Return Y
( X := 10 , Y := 20 ) // Lista de Expresiones
{|| X := 10 , Y := 20 } // Bloque de Código
Esta función recibe como parámetro un bloque de código y evalúa todas las
expresiones incluidas en este bloque de código, devolviendo el resultado de la
última expresión evaluada.
B := {| N | X := 10, Y := 20 + N}
C := Eval(B, 1) ==> 21
B := { |X, Y| X > Y }
aSort(A, B)
Note que este bloque de código busca y compara las partes de los caracteres,
inmediatamente siguientes a un espacio en blanco. Después de utilizar este
bloque de código para la función asort, la matriz tendrá:
EVAL()
DBEVAL()
AEVAL()
EVAL()
DBEVAL()
AEVAL()
Para que una función sea más flexible, al llamarla pueden pasarse parámetros con
los datos y la información que define el procesamiento de la función.
Los parámetros de las funciones descritas que utilizan el lenguaje ADVPL son
posicionales, es decir, al realizar el paso no importa el nombre de la variable, sino su
posición dentro de la lista de parámetros, lo cual permite ejecutar una función
escribiendo:
Return ...
La función también tiene la facultad de devolver una variable, pudiendo incluso ser
un Array. Para ello, se encierra la función con:
Return(campo)
; Function()
; User Function()
; Static Function()
; Main Function()
Function()
// Fuente MATA100INCL.PRW
#INCLUDE "protheus.ch"
Function MATA100INCL01()
ALERT("01")
Return
Function MATA100INCL02()
ALERT("02")
Return
User Function()
Las “User Defined Functions” o funciones definidas por los usuarios, son tipos
especiales de funciones implementadas por el ADVPL, para garantizar que
desarrollos específicos no realizados por la Inteligencia Protheus de Microsiga
superpongan las funciones estándar desarrollados para el ERP.
Static Function()
Ejemplo:
//Fuente FINA010.PRW
Function FINA010()
CriaSx1(“FIN010”)
Return
Function FINA020()
CriaSx1(“FIN020”)
Return
Main Function()
Main Function() es otro tipo de función especial del ADVPL incorporado, para
permitir tratamientos diferentes en la aplicación ERP.
Los parámetros de las funciones descritas que utilizan el lenguaje ADVPL son
posicionales, es decir, al realizar el paso no importa el nombre de la variable,
sino su posición dentro de la lista de parámetros.
Local nCnt
Local nResultado := 0
Return
Local nResultado := 0
nResultado := CalcFator(5)
Local nResultado := 0
Local nFatorUser := 0
nResultado := CalcFator(nFatorUser)
Paso de parámetros por referencia – Dos variables vs. una única área de memoria
Local nCnt
Local nResultado := 0
Default nFator := 1
Return nResultado
Ejemplo:
Local nCnt
Local nResultado := 0
For nCnt := nFator To 1 Step -1 // nFator está como Nulo, por lo tanto nCnt es nulo
nResultado *= nCnt
Next nCnt // Al efectuar el Next, el interpretador realiza la acción nCnt += 1.
Return nResultado
Las directivas pueden colocarse en cualquier parte del programa. Las que el lenguaje
ADVPL implementó son:
; #INCLUDE
; #DEFINE
; #IFDEF
; #IFNDEF
; #ELSE
; #ENDIF
; #COMMAND
Directiva: #INCLUDE
La aplicación ERP tiene diversos includes, los cuales debe utilizarse según la
aplicación que se desarrollará, lo que permitirá la utilización de recursos
adicionales definidos para el lenguaje, implementados por medio del área de
Tecnología de Totvs.
o DIALOG.CH
o FONT.CH
o INI.CH
o PTMENU.CH
o PRINT.CH
o TCQUERY
o CREATE RPCCONN
o CLOSE RPCCONN
o PREPARE ENVIRONMENT
o RESET ENVIRONMENT
o CREATE XMLSTRING
o CREATE XMLFILE
o SAVE XMLSTRING
o SAVE XMLFILE
o ADDITEM TAG
o ADDNODE NODE
o DELETENODE
___________________________________________________________________________
___________________________________________________________________________
Por esta razón, la aplicación ERP tiene tres repositorios distintos para
cada una de las bases de datos homologadas por Microsiga, pues cada
compilación utiliza una directiva referente a su idioma.
Por medio de estas directivas, pueden verificarse parámetros del Sistema, tales
como el idioma con el cual está parametrizado y la base de datos utilizada
para almacenar y administrar la información del ERP.
De esta manera, en lugar de escribir dos o más códigos fuentes que realizan la
misma función, pero que utilizan recursos distintos para cada base de datos o
muestran un mensaje para cada uno de los idiomas tratados por la aplicación,
el desarrollador puede preparar su código fuente para que el procesador
previo lo evalúe, el cual generará un código compilado de acuerdo con el
análisis de los parámetros de entorno.
#IFDEF ENGLISH
#DEFINE STR0001 “Hello !!!”
#ELSE
#DEFINE STR0001 “Olá !!!”
#ENDIF
#ENDIF
; “PORTUGUESE”
; “SPANISH”
; “ENGLISH”
; Base de Datos: Verifica las variables AXS y TOP para determinar si la base
de datos que la aplicación está usando se encuentra en el formato ISAM (DBF,
ADS, CTREE, etc.) o si está utilizando la herramienta TOPCONNECT (DbAcess).
#IFDEF TOP
#ELSE
DbSelectArea(“SA1”)
Directiva: #COMMAND
Ejercicio
Desarrollar un programa que permita al usuario buscar un cliente, informando su
Registro Nacional de Persona Jurídica (CNPJ) y si éste existe en la base, mostrar sus
principales informaciones.
Ejercicio
Por medio de la interfaz visual desarrollada para el ejercicio anterior, desarrollar la
función genérica GetTexto(), para que se utilice en las aplicaciones del Juego Tres en
Raya y el Juego del Ahorcado.
Ejercicio
Por medio de la función AVISO(), desarrollar un programa que permita al usuario
seleccionar la opción de búsqueda del Registro Nacional de Persona Jurídica (CNPJ)
por cliente o proveedor, y si lo encuentra que muestre sus datos principales.
Ejercicio
Desarrollar una rutina que capture varios Registros Nacionales de Personas Jurídicas
(CNPJ) de clientes informados por el usuario, y verifique para cada uno de ellos si
éste existe en la base de datos. Al final, informar qué CNPJ se informaron y de
acuerdo con la selección del usuario, mostrar los datos principales de uno de estos
clientes.
Ejercicio
Por medio de la función FORMBATCH(), desarrollar una rutina que verifique si para
cada ítem de una factura de entrada existe el respectivo encabezado y si encuentra
algún ítem inconsistente, comunique esta ocurrencia al usuario que está realizando
el procesamiento.
El Sistema Protheus, por otro lado, es una plataforma tecnológica que abarca un
Servidor de Aplicación, un Diccionario de Datos y las Interfaces para conexión con el
usuario. Es el Protheus que ejecuta el código ADVPL y el debido acceso a la base de
datos.
; Que el Sistema crezca de forma ilimitada, pues los objetos están fuera del
ejecutable.
Ésta también muestra que los datos que se procesarán pueden estar
almacenados en bases ISAM o en Bases de Datos estándar SQL. En el primer
caso, el server se comunica directamente con los datos. En Bases SQL, la
interfaz TOPCONNECT / DBACCESS convierte los comandos de entrada y
salida, adecuándose al SQL utilizado (SQl Server Microsoft, Oracle, DB2, etc.).
; Patch: Actualizaciones específicas del RPO, aplicadas por medio del IDE.
Si existe algún Firewall o Proxy entre el WEB Server y el Browser que accederá
al SmartClient ActiveX, estos deben configurarse para permitir el download.
c:\protheus\bin\appserver\totvsappserver.exe
Ö
Destino:
- consola
Iniciar en: c:\protheus\bin\appserver
; -Consola o -Debug
; -Install
; -Remove
Para borrarlo de la Lista de Servicios del NT, puede ejecutarse con la opción
Línea de Comando.
c:\protheus\bin\smartclient\totvssmartcliente.exe –
Ö
Destino:
M
Iniciar en: c:\protheus\bin\smartclient
; -Q (Quiet)
; -P (Main Program)
; -E (Environment)
; -M (AllowMultiSession)
Los parámetros que configuran el local del RPO, la Base de Datos (ISAM o
SQL), los archivos de menús, configuraciones y personalizaciones del sistema
en el archivo INI son:
[DRIVERS]
ACTIVE=TCP
[TCP]
TYPE=TCPIP
PORT=1234
[DRIVERS]
ACTIVE=TCP
[TCP]
SERVER=172.16.72.41
PORT=1234
; Server: Apunta a la dirección del servidor que puede ser la propia máquina
(localhost) o el nombre de la máquina (Server= Servidor_01) o incluso una
dirección IP (ejemplo Server=172.16.72.41).
Ejemplo:
Archivo Descripción
SIGAMAT Archivo de empresas y sucursales del sistema
SIGAPSS Archivo de usuarios, grupos y contraseñas del sistema
SIX Índices de los archivos
SX1 Preguntas y respuestas
SX2 Mapeo de tablas
SX3 Diccionario de datos
SX4 Agenda del Schedule de procesos
SX5 Tablas
SX6 Parámetros
SX7 Disparadores de interfaz
SX8 Fuera de uso
SX9 Vinculación entre tablas
SXA Carpetas de registro apuntadas en el SX3
SXB Consulta por medio de la tecla F3 (Consulta Estándar)
SXD Control del Schedule de procesos
SXE Secuencia de documentos (+1)
SXF Secuencia de documentos (Próximo)
SXG Tamaño estándar para campos apuntado por el SX3
SXK Respuesta de Preguntas (SX1) por usuarios
Control de LOG por tabla
SXO
Entornos y tablas
Para permitir una utilización adecuada de las tablas de datos del Sistema por
cada uno de los Entornos de la aplicación ERP, las tablas se dividieron en
grupos denominados “familias”. Cada módulo puede utilizar una o más
familias de tablas específicas para sus actividades y además, compartir
información con otros módulos, por medio de de familias comunes a todas las
operaciones realizadas en el Sistema.
Entorno Identificación
SIGAATF ACTIVO FIJO
SIGACOM COMPRAS
SIGACON CONTABILIDAD
SIGAEST STOCK Y COSTOS
SIGAFAT FACTURACIÓN
SIGAFIN FINANCIERO
SIGAFIS LIBROS FISCALES
SIGAPCP PLANIFICACIÓN Y CONTROL DE LA PRODUCCIÓN
SIGAGPE GESTIÓN DE PERSONAL
SIGAFAS FACTURACIÓN DE SERVICIOS
SIGAVEI VEHÍCULOS
SIGALOJA CONTROL DE TIENDAS/AUTOMATIZACIÓN
SIGATMK CALL CENTER
SIGAOFI TALLERES
SIGAPON RELOJ REGISTRADOR ELECTRÓNICO
SIGAEIC EASY IMPORT CONTROL
F X X E E 0
Familia Descripción
Tablas pertenecientes al sistema básico, también denominado
S -
Classic
Archivos de entes compartidos entre los Entornos (Clientes,
S A
Proveedores, Bancos, entre otros)
Archivos de los Entornos de Materiales (Productos, Saldos entre
S B
otros)
Archivos de movimientos diversos, utilizados por los entornos de
S C Materiales (Solicitud al Depósito, Solicitud de Compras, Pedido de
Compras, Pedido de Ventas, Órdenes de Producción, entre otros)
Archivos de movimientos de stock (Ítems de facturas de entrada y
S D
salida, movimientos internos de stock entre otros)
S E Archivo y movimientos del entorno Financiero
Archivos y Movimientos Fiscales (Encabezados de la facturas de
S F entrada y salida, archivo de tipos de entrada y salida, libros
fiscales, etc.)
S G Archivos del Entorno de Planificación y Control de Producción
S H Movimientos del Entorno de Planificación y Control de Producción
S I Archivos y movimientos del Entorno Contable (descontinuado)
S N Archivos y movimientos del Entorno Activo Fijo
S R Archivos y movimientos del Entorno Gestión de Personal
S X Tablas de configuración del sistema
S Z Tablas libres para utilización y proyectos específicos en clientes
A - Gestión de Proyectos
C - Contabilidad de Gestión
C T Contabilidad de Gestión
C V Contabilidad de Gestión
C W Contabilidad de Gestión
D - Transportadoras y derivados
E - Comercio exterior y derivados
G - Gestión Hospitalaria
Índices
Las especificaciones de las claves de índices de cada una de las tablas está
disponible en el archivo de sistema SIX y la clave única de la tabla utilizada
para la base de datos está descrita en la tabla SX2.
Menús
Cada módulo de la aplicación ERP tiene un menú estándar con todas las
funcionalidades disponibles para el Entorno, el cual se define por medio de la
sintaxis XML (archivos .XNU).
Los menús tienen una estructura estándar que permite al usuario localizar e
identificar fácilmente cada una de las funcionalidades ofrecidas por el Entorno.
Procedimiento
; El dominio SZ1 a SZZ (considerando todos los números y todas las letras en
el último byte) se reserva para datos exclusivos del usuario, pues el Sistema no
utilizará este intervalo. Si fuera necesario el dominio Z00 a ZZZ, también puede
emplearse para desarrollos específicos del cliente.
Procedimiento
Confirmar ( ).
; Nombre del campo: Todos los campos tienen como prefijo el propio
nombre de la tabla y para las tablas de la familia “S”, el prefijo del campo se
compone solamente de los dos próximos dígitos. En el caso de las otras tablas,
el prefijo del campo será los tres dígitos identificadores de la tabla.
; Contexto: Puede ser real o virtual. El contexto virtual sólo crea el campo
en la memoria y no en la tabla almacenada en el disco. Esto es necesario
porque los programas de registro y de consulta genérica muestran solamente
una tabla por cada vez. De esta manera, si queremos mostrar un campo de
otra tabla, o incluso, el resultado de un cálculo, sin que dicha información
Solapa: Campo
; En esta ventana, los datos están clasificados en seis carpetas con carpetas
con objetivos de rellenado bien específicos:
Solapa: Información
Solapa: Opciones
Solapa: Uso
Solapa: Módulos
Procedimiento
1. Para agregar un índice a una tabla del diccionario de datos de una empresa,
seleccione a continuación, la opción Diccionario de Datos de la empresa que
se actualizará. (árbol de opciones de la parte izquierda de la interfaz visual del
Administrador de Bases de Datos).
Confirmar ( ).
Procedimiento
; La regla puede ser una expresión que resulta en un valor que se rellenará
en el Contradominio.
Procedimiento
1. Para agregar una tabla genérica, seleccione los menús Entorno, Archivos,
Tablas.
Procedimiento
Proyecto
Ejecución
; Definir y marcar los puntos de parada más adecuados para análisis del
fuente.
Variables Locales
Variables Privates
Variables Publics
Variables Statics
Ventana de la Watchs
Ventana de Tablas y Campos
Grupo de Llamadas
Interfaz de la aplicación
De esta manera, el lenguaje tiene dos grupos de funciones distintos para actuar con
las bases de datos:
El acceso directo se realiza por medio de índices que son tablas paralelas a las
tablas de datos y que tienen la clave y la dirección del registro, de forma
análoga al índice de un libro. Para cada clave se crea un índice propio.
Cada vez que se incluye o modifica un registro se actualizan todos los índices,
lo que hace necesario planificar adecuadamente cuáles y cuántos índices se
definirán para una tabla, pues una cantidad excesiva puede comprometer el
Esto ocurre en las bases de datos ISAM debido al concepto de borrado lógico
de registros que éstas tienen. Ya en las bases de datos estándar SQL
nativamente sólo se utiliza el concepto de borrado físico de registros, lo que
para otras aplicaciones sería transparente, pero no es el caso del ERP Protheus.
Con ello, el campo R_E_C_N_O_ será un identificador único del registro dentro
de la tabla, funcionando como ID o RECNUMBER de una tabla ISAM, pero
utilizando un recurso adicional disponible en las bases de datos relacionales
conocido como Clave Primaria.
SELECT()
DBSELECTAREA()
DBSETORDER()
DBSEEK() y MSSEEK()
DBSKIP()
DBGOTO()
DBGOTOP()
DBGOBOTTON()
DBSETFILTER()
RECLOCK()
SOFTLOCK()
MSUNLOCK()
DBDELETE()
DBCLOSEAREA()
DBRLOCK()
Sintaxis DBRLOCK(xIdentificador)
Función de base de datos, que efectúa el lock (trabamiento) del
registro identificado por el parámetro xIdentificador. Este
parámetro puede ser el Recno() para tablas en formado ISAM, o
la clave primaria para bases de datos relacionales.
Descripción
Si no se especifica el parámetro xIdentificador, se liberarán todos
los locks del área de trabajo, se trabará el registro marcado y se
agregará en una lista de registros bloqueados.
DBCLOSEAREA()
Sintaxis DbCloseArea()
Permite que se cierre un alias presente en la conexión, lo que
hace posible que se utilice nuevamente en otra operación. Este
Descripción comando sólo tiene efecto en el alias activo en la conexión,
haciéndose necesaria su utilización en conjunto con el comando
DbSelectArea().
DBCOMMIT()
Sintaxis DBCOMMIT()
Efectúa todas las actualizaciones pendientes en el área de
Descripción
trabajo activa.
DBCOMMITALL()
Sintaxis DBCOMMITALL()
Efectúa todas las actualizaciones pendientes en todas las área de
Descripción
trabajo, que están en uso por la thread (conexión) activa.
DBDELETE()
Sintaxis DbDelete()
Efectúa el borrado lógico del registro marcado en el área de
Descripción trabajo activa. Para ello, es necesaria su utilización en conjunto
con las funciones RecLock() y MsUnLock().
Sintaxis DbGoto(nRecno)
Mueve el cursor del área de trabajo activa al record number
Descripción (recno) especificado, realizando una localización directa, sin
necesidad de búsqueda (seek) previa.
DBGOTOP()
Sintaxis DbGoTop()
Mueve el cursor del área de trabajo activa al primer registro
Descripción
lógico.
DBGOBOTTON()
Sintaxis DbGoBotton()
Mueve el cursor del área de trabajo activa al último registro
Descripción
lógico.
DBRLOCKLIST()
Sintaxis DBRLOCKLIST()
Devuelve un array con el record number (recno) de todos los
Descripción
registros trabados del área de trabajo activa.
DBSEEK() y MSSEEK()
Sintaxis DbSkip(nRegistros)
Mueve el cursor del registro marcado al próximo (o anterior,
Descripción dependiendo del parámetro), en función del orden activo para el
área de trabajo.
DBSELECTAREA()
DBSETFILTER()
DBSETORDER()
Sintaxis DbSetOrder(nOrdem)
Define qué índice se utilizará por el área de trabajo activa, es
decir, por el área previamente seleccionada por medio del
Descripción comando DbSelectArea(). Los órdenes disponibles en el Entorno
Protheus son aquellos definidos en el SINDEX /SIX, o los órdenes
puestos a disposición por medio de índices temporales.
DBORDERNICKNAME()
Sintaxis DbOrderNickName(NickName)
Define qué índice creado por el usuario se utilizará. El usuario
Descripción puede incluir sus propios índices y en el momento de la inclusión
debe crear su NICKNAME.
Sintaxis DBUNLOCK()
La misma funcionalidad de la función UNLOCK(), sólo que
recomendada para entornos de red en los cuales se comparten
los archivos.
Descripción
Libera el trabamiento del registro marcado en el área de trabajo
activa y
confirma las actualizaciones realizadas en aquel registro.
DBUNLOCKALL()
Sintaxis DBUNLOCKALL()
Libera el trabamiento de todos los registros de todas las áreas de
Descripción
trabajo disponibles en la thread (conexión) activa.
DBUSEAREA()
MSUNLOCK()
Sintaxis MsUnLock()
Libera el trabamiento (lock) del registro marcado, confirmando
Descripción
las actualizaciones realizadas en este registro.
RECLOCK()
Sintaxis RecLock(cAlias,lInclui)
Efectúa el trabamiento del registro marcado en el área de trabajo
Descripción
activa, permitiendo que se incluya o modifique su información.
SELECT()
Sintaxis Select(cArea)
Determina el número de referencia de un determinado alias en un
entorno de trabajo. Si el alias especificado no estuviera en uso en
Descripción
el Entorno, se devolverá el valor 0 (cero).
SOFTLOCK()
Sintaxis SoftLock(cAlias)
Permite la reserva del registro marcado en el área de trabajo
activa, de tal manera que otras operaciones, con excepción de la
actual, no puedan actualizar este registro. Difiere de la función
RecLock() porque no genera una obligación de actualización y
puede sustituirse por ésta.
Descripción
En la aplicación ERP Protheus, la opción SoftLock() se utiliza en los
browses, antes de la confirmación de la operación de modificación
y borrado, porque en este momento ésta aún no se hizo efectiva,
pero otras conexiones no pueden acceder a aquel registro porque
se encuentra en mantenimiento, lo cual permite la integridad de la
información.
UNLOCK()
Sintaxis UNLOCK()
Libera el trabamiento del registro marcado en el área de trabajo
Descripción activa y
confirma las actualizaciones realizadas en aquel registro.
Muchas veces una variable puede tener el mismo nombre que un campo de
un archivo o de una tabla abierta en el momento. En este caso, el ADVPL
privilegiará el campo, de tal manera que una referencia a un nombre, que
identifique tanto una variable como un campo, resultará en el contenido del
campo.
cRes := MEMVAR->NOME
Esta línea de comando identifica que el valor atribuido a la variable cRes debe
ser el valor de la variable de memoria denominada NOME.
cRes := FIELD->NOME
En este caso, el valor atribuido a la variable cRes será el valor del campo
NOME, existente en el archivo o tabla abierto en el área actual.
cRes := CLIENTES->NOME
Semáforos
GETSXENUM()
CONFIRMSXE()
ROLLBACKSXE()
GETSXENUM()
Sintaxis CONFIRMSXE(lVerifica)
Confirma el número asignado por medio del último comando
Descripción
GETSXENUM().
ROLLBACKSXE()
Sintaxis ROLLBACKSXE()
Descarta el número suministrado por el último comando
Descripción GETSXENUM(), devolviendo la numeración disponible a otras
conexiones.
VAZIO()
NAOVAZIO()
EXISTCPO()
EXISTCHAV()
PERTENCE()
POSITIVO()
NEGATIVO()
TEXTO()
EXISTCHAV()
Descripción
Esta función generalmente se utiliza para verificar si la
información digitada en un campo, que depende de otra tabla,
realmente existe en aquella otra tabla, como por ejemplo, el
código de un cliente en un pedido de venta.
NAOVAZIO()
Sintaxis NaoVazio()
Devuelve .T. o .F. si el contenido del campo marcado en el
Descripción
momento no está vacío.
NEGATIVO()
Sintaxis Negativo()
Devuelve .T. o .F. si el contenido digitado para el campo es
Descripción
negativo.
PERTENCE()
Sintaxis Pertence(cString)
Devuelve .T. o .F. si el contenido digitado para el campo está
incluido en el string, definido como parámetro de la función.
Descripción Generalmente se utiliza en campos con la opción de lista de
opciones, porque de loo contrario se utilizaría la función
ExistCpo().
POSITIVO()
Sintaxis Positivo()
Devuelve .T. o .F. si el contenido digitado para el campo es
Descripción
positivo.
TEXTO()
Sintaxis Texto()
VAZIO()
Sintaxis Vazio()
Devuelve .T. o .F. si el contenido del campo marcado en el
Descripción
momento está vacío.
Funciones
Contenido Funcionalidad
A Acepta solamente caracteres alfabéticos
C Muestra CR después de números positivos
E Muestra número con punto y coma invertidos (formato Europeo)
R Inserta caracteres diferentes de los caracteres de template en la
exhibición pero no los inserta en la variable del GET
S<n> Permite el desplazamiento horizontal del texto dentro del GET, <n>. Es
un número entero que identifica el tamaño de la región
X Muestra DB después de números negativos
Z Muestra ceros como blancos
( Muestra números negativos entre paréntesis con los espacios en
blanco iniciales
) Muestra números negativos entre paréntesis sin los espacios en blanco
iniciales
! Convierte caracteres alfabéticos a mayúsculas
Templates
Contenido Funcionalidad
X Permite cualquier carácter
9 Permite solamente dígitos para cualquier tipo de dato, incluyendo el
signo para numéricos
# Permite dígitos, signos y espacios en blanco para cualquier tipo de
dato
! Convierte caracteres alfabéticos a mayúsculas
A1_NOME – Carácter - 40
Picture: @!
SAY y PSAY
Funciones
Contenido Funcionalidad
C Muestra CR después de números positivos.
E Muestra un número con punto y coma invertidos (formato Europeo).
R Inserta caracteres diferentes de los caracteres de template.
X Muestra DB después de números negativos.
Z Muestra ceros como blancos.
( Involucra números negativos entre paréntesis.
! Convierte todos los caracteres alfabéticos mayúsculo.
Templates
Contenido Funcionalidad
X Muestra dígitos para cualquier tipo de dato.
9 Muestra dígitos para cualquier tipo de dato.
# Muestra dígitos para cualquier tipo de dato.
! Convierte caracteres alfabéticos a mayúsculas.
* Muestra un asterisco en lugar de los espacios en blanco e iniciales en
números.
. Muestra la posición del punto decimal.
, Muestra la posición de millar.
Ejemplos
Ejemplos
Ejemplos
o GETMV()
o SUPERGETMV()
o GETNEWPAR()
GETMV()
SUPERGETMV()
GETNEWPAR()
PUTMV()
GETMV()
Sintaxis GETMV(cParametro)
Devuelve el contenido del parámetro especificado en el archivo
SX6, considerando la sucursal parametrizada en la conexión. Si el
Descripción
parámetro no existe, se mostrará un help del sistema informando
la ocurrencia.
GETNEWPAR()
PUTMV()
Conceptos
Premisas y Reglas
El lenguaje ADVPL tiene dos formas distintas para la definición de interfaces visuales
en el Entorno ERP: sintaxis convencional, en los estándar del lenguaje CLIPPER y la
sintaxis orientada a objetos.
#include “rwmake.ch”
#include “protheus.ch”
MSDIALOG()
MSGET()
SAY()
BUTTON()
SBUTTON()
BUTTON()
MSDIALOG()
SAY()
SBUTTON()
; AxCadastro
; Mbrowse
13.2.1. AxCadastro()
; Parámetros
Ejemplo:
#include "protheus.ch"
dbSelectArea(cAlias)
dbSetOrder(1)
AxCadastro(cAlias,cTitulo,cVldExc,cVldAlt)
Return
; Parámetros
AADD(aRotina,{"Buscar" ,"AxPesqui",0.1})
aRotina
AADD(aRotina,{"Visualizar" ,"AxVisual",0.2})
AADD(aRotina,{"Incluir" ,"AxInclui" ,0.3})
AADD(aRotina,{"Modificar" ,"AxAltera",0.4})
AADD(aRotina,{"Borrar" ,"AxDeleta",0.5})
Ejemplo:
#include "protheus.ch"
AADD(aRotina,{"Buscar" ,"AxPesqui",0.1})
AADD(aRotina,{"Visualizar" ,"AxVisual",0.2})
AADD(aRotina,{"Incluir" ,"AxInclui",0.3})
AADD(aRotina,{"Modificar" ,"AxAltera",0.4})
AADD(aRotina,{"Borrar" ,"AxDeleta",0.5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return
#include "protheus.ch"
AADD(aRotina,{"Buscar" ,"AxPesqui",0.1})
AADD(aRotina,{"Visualizar" ,"AxVisual",0.2})
AADD(aRotina,{"Incluir" ,"U_BInclui" ,0.3})
AADD(aRotina,{"Modificar" ,"AxAltera",0.4})
AADD(aRotina,{"Borrar" ,"AxDeleta",0.5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return
RETURN
AXPESQUI()
AXVISUAL()
AXINCLUI()
AXALTERA()
AXDELETA()
AXALTERA()
AXDELETA()
AXINCLUI()
Sintaxis AXPESQUI()
Función de búsqueda estándar en los registros mostrados por
los browses del Sistema, la cual posiciona el browse en el
Descripción registro consultado. Muestra una pantalla que permite la
selección del índice que se utilizará en la búsqueda y la
digitación de la información que conforma la clave de búsqueda.
AXVISUAL()
Ejercicio
Desarrollar una validación para un campo específico del tipo carácter, cuyo
contenido esté relacionado con otra tabla y que muestre un mensaje de aviso si el
código informado no existe en esta tabla relacionada.
Ejercicio
Desarrollar una validación para un campo carácter existente en la base, para que se
evalúe si aquel código está registrado y en caso positivo, que se muestre un mensaje
advirtiendo sobre esta ocurrencia.
Ejercicio
Ejercicio
Proteger la rutina desarrollada en el ejercicio anterior, para garantizar que en la
utilización de la sucursal como prefijo del título no ocurrirá duplicación de datos en
cuentas por pagar del financiero.
Ejercicio
Implementar una validación adicional en el archivo de clientes, por medio del punto
de entrada adecuado, de tal manera que el campo Registro Nacional de Persona
Jurídica (CNPJ) (A1_CGC) sea obligatorio para todos los tipos de cliente, excepto los
definidos como Exterior.
Es obligatorio utilizar la sangría, porque permite que el código sea mucho más
legible. Vea los siguientes ejemplos:
La utilización de la sangría según las estructuras de control de flujo (while, if, caso
etc), permite que la comprensión del código sea mucho más fácil:
Una forma ampliamente difundida consiste en utilizar letras capitales en las palabras
claves, funciones, variables y campos por medio de una combinación de caracteres
en mayúscula y minúscula, con el fin de facilitar la lectura del código fuente. El
siguiente código:
Quedaría mejor con las palabras claves y variables elaboradas con letras capitales:
; dbSeek()
; dbSelectArea()
; Contantes:
#define NUMLINES 60 #define NUMPAGES 1000
; Variables de memoria:
M-> CT2_CRCONV M->CT2_MCONVER := CriaVar("CT2_CONVER")
; Campos:
SC6->C6_NUMPED
; Queries:
SELECT * FROM...
CTOD()
; Sintaxis: CTOD(cData)
; Parámetros:
Ejemplo:
cData := “31/12/06”
dData := CTOD(cData)
CVALTOCHAR()
Realiza la conversión de una información del tipo numérico en una string, sin
la adición de espacios a la información.
; Sintaxis: CVALTOCHAR(nValor)
; Parámetros:
Ejemplo:
FOR nPercorridos := 1 to 10
MSGINFO(“Pasos recorridos: ”+CvalToChar(nPercorridos))
NEXT nPercorridos
DTOC()
; Sintaxis: DTOC(dData)
; Parámetros:
Ejemplo:
DTOS()
; Sintaxis: DTOS(dData)
; Parámetros:
Ejemplo:
; Sintaxis: STOD(sData)
; Parámetros:
Ejemplo:
STR()
; Sintaxis: STR(nValor)
; Parámetros:
Ejemplo:
FOR nPercorridos := 1 to 10
MSGINFO(“Pasos recorridos: ”+CvalToChar(nPercorridos))
NEXT nPercorridos
STRZERO()
Ejemplo:
FOR nPercorridos := 1 to 10
MSGINFO(“Pasos recorridos: ”+CvalToChar(nPercorridos))
NEXT nPercorridos
VAL()
; Sintaxis: VAL(cValor)
; Parámetros:
Ejemplo:
TYPE()
; Sintaxis: TYPE(“cVariavel”)
; Parámetros:
Ejemplo:
IF TYPE(“dDataBase”) == “D”
MSGINFO(“Database del sistema: ”+DTOC(“dDataBase”))
ELSE
MSGINFO(“Variable indefinida en el momento”)
VALTYPE()
; Sintaxis: VALTYPE(cVariavel)
; Parámetros:
Ejemplo:
LOCAL cTexto := “”
LOCAL nColF := 0
LOCAL nLargGet := 0
PRIVATE oDlg
cTexto := Space(nTamanho)
nLargGet := Round(nTamanho * 2.5,0)
nColf := Round(195 + (nLargGet * 1,75) ,0)
cTexto := IIF(nOpca==1.cTexto,"")
RETURN cTexto
Manipulación de arrays.
Array()
Ejemplo:
aDados := Array(3.3) // Crea un array de tres líneas, cada cual con 3 columnas.
AADD()
Ejemplo:
// En este punto el array aItem tiene 03 elementos, los cuales pueden accederse con:
// aItem[1] -> corresponde al contenido de cVariavel1
// aItem[2] -> corresponde al contenido de cVariavel2
// aItem[3] -> corresponde al contenido de cVariavel3
Ejemplo (continuación):
AADD(aDados, aItem)
AADD(aDados, aItem)
// En este punto, el array aDados tiene 03 elementos, donde cada cual es un array
con otros
// 03 elementos, donde:
ACLONE()
; Sintaxis: AADD(aArray)
; Parámetros:
ADEL()
Ejemplo:
Ejemplo:
// Cuando se utiliza el array aItens, el cual tuvo un elemento borrado por el uso de la
función ADEL()
ASIZE(aItens,Len(aItens-1)).
// En este punto el array aItens tiene 02 elementos, ambos con contenidos válidos.
ASORT()
Ação Z-> expresión que se ejecutará por medio del bloque de código
aSort(aAlunos)
// En este punto, los elementos del array aAlunos serán {“Andrea”, “Mauren”,
“Soraya”}
aSort(aAlunos,,bOrdem)
// En este punto, los elementos del array aAlunos serán {“Soraya” , “Mauren”,
“Andrea”}
ASCAN()
Ejemplo:
AINS()
Ejemplo:
AINS(aAlunos,3)
EVAL()
Ejemplo:
nInt := 10
bBloco := {|N| x:= 10, y:= x*N, z:= y/(x*N)}
Ejemplo 01
dbSelectArea(“SX5”)
dbSetOrder(1)
dbGotop()
nCnt++
dbSkip()
End
Ejemplo 02
dbSelectArea(“SX5”)
dbSetOrder(1)
dbGotop()
Ejemplo 02 (continuación):
AEVAL()
nInicio Elemento inicial del array, a partir del cual se evaluarán los bloques
de código.
nFim Elemento final del array, hasta el cual se evaluarán los bloques de
código.
Ejemplo 01:
AADD(aCampos,”A1_FILIAL”)
AADD(aCampos,”A1_COD”)
SX3->(dbSetOrder(2))
For nX:=1 To Len(aCampos)
Manipulación de strings
ALLTRIM()
; Sintaxis: ALLTRIM(cString)
; Parámetros:
Ejemplo:
cNome := ALLTRIM(SA1->A1_NOME)
ASC()
; Sintaxis: ASC(cCaractere)
; Parámetros:
Ejemplo:
EndCase
cRet := cRet+cLetra
Next
Return UPPER(cRet)
Ejemplo:
cNoMascara := PADR(ALLTRIM(cNoMascara),nTamanho)
ELSE
cNoMascara := PADR(ALLTRIM(cString),nTamanho)
ENDIF
RETURN cNoMascara
CHR()
; Sintaxis: CHR(nASCII)
; Parámetros:
Ejemplo:
LEN()
; Sintaxis: LEN(cString)
; Parámetros:
Ejemplo:
cNome := ALLTRIM(SA1->A1_NOME)
LOWER()
Devuelve una string con todos los caracteres minúsculos, con base en la string
considerada como parámetro.
; Sintaxis: LOWER(cString)
; Parámetros:
Ejemplo:
cTexto := “ADVPL”
MSGINFO(“Texto:”+LOWER(cTexto))
STUFF()
Ejemplo:
SUBSTR()
Ejemplo:
cCampo := “A1_NOME”
nPosUnder := AT(cCampo)
UPPER()
Devuelve una string con todos los caracteres mayúsculos, con base en la string
considerada como parámetro.
; Sintaxis: UPPER(cString)
; Parámetros:
Ejemplo:
cTexto := “advpl”
MSGINFO(“Texto:”+LOWER(cTexto))
ABS()
; Sintaxis: ABS(nValor)
; Parámetros:
nPessoas := 20
nLugares := 18
INT()
; Sintaxis: INT(nValor)
; Parámetros:
Ejemplo:
RETURN nQuantidade
NOROUND()
Ejemplo:
nBase := 2.985
nValor := NOROUND(nBase,2) Æ 2.98
ROUND()
Ejemplo:
nBase := 2.985
nValor := ROUND(nBase,2) Æ 2.99
SELECT()
; Sintaxis: Select(cArea)
; Parámetros:
Ejemplo:
nArea := Select(“SA1”)
DBGOTO()
; Sintaxis: DbGoto(nRecno)
; Parámetros:
Ejemplo:
DbSelectArea(“SA1”)
DbGoto(100) // Marca en el registro 100
; Sintaxis: DbGoTop()
; Parámetros:
Ninguno .
Ejemplo:
DBGOBOTTON()
; Sintaxis: DbGoBotton()
; Parámetros:
Ninguno .
DBSELECTAREA()
DBSETORDER()
Define qué índice se utilizará por el área de trabajo activa, es decir, por el área
previamente seleccionada por medio del comando DbSelectArea(). Los
órdenes disponibles en el Entorno Protheus son aquellos definidos en el
SINDEX /SIX, o los órdenes puestos a disposición por medio de índices
temporales.
; Sintaxis: DbSetOrder(nOrdem)
; Parámetros:
Ejemplo:
DbSelectArea(“SA1”)
DbSetOrder(1) // De acuerdo con el archivo SIX -> A1_FILIAL+A1_COD+A1_LOJA
DBORDERNICKNAME()
Define qué índice creado por el usuario se utilizará. El usuario puede incluir sus
propios índices y en el momento de la inclusión debe crear su NICKNAME.
; Sintaxis: DbOrderNickName(NickName)
; Parámetros:
DbSelectArea(“SA1”)
DbOrderNickName(“Tipo”) // De acuerdo con el archivo SIX -> A1_FILIAL+A1_TIPO
NickName: Tipo
DBSEEK() y MSSEEK()
DbSeek: Con el cursor del área de trabajo activa es posible marcar el registro
con la información especificada en la clave de búsqueda, suministrando una
devolución lógica que indica si la localización se realizó con éxito, es decir, si la
información especificada en la clave de búsqueda se localizó en el área de
trabajo.
DbSelectArea(“SA1”)
DbSetOrder(1) // de acuerdo con el archivo SIX -> A1_FILIAL+A1_COD+A1_LOJA
Else
MsgAlert(“Cliente no encontrado”, “Consulta por cliente”)
Endif
DbSelectArea(“SA1”)
DbSetOrder(1) // de acuerdo con el archivo SIX -> A1_FILIAL+A1_COD+A1_LOJA
// Muestra los datos del cliente localizado, el cual puede no ser el que se especificó
en la clave:
DBSKIP()
; Sintaxis: DbSkip(nRegistros)
; Parámetros:
DbSelectArea(“SA1”)
DbSetOrder(2) // A1_FILIAL + A1_NOME
While !EOF() // Mientras el cursor del área de trabajo activa no indica el final del
archivo
MsgInfo(“Está en el cliente:” + A1_NOME)
DbSkip()
End
DbSelectArea(“SA1”)
DbSetOrder(2) // A1_FILIAL + A1_NOME
DbGoBotton() // Posiciona el cursor al final del área de trabajo activa.
While !BOF() // Mientras el cursor del área de trabajo activa no indica el inicio del
archivo
MsgInfo(“Está en el cliente:” + A1_NOME)
DbSkip(-1)
End
DBSETFILTER()
While !EOF()
MsgInfo(“Está en el cliente:”+A1_COD)
While !EOF()
MsgInfo(“Está en el cliente:”+A1_COD)
DbSkip()
End
DBSTRUCT()
Devuelve un array que contiene la estructura del área de trabajo (alias) activa.
La estructura será un array bidimensional, de acuerdo con lo siguiente:
; Sintaxis: DbStruct()
; Parámetros:
Ninguno .
Ejemplo:
cCampos := “”
DbSelectArea(“SA1”)
aStructSA1 := DbStruct()
NEXT nX
ALERT(cCampos)
RECLOCK()
; Sintaxis: RecLock(cAlias,lInclui)
; Parámetros:
Ejemplo 01 - Inclusión
DbSelectArea(“SA1”)
RecLock(“SA1”,.T.)
SA1->A1_FILIAL := xFilial(“SA1”) // Devuelve la sucursal, de acuerdo con las
configuraciones del ERP.
SA1->A1_COD := “900001”
SA1->A1_LOJA := “01”
MsUnLock() // Confirma y finaliza la operación.
Ejemplo 02 - Modificación
DbSelectArea(“SA1”)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbSeek(“01” + “900001” + “01”) // Búsqueda exacta
; RLOCK()
; DBRLOCK()
MSUNLOCK()
; Sintaxis: MsUnLock()
; Parámetros:
Ninguno .
Ejemplo:
DbSelectArea(“SA1”)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbSeek(“01” + “900001” + “01”) // Búsqueda exacta
; UNLOCK()
; DBUNLOCK()
; DBUNLOCKALL()
SOFTLOCK()
; Sintaxis: SoftLock(cAlias)
; Parámetros:
Ejemplo:
DbSelectArea(“SA1”)
DbSetOrder(1)
DbSeek(cChave)
IF Found()
SoftLock() // Reserva el registro localizado
IF lConfirma
RecLock(“SA1”,.F.)
GravaSA1() // Función ilustrativa que modifica los datos de acuerdo con
AlertaSA1().
MsUnLock() // Liberado el RecLock() y el SoftLock() del registro.
EndIf
EndIf
DBDELETE()
; Sintaxis: DbDelete()
; Parámetros:
Ninguno .
Ejemplo:
DbSelectArea(“SA1”)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbSeek(“01” + “900001” + “01”) // Búsqueda exacta
IF Found()
RecLock(“SA1”,.F.) // Define que se realizará una modificación en el registro
marcado.
DbDelete() // Realiza el borrado lógico del registro marcado.
MsUnLock() // Confirma y finaliza la operación.
ENDIF
DBUSEAREA()
Ejemplo:
DBCLOSEAREA()
Permite que se cierre un alias presente en la conexión, lo que hace posible que
se utilice nuevamente en otra operación. Este comando sólo tiene efecto en el
alias activo en la conexión, haciéndose necesaria su utilización en conjunto con
el comando DbSelectArea().
; Sintaxis: DbCloseArea()
; Parámetros:
Ninguno .
Ejemplo:
GETSXENUM()
CONFIRMSXE()
; Sintaxis: CONFIRMSXE(lVerifica)
; Parámetros:
; Sintaxis: ROLLBACKSXE()
; Parámetros:
Ninguno .
Validación
EXISTCHAV()
EXISTCPO()
NAOVAZIO()
; Sintaxis: NaoVazio()
; Parámetros:
Ninguno .
NEGATIVO()
; Sintaxis: Negativo()
; Parámetros:
Ninguno .
PERTENCE()
; Sintaxis: Pertence(cString)
; Parámetros:
POSITIVO()
; Sintaxis: Positivo()
; Parámetros:
Ninguno .
TEXTO()
; Sintaxis: Texto()
; Parámetros:
Ninguno .
VAZIO()
; Sintaxis: Vazio()
; Parámetros:
Ninguno .
GETMV()
; Sintaxis: GETMV(cParametro)
; Parámetros:
GETNEWPAR()
SUPERGETMV()
MSDIALOG()
Define el componente MSDIALOG(), el cual se utiliza como base para los demás
componentes de la interfaz visual, pues un componente MSDIALOG() es una ventana
de la aplicación.
; Sintaxis:
; Parámetros
Ejemplo:
; Sintaxis:
; Parámetros
Ejemplo:
@ 010.050 MSGET cCGC SIZE 55, 11 OF oDlg PIXEL PICTURE "@R 99,999,999/9999-
99";
VALID !Vazio()
Define el componente visual SAY, el cual se utiliza para mostrar textos en una
pantalla de interfaz.
; Sintaxis:
; Parámetros
Ejemplo:
BUTTON()
; Sintaxis: BUTTON()
; Parámetros
Ejemplo:
SBUTTON()
; Sintaxis: SBUTTON()
; Parámetros
Ejemplo:
DEFINE SBUTTON FROM 020, 120 TYPE 2 ACTION (nOpca := 2.oDlg:End());
ENABLE OF oDlg
AXCADASTRO()
MBROWSE()
AXPESQUI()
Función de búsqueda estándar en los registros mostrados por los browses del
sistema, la cual posiciona el browse en el registro consultado. Muestra una
pantalla que permite la selección del índice que se utilizará en la búsqueda y la
digitación de la información que conforma la clave de búsqueda.
; Sintaxis: AXPESQUI()
; Parámetros:
Ninguno .
; Parámetros
AXINCLUI()
; Parámetros
AXALTERA()
; Parámetros
AXDELETA()
; Parámetros
ALERT()
; Sintaxis: AVISO(cTexto)
; Parámetros:
AVISO()
FORMBACTH()
MSGALERT
MSGINFO
MSGYESNO
GETAREA()
; Sintaxis: GETAREA()
; Retorno: Array que contiene {Alias(),IndexOrd(),Recno()}
; Parámetros
Ninguno .
RESTAREA()
Función que se utiliza para devolver la situación grabada del entorno por
medio del comando GETAREA(). Debe observarse que la última área
restaurada es el área que quedará activa para aplicación.
; Sintaxis: RESTAREA(aArea)
; Parámetros:
Ejemplo:
LOCAL cVar
LOCAL aArea := GetArea()
LOCAL lRet := .T.
cVar := &(ReadVar())
dbSelectArea("SX5")
IF !dbSeek(xFilial()+"Z1"+cVar)
ENDIF
RestArea(aArea)
Return( lRet )