Você está na página 1de 214

Programação e

Customizações
AdvPL e Protheus
Aula 1
Evolução e Arquitetura do Sistema
Arquivos
Customizações
Case – Sistema de Contas
Correntes
Evolução do Sistema da Microsiga

1974  Assembler – Batch


1978  Natural Adabas – Online
1983  DBase II – III, Clipper Summer
1990  Clipper 5 – SIGA Advanced
1995  FiveWin/Top/Coencisa, VO, Delphi, SQL
2000  AdvPL – Protheus 5 ... 8
Multi-Camada

Windows Client (WEB)


Remote (MP8RMT.EXE)
Linux ActiveX Client
Browser

RPO (MPDP811.RPO) Server (MP8SRVWIN.EXE)


Windows Aplication
Linux
Unix
Monitor Server

DBF/CTREE Top Connect


Windows
Linux
Database
Unix SQL Server Oracle DB2 Server
Sybase PostGres MySQL
Múltiplas configurações

..
modem

..
modem

.....
Hub .....
Hub

Servidor

Terminal

Dados
Estrutura Protheus

REMOTE
Programa SERVER
Fonte
MATA010
Compilação APO
APO
MATA01
MATA01
00 Cad.Produtos

RPO Executa
Executa
MATA010
MATA010
MATA010
Executa
Executa
MATA410 MATA410
MATA410 Ped.Vendas
CTBR040
Executa
Executa
CTBR040
CTBR040

Balancete Cont.
Aplicativos

•Protheus Server
•Protheus Remote
•Top Connect
•Monitor
Conjuntos de arquivos

•RPO  arquivo binário com os APOs


•BUILD  executáveis, DLLs e RPO
•Patch  atualizações do RPO
Remote

•Windows
•Linux
•Hand Held (Palm ou Pocket PC)
•ActiveX
Terminal Remoto

•Thin Client
•Baixo tráfego na rede
•Multi-plataforma
•Atualização automática
•ASP - Aplication Server Provider
•Browser Internet (HTML)
Estrutura de pastas do sistema

ERP811
APO (RPO)
BIN
REMOTE
SERVER
INCLUDE
MP_DATA
DATA (versão ISAM)
SAMPLES
SPOOL
SYSTEM (Dic.Dados, Menus,
...)
SYSTEMLOAD
MY PROJECTS
Atalhos

Destino: c:\erp811\bin\server\mp811srvwin.exe –debug


Iniciar em: c:\erp811\bin\server

MP8 Server

Destino: c:\erp811\bin\remote\mp811rmt.exe
Iniciar em: c:\erp811\bin\remote

MP8 Remote
MP8SRV.INI

MP8SRV.INI
[Environment] ERP811
SourcePath=C:\ERP811\APO APO
RootPath=C:\ERP811\MP_Data
BIN
StartPath=\system\
RpoDb=dbf REMOTE
RpoLanguage=portuguese SERVER
RpoVersion=811 INCLUDE
SIGACFG
LocalFiles=ads
localdbextension=.dbf
MP_DATA
PictFormat=DEFAULT DATA
TCP DateFormat=DEFAULT SAMPLES
SPOOL
[Drivers]
Environment Active=TCP SYSTEM
SYSTEMLOAD
[TCP]
MY PROJECTS
TYPE=TCPIP
Port=1234
MP8SRV.INI

[environmentSQL]
SourcePath=C:\ERP811\APO
RootPath=C:\ERP811\MP_Data
StartPath=\system\
RpoVersion=811
RpoDb=Top
LocalFiles=ads
localdbextension=.dbf
RpoLanguage=portuguese
PictFormat=DEFAULT
DateFormat=DEFAULT

[Topconnect]
Alias=BASE810
ConType=TCPIP
DataBase=MSSQL8
Server=SrvTOP01

[Drivers]
Active=TCP

[TCP]
TYPE=TCPIP
Port=1234
MP8RMT.INI

[Config]
LastMainProg=sigamdi

[Drivers]
Active=TCP

[TCP]
Server=localhost
Port=1234
Configurador

SIGACFG

TCP

Environment
Configurador

Senha: admin
Configurador
Configurador
Arquivos – Família SX
Pasta \SYSTEM

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
Famílias de Arquivos de Dados
Pasta \DATA ou Banco de Dados

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.
SI - Contábil Q? - Qualidade (Celerina)
SJ - Estatísticas R? - Recursos Humanos
SM - Miscelâneas SZ,QZ,RZ - Livres
SN - Ativo Fixo P? - Projetos Especiais

M.E.R. Modelo de Entidades e Relacionamento


Principais Arquivos de Dados

Prefixo Descrição
SA1 Cadastro de Clientes
SA2 Cadastro de Fornecedores
SA3 Cadastro de Vendedores
SB1 Cadastro de Produtos
SB2 Saldos dos Produtos por Almoxarifado
SB5 Dados Complementares de Produtos
SC1 Solicitações de Compras
SC5 Cabeçalho dos Pedidos de Venda
SC6 Itens dos Pedidos de Venda
SC7 Pedidos de Compras
SD1 Itens das Notas Fiscais de Entrada
SD2 Itens das Notas Fiscais de Saída
SD3 Movimentações Internas de Produtos
SE1 Títulos a Receber
SE2 Títulos a Pagar
SF1 Cabeçalho das Notas Fiscais de Entrada
Arquivos de Dados – por Empresa

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

Para cada Empresa é criado um jogo de arquivos:


SXXnn0 – onde: XX = Prefixo do arquivo
nn = Empresa

Exemplo: Empresa 99 -> SA1990, SA2990, SB1990...


Arquivos de Dados

Filiais

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

Todo arquivo, exceto SM2, tem um campo XX_Filial que identifica a Filial:
01
01
01
02
02
02

Nomenclatura dos campos:

Arquivo SA1: A1_FILIAL SA2:A2_FILIAL SB1:B1_FILIAL QA1:


QA1_FILIAL
A1_COD A2_COD B1_COD QA1_COD
A1_NOME A2_NOME B1_DESC QA1_DESC
A1_END A2_END B1_TIPO
Arquivos de Dados
Modo de Acesso

Compartilhado  registros compartilhados entre as filiais


Campo Filial: em branco
Exclusivo  o registro é exclusivo da filial
Campo Filial: código da Filial (variável cFilAnt)

Ex: SA1 - Compartilhado


A1_FILIAL A1_COD A1_NOME
000015 FABRICA DE TINTAS E VERINIZES LTDA /SP
000016
000001
TEX MALHAS E CONFECCOES S.A /SP
CLIENTE PADRAO
xFilial(“SA1”)  “ “
000020 ARMANDO JOSE FLORES /SC
000007 COMERCIO SOM DO MUNDO /SP

Ex: SC5 - Exclusivo


C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR
01 000001 01/01/04 000002 11.11014 15.000,00
01 000005 01/01/04 000023 13.13000 5.600,00
01 000007 20/01/04 000016 15.15140 5.600,00
02
02
000001
000005
01/01/04
01/01/04
000002
000023
11.11014
13.13000
15.000,00
5.600,00
xFilial(“SC5”)  cFilAnt
02 000007 20/01/04 000016 15.15140 5.600,00
03 000001 01/01/04 000002 11.11014 15.000,00
03 000005 01/01/04 000023 13.13000 5.600,00
03 000007 20/01/04 000016 15.15140 5.600,00
Arquivos de Índices
Índices
• Todo arquivo precisa ter pelo menos um índice

• Índice Primário:  acesso direto ao registro


 verificação de chave duplicada

• Ordenação de registros

CHAVE REGISTRO REGISTRO A1_FILIAL A1_COD A1_NOME


000001 03 01 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP
000007 05 02 000016 TEX MALHAS E CONFECCOES S.A /SP
000015 01 03 000001 CLIENTE PADRAO
000016 02 04 000020 ARMANDO JOSE FLORES /SC
000020 04 05 000007 COMERCIO SOM DO MUNDO /SP
Arquivos de Índices
Índices
•Um arquivo pode ter até 35 índices (1...9, A...Z)
•dbSetOrder(n), onde n = 1...35  função para selecionar o índice.
•Além dos índices originais, usuários podem incluir seus próprios índices.
•Caso a Microsiga inclua novos índices, os do usuário serão renumerados.

SA1 – índices do Sistema 1


2
...
7
novo índice
índice índice do
do Usuário
do Usuário
Sistema 8 A1_TIPO NickName: TIPO
índice do Usuário 9 A1_TIPO NickName: TIPO

X
Nos programas: dbSetOrder(8)
dbOrderNickName(“TIPO”)
• Portanto, índices de usuário devem sempre ter um NickName. Deve-se usar a função
dbOrderNickName(“NICKNAME”)
• Índices do sistema, nunca terão NickName. Usa-se dbSetOrder().
Customização

•Parâmetros, Tabelas, Perguntas


•Fórmulas - Expressões em AdvPL / User
Function
•Validações, Gatilhos, Campos de Arquivos
•User Function via menu
•Pontos de Entrada
•Dicionário de Dados Ativo
•SigaRPM, Crystal, Excel
Customização
Customização
Parâmetros

Parâmetros: arquivo SX6

cESTNEG := GetMV(“MV_ESTNEG”)
“N” V
“S” F 100 V
100
201
201 F 200
200
If cESTNEG == “S” .Or. QtdVenda < B2_Saldo
tratamento normal
Else
tratamento de erro
EndIf
Customização
Tabelas

Tabelas: arquivo SX5

Tabela 12: Estados do Brasil


Tabela 13: CFOP
Tabela 33: Estado Civil
Customização
Perguntas

Perguntas: arquivo SX1

Do Cliente: 000010
Até Cliente: 000050
Da Data: 01/03/06
Até Data: 31/03/06

As respostas também são gravadas


Customização
Inserção de Código-Fonte

Exemplo: Preço
Um Pedido de Venda é incluído 
100,00
Na emissão da NF, o preço deve ser reajustado em 25% 
125,00
Programa-fonte
MATA460A – Emissão NF SERVER
Fórmulas
Compila “SC6->C6_PRCVEN * 1.25”
Preço
Preço := &Formula * 1.25
:= SC6->C6_PRCVEN ção
APO
APO *
N
MATA460A
MATA460A C VE
R
RPO 6_P . 2 5
C 1
>
C6-
MATA460A S
Execução
Execuçãodo do
MATA460A
MATA460A
Preço
Preço := :=
SC6->C6_PRCVEN
Preço := SC6->C6_PRCVEN
*
*
&Formula
1.25
1.25

