Você está na página 1de 67

Totvs Centro de Desenvolvimento São Paulo – 2014

Arquitetura Protheus
Arquitetura Protheus

Índice

I) Arquitetura
II) Estruturas de Dados e Metadados
III) O que é o AdvPL (Noções)
IV) Criação de um Ambiente ( Prática )

2
Arquitetura
Arquitetura Protheus

Arquitetura

1974 à Assembly – Batch – SIGA


1978 à Natural / Adabas – Online
Mainframe

1983 à DBase II/III, Clipper Summer (entrega de fontes)


1990 à Clipper 5 – SIGA Advanced 2.07/4.07 (customizações)
DOS

1995 à FiveWin/Top/Coencisa, VO, Delphi, SQL


2000 à AdvPL – Protheus 5.08/6.09/7.10/8.11/10
Windows

4
Arquitetura Protheus

Arquitetura

Windows Smart Client Smart Client Html Client WEB Client


Linux (SmartClient.exe) (Browser) (ActiveX)
Browser (Smart Client)

Application Server
RPO (TTTP110.RPO)
Windows (AppServer.exe)
Application
Linux Monitor
Unix (Monitor.exe) Server

DBF/CTREE DBAccess
Windows
Linux Database
Unix Server

5
Arquitetura Protheus

Arquitetura

Programa-fonte APPLICATION
SERVER SMARTCLIENT
MATA010
. . .
dbSelectArea(“SB1”)
RecLock(“SB1”, .T.) Compilação
SB1->B1_COD := “000001”
APO
MATA010
SB1->B1_DESC := “Produto A”
MSUnlock()
. . . Cad.Produtos

RPO Executa
Execuç
ão MATA010
MATA010
Executa
MATA410 MATA410
Ped.Vendas
CTBR040
Executa
CTBR040

Balancete Cont.

6
Arquitetura Protheus

Arquitetura

Executáveis

• Application Server (Server)


• Smart Client (Remote)
• DBAccess (Top Connect)
• Monitor
• Visual Studio Code (Plugin TOTVS)

7
Arquitetura Protheus

Arquitetura

RPO Arquivo binário com os APOs


Versão específica do RPO para:
- Tipo de Base de dados
- Língua

T T x x 110.RPO
P – Português, S – Spanish, E – English
D – DBF, A – ADS, C – CTree, T – DBAccess (TopConnect)

BUILD Executáveis e DLLs


Patch Atualizações do RPO
LIB Conjunto de classes/funções (programas) referentes ao
Framework 8
Arquitetura Protheus

Arquitetura

\TDE\ADVPL

ERP11
APO (RPO)
BIN
APPSERVER (executáveis)
SMARTCLIENT (executáveis)
INCLUDE (arquivos .CH)
PROTHEUS_DATA
DATA (versão ISAM - .DBF e .CDX)
SPOOL (relatórios impressos em disco)
SYSTEM (Dic.Dados, Menus, ...)
SYSTEMLOAD (arq. de carga inicial)
MY PROJECTS (fontes de customizações)

9
Arquitetura Protheus

Aplication Server

Destino: c:\tde\advpl\erp110\bin\appserver\AppServer.exe –console


Iniciar em: c:\tde\advpl\erp110\bin\appserver

Para encerrar o Server: Ctrl+C, e SIM ou YES

-install à inicia o Protheus como um serviço do Windows


-remove à remove da lista de serviços
10
Arquitetura Protheus

Smart Client

Destino: c:\tde\advpl\erp110\bin\smartclient\SmartClient.exe
Iniciar em: c:\tde\advpl\erp110\bin\smartclient

Parâmetros do atalho (opcionais):


-P à programa inicial
-E à ambiente (nome da seção environment no .INI do Server)
-M à permite múltiplas instâncias (cópias) do SmartClient na mesma máquina
Exemplo: ...\TotvsSmartClient.exe –P=SIGAFAT –E=Environment -M
11
Arquitetura Protheus

Ambiente

Localização • RPO
dos arquivos • Arqs. do Sistema
• Arqs. Dados do Usuário

• DBF
• ADS
Base de Dados • CTree
• SQL

