Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Treinamento:

Linguagem de Programação nível básico

Público Alvo:

Analistas de Suporte Técnico e/ou Negócios

Conhecimentos Exigidos:

Estrutura básica do produto Microsiga Protheus

Conteúdo:

O que é uma linguagem de programação?

Uma linguagem de programação é um método padronizado para comunicar instruções para um computador. É um conjunto de regras sintáticas e semânticas usadas para definir um programa de computador.

 

(ideia) Antes de Iniciar o treinamento vamos preparar o ambiente de desenvolvimento, para isto peço que configurem suas maquinas com o passo-a-passo contido no link abaixo:

http://tdn.totvs.com/pages/viewpage.action?pageId=284465676


ESTRUTURA DE DECISÃO E REPETIÇÃO


Estruturas de decisão

        • IF...ELSE (Documentação http://tdn.totvs.com.br/display/framework/IF+...+ELSEIF+...+ELSE+...+ENDIF)

          #INCLUDE "PROTHEUS.CH"

          USER FUNCTION TESTE001

          //Exemplo IF/ELSE
          IF MsgYesNo("HOJE ESTA FRIO ?"," PERGUNTA")
          ALERT("Respondeu SIM, VERDADEIRO")
          ELSE

          ALERT("Respondeu NAO, FALSO")
          ENDIF

          RETURN

        • DO CASE ... CASE (Documentação http://tdn.totvs.com.br/display/framework/DO+CASE)

          #INCLUDE "PROTHEUS.CH"

          USER FUNCTION TESTE001
          Local cOpcao := ' '
          Local oDlg := Nil
          Local oMsGet := NIL
          Local oBtn := NIL

          // Montando a tela para seleção da opçao desejada
          DEFINE MSDIALOG oDlg TITLE "Testando o DO CASE" From 09,0 To 20,50
          DEFINE SBUTTON oBtn FROM 20,50 TYPE 1 ENABLE OF oDlg
          @ 5, 1 Say "Escolha sua Opção de 1 a 9 : " OF oDlg PIXEL
          @ 5, 80 MSGET oMsGet Var cOpcao OF oDlg PIXEL
          ACTIVATE MSDIALOG oDlg CENTERED

          //Exemplo DO CASE/CASE
          DO CASE
          CASE cOpcao == '1'
          ALERT("ESCOLHEU A OPÇÃO 1")
          CASE cOpcao == '2'
          ALERT("ESCOLHEU A OPÇÃO 2")
          CASE cOpcao == '3'
          ALERT("ESCOLHEU A OPÇÃO 3")
          OTHERWISE
          ALERT("ESCOLHEU UMA OPCAO DIFERENTE DE 1, 2 e 3")
          END CASE

          RETURN


 

Estruturas de repetição

        • WHILE...END (Documentação http://tdn.totvs.com.br/display/framework/WHILE+...+ENDDO)

          #INCLUDE "PROTHEUS.CH"
          USER FUNCTION TESTE001
          //Exemplo WHILE/DO
          DO WHILE .T.

          IF MsgYesNo("PERGUNTA","DESEJA SAIR DO LAÇO ? ")
          ALERT("Respondeu SIM, VAMOS SAIR")
          EXIT
          ELSE
          ALERT("Respondeu NAO, VAMOS CONTINUAR")
          ENDIF
          ENDDO

          RETURN

           

           

      • FOR...NEXT (Documentação http://tdn.totvs.com.br/display/framework/FOR+...+NEXT)

        #INCLUDE "PROTHEUS.CH"
        USER FUNCTION TESTE001
        Local nX := 0

        //Exemplo FOR/NEXT
        FOR nX :=1 To 4
        IF MsgYesNo("INTERAÇÃO: " + Alltrim(STR(nX)),"DESEJA SAIR DO NEXT ? ")
        ALERT("Respondeu SIM, VAMOS SAIR")
        EXIT
        ELSE
        ALERT("Respondeu NAO, VAMOS CONTINUAR")
        ENDIF
        NEXT
        RETURN

 

TIPOS DE FUNÇÕES


USER FUNCTION - Funções de usuário, não necessita de chave de compilação (Autorização TOTVS)

Declara uma função de usuário que poderá ser invocada apenas por outras funções declaradas no mesmo programa. Ou seja, no mesmo arquivo .PRW que contém o seu código.

FUNCTION - Funções do produto padrão (E obrigatório ter chave de compilação especial para compilar no repositório)

O comando FUNCTION permite a declaração e a construção de funções definidas pelo próprio usuário, utilizando os recursos da linguagem AdvPL. Este comando praticamente abre a arquitetura da linguagem AdvPL para o usuário, pois através dele é possível expandi-la, criando funções próprias, de acordo com a necessidade.

STATIC FUNCTION - Funções que somente são utilizadas dentro de seu fonte.

Declara uma função de usuário específica, que não pertence ao padrão do Protheus. Ela poderá ser invocada por qualquer outra função pertencente ao Protheus.

(aviso) Quando o Help NOFUNCW for exibido na tela do Microsiga Protheus indica que o sistema esta chamando a execução de uma Function/Static Function e/ou User Function que NÃO existe no repositório do ambiente (RPO).


TIPOS DE VARIÁVEIS

ADVPL não é uma linguagem de tipos rígidos, o que significa que variáveis de memória podem receber diferentes tipos de dados durante a execução do programa.
As variáveis podem também conter objetos, mas os tipos primários da linguagem são:

Numérico

O ADVPL não diferencia valores inteiros de valores com ponto flutuante. Portanto, é possível criar variáveis numéricas com qualquer valor dentro do intervalo permitido. Os seguintes
elementos são do tipo de dado numérico:

2
43.53
0.5
0.00001
1000000

Uma variável do tipo de dado numérico pode conter um número de dezoito dígitos, incluindo o ponto flutuante, no intervalo de 2.2250738585072014 E–308 até 1.7976931348623158
E+308.

Data

O ADVPL tem um tipo de dados específico para datas. Internamente as variáveis desse tipo de dado são armazenadas como um número correspondente à data Juliana. Variáveis do tipo de dados Data não podem ser declaradas diretamente, e sim com a utilização de funções específicas como, por exemplo, CTOD() que converte uma string para data.

Lógico
Valores lógicos em ADVPL são identificados através de .T. ou .Y. para verdadeiro e .F. ou .N. para falso (independentemente se os caracteres estiverem em maiúsculo, ou minúsculo).

Caractere
Strings ou cadeias de caracteres são identificadas em ADVPL por blocos de texto entre aspas duplas (") ou aspas simples ('):

 

"Olá mundo!"
'Esta é uma string'
"Esta é 'outra' string"

 

Uma variável do tipo caractere pode conter strings com no máximo 1 MB, ou seja, 1048576 caracteres.

Array
O Array é um tipo de dado especial. É a disposição de outros elementos em colunas e linhas. O ADVPL suporta arrays unidimensionais (vetores) ou multidimensionais (matrizes). Os elementos de um array são acessados através de índices numéricos iniciados em 1, identificando a linha e coluna para quantas dimensões existirem. Arrays devem ser utilizadas com cautela, pois se forem muito grandes podem exaurir a memória do servidor.

Bloco de Código
O bloco de código é um tipo de dado especial. É utilizado para armazenar instruções escritas em ADVPL que poderão ser executadas posteriormente.



TIPOS DE OPERADORES MATEMÁTICOS

Os operadores utilizados em ADVPL para cálculos matemáticos são:

Veja o exemplo abaixo com os operadores de Adição e Multiplicação:

#INCLUDE "PROTHEUS.CH"
USER FUNCTION TESTE001
Local nNumero1 := 100
Local nNumero2 := 30
Local nResultado := 0

IF MsgYesNo("(Sim) - Teste de Adição / (Não) - Subtração)"," OPERADORES MATEMATICOS")
nResultado := nNumero1 + nNumero2
ALERT("Resultado Adição:" + ALLTRIM(STR(nResultado)))
ELSE
nResultado := nNumero1 - nNumero2
ALERT("Resultado Subtração:" + ALLTRIM(STR(nResultado)))
ENDIF

RETURN

 

TIPOS DE OPERADORES DE STRING

Os operadores utilizados em ADVPL para tratamento de caracteres são:

Veja o exemplo abaixo com os operadores de Concatenação de Strings:

#INCLUDE "PROTHEUS.CH"
USER FUNCTION TESTE001
Local cTexto1 := ' ROGERIO'
Local cTexto2 := ' DA'
Local cTexto3 := ' SILVA'
Local cResultado := ''

//Concatenando Strings
cResultado := cTexto1 + cTexto2 + cTexto3
ALERT("Resultado Concatenação:" + cResultado)

RETURN

Veja o exemplo abaixo com os operadores de Concatenação de Comparação:

#INCLUDE "PROTHEUS.CH"
USER FUNCTION TESTE001
Local cTexto1 := 'ROGERIO DA SILVA'

IF MsgYesNo("(Sim) - Procurar por SILVA / (Não) - Procurar por FERREIRA"," OPERADOR DE COMPARAÇÃO")
IF "SILVA" $ cTexto1
ALERT("Resultado: ENCONTROU !!!")
ELSE
ALERT("Resultado: NAO ENCONTROU !!!")
ENDIF
ELSE
IF "FERREIRA" $ cTexto1
ALERT("Resultado: ENCONTROU !!!")
ELSE
ALERT("Resultado: NAO ENCONTROU !!!")
ENDIF
ENDIF

RETURN


TIPOS DE OPERADORES RELACIONAIS

Os operadores utilizados em ADVPL para operações e avaliações relacionais são:


TIPOS DE OPERADORES LÓGICOS

Os operadores utilizados em ADVPL para operações e avaliações lógicas são:

 

TIPOS DE OPERADORES ESPECIAIS

Além dos operadores comuns, o ADVPL possui alguns outros operadores, ou identificadores. Estas são suas finalidades:

    • Os parênteses são utilizados para agrupar elementos em uma expressão, mudando a ordem de precedência da avaliação da expressão (segundo as regras matemáticas, por exemplo). Também servem para envolver os argumentos de uma função.

    • Os colchetes são utilizados para especificar um elemento específico de uma matriz. Por exemplo, A[3,2] refere-se ao elemento da matriz A na linha 3, coluna 2.
    • As chaves são utilizadas para a especificação de matrizes literais, ou blocos de código.


Por exemplo, A:={10,20,30} cria uma matriz chamada A com três elementos.


O símbolo -> identifica um campo de um arquivo, diferenciando-o de uma variável.
Por exemplo, FUNC->nome refere-se ao campo nome do arquivo FUNC. Mesmo que exista uma variável chamada nome, é o campo nome que será acessado.

O símbolo & identifica uma avaliação de expressão através de macro e é visto em detalhes na documentação sobre macro substituição.

O símbolo @ é utilizado para indicar que durante a passagem de uma variável para uma função, ou procedimento ela seja tomada como uma referência e não como valor.

O símbolo || é utilizado para indicar que durante a passagem de uma variável para uma função ou procedimento, ela seja tomada como um e valor não como referência.


ATRIBUIÇÃO A VARIÁVEIS


Atribuição Simples

O sinal de igualdade é utilizado para atribuir valor a uma variável de memória.
nVariavel := 10


Atribuição em Linha

O operador de atribuição em linha é caracterizado por dois pontos e o sinal de igualdade.
Tem a mesma função do sinal de igualdade sozinho, porém aplica a atribuição às variáveis.
Com ele é possível atribuir mais de uma variável ao mesmo tempo.

Quando diversas variáveis são inicializadas em uma mesma linha, a atribuição começa da direita para a esquerda, ou seja, nVar3 recebe o valor zero inicialmente, nVar2 recebe o
conteúdo de nVar3 e nVar1 recebe o conteúdo de nVar2 por final.
Com o operador de atribuição em linha, é possível substituir as inicializações individuais de cada variável por uma inicialização apenas:

O operador de atribuição em linha também pode ser utilizado para substituir valores de campos em um banco de dados.

 

Atribuição Composta

Os operadores de atribuição composta são uma facilidade da linguagem ADVPL para expressões de cálculo e atribuição. Dessa forma é possível economizar digitação:

 

ESCOPO DE VARIAVEIS

O ADVPL não é uma linguagem de tipos rígidos para variáveis, ou seja, não é necessário informar o tipo de dados que determinada variável irá conter no momento de sua declaração, e o seu valor pode mudar durante a execução do programa.

Também não há necessidade de declarar variáveis em uma seção específica do seu código fonte, embora seja aconselhável declarar todas as variáveis necessárias no começo, tornando
a manutenção mais fácil, e evitando a declaração de variáveis desnecessárias.

Para declarar uma variável é necessário utilizar um identificador de escopo. Um identificador de escopo é uma palavra chave que indica a que contexto do programa a variável declarada pertence. O contexto de variáveis pode ser local (visualizadas apenas dentro do programa atual), público (visualizadas por qualquer outro programa), entre outros.

O Contexto de Variáveis dentro de um Programa

As variáveis declaradas em um programa ou função são visíveis de acordo com o escopo onde são definidas. Como também do escopo depende o tempo de existência das variáveis. A definição do escopo de uma variável é efetuada no momento de sua declaração.

Local nNúmero := 10

Esta linha de código declara uma variável chamada nNúmero, indicando que aonde pertence seu escopo é local.

Os identificadores de escopo são:

    • Local
    • Static
Private
      • PRIVATE

      • LOCAL


(aviso) Existem outros tipos de contextos (ex. Static, Public e etc.), porém vamos citar neste treinamento somente os tipos mais utilizados private e local.


O ADVPL não é rígido em relação à declaração de variáveis no começo do programa. A inclusão de um identificador de escopo não é necessário para a declaração de uma variável, contanto que um valor lhe seja atribuído.


nNumero2 := 15

Quando um valor é atribuído a uma variável em um programa ou função, o ADVPL criará a variável se ela não tiver sido declarada anteriormente. A variável então é criada como se tivesse sido declarada como Private.

Devido a essa característica, quando se pretende fazer uma atribuição a uma variável declarada previamente, mas escreve-se o nome da variável de forma incorreta, o ADVPL não gerará nenhum erro de compilação ou de execução. Assim, compreenderá o nome da variável escrito de forma incorreta como se fosse a criação de uma nova variável. Dessa forma, será alterada a lógica do programa, e é um erro muitas vezes difícil de identificar.

 

Variáveis de escopo local
Variáveis de escopo local são pertencentes apenas ao escopo da função onde foram declaradas e devem ser explicitamente declaradas com o identificador LOCAL, como no exemplo:

Neste exemplo, a variável nVar foi declarada como local e atribuída com o valor 10. Quando a função Filha é executada, nVar ainda existe mas não pode ser acessada. Quando a execução da função Pai terminar, a variável nVar é destruída. Qualquer variável, com o mesmo nome no programa que chamou a função Pai, não é afetada.

Variáveis de escopo local são criadas automaticamente, cada vez que a função onde forem declaradas for ativada. Elas continuam a existir e mantêm seu valor até o fim da ativação da função (ou seja, até que a função retorne o controle para o código que a executou). Se uma função é chamada recursivamente (por exemplo, chama a si mesma), cada chamada em recursão cria um novo conjunto de variáveis locais.

A visibilidade de variáveis de escopo locais é idêntica ao escopo de sua declaração, ou seja, a variável é visível em qualquer lugar do código fonte em que foi declarada. Se uma função é chamada recursivamente, apenas as variáveis de escopo local criadas na mais recente ativação são visíveis.

Variáveis de escopo private
A declaração é opcional para variáveis privadas. Mas podem ser declaradas explicitamente com o identificador PRIVATE.

Adicionalmente, a atribuição de valor a uma variável não criada anteriormente, de forma automática cria-se a variável como privada. Uma vez criada, uma variável privada continua a existir e mantém seu valor até que o programa ou função onde foi criada termine (ou seja, até que a função onde foi feita retorne para o código que a executou). Neste momento, é automaticamente destruída.

É possível criar uma nova variável privada com o mesmo nome de uma variável já existente. Entretanto, a nova (duplicada) variável pode apenas ser criada em um nível de ativação inferior ao nível onde a variável foi declarada pela primeira vez (ou seja, apenas em uma função chamada pela função onde a variável já havia sido criada). A nova variável privada esconderá qualquer outra variável privada ou pública (veja a documentação sobre variáveis públicas) com o mesmo nome enquanto existir.

Uma vez criada, uma variável privada é visível em todo o programa, enquanto não for destruída automaticamente. Quando a rotina que a criou terminar, ou uma outra variável privada com o mesmo nome for criada em uma subfunção chamada (neste caso, a variável existente torna-se inacessível até que a nova variável privada seja destruída).

Em termos mais simples, uma variável privada é visível dentro da função de criação e todas as funções chamadas por esta, a menos que uma função chamada crie sua própria variável privada com o mesmo nome.

Neste exemplo, a variável nVar é criada com escopo private e inicializada com o valor 10. Quando a função Filha é executada, nVar ainda existe e, diferente de uma variável de escopo local, pode ser acessada pela função Filha. Quando a função Pai terminar, nVar será destruída e qualquer declaração de nVar anterior se tornará acessível novamente.