Emissão NF
Customização
Inserção de Código-Fonte

Fórmulas: arquivo SM4 - Expressões em AdvPL / Funções


Microsiga

Ex: Reajuste de preço entre o Pedido e o Faturamento:


-No Pedido é preenchido o código da fórmula de reajuste (campo “Tipo
Reajuste”)
-No Programa de emissão da nota fiscal: Preço := &Formula
(Obs: a pergunta “Reajuste na mesma NF?” precisa estar com SIM)

Fórmula 001 - Reajuste fixo:


“SC6->C6_PRCVEN * 1.25”
Fórmula 002 - Reajuste se preço em dólar:
“SC6->C6_PRCVEN * RecMoeda(dDataBase,’2’)”
Fórmula 003 - Reajuste pelo dólar:
“SC6->C6_PRCVEN * (RecMoeda(dDataBase,’2’)/
If(RecMoeda(SC5->C5_EMISSAO,’2’) <> 0,
Tipos de Processamento

Run Time
Interpretador Server
Maquina Virtual

FONT PCode
E
DBase, Access Visual Basic, AdvPl
Abap, Oracle,Java

Executável +
Interpretador Executável

Clipper, Visual Objects Delphi, C


Compilação

A=A+B A = A + &B
A=5
MACRO
965534567654 A= 7

5
End 3
2
3456 3
7654
Customização
Validações

Validações: Dicionário de Dados (SX3)

Campo Cód.Cliente: ExistChav(“SA1”)


Campo Natureza: ExistCpo(“SED”)
Campo Estado: ExistCpo(“SX5”, “12”+M->A1_EST)
Campo CNPJ: CGC(M->A1_CGC)
Customização
Gatilhos

Gatilhos: Aciona a rotina ao sair-se de um campo (SX7)

Exemplo: na digitação da NF de Compra


Quant. Vr.Unit. Total

10 2,00 20,00

Campo: D1_VUNIT
Contra-Dominio: D1_TOTAL
Regra: Round(M->D1_VUNIT * M->D1_QUANT, 2)
Customização
Campos de Arquivos

Campos: Campos dos Lançamentos Padronizados (SI5)

Débito: If(SD3->D3_TIPO=“MC”, “33201”+SD3->D3_CC, “11303”)


Customização
User Function

• Executa uma série de comandos, retornando um valor;


• Precisa ser compilado;
• O resultado é um objeto que é armazenado no Repositório.

Ex:

User Function ContaDeb()

Do Case
Case SB1->B1_TIPO == “MC”
Conta := “11302”
Case SB1->B1_TIPO == “ME”
Lançamento Padronizado
Conta := “11303” (SI5)
... Débito: u_ContaDeb()
EndCase

Return (Conta + SD3->D3_CC)


Customização
Ponto de Entrada

• São pontos pré-determinados, onde o usuário pode escrever


uma nova rotina em substituição àquela existente ou adicionar
algum processamento.
• Cada Ponto de Entrada é identificado pelo nome de uma Função.
If ExistBlock(“CalcSaldo”)
u_CalcSaldo()
EndIf
• Para utilizá-lo, deve-se escrever uma função com este mesmo
nome.
User Function CalcSaldo()
...
Return
• Os Pontos de Entrada estão descritos no DEM.
• Exemplo: pode-se alterar a rotina de cálculo do ICMS ou do IPI
no programa de Preparação de Nota Fiscal de Vendas
Exemplo de Ponto de Entrada

// PONTO DE ENTRADA NA ALTERAÇÃO DO CADASTRO DE PRODUTO

#Include “RWMake.ch"

User Function MT010ALT()

If AllTrim(SB1->B1_TIPO) == "MO" // Trata-se de mão-de-obra.


dbSelectArea("SB2") // Acessa o registro de saldos
dbSetOrder(1) // e custos no SB2.
dbSeek(xFilial()+SB1->B1_COD)
If RecLock("SB2", .F.)
// Grava em custo médio o custo standard, pois não existe custo
// médio de mão-de-obra.
SB2->B2_CM1 := SB1->B1_CUSTD
EndIf
EndIf

Return Nil
Configurador - SIGACFG

•Dicionário de Dados
•Menus
Exercícios

Crie um parâmetro (SX6) para o limite máximo por


transação:
Nome da Var.:MV_VRMAX
Tipo: N
Conteúdo: 10000
Descrição: Valor maximo da transacao
SIGACFG: menu Ambiente / Cadastros / Parâmetro

Crie uma tabela (SX5) de tipos de transações:


Tabela ZZ D – Depósito
S – Saque
E – Encargos
J – Juros
R – Resgates
SIGACFG: menu Ambiente / Cadastros / Tabelas
(tem que preencher os 3 idiomas)
Exercício

Crie uma Fórmula (SM4) para reajustar o preço dos produtos da


Fábrica de Chaveiros:

Código: 001
Descrição: REAJUSTE DE PREÇO
Fórmula: SB1->B1_PRV1 * 1.25
SIGACFG: menu Ambiente / Cadastros / Formulas

Crie um Gatilho que apresente o valor total do item:

Campo: D1_VUNIT
Sequencia: 001
Cnt. Dominio: D1_TOTAL
Tipo: Primario
Regra: M->D1_QUANT * M->D1_VUNIT
Posiciona: Não
SIGACFG: menu Base de Dados / Dicionario / Gatilhos
Exercício

Insira a validação no arquivo SI2, campo I2_VALOR:

If(M->I2_Valor < GetMV(“MV_VRMAX”), .T., .F.)

SIGACFG: menu Base de Dados / Dicionario / Base de Dados


Exercício

Crie um Ponto de Entrada para modificar o cálculo do


Saldo após um Saque, considerando apenas 60% do
seu valor.
Exercício

Lançamento Contábil Automático


Mostrar o lançamento 666 - Requisição
Case

Sistema de Contas Correntes


Case
Sistema de Contas Correntes

• Contas
• Transações
• Consultas
• Relatórios
• Excel
• WorkFlow
• TXT / XML
• WebServices
• AdvPL ASP
Case
Sistema de Contas Correntes
Tabelas do sistema

CONTAS TRANSAÇÕES
Nome Tem Nome
Refere-se
E-Mail Número da Transação
E-Mail1 Item da Transação
Saldo Tipo (Depósito ou Saque)
Data
Histórico
Saldo Atual (virtual)
Valor
Aprovação
Exercício – Criação de Arquivos (SX2)

SIGACFG: menu Base de Dados / Dicionario / Arquivos

Prefixo: SZ1
Path: \DATA\
Nome: SZ1990
Descrição: CONTAS
Desc.Esp.: CONTAS
Desc.Inglês: CONTAS
Modo Acesso: COMPARTILHADO
Prefixo: SZ2
Path: \DATA\
Nome: SZ2990
Descrição: TRANSAÇÕES
Desc.Esp.: TRANSAÇÕES
Desc.Inglês: TRANSAÇÕES
Modo Acesso: EXCLUSIVO

Modo de Acesso:
Compartilhado  Filial = branco
Exclusivo  Filial = número da Filial (var. pública cFilAnt)
Função xFilial(Alias)
Criação de Campos (SX3)

Criação dos campos dos arquivos:

SZ1 – Cadastro de Contas


SZ2 – Arquivo de Transações
SIGACFG: menu Base de Dados / Dicionario / Base de Dados

• Ordem faz parte da chave do SX3


• O cadastramento de um campo é dividido em pastas:
– Campo
– Informações
– Opções
– Validações
– Uso
– Módulo
Criação de Campos (SX3)

Caracter, Numérico, Lógico, Data, Memo

Picture variável, que pode ser retornada por uma função


Real, Virtual
Alterar, Visualizar
Criação de Campos (SX3)

Nome do cliente
Criação de Campos (SX3)

ComboBox. No campo será


D=Deposito;S=Saquegravada a letra, no exemplo, D
ou S.

“D” dDataBase GetSXENum(“SZ2”, “Z2_NUMERO”)

Cadastro de Contas (SZ1)

Campo Z2_Nome
F3
Criação de Campos (SX3)

Exemplo: no Depto. Pessoal


0a9
Define a permissão de acesso ao
campo.
Usuários: Campos:
O Usuário só terá acesso a campos
9 Nível do Nível dos 9 de nível igual ou menor que o seu
8 Usuário Campos Exemplo:
8 Nome Usuário com nível 5 só
7 Gerente – nível 9
7
do
nível. Func.
terá acesso a –campos com
6 6 nível igual ou menor que 5.
5 nível 5 5
4 4
3 3
Digitador
2 2 nível 5 Endereço
– – nível 4
1 1
0 0 Salário – nível 9
Criação de Campos (SX3)
Criação de Campos (SX3)
Exercício
Cadastrar os campos do SZ1
Campo Inform. Uso
Campo Tipo Tam. Dec. Formato Contexto Propr. Título Obrig Usa Brw
Z1_NOME Car 20 @! Real Alt. Nome
Z1_EMAIL Car 40 Real Alt. EMail
Z1_EMAIL1 Car 40 Real Alt. EMail1
Z1_SALDO Num 12 2 @E 999,999,999.99 Real Visual Saldo

Cadastrar Opções e Validações para estes campos


Opções
Campo Validações
Lista de Opções Inic.Padrão

Z1_NOME ExistChav(“SZ1”, M->Z1_NOME, 1)

Z2_NOME ExistCpo(“SZ1”, M->Z2_NOME, 1)


Z2_NUMERO GetSXENum(“SZ2”, “Z2_NUMERO”)
ExistChav("SZ2", M->Z2_NUMERO+
Z2_ITEM
M->Z2_ITEM, 1)
Z2_DATA dDataBase
Z2_TIPO D=Deposito;S=Saque “D”
Exercício
Campos do SZ2 (já estão cadastrados)
Campo Inform. Uso
Campo Tipo Tam. Dec. Formato Contexto Propr. Título Obrig Usa Brw
Z2_NOME Car 20 @! Real Alt. Nome
Z2_NUMERO Car 4 Real Visual Numero
Z2_ITEM Car 2 99 Real Alt. Item
Z2_DATA Data 8 Real Alt. Data
Z2_TIPO Car 1 Real Alt. Tipo
Z2_HIST Car 20 Real Alt. Historico
Z2_VALOR Num 12 2 @E 999,999,999.99 Real Alt. Valor
Z2_SLDATU Num 12 2 @E 999,999,999.99 Virtual Visual Saldo
Z2_APROV Car 3 Real Visual Aprovado
Exercício
Criação dos Índices

1
3
4

Chave Nickname

SZ1 Z1_Filial + Z1_Nome NOME

SZ2 Z2_Filial + Z2_Numero + Z2_Item NR_IT


Z2_Filial + Z2_Nome + Z2_Numero + Z2_Item NOME_NR_IT
Exercícios

Crie a Consulta Padrão que mostre o arquivo SZ1 e insira-a no campo


Z2_Nome

SIGACFG: menu Base de Dados / Dicionario / Base de Dados

Faça o Gatilho para atualizar o Z2_SldAtu (virtual) ao digitar-se Z2_Valor:

Campo: Z2_VALOR
Cnt. Dominio: Z2_SLDATU
Tipo: Primario
Regra: IF(M->Z2_TIPO==“D”, SZ1->Z1_SALDO + M->Z2_VALOR,
SZ1->Z1_SALDO - M->Z2_VALOR)
Posiciona: Sim
Alias: SZ1
Ordem: 1
Chave: xFilial(“SZ1”) + M->Z2_NOME

SIGACFG: menu Base de Dados / Dicionario / Gatilhos


Exercício

Crie em ERP o menu do Sistema de Contas Correntes


SIGACFG: menu Ambiente / Cadastro / Menus

Contas
Corrente
s

Consultas Relatórios
Atualizaçõe
s Programa: Programa:
Con001 Rel001

Contas
Programa: Transações
Cad

Modelo 1 Modelo 2 Modelo 3


Programa: Programa: Programa:
TranM1 TranM2 TranM3
Aula 2
Programação
Comandos e funções
Operadores
IDE
Variáveis de memória
Array
Funções
Programação
Exercícios de Lógica

• Aquário

• 3 cestos com bolas pretas e brancas e etiquetas


erradas

Preta Preta Branca


Branca Preta Branca
3 cestos: 1ª hipótese

Preta Preta Branca


Branca Preta Branca
3 cestos: 2ª hipótese

Preta Preta Branca


Branca Preta Branca
Resposta
• Vai na caixa com etiqueta Preta-Branca
• Saca uma bola

– Se Branca
• Conclui-se
– a outra bola é Branca e esta caixa é a Branca-Branca
– a caixa que está etiquetada Preta-Preta é Preta-Branca
– a caixa que está etiquetada Branca-Branca é Preta-Preta

– Se Preta
• Conclui-se
– a outra bola é Preta e esta caixa é a Petra-Preta
– a caixa que está etiquetada Preta-Preta é Branca-Branca
– a caixa que está etiquetada Branca-Branca é Preta-
Branca
Cruzamento dos ponteiros do relógio

Entre 0 horas e 24 horas


quantas vezes os ponteiros
se cruzam, contando
inclusive o cruzamento das 0
horas e das 24 horas?
Resposta: 23 vezes
Travessia da passarela
Quatro pessoas tem de atravessar uma passarela bamba.
Há muitos buracos na passarela, que suporta apenas 2
pessoas de cada vez (mais que isso, ela cai). O grupo
deve usar uma lanterna para guiar seus passos, caso
contrário acabará caindo no buraco e morrendo. Só há
uma lanterna. As 4 pessoas andam em velocidades
diferentes. Antonio cruza a passarela em 1 minuto.
Bernardo em 2 minutos. Carlos leva 5 minutos. O mais
lento, Roberto, leva 10 minutos. A passarela vai ruir
dentro de exatamente 17 minutos.

Como os 4 podem atravessá-la?


Resposta

•Vai o1e2 2
•Volta o1 3
•Vai o 5 e 10 13
•Volta o2 15
•Vai o1e2 17
Programa

Conjunto de Instruções: Comandos e Funções

Instruções básicas de uma Linguagem:

Aritméticas:
Somar / Subtrair / Multiplicar / Dividir

Entrada e Saida:
Ler / Gravar / Tela / Impressão / Teclado / Atribuição

Lógicas:
If...Else...EndIf
For...Next
While...End
Do Case...EndCase
Inicio A

Armar Sim
A Esposa
Despertador Resmungar quer $$ ?

Desligar Não
Despertador
Casado
Dar-lhe Sim
há mais de
R$ 100,00 5 anos ?
Repetir Bocejar
3 Não
vezes
Sacudir a Beijar a
Esposa esposa

Sair da Casado
Sim
Cama há mais de
1 ano ?

Sim Não
Acender
Está Escuro ? Beijar a
a luz
esposa
Não
Sim Ir até o
Voltar para Está Frio ? carro
a cama
Não
Possível Voltar Não Está
Fim Ir ao para pegá-las Com as
Banheiro Chaves ?
da rotina
Sim
Tomar Dirigir-se
Café ao escritório

A Fim
Operadores
Matemáticos

+ - * / ** ou ^ %

x := 10 + 20

nValor := nQtde * nPreco

nValor := nValor + (nValor * 18 / 100)


Operadores
Relacionais

< > == <= >= <> ou # ou !=

If nQtde < nSaldo


MsgAlert(“Pedido liberado”)
Else
MsgAlert(“Pedido bloqueado: estoque insuficiente”)
EndIf

If nSalario > 1257


nIR := 15
EndIf
Operadores
Lógicos

.And. .Or. .Not. ou !

If cCredito == “OK” .And. nQtde < nSaldo


Liberar venda
EndIf

cCredito == .
nQtde < nSaldo
“OK” And.

V V  V

V F  F

F V  F

F F  F
Operadores
Lógicos

.And. .Or. .Not. ou !

If cEstNeg == "S" .Or. nQtdVenda < nSaldo


MsgAlert("OK, pode faturar!")
Else
MsgAlert("Estoque insuficiente!")
EndIf

cEstNeg == nQtdeVenda <


.Or.
“S” nSaldo

V V  V

V F  V

F V  V

F F  F
Operadores
Lógicos

.And. .Or. .Not. ou !


If cCredito == "OK" .And. (cEstNeg == "S" .Or. nQtdVenda < nSaldo)
MsgAlert("OK, pode faturar!")
Else
MsgAlert("Sem credito ou estoque insuficiente!")
EndIf

cCredito == “OK” .And. ( cEstNeg == .Or. nQtdVenda < nSaldo


“S” )
V V V V
V V F V
V F V V
V F F F
F V V V
F V F V
F F V V
F F F F
Operadores
Lógicos

.And. .Or. .Not. ou !


If cCredito == "OK" .And. (cEstNeg == "S" .Or. nQtdVenda < nSaldo)
MsgAlert("OK, pode faturar!")
Else
MsgAlert("Sem credito ou estoque insuficiente!")
EndIf

cCredito == “OK” .And. ( cEstNeg == .Or. nQtdVenda < nSaldo


“S” )
V V V V  V
V V F V  V
V F V V  V
V F F F  F
F V V V  F
F V F V  F
F F V V  F
F F F F  F
Operadores
Lógicos

.And. .Or. .Not. ou !

If a <> b If .Not. a==b If !a==b


... ... ...
EndIf EndIf EndIf
Operadores
Atribuição

:= += -= *= /= ^= ou **= %=

x := 10

x := x + 20
é o mesmo que: x += 20

nValor := nValor + (nValor * 18 / 100)


é o mesmo que: nValor += (nValor * 18 / 100)
Operadores
Incremento / Decremento

i++ ++i i-- --i

i++ equivale a i := i + 1

i := 1
i := 1
equivale a MsgAlert(i)  mostra 1
MsgAlert(i++) i := i + 1

i := 1
i := 1 equivale a i := i + 1
MsgAlert(++i) MsgAlert(i)  mostra 2
Operadores
Strings

x + y x - y x $ y

Concatenação
cNome := “João”
cSobreNome := “Silva”
cNomeCompleto := cNome + cSobreNome 
“JoãoSilva”

“A ” - “B”  “AB ”

Pertence
“Silva” $ cNomeCompleto  .T.
“SILVA” $ cNomeCompleto  .F.
Operadores
Especiais

( ) Funcao()
{ } Array, bloco de código
[ ] Array
& Macro
|| Bloco de código
-> Alias de arquivo e var. de memória
SA1->A1_Nome M->A1_Nome
@ Parâmetros por referência
; Quebra de linha
If cCredito == "OK" .And.;
(cEstNeg == "S" .Or. nQtdVenda < nSaldo)
MsgAlert("OK, pode faturar!")
Else
MsgAlert("Sem credito ou estoque insuficiente!")
EndIf
: Objetos oBotao:cCaption := “OK”
IDE – Primeiro Programa

1. Criar atalho do IDE (\erp811\bin\remote\mp8ide.exe)


2. Criar um novo projeto
3. Criar um novo arquivo
4. Digitar o primeiro programa User Function Se()
5. Salvá-lo na pasta \erp811\My Projects
6. Inseri-lo no projeto Local nX := 10
7. Compilar:
Usuário: Administrador If nX > 5
Senha: admin MsgAlert("Maior")
8. Executar EndIf

Return

Ver 010_If.prw / 020_For.prw / 030_While.prw / 040_Case.prw


Organização dos Programas-Fonte

Projeto (.PRJ)
Programa (.PRW) Função
Função
Função

Programa (.PRW) Função


Função
Função
Programa (.PRW) Função
Função
Função
Variáveis de Memória
Armazenamento temporário de dados

Cadastro

Nome: José

Memória
Nome
José
Valor
1000

A1_NOME
José
D2_VALOR ICMS = Valor * 18 / 100
1000 CPU
Tipos de Variáveis de Memória

Notação Húngara:
Caractere “Casa” cTexto
Numéricas 1234.56 nValor
Data CtoD(“25/10/05”) dData
Lógicas .T. .F. lOk

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

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

Operação
n X := n X + 1 ERRO !
matemática
Tipos de Variáveis de Memória

Notação Húngara:
Caractere “Casa” cTexto
Numéricas 1234.56 nValor
Data CtoD(“25/10/05”) dData
Lógicas .T. .F. lOk

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


Exemplo:
cNome := “Jose” ValType(cNome)  “C”
nValor := 1000 ValType(nValor)  “N”
x := Nil ValType(x)  “U”

Ver Operadores.PRW
Exercicio
Array, Vetor ou Matriz

Variáveis do tipo Caracter: uma para cada nome


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

cNome4 := “Maria”
aNomes
Joao Alberto Pedro Maria

Variáveis do tipo Array: todos os nomes numa única variável


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

aNomes[1]
aNomes[2]
aNomes[3]
aNomes[4]
Array, Vetor ou Matriz

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
Array, Vetor ou Matriz

Gaveta 1 Joao

Gaveta 2 Alberto

Gaveta 3 Pedro

Gaveta 4 Maria
Array, Vetor ou Matriz

Um array pode conter tipos diferentes de dados

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][1]
aMatriz[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.}}
Array, Vetor ou Matriz

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
Array, Vetor ou Matriz