• Português
Língua • Spanish
• English

Comunicação
• TCP-IP
Tipo de Comunicação • Endereço do Servidor
• Porta

12
Arquitetura Protheus

Arquitetura

APPSERVER.INI
ERP110
[Environment]
SourcePath=C:\ERP101\APO APO TTTP110.RPO
RootPath=C:\ERP101\Protheus_Data BIN
StartPath=\system\
RpoDb=TOP APPSERVER
RpoLanguage=portuguese SMARTCLIENT
RpoVersion=110
LocalFiles=ads INCLUDE
localdbextension=.dbf
PictFormat=DEFAULT (ou AMERICAN)
PROTHEUS_DATA
DateFormat=DEFAULT (ou AMERICAN) DATA
[DBACCESS] SPOOL
SERVER=127.0.0.1
SYSTEM
PORT=7890
DATABASE=POSTGRES SYSTEMLOAD
ALIAS=ADVPL
MY PROJECTS
[Drivers]
Active=TCP

[TCP]
TYPE=TCPIP
Port=1234

13
AdvPL usando Queries e Procedures

Configuração INI Server Protheus


MVC – Nossa inspiração

APPSERVER.INI
Application Server
[Environment]
SourcePath=C:\ERP110\APO Protheus
RootPath=C:\ERP110\Protheus_Data IP 192.16.0.1
Porta 1234
StartPath=\system\
RpoDb=TOP
RpoLanguage=portuguese
RpoVersion=110
LocalFiles=ads
localdbextension=.dbf
PictFormat=DEFAULT (ou AMERICAN) DataBase Server
DateFormat=DEFAULT (ou AMERICAN)
DbAccess
[TOTVSDBACCESS] IP 192.16.0.2
SERVER=192.16.0.2 Porta 7890
PORT=7890
DATABASE=POSTGRES
ALIAS=ADVPL
MEMOMEGA=1

[Drivers]
Active=TCP

[TCP]
TYPE=TCPIP
Port=1234
14
AdvPL usando Queries e Procedures

Configuração INI Server Protheus


MVC – Nossa inspiração

APPSERVER.INI
Application Server
[Environment]
SourcePath=C:\ERP110\APO Protheus
RootPath=C:\ERP110\Protheus_Data IP 192.16.0.1
Porta 1234
StartPath=\system\
RpoDb=TOP
RpoLanguage=portuguese
RpoVersion=101
LocalFiles=ads
localdbextension=.dbf
PictFormat=DEFAULT (ou AMERICAN) DataBase Server
DateFormat=DEFAULT (ou AMERICAN)
TopSERVER=192.16.0.2 DbAccess
TopPORT=7890 IP 192.16.0.2
TopDATABASE=POSTGRES Porta 7890
TopALIAS=ADVPL
TopMEMOMEGA=1

[TOTVSDBACCESS]
SERVER=192.16.0.2
PORT=7890
DATABASE=POSTGRES
ALIAS=ADVPL
MEMOMEGA=1

15
Arquitetura Protheus

Arquitetura

APPSERVER.INI
Usuário Brasileiro [EnvPOR]
SourcePath=C:\ERP110\APO
RootPath=C:\ERP110\Protheus_Data ERP110
EnvPOR StartPath=\system\ TTTP110.RPO
RpoDb=TOP
APO TTTS110.RPO
RpoLanguage=portuguese BIN
RpoVersion=110
LocalFiles=ads APPSERVER
localdbextension=.dbf SMARTCLIENT
Usuário Argentino PictFormat=DEFAULT
DateFormat=DEFAULT INCLUDE
EnvSPA PROTHEUS_DATA
[EnvSPA]
SourcePath=C:\ERP110\APO DATA
RootPath=C:\ERP110\Protheus_Data
StartPath=\system\ SPOOL
RpoDb=TOP SYSTEM
RpoLanguage=spanish
RpoVersion=110 SYSTEMLOAD
LocalFiles=ads
MY PROJECTS
localdbextension=.dbf
PictFormat=DEFAULT
DateFormat=DEFAULT

16
Arquitetura Protheus