Adicionar elementos num array vazio

aNomes := {“Joao”,
{}
{“Joao”} “Alberto”,
“Alberto”} “Pedro”,
“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.}}


Array, Vetor ou Matriz

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

aArray := Array(5)
aArray  {Nil, Nil, Nil, Nil,
Nil}

Atribuição de valor aos elementos do array


aArray[1] := “A”
aArray[2] := “B”
aArray[3] := “C”
aArray[4] := “D”
aArray[5] := “E”
aArray  {“A”, “B”, “C”, “D”,
“E”}
Ver 050_Array.prw
Exercicio: fazer o sort de um array
Funções
Conjunto de Comandos

Programa.PRW
User Function Teste()

Comandos
Comandos
Comandos
Comandos

Return

Execução (chamada) da função: u_Teste()


Funções
Rotinas repetitivas

User Function CadCli() User Function CadFor()

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

r
EndIf Else

o
ed
Comandos abandona

ec
CG

rn
Comandos EndIf

Fo
C
Comandos do Comandos

do
Cl

C
ie

CG
Return Return
nt
e

Function CGC(cCGC)

.T. ou .F.
If cCGC OK
.T. ou .F.

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

Return lOK
Funções
Programação Estruturada

User Function Relato()


u_PreparaImpr()
u_LeDados()
u_Imprime()
Return

User Function PreparaImpr()


...
Return

User Function LeDados()


...
Return

User Function Imprime()


...
Return
Funções
Passagem de parâmetros

User Function Venda()

nImposto := u_ICMS(“NE”, 1000)

Return
User Function ICMS(cRegiao, nValor)
“NE” 1000
If cRegiao == “SE”
nICMS := nValor * 18 / 100
ElseIf cRegiao == “NE”
nICMS := nValor * 7 / 100
Else
nICMS := nValor * 12 / 100
EndIf

Return nICMS
Escôpo das Variávies

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)
Escôpo das Variávies

User Function Func1()

Local cVar := "Func1" LOCAL Conteúdo


u_Func2()

Return

User Function Func2()

Local cVar := "Func2" PRIVATE Conteúdo


Local cVar1 := "Func2"
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"

u_Func3()

Return
PUBLIC Conteúdo
User Function Func3()

cVar2 := “ABC"

Return
Escôpo das Variávies

User Function Func1()

Local cVar := "Func1" LOCAL Conteúdo


u_Func2() cVar Func1
Return

User Function Func2()

Local cVar := "Func2" PRIVATE Conteúdo


Local cVar1 := "Func2"
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"

u_Func3()

Return
PUBLIC Conteúdo
User Function Func3()

cVar2 := “ABC"

Return
Escôpo das Variávies

User Function Func1()

Local cVar := "Func1" LOCAL Conteúdo


u_Func2() cVar Func2
cVar1 Func2
Return

User Function Func2()

Local cVar := "Func2" PRIVATE Conteúdo


Local cVar1 := "Func2"
Private cVar2 := "Private Func2" cVar2 Private Func2
Public cVar3 := "Public Func2"

u_Func3()

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

Return
Escôpo das Variávies

User Function Func1()

Local cVar := "Func1" LOCAL Conteúdo


u_Func2()

Return

User Function Func2()

Local cVar := "Func2" PRIVATE Conteúdo


Local cVar1 := "Func2"
Private cVar2 := "Private Func2" cVar2 ABC
Public cVar3 := "Public Func2"

u_Func3()

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

Return
Escôpo das Variávies

User Function Func1()

Local cVar := "Func1" LOCAL Conteúdo


u_Func2() cVar Func2
cVar1 Func2
Return

User Function Func2()

Local cVar := "Func2" PRIVATE Conteúdo


Local cVar1 := "Func2"
Private cVar2 := "Private Func2" cVar2 ABC
Public cVar3 := "Public Func2"

u_Func3()

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

Return
Escôpo das Variávies

User Function Func1()

Local cVar := "Func1" LOCAL Conteúdo


u_Func2() cVar Func1
Return

User Function Func2()

Local cVar := "Func2" PRIVATE Conteúdo


Local cVar1 := "Func2"
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"

u_Func3()

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

Return
Ver 052_EscopoVar.prw
Passagem de Parâmetros
Por Valor

User Function Venda()


Local cRegiao := “NE”
Local nValor := 1000
nImposto := ICMS(cRegiao, nValor)
Return “NE” 1000

User Function ICMS(cRegiao, nValor) São


“NE” 1000 criadas
If cRegiao == “SE” variáveis
nICMS := nValor * 18 / 100 LOCAIS
ElseIf cRegiao == “NE”
nICMS := nValor * 7 / 100
Else
nICMS := nValor * 12 / 100
EndIf

Return nICMS
Passagem de Parâmetros
Por Valor

User Function Param1()

Local x := 1
Local y := 2 x=1
u_Param2(x, y) y=2
MsgAlert(x+y)

Return

User Function Param2(x, y)

x := 50
y := 100

Return
Ver 060_Param.prw
Passagem de Parâmetros
Por Valor

User Function Param1()

Local x := 1
Local y := 2 x=1
u_Param2(x, y) y=2
MsgAlert(x+y)

Return

User Function Param2(x, y)

x := 50 x = 50
y := 100
y = 100
Return
Ver 060_Param.prw
Passagem de Parâmetros
Por Valor

User Function Param1()

Local x := 1
Local y := 2 x=1
u_Param2(x, y) y=2
MsgAlert(x+y)

Return

User Function Param2(x, y)

x := 50
y := 100

Return
Ver 060_Param.prw
Passagem de Parâmetros
Por Referência

User Function Param1()

Local x := 1
Local y := 2 x=1
u_Param2(@x, y) y=2
MsgAlert(x+y)

Return

User Function Param2(x, y)

x := 50
y := 100

Return
Ver 060_Param.prw
Passagem de Parâmetros
Por Referência

User Function Param1()

Local x := 1
Local y := 2 x = 50
u_Param2(@x, y) y=2
MsgAlert(x+y)

Return

User Function Param2(x, y)

x := 50 y = 100
y := 100

Return
Ver 060_Param.prw
Passagem de Parâmetros
Por Referência

User Function Param1()

Local x := 1
Local y := 2 x = 50
u_Param2(@x, y) y=2
MsgAlert(x+y)

Return

User Function Param2(x, y)

x := 50
y := 100

Return
Ver 060_Param.prw
Funções de Caracteres, Números e Datas

•Manipulação de textos (strings)


•Conversão de números
•Funções de data e hora
•Conversão de datas

Ver 053_Tratamentos.PRW
Aula 3
Macro
Bloco de Código
UDC
Semáforos
Arquivos e Índices
Macro-Substituição

User Function Reajuste()

dbSelectArea("SB1")
dbGoTop()
While !SB1->(Eof())
RecLock("SB1")
SB1->B1_Prv1 := SB1->B1_Prv1 * 1.25
MSUnlock()
SB1->(dbSkip())
End

MsgInfo("Terminou!")

Return
Macro-Substituição

User Function Reajuste()


Local cFormula
dbSelectArea("SM4") Arquivo SM4 - Fórmulas
dbSetOrder(1) M4_FILIAL: “01”
dbSeek(xFilial("SM4") + "001") M4_CODIGO: “001”
cFormula := “SB1->B1_Prv1 * 1.25”
SM4->M4_Formula M4_FORMULA: “SB1->B1_Prv1 * 1.25”

dbSelectArea("SB1")
dbGoTop()
While !SB1->(Eof())
RecLock("SB1")
SB1->B1_Prv1
&(cFormula) * *
SB1->B1_Prv1 := &(SB1->B1_Prv1 1.25
1.25)
MSUnlock()
SB1->(dbSkip())
End
MsgInfo("Terminou!")
Return
Ver Reajuste.PRW
Macro-Substituição
Aplicação de Macros

• Validações
“If(M->I2_Valor < GetMV(‘MV_VRMAX’), .T., .F.)”
• Gatilhos
“M->D1_QUANT * M->D1_VUNIT”
• Fórmulas
“SB1->B1_Prv1 * 1.25”
• Lançamentos Contábeis Automáticos
“If(SD3->D3_TIPO=‘MC’, ‘33201’+SD3->D3_CC, ‘11303’)”
Bloco de Código

bBloco := {|| 2 * 10}

nResult := EVal(bBloco) nResult = 20

bBloco := {|x| x * 2}

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

Ver 051_Bloco.prw
Bloco de Código

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

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

DBEval()

Ver AEval em 050_Array.prw


Bloco de Código
Ordenação de array

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


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

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


.F.
.T.

Ver 050_Array.prw
Bloco de Código
Ordenação de array

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

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


.T.
.F.

Ver 050_Array.prw
UDC – User Defined Command
Legibilidade e Manutenibilidade do Fonte

Instruções para o Compilador

#DEFINE
#IFDEF...#ELSE...#ENDIF
#IFNDEF
#INCLUDE
#COMMAND

Ver 080_UDC.prw
Semáforos
Controle de numeração sequencial

GetSXENum(Alias) 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

Arquivos MS: só alias GetSXENum(“SC5”)


Arquivos de usuário: alias e campo GetSXENum(“SZ2”, “Z2_NUMERO”)

Exemplo: 001 003


002 004
003 006
004 007
005 008
Exemplos em 120_TranM2
Arquivos
Famílias de Arquivos de Dados

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.
SI - Contábil Q? - Qualidade (Celerina)
SJ - Estatísticas R? - Recursos Humanos
SM - Miscelâneas SZ,QZ,RZ - Livres
SN - Ativo Fixo P? - Projetos Especiais

M.E.R. Modelo de Entidades e Relacionamento


Principais Arquivos de Dados