Arquitetura

SMARTCLIENT.INI
[Config]
LastMainProg=sigamdi

[Drivers]
Active=TCP

[TCP]
Server=localhost
Port=1234

17
Arquitetura Protheus

Arquitetura

Application Server

ou

Application Server
Smart Client

Smart Client Smart Client Smart Client

18
Arquitetura Protheus

Arquitetura Simplificada

SmartClient Application
Server
License
Server

Banco de
DBAccess Dados

19
Arquitetura Protheus

Arquitetura com Balance


Arquitetura com Balance

SmartClient Balance Slaves


License
Server

Banco de
DBAccess Dados

20
Estruturas de Dados e
Metadados
Arquitetura Protheus

Estruturas de Dados e Metadados


Arquivo Descrição
SX1 Perguntas e Respostas
SX2 Mapeamento de Tabelas
SX3 Dicionário de Dados
SX4 Agenda do Schedule de Processos
SX5 Tabelas
SX6 Parâmetros
SX7 Gatilhos
SX9 Relacionamento entre Tabelas
SXA Pastas Cadastrais apontadas no SX3
SXB Consulta por meio da tecla F3 (Consulta Padrão)
SXD Controle do Schedule de Processos
SXE Seqüência de Documentos (+1)
SXF Seqüência de Documentos (próximo)
SXG Tamanho padrão para campos
SXK Respostas das Perguntas (SX1) por Usuário
SXO Controle de LOGs por Tabela
SIX Índices dos Arquivos
.XNU Menu de Opções dos Módulos
22
Arquitetura Protheus

Estruturas de Dados e Metadados

SA - Cadastros SO - Assist. Técnica


SB - Estoques SP - Ponto Eletrônico
SC - Previsões de E/S SQ - Recr. e Seleção
SD - Mov. De Estoque SR - Folha de Pagto
SE - Financeiro ST - Manut. Industrial
SF - Fiscal SU - Telemarketing
SG - Estruturas SV - Concessionárias
SH - Carga de Máquina SW e SY - Export./Import.
CT - Contábil Q? - Qualidade (Celerina)
SJ - Estatísticas R? - Recursos Humanos
SM - Miscelâneas P? - Projetos Especiais
SN - Ativo Fixo SZ? e Z?? - Livres

M.E.R. Modelo de Entidades e Relacionamento


23
23
Arquitetura Protheus

Estruturas de Dados e Metadados


O sistema permite controlar até 99 Empresas.
Cada Empresa pode ter até 99 Filiais.
Empresa 01 Empresa 02 Empresa 99
Filiais 01 Filiais 01 Filial 01
02
.. 02
..
. .
99 99

SA1010 SA1020 SA1990


SA2010 SA2020 SA2990
SB1010 SB1020 SB1990
... ... ...

Para cada Empresa é criado um conjunto de arquivos:


SXXnn0 – onde: XX = Prefixo do arquivo
nn = Empresa
24
Arquitetura Protheus

Estruturas de Dados e Metadados

Os dados das Filiais ficam dentro do arquivo de cada Empresa.

FILIAL CAMPO1 CAMPO2 CAMPO3 ...


01 Registro da Filial 01
01 Registro da Filial 01
01 Registro da Filial 01
02 Registro da Filial 02
02 Registro da Filial 02
02 Registro da Filial 02
... ...

Todo arquivo, exceto SM2 (Moedas), tem um campo que identifica a Filial nos
registros.

25
Arquitetura Protheus

Nomenclatura de Campos

Arquivo: SA1 SA2 SB1 QA1


A1_FILIAL A2_FILIAL B1_FILIAL QA1_FILIAL
A1_COD A2_COD B1_COD QA1_COD
A1_NOME A2_NOME B1_DESC QA1_DESC
A1_END A2_END B1_TIPO

26
Arquitetura Protheus