Prefixo Descrição
SA1 Cadastro de Clientes
SA2 Cadastro de Fornecedores
SA3 Cadastro de Vendedores
SB1 Cadastro de Produtos
SB2 Saldos dos Produtos por Almoxarifado
SB5 Dados Complementares de Produtos
SC1 Solicitações de Compras
SC5 Cabeçalho dos Pedidos de Venda
SC6 Itens dos Pedidos de Venda
SC7 Pedidos de Compras
SD1 Itens das Notas Fiscais de Entrada
SD2 Itens das Notas Fiscais de Saída
SD3 Movimentações Internas de Produtos
SE1 Títulos a Receber
SE2 Títulos a Pagar
SF1 Cabeçalho das Notas Fiscais de Entrada
Arquivos de Dados – por Empresa

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

Para cada Empresa é criado um jogo de arquivos:


SXXnn0 – onde: XX = Prefixo do arquivo
nn = Empresa

Exemplo: Empresa 99 -> SA1990, SA2990, SB1990...


Arquivos de Dados – por Empresa

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

Todo arquivo, exceto SM2, tem um campo XX_Filial que identifica a Filial:
01
01
01
02
02
02

Nomenclatura dos campos:

Arquivo SA1: A1_FILIAL SA2:A2_FILIAL SB1:B1_FILIAL QA1:


QA1_FILIAL
A1_COD A2_COD B1_COD QA1_COD
A1_NOME A2_NOME B1_DESC QA1_DESC
A1_END A2_END B1_TIPO
Arquivos de Dados
Modo de Acesso

Compartilhado  registros compartilhados entre as filiais


Campo Filial: em branco
Exclusivo  o registro é exclusivo da filial
Campo Filial: código da Filial (variável cFilAnt)

Ex: SA1 - Compartilhado


A1_FILIAL A1_COD A1_NOME
000015 FABRICA DE TINTAS E VERINIZES LTDA /SP
000016
000001
TEX MALHAS E CONFECCOES S.A /SP
CLIENTE PADRAO
xFilial(“SA1”)  “ “
000020 ARMANDO JOSE FLORES /SC
000007 COMERCIO SOM DO MUNDO /SP

Ex: SC5 - Exclusivo


C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR
01 000001 01/01/04 000002 11.11014 15.000,00
01 000005 01/01/04 000023 13.13000 5.600,00
01 000007 20/01/04 000016 15.15140 5.600,00
02
02
000001
000005
01/01/04
01/01/04
000002
000023
11.11014
13.13000
15.000,00
5.600,00
xFilial(“SC5”)  cFilAnt
02 000007 20/01/04 000016 15.15140 5.600,00
03 000001 01/01/04 000002 11.11014 15.000,00
03 000005 01/01/04 000023 13.13000 5.600,00
03 000007 20/01/04 000016 15.15140 5.600,00
Arquivos e Índices

Índice: CÓDIGO Arquivo


CODIGO REGISTRO RECNO A1_COD A1_NOME

000001 03 01 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP


000002 09 02 000016 TEX MALHAS E CONFECCOES S.A /SP
000007 05 03 000001 CLIENTE PADRAO
000008 07 04 000020 ARMANDO JOSE FLORES /SC
000015 01 05 000007 COMERCIO SOM DO MUNDO /SP
000016 02 06 000024 JOAO DA SILVA /SP
000019 13 07 000008 FLORICULTURA FULO DE MARAVILHA /SP
000020 04 08 000023 PREFEITURA MUNICIPAL DE SAO PAULO /SP
000023 08 09 000002 ECOSSISTEMA DIGITAL S/A
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 /RS
000030 15 14 000033 DESPACHANTE
000033 14 15 000030 IMPORTADOR EUA
Arquivos e Índices

Índice: NOME Arquivo


NOME REGISTRO RECNO A1_COD A1_NOME

ACTIONVEA.. 10 01 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP


ARMANDO J.. 04 02 000016 TEX MALHAS E CONFECCOES S.A /SP
CLIENTE P.. 03 03 000001 CLIENTE PADRAO
COMERCIO .. 05 04 000020 ARMANDO JOSE FLORES /SC
DESPACHAN.. 14 05 000007 COMERCIO SOM DO MUNDO /SP
ECOSSISTE.. 09 06 000024 JOAO DA SILVA /SP
FABRICA D.. 01 07 000008 FLORICULTURA FULO DE MARAVILHA /SP
FLORICULT.. 07 08 000023 PREFEITURA MUNICIPAL DE SAO PAULO /SP
IMPORTADO.. 15 09 000002 ECOSSISTEMA DIGITAL S/A
JOAO DA S.. 06 10 000026 ACTIONVEA IMP. EXP.
JOAO DE A.. 13 11 000027 STARMEAL LEAK S.A.
PREFEITUR.. 08 12 000028 REIZA KERN IMP. EXP.
REIZA KER.. 12 13 000019 JOAO DE ALMEIDA SILVA /RS
STARMEAL .. 11 14 000033 DESPACHANTE
TEX MALHA.. 02 15 000030 IMPORTADOR EUA
Arquivos e Índices
Índices Arquivo: SA1990 Alias: SA1 Cadastro de Clientes

CODIGO REG RECNO A1_COD A1_NOME


000001 3 1 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP
000002 9 2 000016 TEX MALHAS E CONFECCOES S.A /SP
000007 5 3 000001 CLIENTE PADRAO
000008 7 4 000020 ARMANDO JOSE FLORES /SC
000015 1 5 000007 COMERCIO SOM DO MUNDO /SP dbSelectArea(“SA1”)
000016 2 6 000024 JOAO DA SILVA /SP
000020 4 7 000008 FLORICULTURA FULO DE MARAVILHA /SP
000023 8 8 000023 PREFEITURA MUNICIPAL DE SAO PAULO /SP
000024 6 9 000002 ECOSSISTEMA DIGITAL S/A
000026 10 10 000026 ACTIONVEA IMP. EXP.

Índices Arquivo: SB1990 Alias: SB1 Cadastro de Produtos


CODIGO REG RECNO B1_COD B1_DESC B1_TIPO B1_UM
1 11.11014 PROD. DE REVENDA PA UN
11.11000 2 2 11.11000 PROD. ACABADO PA UN
11.11003 5 3 12.12006 MAT. PRIMA 1 – QUALITY MP UN
11.11014 1 4 13.13001 CAIXA GRANDE – PA PA CX dbSelectArea(“SB1”)
12.12006 3 5 11.11003 MAT. PRIMA MP UN
13.13000 8 6 15.15140 ALCOOL ETILICO MC L
13.13001 4 7 33.03323 LUVA MP UN
15.15140 6 8 13.13000 CAIXA PEQUENA – PA PA CX
33.03323 7

Arquivo: SC5990 Alias: SC5 Pedidos de Venda


RECNO C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR
Posicionamento de
1 000001 01/01/04 000002 11.11014 15.000,00
registro
dbSkip() 2 000005 01/01/04 000023 13.13000 5.600,00 dbSelectArea(“SC5”)
dbSelectArea(“SB1”)
dbSelectArea(“SA1”)
dbSkip() 3 000007 20/01/04 000016 15.15140 5.600,00
dbSetOrder(1)
dbSkip() 4 000008 27/01/04 000024 13.13001 1.000,00
dbSkip() 5 000009 01/01/04 000008 11.11000 3.450,00
dbSeek(“11.11014”)
dbSeek(“000002”)
Posicionamento de Arquivos

Empresa: XX Filial: 02

dbGoTop()
dbSeek(xFilial(“SC5”))

FILIAL+NUM REG RECNO C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR


1 01 000001 01/01/04 000002 11.11014 15.000,00
01000001 1 2 01 000005 01/01/04 000023 13.13000 5.600,00
01000005 2 3 01 000007 20/01/04 000016 15.15140 5.600,00
01000007 3 4 01 000008 27/01/04 000024 13.13001 1.000,00
01000008 4 5 01 000009 01/01/04 000008 11.11000 3.450,00
01000009 5 6 02 000001 01/01/04 000002 11.11014 15.000,00
02000001 6 7 02 000005 01/01/04 000023 13.13000 5.600,00
02000005 7 8 02 000007 20/01/04 000016 15.15140 5.600,00
02000007 8 9 02 000008 27/01/04 000024 13.13001 1.000,00
02000008 9 10 02 000009 01/01/04 000008 11.11000 3.450,00
02000009 10 11 03 000001 01/01/04 000002 11.11014 15.000,00
03000001 11 12 03 000005 01/01/04 000023 13.13000 5.600,00
03000005 12 13 03 000007 20/01/04 000016 15.15140 5.600,00
03000007 13 14 03 000008 27/01/04 000024 13.13001 1.000,00
03000008 14 15 03 000009 01/01/04 000008 11.11000 3.450,00
03000009 15
Posicionamento de Arquivos
Leitura sequencial

dbGoTop()  Posiciona no topo do arquivo

While !EOF()
dbSkip()  Leitura sequencial, registro a registro
End

FILIAL+NUMERO+ITEM REG RECNO Z2_FILIAL Z2_NUMERO Z2_ITEM


01000101 1 1 01 0001 01
01000102 2 2 01 0001 02
01000103 3 3 01 0001 03
01000201 4 4 01 0002 01
01000202 5 5 01 0002 02
01000301 6 6 01 0003 01
01000302 7 7 01 0003 02
01000303 8 8 01 0003 03
01000401 9 9 01 0004 01
01000402 10 10 01 0004 02

EOF() .T.
Posicionamento de Arquivos
Acesso direto ao registro
Por chave completa ou parcial
dbSeek(xFilial(“SZ2”)+”0003”+”02”)  Chave completa

dbSeek(xFilial(“SZ2”)+”0003”)  Chave parcial

FILIAL+NUMERO+ITEM REG RECNO Z2_FILIAL Z2_NUMERO Z2_ITEM


01000101 1 1 01 0001 01
01000102 2 2 01 0001 02
01000103 3 3 01 0001 03
01000201 4 4 01 0002 01
01000202 5 5 01 0002 02
01000301 6 6 01 0003 01
01000302 7 7 01 0003 02
01000303 8 8 01 0003 03
01000401 9 9 01 0004 01
01000402 10 10 01 0004 02
Sobre arquivos…

• Número máximo de arquivos abertos: 512 (por thread);


• A navegação nos registros é em ordem do índice selecionado - dbSetOrder(n). Se for selecionado
dbSetOrder(0), a navegação será pela ordem física dos registros (Recno);
• No SIX, os índices são numerados de 1 a 9 e A, B,... (campo ORDEM). No dbSetOrder(): 1...9, 10, 11...;
• dbSkip() – avança 1 registro;
• dbSkip(n) ou dbSkip(-n) – avança ou retrocede n registros;
• dbSelectArea(cAlias) – seleciona o arquivo. Caso ainda não esteja aberto, abre-o neste momento.
• A referência a um campo de arquivo com o seu Alias ( ex.: MsgAlert(SA1->A1_Nome) ), também abre o
arquivo, caso não esteja aberto, mesmo sem um dbSelectArea() anterior.
• Na abertura do arquivo, o primeiro índice é selecionado. O ponteiro de registro é posicionado no primeiro
registro físico (não pelo índice). A função dbGoTop(), posiciona no primeiro registro do índice selecionado;
• No Protheus MDI, os arquivos são abertos dentro da thread e fechados no seu encerramento. Na chamada
à mesma rotina, mesmo em outra thread, concomitante ou não, os arquivos são reabertos e posicionados
no topo e com o primeiro índice selecionado.
• No Protheus SDI, uma vez abertos, os arquivos permanecem assim, inclusive com o último posicionamento
do ponteiro de registro e o índice selecionado. A função dbCloseArea() fecha o arquivo.
• No MDI: a abertura e o posicionamento de um mesmo arquivo em threads diferentes são independentes,
ou seja, podem ser selecionados índices diferentes e o ponteiro de registros podem ser posicionados em
registros diferentes também. O bloqueio de um mesmo registro é comum, ou seja, se o registro for
bloqueado por um dos threads, o outro não poderá acessá-lo para alteração ou exclusão.
Aula 4
AxCadastro
MBrowse
Modelo2
Modelo3
Funções de
Tratamento de
Arquivos
AxCadastro,MBrowse,Modelo2,Mo
delo3
AxCadastro

AxPesqui(
)
AxVisual(
)
AxInclui()

AxAltera(
)
AxDeleta(
)
AxCadastro

AxInclui
()

Ver 100_Cad.prw
AxCadastro

Cadastre algumas contas

No campo E-Mail, coloque:


aprovador@tecnico.com.br

E no E-Mail1, coloque: aprovador1@tecnico.com.br


MBrowse
Permite uma flexibilidade maior que a AxCadastro

Precisa de duas variáveis PRIVATE:

cCadastro  Título da janela.

aRotina  array onde devem ser incluidos os botões


(no máximo, 10).

Esses botões podem ser associados a


qualquer função, inclusive AxInclui(), AxAltera(),
etc.

Ver 110_TranM1.prw
Sobre variáveis…

Referência
Nome := “João” a uma
variável
É
atribuiçã S Cria a
o de variável
valor?
Variáve
Atribui o S l N Nome := “João”
valor à existe Cria como privada
variável ?
“João”  Var. Nome Erro:
N
variável
não existe
Existe
um N
arquivo
aberto ?
Arquivo Para não confundir variáveis de memória com
S campos de arquivos, usa-se o ALIAS:
Codigo Nome
João M->Z1_Nome  variável de memória
Existe
SZ1->Z1_Nome  campo de arquivo
Grava o S campo N
valor no com
este
campo Arquivo
nome ?
“João”  Campo Nome Codigo Descricao
Sobre variáveis…

JOSE
aprovador@tecnico.com.br

Para cada campo é criada uma variável de memória com o


mesmo nome, onde os dados digitados ficam inicialmente
armazenados, antes de ser efetivamente gravados no arquivo:
M->Z1_NOME JOSE
M->Z1_EMAIL aprovador@tecnico.com.br
M->Z1_EMAIL1
M->Z1_SALDO

Estas variáveis são usadas em Validações, Gatilhos, etc.


ExistChav(“SZ1”, M->Z1_NOME, 1)
Funções de tratamento de arquivos

• Ver FuncMod2
• Ver MarkBrow (exemplo do Baile)
Modelo 2
GetDados Enchoice

Número
Variáveis
Nome Data
de memória

Item Tipo Histórico Valor aHeader

aCols
Modelo 2
Enchoice

Número
Variáveis
Nome Data
de memória

1 2 3 4
1 Item Tipo Histórico Valor Titulo
2 Z2_ITEM Z2_TIPO Z2_HIST Z2_VALOR Campo
3 @E 999,999,999.99 Picture
4 2 1 20 12 Tamanho
5 0 0 0 2 Decimal
aHeader
GetDados

6 Valid.
7 C C C N Usado
8 SZ2 SZ2 SZ2 SZ2 Tipo
9 R R R R Arquivo
10 Contexto

1 01 D Deposito 10.000,00 .F.

2
02 S Saque 300,00 .F. aCols
3
03 S Saque 2.500,00 .F.

1 2 3 4 5
Modelo 2

Array aRotina

lRet
mBrowse()

.T.
Monta os parametros:
1. Variáveis de memória
2. aHeader 3 5
Inclusão nOpc Exclusão
3. aCols
4. Enchoice
4

lRet := Modelo2() Alteração

Ver 120_TranM2.prw
Modelo 2

Criação do aCols para Inclusão


Modelo 2 – Criação do aCols para Inclusão
Adiciona uma linha no aCols

1 2 3 4
1 Item Tipo Histórico Valor Titulo
2 Z2_ITEM Z2_TIPO Z2_HIST Z2_VALOR Campo
3 @E 999,999,999.99 Picture
4 2 1 20 12 Tamanho
5 0 0 0 2 Decimal
6 Valid. aHeader
7 C C C N Usado
8 SZ2 SZ2 SZ2 SZ2 Tipo
9 R R R R Arquivo
10 Contexto
1 2 3 4 5
1 Nil Nil Array(?)
Array(5)
Nil Nil Nil

aCols

// Como cada elemento de aCols sempre contera um elemento a mais que o aHeader,
// adiciona em aCols um ARRAY com o "num.elementos de aHeader + 1", ou seja, 5 elementos.

AAdd(aCols, Array(Len(aHeader)+1))

4
Modelo 2 – Criação do aCols para Inclusão
Preenche o aCols de acordo com o Inicializador-Padrão

1 2 3 4
1 Item Tipo Histórico Valor Titulo
2 Z2_ITEM Z2_TIPO Z2_HIST Z2_VALOR Campo
3 @E 999,999,999.99 Picture
4 2 1 20 12 Tamanho
5 0 0 0 2 Decimal
6 Valid. aHeader
7 C C C N Usado
8 SZ2 SZ2 SZ2 SZ2 Tipo
9 R R R R Arquivo
10 Contexto
1 2 3 4 5
1 Nil“
“ Nil
“D” “ Nil “ Nil 0,00 Nil

aCols

// Preenche cada elemento desse array, de acordo com o Inicializador-Padrao do Dic.Dados.

For i := 1 To Len(aHeader)
“Z2_ITEM”
“Z2_VALOR”
“Z2_HIST”
“Z2_TIPO”
aCols[1][i] := CriaVar(aHeader[i][2])
2
3
4
1 2
3
4
1
Next
Modelo 2 – Criação do aCols para Inclusão
Inicializa a última coluna com .F.

1 2 3 4
1 Item Tipo Histórico Valor Titulo
2 Z2_ITEM Z2_TIPO Z2_HIST Z2_VALOR Campo
3 @E 999,999,999.99 Picture
4 2 1 20 12 Tamanho
5 0 0 0 2 Decimal
6 Valid. aHeader
7 C C C N Usado
8 SZ2 SZ2 SZ2 SZ2 Tipo
9 R R R R Arquivo
10 Contexto
1 2 3 4 5
1 Nil
“ “ Nil
“D” “ Nil “ Nil 0,00 .F.
Nil

aCols

// Inicializa a ultima coluna para o controle da GetDados: deletado ou nao.

// aCols[1][5] := .F.

aCols[1][Len(aHeader)+1] := .F.

4
Modelo 2 – Criação do aCols para Inclusão
Inicializa a coluna do ITEM com 01

1 2 3 4
1 Item Tipo Histórico Valor Titulo
2 Z2_ITEM Z2_TIPO Z2_HIST Z2_VALOR Campo
3 @E 999,999,999.99 Picture
4 2 1 20 12 Tamanho
5 0 0 0 2 Decimal
6 Valid. aHeader
7 C C C N Usado
8 SZ2 SZ2 SZ2 SZ2 Tipo
9 R R R R Arquivo
10 Contexto
1 2 3 4 5
1 “ “
“01“ Nil
“D” “ Nil “ Nil 0,00 .F.
Nil

aCols

// Inicializa a coluna do ITEM com 01.


// aCols[1][1] := "01" <-- teria problema se o usuario alterasse a posicao do
// campo Z2_ITEM no Dic. de Dados.

aCols[1][AScan(aHeader, {|x|Trim(x[2])=="Z2_ITEM"})] := "01"

1
Modelo 2

Criação do aCols para Alteração


Modelo 2 – Criação do aCols para Alteração
Inicializa as variáveis de memória da Enchoice

M->Z2_Nome := (cAlias)->Z2_Nome PEDRO


M->Z2_Numero := (cAlias)->Z2_Numero 0003
M->Z2_Data := (cAlias)->Z2_Data 30/03/06
Modelo 2 – Criação do aCols para Alteração
Posiciona no primeiro registro com o número 0003

M->Z2_Nome := (cAlias)->Z2_Nome PEDRO


M->Z2_Numero := (cAlias)->Z2_Numero 0003
M->Z2_Data := (cAlias)->Z2_Data 30/03/06

dbSelectArea(cAlias)
dbSetOrder(2) // Z2_Filial + Z2_Nome + Z2_Numero + Z2_Item
dbSeek(xFilial(cAlias) + M->Z2_Nome + M->Z2_Numero)
01 PEDRO 0003

While !EOF() .And. (cAlias)->(Z2_Filial+Z2_Numero) == xFilial(cAlias) + M->Z2_Numero


... “01” + “0003” “01” + “0003”
dbSkip() “01” + “0004”
End
Modelo 2 – Criação do aCols para Alteração
Adiciona uma linha no aCols