Modo de Acesso
Modo de Acesso
Compartilhado à registros compartilhados entre as filiais
Campo Filial: em branco
Exclusivo à cada Filial tem seus os próprios registros
Campo Filial: código da Filial (variável cFilAnt)
O usuário pode SA1 (Cad.Clientes) - Compartilhado
selecionar apenas 1 A1_FILIAL A1_COD A1_NOME
Empresa e 1 Filial 000015 FABRICA DE TINTAS E VERINIZES LTDA
por vez 000016
000001
TEX MALHAS E CONFECCOES S.A
CLIENTE PADRAO
000020 ARMANDO JOSE FLORES
000007 COMERCIO SOM DO MUNDO
Empresa 01
SC5 (Pedidos de Venda) - Exclusivo
Filiais 01 C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR
01 000001 01/01/04 000002 1111014 15.000,00
02 01 000005 01/01/04 000023 1313000 5.600,00
01 000007 20/01/04 000016 1515140 5.600,00
02 000001 01/01/04 000002 1111014 15.000,00
03 02 000005 01/01/04 000023 1313000 5.600,00
02 000007 20/01/04 000016 1515140 5.600,00
03 000001 01/01/04 000002 1111014 15.000,00
03 000005 01/01/04 000023 1313000 5.600,00
03 000007 20/01/04 000016 1515140 5.600,00
27
Arquitetura Protheus

Modo de Acesso

Compartilhado Empresa XX Exclusivo


A1_Filial A1_Cod A1_Nome Filiais A1_Filial A1_Cod A1_Nome
000001 JOSÉ 01 01 000001 JOSÉ
02 02 000001 JOSÉ

“ ” ou “01” ou
Preenchimento do campo Filial: “02”...
A1_FILIAL := ??

A1_FILIAL := xFilial(“SA1”) à “ “ A1_FILIAL := xFilial(“SA1”) à cFilAnt


C5_FILIAL := xFilial(“SC5”) à cFilAnt

28
Arquitetura Protheus

Índice

• Índice Primário à acesso direto ao registro


à verificação de chave duplicada

FILIAL+CODIGO RECNO RECNO A1_FILIAL A1_COD A1_NOME

000001 03 01 000015 FABRICA DE TINTAS E VERINIZES LTDA


000002 09 02 000016 TEX MALHAS E CONFECCOES S.A
000007 05 03 000001 CLIENTE PADRAO
000008 07 04 000020 ARMANDO JOSE FLORES
000015 01 05 000007 COMERCIO SOM DO MUNDO
000016 02 06 000024 JOAO DA SILVA
000019 13 07 000008 FLORICULTURA FULO DE MARAVILHA
000020 04 08 000023 PREFEITURA MUNICIPAL DE SAO PAULO
000023 08 09 000002 ECOSSISTEMA DIGITAL
000024 06 10 000026 ACTIONVEA IMP. EXP.
000026 10 11 000027 STARMEAL LEAK S.A.
000027 11 12 000028 REIZA KERN IMP. EXP.
000028 12 13 000019 JOAO DE ALMEIDA SILVA
000030 15 14 000033 DESPACHANTE
000033 14 15 000030 IMPORTADOR EUA

Acesso direto ao registro:


dbSeek(“ ”+“000020”) ou
dbSeek(xFilial(“SA1”)+”000020”)
29
29
Arquitetura Protheus

Índice

• Demais índices: ordenação de registros

1 2
FILIAL+CODIGO RECNO FILIAL+NOME RECNO RECNO A1_FILIAL
RECNO A1_COD A1_NOME A1_NOME
A1_COD

000001 03 ACTIONVEA.. 10 01 000015 FABRICA DE TINTAS E


000002 09 ARMANDO J.. 04 02 000016 TEX MALHAS E CONFECC
000007 05 CLIENTE P.. 03 03 000001 CLIENTE PADRAO
000008 07 COMERCIO .. 05 04 000020 ARMANDO JOSE FLORES
000015 01 DESPACHAN.. 14 05 000007 COMERCIO SOM DO MUND
000016 02 ECOSSISTE.. 09 06 000024 JOAO DA SILVA
000019 13 FABRICA D.. 01 07 000008 FLORICULTURA FULO DE
000020 04 FLORICULT.. 07 08 000023 PREFEITURA MUNICIPAL
000023 08 IMPORTADO.. 15 09 000002 ECOSSISTEMA DIGITAL
000024 06 JOAO DA S.. 06 10 000026 ACTIONVEA IMP. EXP.
000026 10 JOAO DE A.. 13 11 000027 STARMEAL LEAK S.A.
000027 11 PREFEITUR.. 08 12 000028 REIZA KERN IMP. EXP.
000028 12 REIZA KER.. 12 13 Leitura sequencial:
000019emJOAO
ordem
DE de NomeSILV
ALMEIDA
000030 15 STARMEAL .. 11 14 dbSetOrder(2)
000033 DESPACHANTE
000033 14 TEX MALHA.. 02 15 000030 IMPORTADOR EUA
dbGoTop()
EOF() à .T. While !Eof()
...
dbSkip()
End
30
30
O que é o AdvPL ?
Arquitetura Protheus

Variáveis de Memória

Cadastro

Nome: José

Memória
Nome
José
Valor
1000

A1_NOME
José
D2_VALOR ICMS = Valor * 18 / 100
1000
CPU

32
Arquitetura Protheus

Notação Húngara

Caractere (string) cTexto := “Casa”


Numérico nValor := 1234.56
Data dData := CtoD(“25/10/08”)
Lógico lOk := .T.
Array aNomes := {“João”,“Pedro”,“Maria”}
Bloco de Código bSoma := {|| 5 + 10 }
Nulo x := Nil

33
Arquitetura Protheus

Tipagem da Variável

n X := 1 nX
X éénumérico
numérico

c X := “José” X agora
cX é caracter
é caracter

n X := n X + 1 Operação
ERRO
matemática
!

34
Arquitetura Protheus

Estruturas de Dados e Metadados

Função ValType(NomeVar) à tipo da variável: C, N, D, L, A, B, U

Exemplo:
cNome := “Jose” ValType(cNome) à “C”
nValor := 1000 ValType(nValor) à “N”
dData := CtoD(“25/10/08”) ValType(dData) à “D”
x := Nil ValType(x) à “U”

35
Arquitetura Protheus

Array

Cada variável armazena um dado único:


Memória
cNome1 := “Joao”
cNome1 cNome2 cNome3 cNome4
cNome2 := “Alberto” Joao Alberto Pedro Maria
cNome3 := “Pedro”
cNome4 := “Maria” aNomes
Joao Alberto Pedro Maria

Variáveis do tipo Array: armazenam uma coleção de dados


aNomes := {“Joao”, “Alberto”, “Pedro”, “Maria”}

aNomes[1] 1º 2º 3º 4º
aNomes[2] elemento elemento elemento elemento
aNomes[3]
aNomes[4]
36
Arquitetura Protheus

O que é o AdvPL ?

Variáveis

Armário 1 Armário 2 Armário 3 Armário 4

Joao Alberto Pedro Maria

Array
Armário

Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4


Joao Alberto Pedro Maria

37
Arquitetura Protheus

O que é o AdvPL ?

aPessoa := {“Joao”, 25, .T.}

Um array pode conter outros arrays: Matriz


aMatriz := {{“Joao”,25,.T.}, {“Alberto”,18,.F.}, {“Pedro”,40,.T.}, {“Maria”,33,.F.}}

aMatriz[1]
aMatriz[1][1]
aMatriz[1][2]
aMatriz[1][3]

aMatriz[2]
aMatriz[2][1]
aMatriz[2][2]
aMatriz[2][3]

aMatriz := {{“Joao” , 25, .T.},;


{“Alberto”, 18, .F.},;
{“Pedro” , 40, .T.},;
{“Maria” , 33, .F.}}
38
Arquitetura Protheus

O que é o AdvPL ?

aMatriz := {{“Joao”,25,.T.}, {“Alberto”,18,.F.}, {“Pedro”,40,.T.}, {“Maria”,33,.F.}}

aMatriz := {{“Joao” , 25, .T.},;


{“Alberto”, 18, .F.},;
{“Pedro” , 40, .T.},;
{“Maria” , 33, .F.}}

Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4


1 2 3 1 2 3 1 2 3 1 2 3
Joao 25 T Alberto 18 F Pedro 40 T Maria 33 F

Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4