1 2 3 4
1 Item Tipo Histórico Valor Titulo
2 Z2_ITEM Z2_TIPO Z2_HIST Z2_VALOR Campo
3 @E 999,999,999.99 Picture
4 2 1 20 12 Tamanho
5 0 0 0 2 Decimal
6 Valid. aHeader
7 C C C N Usado
8 SZ2 SZ2 SZ2 SZ2 Tipo
9 R R R R Arquivo
10 Contexto
1 2 3 4 5
1 Nil Nil Nil Nil Nil

aCols

// Como cada elemento de aCols sempre contera um elemento a mais que o aHeader,
// adiciona em aCols um ARRAY com o "num.elementos de aHeader + 1", ou seja, 5 elementos.

AAdd(aCols, Array(Len(aHeader)+1))

4
Modelo 2 – Criação do aCols para Alteração
Preenche o aCols com os dados lidos do arquivo

1 2 3 4
1 Item Tipo Histórico Valor Titulo
2 Z2_ITEM Z2_TIPO Z2_HIST Z2_VALOR Campo
3 @E 999,999,999.99 Picture
4 2 1 20 12 Tamanho
5 0 0 0 2 Decimal
6 Valid. aHeader
7 C C C N Usado
8 SZ2 SZ2 SZ2 SZ2 Tipo
9 R R R R Arquivo
10 Contexto
1 2 3 4 5
1 Nil
“01“ Nil
“D” “Deposito“
Nil Nil 500,00 Nil

aCols

For i := 1 To Len(aHeader)

If aHeader[i][10] == "R“
“Z2_ITEM”
“Z2_VALOR”
“Z2_HIST”
“Z2_TIPO”
aCols[nLin][i] := FieldGet(FieldPos(aHeader[i][2]))

Else 1
4
2
3 8
4
7
6 1
2
3
4 4 6 7 8
Z2_ITEM Z2_TIPO Z2_HIST
aCols[nLin][i] := CriaVar(aHeader[i][2], .T.)
Z2_VALOR
EndIf 01 D Deposito 500,00
02 D Deposito 150,00
Next 03 S Saque 90,00
Modelo 2 – Criação do aCols para Alteração
Inicializa a última coluna com .F.

1 2 3 4
1 Item Tipo Histórico Valor Titulo
2 Z2_ITEM Z2_TIPO Z2_HIST Z2_VALOR Campo
3 @E 999,999,999.99 Picture
4 2 1 20 12 Tamanho
5 0 0 0 2 Decimal
6 Valid. aHeader
7 C C C N Usado
8 SZ2 SZ2 SZ2 SZ2 Tipo
9 R R R R Arquivo
10 Contexto
1 2 3 4 5
1 “01“ “D” “Deposito“ 500,00 .F.
Nil

aCols

// Inicializa a ultima coluna para o controle da GetDados: deletado ou nao.

// aCols[1][5] := .F.

aCols[nLin][Len(aHeader)+1] := .F.

4
Modelo 3
Similar ao Modelo2

Diferença:

Modelo2 – Cabeçalho e Itens são o


mesmo arquivo (ex.: SC7 - Ped.
Compras)
A definição de quais campos ficarão no cabeçalho e
quais
ficarão nos itens, é feita no programa.

Modelo3 – Cabeçalho é um arquivo (ex.:


SC5 – Cabec. Ped. Vendas)
Itens é outro arquivo (ex.: SC6 – Itens do Ped.
Vendas)

Ver 130_TranM3.prw
Aula 5
Telas
Relatórios
Reposicionamento de arquivos
Integração com Excel
SQL
OOP
Arquivos TXT e XML
Telas
Tela

• EnchoiceBar – barra de ferramentas com os botões padrões


• aButtons – acrescenta botões na EnchoiceBar
• Define Font – cria uma fonte diferente da padrão
• Define MSDialog – define a janela principal
• Say – mostra um texto na tela (normal ou como objeto)
• Get – campo para digitação (normal ou como objeto)
• Radio Button
• Check Box
• Botões
• Folder
• Activate MSDialog – ativa (desenha) a tela
• Hide e Show – esconde e reexibe um objeto
• Mudança do texto
• Exercício: colocar o foco no campo Nome depois de clicado no
botão OK oGetNome:SetFocus()
Ver 131_Tela.prw
Tela

RDDemo e RDDemo2 – mais componentes de tela


Relatórios
Relatórios

Criar um relatório pelo Assistente de Código do IDE:


IDE: menu Ferramentas / Assistente de Código

Nome Data Numero Item Tipo Historico Valor


Para incluir as
ordens, digitar
no campo Ordem
e clicar neste botão
Relatórios

• Alterar o nome da User Function para: Rel001()

• Na função RunReport(), após a linha “nLin := nLin + 1”, que


normalmente está na linha 221, incluir os comandos de impressão dos
campos:

@nLin,00 PSay SZ2->Z2_Nome


@nLin,23 PSay SZ2->Z2_Data
@nLin,34 PSay SZ2->Z2_Numero
@nLin,41 PSay SZ2->Z2_Item
@nLin,46 PSay SZ2->Z2_Tipo
@nLin,50 PSay SZ2->Z2_Hist
@nLin,73 PSay SZ2->Z2_Valor Picture "@E 999,999,999.99"

• Compilar e executar
Relatórios
Perguntas

• Arquivo SX1

• Função Pergunte(): lê as perguntas e cria as variáveis


correspondentes à cada pergunta: MV_PAR01, MV_PAR02, etc.
Estas variáveis são Private.

• Sintaxe: Pergunte(cPerg, lMostra)

cPerg  código do grupo de perguntas


lMostra  .T. abre a tela de perguntas
 .F. não abre a tela; apenas cria as variáveis
Relatórios
Perguntas

• Abrir e compilar o programa CriaSX1.prw

• Na parte inicial do programa, antes da linha “Pergunte(cPerg, .F.)”,


incluir a chamada à função u_CriaSX1(cPerg)

• Na função RunReport(), na parte da impressão dos campos, incluir a


lógica para imprimir somente se o Nome e a Data estiverem dentro dos
limites informados nas perguntas “Conta de”, “Conta até”, “Data de” e
“Data até”

If SZ2->Z2_Nome >= mv_Par01 .And. SZ2->Z2_Nome <= mv_Par02 .And.;


SZ2->Z2_Data >= mv_Par03 .And. SZ2->Z2_Data <= mv_Par04

@nLin,00 PSay SZ2->Z2_Nome


...

EndIf
Relatórios
Índice temporário

• Índices permanentes são criados no Dicionário de Dados. A cada


inclusão/alteração de registros, todos os índices também são
atualizados.
• Por questões de performance, somente índices usados com muita
freqüência deveriam ser permanentes.
• Índices usados esporadicamente, deverão ser criados como
temporários por meio da função IndRegua().
• Função IndRegua(): permite criar índices temporários, inclusive com a
possibilidade de estabelecer um filtro.
• Ao criar um índice temporário, os índices originais são desativados, e
deverão ser reativados por meio da função RetIndex().
• O arquivo temporário deverá ser apagado pela função FErase().
Relatórios
Índice temporário

• Na função RunReport(), na linha “nOrdem := aReturn[8]”, substituir


dbSetOrder(nOrdem) por:

If nOrdem < 3
dbSetOrder(nOrdem)
Else
cArqInd := CriaTrab(Nil, .F.)
cChave := "xFilial('SZ2') + DtoS(Z2_Data)"
cFiltro := "Z2_Filial==xFilial('SZ2') .And. Z2_Tipo == '" + If(mv_Par05==1,"D","S") + "'"
cOrdem := " "
lMostra := .T.

IndRegua("SZ2", cArqInd, cChave, cOrdem, cFiltro, "Indexando...", lMostra)


EndIf

• No final da função, antes da linha “Return”, incluir:


RetIndex("SZ2")
FErase(cArqInd + OrdBagExt())
Relatórios
Funções usadas nos programas de relatórios

SetPrint()  janela principal para definição das propriedades


do relatório (array aReturn).
aReturn[1] = Reservado para formulário
aReturn[2] = Reservado para número de vias
aReturn[3] = Destinatário
aReturn[4] = Formato: 1-Retrato, 2-Paisagem
aReturn[5] = Tipo midia: 1-Disco, 2-Via spool, 3-Direto na porta, 4-EMail
aReturn[6] = "NomeArq"-Disco, "LPT1"-Via spool, "LPT1"-Direto na porta, ""-
Cancelado
aReturn[7] = Expressão do filtro
aReturn[8] = Ordem a ser selecionada

SetDefault()  prepara o ambiente de impressão de acordo com


as informações contidas no array aReturn, obtidas através da função SetPrint().
Pergunte()  abre a janela de perguntas.
RptStatus()  executa a função de impressão, mostrando uma
régua de progressão.
SetRegua()  define o limite da régua de progressão criada
pela função RptStatus().
IncRegua()  incrementa a progressão da régua.
SIGARPM

Fazer um relatório com as transações de cada cliente,


listando todos os dados do SZ2 e também o e_mail e o
saldo atual.
Pontos de Entrada

Crie um Ponto de Entrada para modificar o cálculo do


Saldo após um Saque, considerando apenas 60% do
seu valor.
Reposicionamento de Arquivos

As funções de Ponto de Entrada que despocionarem arquivos têm a


responsabilidade de devolvê-los na mesma situação em que
receberam.

Para tanto, estas três informações devem ser guardadas:

cAlias := Alias() Arquivo atualmente selecionado


nOrdem := IndexOrd() Índice selecionado
nRecno := Recno() Número do registro posicionado

Na saída, devem ser restauradas:

dbSelectArea(cAlias)
dbSetOrder(nOrdem)
dbGoTo(nRecno)
Reposicionamento de Arquivos

GetArea() Guarda as três informações num array


RestArea() Restaura

User Function MT010Inc()


Local aAreaSA1 := SA1->(GetArea())
Local aAreaSB1 := SB1->(GetArea())
Local aAreaSC5 := SC5->(GetArea())

...

RestArea(aAreaSA1)
RestArea(aAreaSB1)
RestArea(aAreaSC5)
Return

Obs.: esta regra vale para qualquer função.


Integração com Excel

APExcel

Protheus =MSGetArray(A1;Siga("U_PLANMOV")) Excel

u_PlanMov() Array de dados

Ver 170_Planilha.prw
SQL - Structured Query Language

SELECT Natureza, Data, Valor FROM Movto

SELECT MOVTO.Natureza, MOVTO.Data, MOVTO.Valor,


ORCADO.Tipo FROM MOVTO, ORCADO