1 Joao 1 Alberto 1 Pedro 1 Maria

2 25 2 18 2 40 2 33

3 T 3 F 3 T 3 F

39
Arquitetura Protheus

O que é o AdvPL ?

Adicionar elementos num array vazio

aNomes := {“Joao”,
{}
{“Joao”} “Alberto”} “Pedro”,
“Alberto”, “Pedro”} “Maria”}

AAdd(aNomes, “Joao”)
AAdd(aNomes, “Alberto”)
AAdd(aNomes, “Pedro”)
AAdd(aNomes, “Maria”)

AAdd(aMatriz, {“Joao”,25,.T.})
AAdd(aMatriz, {“Alberto”,18,.F.})
AAdd(aMatriz, {“Pedro”,40,.T.})
AAdd(aMatriz, {“Maria”,33,.F.})

aMatriz: {{“Joao”,25,.T.}, {“Alberto”,18,.F.}, {“Pedro”,40,.T.}, {“Maria”,33,.F.}}


40
Arquitetura Protheus

O que é o AdvPL ?

Função Array(n): retorna um array com n elementos nulos

aPessoa := Array(3)
aPessoa à {Nil, Nil, Nil}

Atribuição de valor aos elementos do array


aPessoa[1] := “Joao”
aPessoa[2] := 25
aPessoa[3] := .T.

aPessoa à {“Joao”, 25, .T.}

41
Arquitetura Protheus

O que é o AdvPL ?

a1 := {“Joao”, 25, .T.} {“Pedro”, 25, .T.}


a1
a2 := a1 a2
a2[1] := “Pedro”

a1 := {“Joao”, 25, .T.} a1 {“Joao”, 25, .T.}


a2 := AClone(a1) a2 {“Pedro”, 25, .T.}
a2[1] := “Pedro”

42
Arquitetura Protheus

O que é o AdvPL ?

Function

PRW
Function
Local Private Public Static

Function

Function

43
Arquitetura Protheus

O que é o AdvPL ?

Local
Visível somente na função em que foi criada.

Private
Visível na função em que foi criada e nas funções seguintes.

Public
Visível em todas as funções, a partir do momento em que foi criada.

Static
-Visível somente no programa (PRW);
-Pode ser declarada fora da função;
-É criada na chamada de qualquer função dentro do PRW.
44
Arquitetura Protheus

O que é o AdvPL ?

User Function Func1()

Local cVar := "Func1"


LOCAL Conteúdo
u_Func2()

Return

User Function Func2()

Local cVar := "Func2"


Local cVar1 := "Func2" PRIVATE Conteúdo
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"

u_Func3()

Return

PUBLIC Conteúdo
User Function Func3()

cVar2 := “ABC"

Return
45
Arquitetura Protheus

O que é o AdvPL ?

User Function Func1()

Local cVar := "Func1"


LOCAL Conteúdo
u_Func2()
cVar Func1
Return

User Function Func2()

Local cVar := "Func2"


Local cVar1 := "Func2" PRIVATE Conteúdo
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"

u_Func3()

Return

PUBLIC Conteúdo
User Function Func3()

cVar2 := “ABC"

Return
Arquitetura Protheus

O que é o AdvPL ?

User Function Func1()

Local cVar := "Func1"


LOCAL Conteúdo
u_Func2()
cVar Func2
Return
cVar1 Func2

User Function Func2()

Local cVar := "Func2"


Local cVar1 := "Func2" PRIVATE Conteúdo
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2" cVar2 Private Func2
u_Func3()

Return

PUBLIC Conteúdo
User Function Func3()
cVar3 Public Func2
cVar2 := “ABC"

Return
47
Arquitetura Protheus

O que é o AdvPL ?

User Function Func1()

Local cVar := "Func1"


LOCAL Conteúdo
u_Func2()

Return

User Function Func2()

Local cVar := "Func2"


Local cVar1 := "Func2" PRIVATE Conteúdo
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2" cVar2 ABC
u_Func3()

Return

PUBLIC Conteúdo
User Function Func3()
cVar3 Public Func2
cVar2 := “ABC"

Return
48
Arquitetura Protheus

O que é o AdvPL ?

User Function Func1()

Local cVar := "Func1"


LOCAL Conteúdo
u_Func2()
cVar Func2
Return
cVar1 Func2

User Function Func2()

Local cVar := "Func2"


Local cVar1 := "Func2" PRIVATE Conteúdo
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2" cVar2 ABC
u_Func3()

Return

PUBLIC Conteúdo
User Function Func3()
cVar3 Public Func2
cVar2 := “ABC"

Return
49
Arquitetura Protheus

O que é o AdvPL ?

User Function Func1()

Local cVar := "Func1"


LOCAL Conteúdo
u_Func2()
cVar Func1
Return

User Function Func2()

Local cVar := "Func2"


Local cVar1 := "Func2" PRIVATE Conteúdo
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"

u_Func3()

Return

PUBLIC Conteúdo
User Function Func3()
cVar3 Public Func2
cVar2 := “ABC"

Return
50
Arquitetura Protheus

Funções

Programa.PRW
User Function Soma()
RPO
Local nX := 5
Local nY := 10
u_Soma
MsgAlert(nX + nY)

Return

• Execução (chamada) da função: u_Soma()


• Não pode haver mais do que uma função com o mesmo nome
• O nome da função pode ter até 10 caracteres

51
Arquitetura Protheus

Funções

User Function CadCli() User Function CadFor()

Comandos Comandos
If CGC(cCGC) Comandos
continua Comandos
Else If CGC(cCGC)
abandona continua
EndIf Else

r
do
CG
Comandos abandona

ce
Cd

ne
Comandos EndIf
oC

or
oF
lie
Comandos Comandos

Cd
nt
e

CG
Return Return
Function CGC(cCGC)

If cCGC OK

.T. ou .F.
.T. ou .F.

lOK := .T.
Else
lOK := .F.
EndIf

Return lOK
52
Arquitetura Protheus

Funções

CAD1.PRW CAD2.PRW GENERICAS.PRW


User Function CadCli() User Function CadFor() Function CGC(cCGC)

If CGC(cCGC) If CGC(cCGC) If cCGC OK


... ... lOK := .T.
Else Else Else
... ... lOK := .F.
EndIf EndIf EndIf

Grava() Grava() Return lOK

Return Return
CAD3.PRW
Static Function Grava() Static Function Grava() User Function CadXXX()
... ...
...
Return Return
X Grava()
Return
Function à desenvolvimento Totvs
User Function à desenvolvimento Usuário podem estar em qualquer .PRW
Static Function à desenvolvimento Totvs/Usuário somente no próprio .PRW
53
Arquitetura Protheus

Funções

User Function Venda()

nImposto := u_ICMS(“NE”, 1000)

Return
São criadas
User Function ICMS(cRegiao, nValor)
“NE” 1000 variáveis
LOCAIS
If cRegiao == “SE”
nICMS := nValor * 18 / 100
ElseIf cRegiao == “NE”
nICMS := nValor * 7 / 100
Else
nICMS := nValor * 12 / 100
EndIf

Return nICMS
54
Arquitetura Protheus

Funções

User Function Venda()


Local cRegiao
Local nValor
Local nAliquota
Local nICMS nAliquota
cRegiao := “NORDESTE”
“NORDESTE”
nValor := 1000
1000 Antes: 18
nAliquota :=
nAliquota 18 7
nICMS := u_ICMS(cRegiao, nValor, @nAliquota)
Depois: 7
E”

MsgInfo(nAliquota) à
ia
DEST

c
ên el
Return fer riáv
Re va
“NOR

User Function ICMS(cReg, nVal, nAliq)

If cReg == "NORDESTE“
nAliq := 7
EndIf

Return nVal * nAliq / 100


55
Arquitetura Protheus

Bloco de Código

User Function Reajuste()

dbSelectArea("SB1")
dbGoTop()
While !SB1->(Eof()) Fórmula fixada no
RecLock("SB1") código-fonte
SB1->B1_Prv1 := SB1->B1_Prv1 * 1.25
MSUnlock()
SB1->(dbSkip())
End