SELECT * FROM Movto WHERE Valor > 100

SELECT * FROM Orcado WHERE Natureza = ‘Casa’

Outras cláusulas do SELECT: GROUP BY, ORDER BY, HAVING,


AND, OR, IN, DISTINCT, BETWEEN, LIKE.

VIEW ou Visão. A View é virtual

Ver 090_DBFSQL.prw
Ver texto Programando SQL com RDMake
Relação de Stored Procedures no PPT Oficial
MPSDU

Programa utilitário para acesso, visualização e pequenas manutenções


de arquivos Menu Arquivo / Abrir
1
3

MPSDU

TCP
4
Environment

Administrador

admin
MPSDU
OOP – Programação Orientada a Objetos

• Classes
• Métodos
• Propriedades

Um objeto é uma instância da sua classe. Por exemplo, o botão é da


classe tButton.

É criado a partir da execução do método construtor.


oBotaoOK := tButton():New()

Suas propriedades podem ser definidas ou alteradas.


oBotaoOK:cCaption := “Ok”
oBotaoOK:nWidth := 50
oBotaoOK:nHeight := 15
oBotaoOK:bAction := {|| u_Grava() }

O AdvPL permite usar as classes pré-definidas ou criar novas classes,


substituindo a programação baseada em comandos e funções pela
orientação a objetos.
Ver 143_Objetos.prw
Arquivos Texto

O IDE possui um Assistente de Geração e Importação de arquivos texto:

IDE: menu Ferramentas / Assistente de Código

SZ1JOSE 00000956000
SZ230/03/06DDeposito inicial 00001000000
SZ230/03/06SPagto. conta de luz 00000030000
SZ230/03/06SSupermercado 00000014000
SZ1MARIA 00000150000
SZ230/03/06DAbertura de conta 00000200000
SZ230/03/06SLojas Marina 00000050000
SZ1PEDRO 00000056000
SZ230/03/06DDeposito 00000050000
SZ230/03/06DDeposito 00000015000
SZ230/03/06SConta de telefone 00000009000

Programa TXT: gera e lê arquivos TXT.

É necessário criar, abaixo do diretório \MP_DATA, o diretório \TXT, onde


será gravado o arquivo CONTAS.TXT.
Ver 150_TXT.prw
XML

<Contas>
<Conta>
<Nome>JOSE</Nome>
<Saldo>9560</Saldo>
<Transacao>
<Data>30/03/06</Data>
<Tipo>D</Tipo>
<Hist>Deposito inicial</Hist>
<Valor>10000</Valor>
</Transacao>
<Transacao>
<Data>30/03/06</Data>
<Tipo>S</Tipo>
<Hist>Pagto. conta de luz</Hist>
<Valor>300</Valor>
</Transacao>
</Conta>
</Contas>

Programa XML: gera e lê arquivos XML.

Será gravado no diretório \TXT, o arquivo CONTAS.XML. Este arquivo


poderá ser visualizado no Internet Explorer.
Ver 160_XML.prw
Aula 6
Workflow
WebServices
AdvPL ASP
WorkFlow
Fluxo manual

do
a sal Contas Saldo
aliz
Atu
Efetua
transações Aguardando o
Gra aprovador
va
t ran rova
saç Transa- va ou Rep o
acessar
Cliente ão
ções
Apro
sistema... Aprovador
WorkFlow
Fluxo automático

Saldo Negativo?
do
a sal Contas Saldo Dispara um WorkFlow
aliz
Atu
Efetua WFSalNeg()
transações
Gra osta WFRetorno()
va a resp
t ran Grava vado)
saç Transa- o ou Repro
Cliente ad
ão (Aprov
ções
Executa a função
l de retorno
ai
M
E-

Job WFRET
Caixa
Caixade
de WFReturn()
Saída
Saída

E-Mail Captura a resposta

Resposta Caixa
(Aprovado ou Reprovado)
Caixade
de
Entrada
Entrada

Aprovador
WebServices
Integração de sistemas

Via troca de arquivos

Sistema Sistema
TXT/XML
A B

Via Web Services

Web Service
<Nome>JOSE</Nome>
WSDL

Sistema Sistema
http://...
A B
<Saldo>1000</Saldo>
WebServices
Configuração
O Protheus dispõe de um Assistente de Configuração:
\ERP811\BIN\REMOTE\MP8WIZARD.EXE
WebServices
Configuração

WS – Protheus 8 Web Services

ws

\web\ws

ENVIRONMENT
WebServices
Configuração

localhost/ws/9901
WebServices
Configuração
WebServices
Configuração – MP8SRV.INI

[HTTP]
ENABLE=1
PORT=80
Acesso ao WebService:
http://localhost/ws/9901/... [localhost/ws1/9901]
[localhost/ws/9901]
ENABLE=1
ENABLE=1
http://localhost/ws1/9901/... PATH=C:\ERP811\MP_Data\web\ws
PATH=C:\ERP811\MP_Data\web\ws1
ENVIRONMENT=ENVIRONMENT1
ENVIRONMENT=ENVIRONMENT
INSTANCENAME=ws1
INSTANCENAME=ws
RESPONSEJOB=JOB_WS1_9901
RESPONSEJOB=JOB_WS_9901
DEFAULTPAGE=wsindex.apw
DEFAULTPAGE=wsindex.apw

[JOB_WS1_9901]
[JOB_WS_9901]
TYPE=WEBEX
TYPE=WEBEX
ENVIRONMENT=ENVIRONMENT1
ENVIRONMENT=ENVIRONMENT [EVIRONMENT]
INSTANCES=1,3
INSTANCES=1,3 SourcePath=C:\ERP811\APO
SIGAWEB=WS
SIGAWEB=WS RootPath=C:\ERP811\MP_Data
INSTANCENAME=ws1
INSTANCENAME=ws StartPath=\system\
ONSTART=__WSSTART
ONSTART=__WSSTART ...
ONCONNECT=__WSCONNECT
ONCONNECT=__WSCONNECT [EVIRONMENT1]
PREPAREIN=99,01
PREPAREIN=99,01 Emp. 99, Filial 01 SourcePath=C:\ERP811\APO1
RootPath=C:\ERP811\MP_Data
[ONSTART]
[ONSTART] StartPath=\system\
JOBS=JOB_WS_9901,JOB_WS1_9901
JOBS=JOB_WS_9901 ...
WebServices

Após a configuração, ver a lista de Web Services disponíveis no


Protheus:
• Reinicializar o server
• No Internet Explorer: http://localhost/ws/9901/wsindex.apw
WebServices
IDE

http://localhost/FORNECESALDO.apw?WSDL
http://localhost
WebService ForneceSaldo
WSDL
Método BuscaSaldo
Cliente WSForneceSaldo Nome
Método BuscaSaldo Saldo
Nome
Saldo

Sistema

Contas
WebServices

http://localhost
WebService ForneceSaldo
WSDL
Método BuscaSaldo
Cliente WSForneceSaldo Nome
João
Método BuscaSaldo Saldo
Nome

1000,00
1000,00
Saldo

João
10
00
Jo

,0
ConsultaSaldo
ã

0
Sistema
o

Tela
Nome:João
Saldo: 1000,00
Contas
100

OK
0,

ão
Saldo(cNome) Jo
00

oWS := WSForneceSaldo():New()
oWS:BuscaSaldo(cNome)
Portal Protheus
Configuração
Para o desenvolvimento de páginas Internet, via AdvPL ASP, é
necessário configurar o módulo web Portal Protheus:
Portal Protheus
Configuração

PP – Portal Protheus

pp

\web\pp

ENVIRONMENT

http://localhost/ws/9901
Portal Protheus
Configuração

localhost/pp
Portal Protheus
Configuração
HTML
Página estática (html)
Servidor Internet

Browser
http://www.empresax.com.br/inicio.htm inicio.htm

Benvindo ao site da Empresa X


Hoje é 10/08/05 <html>
<body>

Benvindo ao site da Empresa X

Página Hoje é 10/08/05


estática
</body>
</html>
HTML + ASP
Página dinâmica (html + ASP)
Servidor Internet

21/02/06

Browser
http://www.empresax.com.br/inicio.htm inicio.htm

Benvindo ao site da Empresa X


Hoje é 21/02/06 <html>
<body>

Benvindo ao site da Empresa X


Página
dinâmica, Hoje é <%=Date%>

com a data </body>


obtida do </html>
servidor
AdvPL ASP
Página com html + AdvPL ASP
Servidor Internet
Protheus

21/02/06

Browser RPO
http://www.empresax.com.br/u_inicio.apw inicio.prw

Benvindo ao site da Empresa X


Hoje é 21/02/06 User Function Inicio()
Local cHtml
WEB EXTENDED INIT cHtml
cHtml := ExecInPage(“Pagina”)
WEB EXTENDED END
Return cHtml

Pagina.aph
<html>
<body>
Benvindo ao site da Empresa X
Ver 230_ASP1.prw e 235_ASP1.aph
Ver 240_ASP2.prw e 245_ASP2.aph Hoje é <%=Date()%>
Ver 250_ASP3.prw e 255_ASP3.aph </body>
Ver 260_ASP4.prw e 265_ASP4.aph </html>
Ver 270_ASP5.prw e 275_ASP5.aph
Call Center
Telnet
Integração com equipamentos micro-terminais

No MP8SRV.INI, acrescentar:

[TELNET]
Enable=1
Environment=Environment RPO

Main=MTTRAN MTTran()
Port=1024

Ver 330_MTTran.prw e 331_MTFunc.prw


DEM
Documentação Eletrônica Microsiga

• Linguagem AdvPL
• Tecnologia Protheus
• Dicas e Notícias
• F.A.Q.
• Guias de Referência
• Releases
• Sistema
Top Connect com SQL
Duvidas

descrição da GetDados e da Enchoice


Porque na U_Deleta tem parametros
Qdo vai para a função Alterar a Mbrowse já jogou os cpos para a
memoria. Porque precisa do nReg
Qdo se usa passagem por referencia. Não é o mesmo que Private/local
Exemplos de CodeBlock com Eval, aEval e DBEval
O que é o ultimo parametro do IndRegua (.T.). Como faz para funcionar
o D de descendente
No Modelo 2 toda vez ele lê o SX3?
Como funcionar a UDC #command
Back-Up

Seguranç
a

Dicionário
de Dados Dicionário de
Dados

Programa A Programa C

Programa B

Você também pode gostar