MsgInfo("Terminou!")

Return

56
Arquitetura Protheus

Bloco de Código

User Function Reajuste()


Local cFormula
dbSelectArea("SM4")
Arquivo SM4 - Fórmulas
dbSetOrder(1)
M4_FILIAL: “01”
If dbSeek(xFilial("SM4") + "001") M4_CODIGO: “001”
cFormula :=“SB1->B1_Prv1
SM4->M4_Formula
* 1.25” M4_FORMULA: “SB1->B1_Prv1 * 1.25”
dbSelectArea("SB1")
dbGoTop()
While !SB1->(Eof())
RecLock("SB1")
SB1->B1_Prv1 := SB1->B1_Prv1
&(cFormula) * 1.25
&(SB1->B1_Prv1 * 1.25)
MSUnlock()
SB1->(dbSkip())
End
MsgInfo("Terminou!")
Else
MsgAlert(“Fórmula não cadastrada!”)
EndIf
Return
57
Arquitetura Protheus

Bloco de Código

bBloco := {|| 2 * 10}

nResult := EVal(bBloco)
nResult = 20

bBloco := {|x| x * 2}

nResult := EVal(bBloco, 5) nResult = 10

bBloco := {|x,y| x * y}

nResult := EVal(bBloco, 5, 2) nResult = 10

58
Arquitetura Protheus

Bloco de Código

aNomes := {“Joao”, “Alberto”, “Pedro”, “Maria”}

AEval(aNomes, {|x| MsgAlert(x)})

DBEval()

59
Arquitetura Protheus

Bloco de Código

aMatriz := { {“Joao ”,15} , {“Pedro


{“Alberto”,20}
”,10} ,{“Pedro ”,10}, {“Maria
{“Alberto”,20} ”,30} }

ASort(aMatriz,,,{|aX,aY| aX[2] < aY[2]})

.T.
.F.

60
Arquitetura Protheus

Bloco de Código

aMatriz := { {“Pedro
{“Joao ”,10}
”,15} , {“Joao
{“Pedro ”,15}
”,10} ,{“Alberto”,20}, {“Maria ”,30} }

ASort(aMatriz,,,{|aX,aY| aX[2] < aY[2]})

.T.
.F.

61
Arquitetura Protheus

Bloco de Código

aMatriz := { {“Pedro ”,10} , {“Joao ”,15} ,{“Alberto”,20}, {“Maria ”,30} }

ASort(aMatriz,,,{|aX,aY| aX[2] < aY[2]})

.T.

62
Arquitetura Protheus

Semáforo
Semáforo

GetSXENum(Alias, Campo) Obtem o próximo número


ConfirmSX8() Confirma o número
RollBackSX8() Reutiliza o número
MayIUseCode(Alias) Confirma se o número está mesmo disponível
APCFG110 Manutenção do SXE/SXF ou Hardlock

Exemplo:
GetSXENum
ConfirmSX8 GetSXENum
ConfirmSX8 GetSXENum
RollBackSX8 GetSXENum
RollBackSX8 GetSXENum
ConfirmSX8
001 002 003 004 005
003 004 006 007 008

Exemplos: GetSXENum(“SC5”, “C5_NUM”)


GetSXENum(“SZ2”, “Z2_NUMERO”)
63
Criação de um Ambiente
Arquitetura Protheus

Pastas

• Repositório D-1: Repositório com as ultimas versões dos fontes aprovados pelo SQA
• \\ 172.16.103.229\d-1
• Pasta Temp: Pasta com o último dicionário gerado pelo ATUSX. Somente serão
gerados campos aprovados pelo DBA e pelo líder do desenvolvimento
• \\SSIMSLV-03\temp
• Espelho do Portal: Pasta de rede com os arquivos que estão no portal do cliente
• \\ 172.16.103.229\espelho-portal

65
Arquitetura Protheus

Montagem de Ambiente - Prática

66
Título da Apresentação

Questões

Palestrante
Desenvolvimento - Inovação

demetrio.fontes@totvs.com.br

67

Você também pode gostar