Anda di halaman 1dari 214

Programao e

Customizaes
AdvPL e Protheus

Aula 1
Evoluo e Arquitetura do Sistema
Arquivos
Customizaes
Case Sistema de Contas Correntes

Evoluo 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
Linux
Browser

Windows
Linux
Unix

Windows
Linux
Unix

Remote (MP8RMT.EXE)

RPO (MPDP811.RPO)

Client (WEB)
ActiveX

Server (MP8SRVWIN.EXE)
Monitor

Client

Aplication
Server

Top Connect

DBF/CTREE
SQL Server

Oracle

DB2

Sybase

PostGres

MySQL

Database
Server

Mltiplas configuraes

..

modem

..

modem

.....

Hub

Servidor
Terminal
Dados

Hub
.....

Estrutura Protheus

Programa
Fonte

SERVER

REMOTE

MATA010

APO
MATA010

RPO
MATA010
MATA410
CTBR040

Cad.Produtos

Executa
MATA010
Executa
MATA410

Ped.Vendas

Executa
CTBR040

Balancete Cont.

Aplicativos
Protheus

Server
Protheus Remote
Top Connect
Monitor

Conjuntos de arquivos
RPO

arquivo binrio com os APOs


BUILD executveis, DLLs e RPO
Patch atualizaes do RPO

Remote
Windows
Linux
Hand

Held (Palm ou Pocket PC)


ActiveX

Terminal Remoto
Thin

Client
Baixo trfego na rede
Multi-plataforma
Atualizao automtica
ASP - Aplication Server Provider
Browser Internet (HTML)

Estrutura de pastas do sistema


ERP811

APO (RPO)
BIN
REMOTE
SERVER

INCLUDE
MP_DATA

DATA (verso 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

TCP

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

Environment

[Drivers]
Active=TCP

SIGACFG

[TCP]
TYPE=TCPIP
Port=1234

ERP811
APO
BIN
REMOTE
SERVER
INCLUDE
MP_DATA
DATA
SAMPLES
SPOOL
SYSTEM
SYSTEMLOAD
MY PROJECTS

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

Server e Remote em
mquinas separadas

Protheus
Server

OU

Server e Remote na
mesma mquina
aradas

Protheus
Server

Rede
Intranet

Protheus
Remote

Extranet
Internet

Protheus
Remote

Configurador

SIGACFG

TCP

Environment

Configurador

Senha: admin

Configurador

Configurador

CONFIGURADOR

Ambiente ...

Usurio ...

Possibilita a
definio do
formato das
interfaces de
acesso aos
mdulos do
sistema, criao
e manuteno de
menus, tabelas,
parmetros e
perguntas

Permite o registro
e a manuteno de
usurios, empresas,
senhas e nveis de
acessos.

Bases

de

Dados..

Oferece um
conjunto completo
de funes para a
criao e manuteno
do Dicionrio de
Dados (campos
com suas
caractersticas e
seus gatilhos e
validaes).

Empresas ...

Ajuda ...

Permite a criao
de bases para
novas empresas e
consolida todos os
fatos ocorridos no
sistema por meio
de consulta aos
arquivos de LOG.

Consolida um
conjunto de dicas
sobre os
conceitos e
utilizao do
produto.

Arquivos Famlia SX
Pasta \SYSTEM
Arquivo
SX1
SX2
SX3
SX4
SX5
SX6
SX7
SX9
SXA
SXB
SXD
SXE
SXF
SXG
SXK
SXO
SIX
.XNU

Descrio
Perguntas e Respostas
Mapeamento de Tabelas
Dicionrio de Dados
Agenda do Schedule de Processos
Tabelas
Parmetros
Gatilhos
Relacionamento entre Tabelas
Pastas Cadastrais apontadas no SX3
Consulta por meio da tecla F3 (Consulta Padro)
Controle do Schedule de Processos
Seqncia de Documentos (+1)
Seqncia de Documentos (prximo)
Tamanho padro para campos
Respostas das Perguntas (SX1) por Usurio
Controle de LOGs por Tabela
ndices dos Arquivos
Menu de Opes dos Mdulos

Famlias de Arquivos de Dados


Pasta \DATA ou Banco de Dados

SA
SB
SC
SD
SE
SF
SG
SH
SI
SJ
SM
SN

Cadastros
Estoques
Previses de E/S
Mov. De Estoque
Financeiro
Fiscal
Estruturas
Carga de Mquina
Contbil
Estatsticas
Miscelneas
Ativo Fixo

SO - Assist. Tcnica
SP - Ponto Eletrnico
SQ - Recr. e Seleo
SR - Folha de Pagto
ST - Manut. Industrial
SU - Telemarketing
SV - Concessionrias
SW e SY
- Export./Import.
Q? - Qualidade (Celerina)
R? - Recursos Humanos
SZ,QZ,RZ - Livres
P? - Projetos Especiais

M.E.R. Modelo de Entidades e Relacionamento

Principais Arquivos de Dados


Prefixo
SA1
SA2
SA3
SB1
SB2
SB5
SC1
SC5
SC6
SC7
SD1
SD2
SD3
SE1
SE2
SF1
SF2
SI1
SI2

Descrio
Cadastro de Clientes
Cadastro de Fornecedores
Cadastro de Vendedores
Cadastro de Produtos
Saldos dos Produtos por Almoxarifado
Dados Complementares de Produtos
Solicitaes de Compras
Cabealho dos Pedidos de Venda
Itens dos Pedidos de Venda
Pedidos de Compras
Itens das Notas Fiscais de Entrada
Itens das Notas Fiscais de Sada
Movimentaes Internas de Produtos
Ttulos a Receber
Ttulos a Pagar
Cabealho das Notas Fiscais de Entrada
Cabealho das Notas Fiscais de Sada
Plano de Contas
Lanamentos Contbeis

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
A1_COD
A1_NOME
A1_END

SA2: A2_FILIAL
A2_COD
A2_NOME
A2_END

SB1: B1_FILIAL
B1_COD
B1_DESC
B1_TIPO

QA1: QA1_FILIAL
QA1_COD
QA1_DESC

Arquivos de Dados
Modo de Acesso

Compartilhado registros compartilhados entre as filiais


Campo Filial: em branco
Exclusivo

o registro exclusivo da filial

Campo Filial: cdigo da Filial (varivel cFilAnt)

Ex: SA1 - Compartilhado


A1_FILIAL

A1_COD

A1_NOME

000015
000016
000001
000020
000007

FABRICA DE TINTAS E VERINIZES LTDA /SP


TEX MALHAS E CONFECCOES S.A /SP
CLIENTE PADRAO
ARMANDO JOSE FLORES /SC
COMERCIO SOM DO MUNDO /SP

xFilial(SA1)

Ex: SC5 - Exclusivo


C5_FILIAL

C5_NUM

C5_EMISSAO

C5_CLIENTE

C5_PROD

C5_VALOR

01
01
01

000001
000005
000007

01/01/04
01/01/04
20/01/04

000002
000023
000016

11.11014
13.13000
15.15140

15.000,00
5.600,00
5.600,00

02
02
02

000001
000005
000007

01/01/04
01/01/04
20/01/04

000002
000023
000016

11.11014
13.13000
15.15140

15.000,00
5.600,00
5.600,00

03
03
03

000001
000005
000007

01/01/04
01/01/04
20/01/04

000002
000023
000016

11.11014
13.13000
15.15140

15.000,00
5.600,00
5.600,00

xFilial(SC5) cFilAnt

Arquivos de ndices
ndices
Todo arquivo precisa ter pelo menos um ndice
ndice Primrio:

acesso direto ao registro


verificao de chave duplicada

Ordenao de registros

CHAVE

REGISTRO

REGISTRO

000001
000007
000015
000016
000020

03
05
01
02
04

01
02
03
04
05

A1_FILIAL

A1_COD

A1_NOME

000015
000016
000001
000020
000007

FABRICA DE TINTAS E VERINIZES LTDA /SP


TEX MALHAS E CONFECCOES S.A /SP
CLIENTE PADRAO
ARMANDO JOSE FLORES /SC
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 funo para selecionar o ndice.
Alm dos ndices originais, usurios podem incluir seus prprios ndices.
Caso a Microsiga inclua novos ndices, os do usurio sero renumerados.

SA1 ndices do Sistema

Usurio
ndice
novo ndice
do Usurio
do Sistema
ndice do Usurio

1
2
...
7
8
9

A1_TIPO
A1_TIPO

NickName: TIPO
NickName: TIPO

Nos programas: dbOrderNickName(TIPO)


dbSetOrder(8)
X
Portanto, ndices de usurio devem sempre ter um NickName. Deve-se usar a
funo dbOrderNickName(NICKNAME)
ndices do sistema, nunca tero NickName. Usa-se dbSetOrder().

Customizao
Parmetros,

Tabelas, Perguntas
Frmulas - Expresses em AdvPL / User Function
Validaes, Gatilhos, Campos de Arquivos
User Function via menu
Pontos de Entrada
Dicionrio de Dados Ativo
SigaRPM, Crystal, Excel

Customizao

Customizao
Parmetros

Parmetros: arquivo SX6


cESTNEG := GetMV(MV_ESTNEG)
S
100
201
100
200
N
201
200
V
V
F
F
If cESTNEG == S .Or. QtdVenda < B2_Saldo
tratamento normal
Else
tratamento de erro
EndIf

Customizao
Tabelas

Tabelas: arquivo SX5


Tabela 12: Estados do Brasil
Tabela 13: CFOP
Tabela 33: Estado Civil

Customizao
Perguntas

Perguntas: arquivo SX1


Do Cliente:
At Cliente:
Da Data:
At Data:

000010
000050
01/03/06
31/03/06

As respostas tambm so gravadas

Customizao
Insero de Cdigo-Fonte

Exemplo:
Um Pedido de Venda includo
Na emisso da NF, o preo deve ser reajustado em 25%

Preo
100,00
125,00

Programa-fonte

SERVER

MATA460A Emisso NF

Frmulas
Preo
:= SC6->C6_PRCVEN
Preo
:= &Formula * 1.25

RPO
MATA460A

APO
MATA460A

SC6->C6_PRCVEN * 1.25

Execuo do
MATA460A
Preo := &Formula

Preo := SC6->C6_PRCVEN * 1.25

Emisso NF

Customizao
Insero de Cdigo-Fonte

Frmulas: arquivo SM4 - Expresses em AdvPL / Funes Microsiga


Ex: Reajuste de preo entre o Pedido e o Faturamento:
-No Pedido preenchido o cdigo da frmula de reajuste (campo Tipo Reajuste)
-No Programa de emisso da nota fiscal: Preo := &Formula
(Obs: a pergunta Reajuste na mesma NF? precisa estar com SIM)

Frmula 001 - Reajuste fixo:


SC6->C6_PRCVEN * 1.25
Frmula 002 - Reajuste se preo em dlar:
SC6->C6_PRCVEN * RecMoeda(dDataBase,2)

Frmula 003 - Reajuste pelo dlar:


SC6->C6_PRCVEN * (RecMoeda(dDataBase,2)/
If(RecMoeda(SC5->C5_EMISSAO,2) <> 0,
RecMoeda(SC5->C5_EMISSAO,2),1))

Tipos de Processamento

Interpretador

Run Time
Server
Maquina Virtual

FONTE
DBase, Access

Executvel +
Interpretador
Clipper, Visual Objects

PCode
Visual Basic, AdvPl
Abap, Oracle,Java

Executvel

Delphi, C

Compilao

A = A + &B

A=A+B
A=5

MACRO

A=7

965534567654

5
End 3
2
3456

3
7654

Customizao
Validaes

Validaes: Dicionrio de Dados (SX3)


Campo
Campo
Campo
Campo

Cd.Cliente:
Natureza:
Estado:
CNPJ:

ExistChav(SA1)
ExistCpo(SED)
ExistCpo(SX5, 12+M->A1_EST)
CGC(M->A1_CGC)

Customizao
Gatilhos

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


Exemplo: na digitao 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)

Customizao
Campos de Arquivos

Campos: Campos dos Lanamentos Padronizados (SI5)


Dbito: If(SD3->D3_TIPO=MC, 33201+SD3->D3_CC, 11303)

Customizao
User Function
Executa uma srie de comandos, retornando um valor;
Precisa ser compilado;
O resultado um objeto que armazenado no Repositrio.
Ex:
User Function ContaDeb()
Do Case
Case SB1->B1_TIPO == MC
Conta := 11302
Case SB1->B1_TIPO == ME
Conta := 11303
...
EndCase
Return (Conta + SD3->D3_CC)

Lanamento Padronizado (SI5)


Dbito: u_ContaDeb()

Customizao
Ponto de Entrada

So pontos pr-determinados, onde o usurio pode escrever uma nova


rotina em substituio quela existente ou adicionar algum
processamento.
Cada Ponto de Entrada identificado pelo nome de uma Funo.
If ExistBlock(CalcSaldo)
u_CalcSaldo()
EndIf
Para utiliz-lo, deve-se escrever uma funo com este mesmo nome.
User Function CalcSaldo()
...
Return
Os Pontos de Entrada esto descritos no DEM.
Exemplo: pode-se alterar a rotina de clculo do ICMS ou do IPI no
programa de Preparao de Nota Fiscal de Vendas escrevendo um P.E.

Exemplo de Ponto de Entrada

// PONTO DE ENTRADA NA ALTERAO DO CADASTRO DE PRODUTO


#Include RWMake.ch"
User Function MT010ALT()
If AllTrim(SB1->B1_TIPO) == "MO"
// Trata-se
dbSelectArea("SB2")
// Acessa o
dbSetOrder(1)
// e custos
dbSeek(xFilial()+SB1->B1_COD)
If RecLock("SB2", .F.)
// Grava em custo mdio o custo standard,
// mdio de mo-de-obra.
SB2->B2_CM1 := SB1->B1_CUSTD
EndIf
EndIf
Return Nil

de mo-de-obra.
registro de saldos
no SB2.

pois no existe custo

Configurador - SIGACFG
Dicionrio
Menus

de Dados

Exerccios
Crie um parmetro (SX6) para o limite mximo por transao:
Nome da Var.:
Tipo:
Contedo:
Descrio:

MV_VRMAX
N
10000
Valor maximo da transacao

SIGACFG: menu Ambiente / Cadastros / Parmetro

Crie uma tabela (SX5) de tipos de transaes:


Tabela ZZ

D
S
E
J
R

Depsito
Saque
Encargos
Juros
Resgates

SIGACFG: menu Ambiente / Cadastros / Tabelas


(tem que preencher os 3 idiomas)

Exerccio
Crie uma Frmula (SM4) para reajustar o preo dos produtos da Fbrica de
Chaveiros:
Cdigo:
Descrio:
Frmula:

001
REAJUSTE DE PREO
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:
No
SIGACFG: menu Base de Dados / Dicionario / Gatilhos

Exerccio
Insira a validao no arquivo SI2, campo I2_VALOR:

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


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

Exerccio

Crie um Ponto de Entrada para modificar o clculo do Saldo


aps um Saque, considerando apenas 60% do seu valor.

Exerccio
Lanamento Contbil Automtico
Mostrar o lanamento 666 - Requisio

Case
Sistema de Contas Correntes

Case
Sistema de Contas Correntes

Contas
Transaes

Consultas
Relatrios
Excel
WorkFlow
TXT

/ XML
WebServices
AdvPL ASP

Case
Sistema de Contas Correntes

Tabelas do sistema

CONTAS
Nome
E-Mail
E-Mail1
Saldo

TRANSAES
Tem
Refere-se

Nome
Nmero da Transao
Item da Transao
Tipo (Depsito ou Saque)
Data
Histrico
Saldo Atual (virtual)
Valor
Aprovao

Exerccio Criao de Arquivos (SX2)


SIGACFG: menu Base de Dados / Dicionario / Arquivos

Prefixo:
Path:
Nome:
Descrio:
Desc.Esp.:
Desc.Ingls:
Modo Acesso:

SZ1
\DATA\
SZ1990
CONTAS
CONTAS
CONTAS
COMPARTILHADO

Prefixo:
Path:
Nome:
Descrio:
Desc.Esp.:
Desc.Ingls:
Modo Acesso:

SZ2
\DATA\
SZ2990
TRANSAES
TRANSAES
TRANSAES
EXCLUSIVO

Modo de Acesso:
Compartilhado
Exclusivo

Filial = branco
Filial = nmero da Filial (var. pblica cFilAnt)

Funo xFilial(Alias)

Criao de Campos (SX3)


Criao dos campos dos arquivos:
SZ1 Cadastro de Contas
SZ2 Arquivo de Transaes
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
Informaes
Opes
Validaes
Uso
Mdulo

Criao de Campos (SX3)

Caracter, Numrico, Lgico, Data, Memo

Picture varivel, que pode ser retornada por uma funo


Real, Virtual
Alterar, Visualizar

Criao de Campos (SX3)

Nome do cliente

Criao de Campos (SX3)

D=Deposito;S=Saque

ComboBox. No campo ser gravada a


letra, no exemplo, D ou S.

dDataBase

GetSXENum(SZ2, Z2_NUMERO)

Cadastro de Contas (SZ1)

Campo Z2_Nome

F3

Criao de Campos (SX3)

Exemplo: no Depto. Pessoal


0a9
Define a permisso de acesso ao campo.
O Usurio s ter acesso a campos de
Usurios:
Campos:
nvel igual ou menor que o seu nvel.
Nvel
do
Nvel
dos
9
9
Exemplo:
Usurio
com 5
nvel 5 s ter
Usurio
Campos
Gerente

nvel
9
Nome
do Func.
nvel
8
8
acesso a campos com nvel
7
7
6
igual ou menor que 5.
6
Digitador

nvel
5
Endereo
nvel 4
5
5
4
4
3
3
Salrio
nvel 9
2
2
1
1
0 0

Criao de Campos (SX3)

Criao de Campos (SX3)

Exerccio
Cadastrar os campos do SZ1
Campo
Campo

Tipo

Tam.

Z1_NOME

Car

20

Z1_EMAIL

Car

Z1_EMAIL1
Z1_SALDO

Dec.

Inform.

Formato

Contexto

Propr.

Real

Alt.

Nome

40

Real

Alt.

EMail

Car

40

Real

Alt.

EMail1

Num

12

Real

Visual

@!

@E 999,999,999.99

Ttulo

Uso
Obrig

Usa

Brw

Saldo

Cadastrar Opes e Validaes para estes campos


Opes
Campo

Validaes
Lista de Opes

Inic.Padro

Z1_NOME

ExistChav(SZ1, M->Z1_NOME, 1)

Z2_NOME

ExistCpo(SZ1, M->Z2_NOME, 1)
GetSXENum(SZ2, Z2_NUMERO)

Z2_NUMERO

ExistChav("SZ2", M->Z2_NUMERO+
M->Z2_ITEM, 1)

Z2_ITEM

dDataBase

Z2_DATA
Z2_TIPO

D=Deposito;S=Saque

Exerccio
Campos do SZ2 (j esto cadastrados)
Campo

Campo

Tipo

Tam.

Z2_NOME

Car

20

Z2_NUMERO

Car

Z2_ITEM

Car

Z2_DATA

Data

Z2_TIPO

Dec.

Formato

Inform.

Contexto

Propr.

Real

Alt.

Real

Visual

Real

Alt.

Item

Real

Alt.

Data

Car

Real

Alt.

Tipo

Z2_HIST

Car

20

Real

Alt.

Historico

Z2_VALOR

Num

12

@E 999,999,999.99

Real

Alt.

Valor

Z2_SLDATU

Num

12

@E 999,999,999.99

Virtual

Visual

Saldo

Z2_APROV

Car

Real

Visual

Aprovado

@!

99

Ttulo
Nome
Numero

Uso

Obrig

Usa

Brw

Exerccio
Criao dos ndices

1
3

Chave

Nickname

SZ1

Z1_Filial + Z1_Nome

NOME

SZ2

Z2_Filial + Z2_Numero + Z2_Item


Z2_Filial + Z2_Nome + Z2_Numero + Z2_Item

NR_IT
NOME_NR_IT

Exerccios
Crie a Consulta Padro que mostre o arquivo SZ1 e insira-a no campo Z2_Nome
SIGACFG: menu Base de Dados / Dicionario / Base de Dados

Faa o Gatilho para atualizar o Z2_SldAtu (virtual) ao digitar-se Z2_Valor:


Campo:
Cnt. Dominio:
Tipo:
Regra:
Posiciona:
Alias:
Ordem:
Chave:

Z2_VALOR
Z2_SLDATU
Primario
IF(M->Z2_TIPO==D, SZ1->Z1_SALDO + M->Z2_VALOR,
SZ1->Z1_SALDO - M->Z2_VALOR)
Sim
SZ1
1
xFilial(SZ1) + M->Z2_NOME

SIGACFG: menu Base de Dados / Dicionario / Gatilhos

Exerccio
Crie em ERP o menu do Sistema de Contas Correntes
SIGACFG: menu Ambiente / Cadastro / Menus

Contas
Correntes

Atualizaes

Consultas

Relatrios

Programa:

Programa:

Con001

Rel001

Contas
Transaes

Programa:

Cad

Modelo 1

Modelo 2

Modelo 3

Programa:

Programa:

Programa:

TranM1

TranM2

TranM3

Aula 2
Programao
Comandos e funes
Operadores
IDE
Variveis de memria
Array
Funes

Programao

Exerccios de Lgica
Aqurio

3 cestos com bolas pretas e brancas e etiquetas erradas

Preta
Branca

Preta
Preta

Branca
Branca

3 cestos: 1 hiptese
Preta
Branca

Preta
Preta

Branca
Branca

3 cestos: 2 hiptese
Preta
Branca

Preta
Preta

Branca
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 relgio


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 contrrio 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

Volta
Vai

o1

o 5 e 10

13

Volta
Vai

o2

15

o1e2

17

Programa
Conjunto de Instrues: Comandos e Funes
Instrues bsicas de uma Linguagem:
Aritmticas:
Somar / Subtrair / Multiplicar / Dividir
Entrada e Saida:
Ler / Gravar / Tela / Impresso / Teclado / Atribuio
Lgicas:
If...Else...EndIf
For...Next
While...End
Do Case...EndCase

Inicio
Armar
Despertador
Desligar
Despertador
Repetir
3
vezes

Bocejar

Sim

A Esposa
quer $$ ?
No
Casado
h mais de
5 anos ?

Dar-lhe
R$ 100,00

No

Sacudir a
Esposa
Sair da
Cama

Acender
a luz

Resmungar

Beijar a
esposa
Casado
h mais de
1 ano ?

Sim

No

Sim

Beijar a
esposa

Est Escuro ?
No

Voltar para
a cama
Possvel
Fim
da rotina

Ir at o
carro

Sim
Est Frio ?
No

Ir ao
Banheiro
Tomar
Caf
A

Voltar
para peg-las

No

Est
Com as
Chaves ?
Sim

Dirigir-se
ao escritrio
Fim

Sim

Operadores
Matemticos

** 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
Lgicos

.And.

.Or.

.Not. ou !

If cCredito == OK .And. nQtde < nSaldo


Liberar venda
EndIf

cCredito == OK

.And.

nQtde < nSaldo

Operadores
Lgicos

.And.

.Or.

.Not. ou !

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


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

cEstNeg == S

.Or.

nQtdeVenda < nSaldo

Operadores
Lgicos

.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 == S

.Or.

nQtdVenda < nSaldo )

Operadores
Lgicos

.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 == S

.Or.

nQtdVenda < nSaldo )

Operadores
Lgicos

.And.

If a <> b
...
EndIf

.Or.

.Not. ou !

If .Not. a==b
...
EndIf

If !a==b
...
EndIf

Operadores
Atribuio

:=

+=

-=

*=

/=

^= ou **=

%=

x := 10

o mesmo que:

x := x + 20
x += 20

o mesmo que:

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


nValor += (nValor * 18 / 100)

Operadores
Incremento / Decremento

i++

++i

i++

i := 1
MsgAlert(i++)

i := 1
MsgAlert(++i)

i--

--i

equivale a

i := i + 1

equivale a

i := 1
MsgAlert(i)
i := i + 1

equivale a

i := 1
i := i + 1
MsgAlert(i)

mostra 1

mostra 2

Operadores
Strings

x + y

x - y

x $ y

Concatenao
cNome
:= Joo
cSobreNome
:= Silva
cNomeCompleto := cNome + cSobreNome
A - B

AB

Pertence
Silva $ cNomeCompleto
SILVA $ cNomeCompleto

.T.
.F.

JooSilva

Operadores
Especiais

( )
{ }
[ ]
&
||
->
@
;

Funcao()
Array, bloco de cdigo
Array
Macro
Bloco de cdigo
Alias de arquivo e var. de memria
SA1->A1_Nome
M->A1_Nome
Parmetros por referncia
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.
2.
3.
4.
5.
6.
7.

8.

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


Criar um novo projeto
Criar um novo arquivo
User Function Se()
Digitar o primeiro programa
Salv-lo na pasta \erp811\My Projects
Local nX := 10
Inseri-lo no projeto
Compilar:
If nX > 5
Usurio: Administrador
MsgAlert("Maior")
Senha: admin
EndIf
Executar
Return

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

Organizao dos Programas-Fonte

Projeto (.PRJ)
Programa (.PRW)

Funo
Funo
Funo

Programa (.PRW)

Funo
Funo
Funo

Programa (.PRW)

Funo
Funo
Funo

Variveis de Memria
Armazenamento temporrio de dados

Cadastro
Nome:

Jos

Memria
Nome
Jos
Valor
1000

A1_NOME
Jos
D2_VALOR
1000

ICMS = Valor * 18 / 100

CPU

Tipos de Variveis de Memria


Notao Hngara:
Caractere

Casa

cTexto

Numricas

1234.56

nValor

Data

CtoD(25/10/05)

dData

Lgicas

.T.

lOk

.F.

n X := 1

nX
X numrico
numrico

c X := Jos

X agora
cX caracter
caracter

n X := n X + 1

Operao
ERRO
matemtica
!

Tipos de Variveis de Memria


Notao Hngara:

Caractere

Casa

cTexto

Numricas

1234.56

nValor

Data

CtoD(25/10/05)

dData

Lgicas

.T.

lOk

.F.

Funo ValType(NomeVar) tipo da varivel: C, N, D, L, A, U


Exemplo:
cNome := Jose
nValor := 1000
x := Nil

Ver Operadores.PRW
Exercicio

ValType(cNome) C
ValType(nValor) N
ValType(x)
U

Array, Vetor ou Matriz


Variveis do tipo Caracter: uma para cada nome
cNome1
cNome2
cNome3
cNome4

:=
:=
:=
:=

Joao
Alberto
Pedro
Maria

Memria
cNome1
Joao

cNome2

cNome3

Alberto

cNome4

Pedro

aNomes
Joao

Alberto

Pedro

Maria

Variveis do tipo Array: todos os nomes numa nica varivel


aNomes := {Joao, Alberto, Pedro, Maria}
aNomes[1]
aNomes[2]
aNomes[3]
aNomes[4]

Maria

Array, Vetor ou Matriz


Variveis
Armrio 1

Armrio 2

Armrio 3

Armrio 4

Joao

Alberto

Pedro

Maria

Array
Armrio
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
,
{Alberto,
{Pedro ,
{Maria ,

25,
18,
40,
33,

.T.},;
.F.},;
.T.},;
.F.}}

Array, Vetor ou Matriz


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

aMatriz := {{Joao
,
{Alberto,
{Pedro ,
{Maria ,

Gaveta 1

25,
18,
40,
33,

.T.},;
.F.},;
.T.},;
.F.}}

Gaveta 2

Gaveta 3

Gaveta 4

Joao

25

Alberto

18

Pedro

40

Gaveta 1

Gaveta 2

1
Maria

Gaveta 3

33

Gaveta 4

Joao

Alberto

Pedro

Maria

25

18

40

33

Array, Vetor ou Matriz


Adicionar elementos num array vazio
aNomes := {Joao,
{}
{Joao}
Pedro, Maria}
Alberto} Pedro}
Alberto,
AAdd(aNomes, Joao)
AAdd(aNomes, Alberto)

AAdd(aNomes, Pedro)
AAdd(aNomes, Maria)

AAdd(aMatriz,
AAdd(aMatriz,
AAdd(aMatriz,
AAdd(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.}}

Array, Vetor ou Matriz


Funo Array(n): retorna um array com n elementos nulos
aArray := Array(5)
aArray

{Nil, Nil, Nil, Nil, Nil}

Atribuio de valor aos elementos do array


aArray[1]
aArray[2]
aArray[3]
aArray[4]
aArray[5]
aArray

Ver 050_Array.prw
Exercicio: fazer o sort de um array

:=
:=
:=
:=
:=

A
B
C
D
E

{A, B, C, D, E}

Funes
Conjunto de Comandos

Programa.PRW
User Function Teste()
Comandos
Comandos
Comandos
Comandos
Return

Execuo (chamada) da funo: u_Teste()

Funes
Rotinas repetitivas
User Function CadCli()

User Function CadFor()

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

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

Return

Return
Function CGC(cCGC)

Return lOK

.T. ou .F.

.T. ou .F.

If cCGC OK
lOK := .T.
Else
lOK := .F.
EndIf

Funes
Programao Estruturada

User Function Relato()


u_PreparaImpr()
u_LeDados()
u_Imprime()
Return
User Function PreparaImpr()
...
Return

User Function LeDados()


...
Return
User Function Imprime()
...
Return

Funes
Passagem de parmetros
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

Escpo das Varivies


Local
Visvel somente na funo em que foi criada

Private
Visvel na funo em que foi criada e nas funes seguintes

Public
Visvel em todas as funes, a partir do momento em que foi criada

Static
Visvel somente no programa (PRW)

Escpo das Varivies


User Function Func1()
Local cVar := "Func1"

LOCAL

Contedo

PRIVATE

Contedo

PUBLIC

Contedo

u_Func2()
Return
User Function Func2()
Local cVar := "Func2"
Local cVar1 := "Func2"
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"
u_Func3()
Return
User Function Func3()
cVar2 := ABC"
Return

Escpo das Varivies


User Function Func1()
Local cVar := "Func1"
u_Func2()

LOCAL

Contedo

cVar

Func1

PRIVATE

Contedo

PUBLIC

Contedo

Return
User Function Func2()
Local cVar := "Func2"
Local cVar1 := "Func2"
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"
u_Func3()
Return
User Function Func3()
cVar2 := ABC"
Return

Escpo das Varivies


User Function Func1()
Local cVar := "Func1"
u_Func2()
Return

LOCAL

Contedo

cVar
cVar1

Func2
Func2

PRIVATE

Contedo

cVar2

Private Func2

PUBLIC

Contedo

cVar3

Public Func2

User Function Func2()


Local cVar := "Func2"
Local cVar1 := "Func2"
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"
u_Func3()
Return
User Function Func3()
cVar2 := ABC"
Return

Escpo das Varivies


User Function Func1()
Local cVar := "Func1"

LOCAL

Contedo

PRIVATE

Contedo

cVar2

ABC

PUBLIC

Contedo

cVar3

Public Func2

u_Func2()
Return
User Function Func2()
Local cVar := "Func2"
Local cVar1 := "Func2"
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"
u_Func3()
Return
User Function Func3()
cVar2 := ABC"
Return

Escpo das Varivies


User Function Func1()
Local cVar := "Func1"
u_Func2()
Return

LOCAL

Contedo

cVar
cVar1

Func2
Func2

PRIVATE

Contedo

cVar2

ABC

PUBLIC

Contedo

cVar3

Public Func2

User Function Func2()


Local cVar := "Func2"
Local cVar1 := "Func2"
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"
u_Func3()
Return
User Function Func3()
cVar2 := ABC"
Return

Escpo das Varivies


User Function Func1()
Local cVar := "Func1"
u_Func2()

LOCAL

Contedo

cVar

Func1

PRIVATE

Contedo

PUBLIC

Contedo

cVar3

Public Func2

Return
User Function Func2()

Local cVar := "Func2"


Local cVar1 := "Func2"
Private cVar2 := "Private Func2"
Public cVar3 := "Public Func2"
u_Func3()
Return
User Function Func3()
cVar2 := ABC"
Return
Ver 052_EscopoVar.prw

Passagem de Parmetros
Por Valor
User Function Venda()
Local cRegiao := NE
Local nValor := 1000
nImposto := ICMS(cRegiao, nValor)
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

So criadas
variveis
LOCAIS

Passagem de Parmetros
Por Valor
User Function Param1()
Local x := 1
Local y := 2
u_Param2(x, y)
MsgAlert(x+y)
Return
User Function Param2(x, y)

x := 50
y := 100
Return
Ver 060_Param.prw

x=1
y=2

Passagem de Parmetros
Por Valor
User Function Param1()
Local x := 1
Local y := 2
u_Param2(x, y)
MsgAlert(x+y)

x=1
y=2

Return
User Function Param2(x, y)

x := 50
y := 100
Return
Ver 060_Param.prw

x = 50
y = 100

Passagem de Parmetros
Por Valor
User Function Param1()
Local x := 1
Local y := 2
u_Param2(x, y)
MsgAlert(x+y)
Return
User Function Param2(x, y)

x := 50
y := 100
Return
Ver 060_Param.prw

x=1
y=2

Passagem de Parmetros
Por Referncia
User Function Param1()
Local x := 1
Local y := 2
u_Param2(@x, y)
MsgAlert(x+y)
Return
User Function Param2(x, y)

x := 50
y := 100
Return
Ver 060_Param.prw

x=1
y=2

Passagem de Parmetros
Por Referncia
User Function Param1()
Local x := 1
Local y := 2
u_Param2(@x, y)
MsgAlert(x+y)

x = 50
y=2

Return
User Function Param2(x, y)

x := 50
y := 100
Return
Ver 060_Param.prw

y = 100

Passagem de Parmetros
Por Referncia
User Function Param1()
Local x := 1
Local y := 2
u_Param2(@x, y)
MsgAlert(x+y)
Return
User Function Param2(x, y)

x := 50
y := 100
Return
Ver 060_Param.prw

x = 50
y=2

Funes de Caracteres, Nmeros e Datas


Manipulao de textos (strings)
Converso de nmeros
Funes de data e hora
Converso de datas

Ver 053_Tratamentos.PRW

Aula 3
Macro
Bloco de Cdigo
UDC
Semforos
Arquivos e ndices

Macro-Substituio
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-Substituio
User Function Reajuste()
Local cFormula
dbSelectArea("SM4")
dbSetOrder(1)
dbSeek(xFilial("SM4") + "001")
cFormula := SB1->B1_Prv1
SM4->M4_Formula
* 1.25

Arquivo SM4 - Frmulas


M4_FILIAL: 01
M4_CODIGO: 001
M4_FORMULA: SB1->B1_Prv1 * 1.25

dbSelectArea("SB1")
dbGoTop()
While !SB1->(Eof())
RecLock("SB1")
SB1->B1_Prv1 := &(cFormula)
SB1->B1_Prv1 * *
1.25
&(SB1->B1_Prv1
1.25)
MSUnlock()
SB1->(dbSkip())
End
MsgInfo("Terminou!")
Return
Ver Reajuste.PRW

Macro-Substituio
Aplicao de Macros

Validaes

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


Gatilhos

M->D1_QUANT * M->D1_VUNIT
Frmulas

SB1->B1_Prv1 * 1.25
Lanamentos

Contbeis Automticos

If(SD3->D3_TIPO=MC, 33201+SD3->D3_CC, 11303)

Bloco de Cdigo

bBloco := {|| 2 * 10}

nResult := EVal(bBloco)

nResult = 20

bBloco := {|x| x * 2}
nResult := EVal(bBloco, 5)

Ver 051_Bloco.prw

nResult = 10

Bloco de Cdigo

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

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

DBEval()

Ver AEval em 050_Array.prw

Bloco de Cdigo
Ordenao de array

aMatriz := { {Joao

,15} , {Pedro
{Alberto,20}
,10}, {Maria
,10} ,{Pedro
{Alberto,20}

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

.F.
.T.

Ver 050_Array.prw

,30} }

Bloco de Cdigo
Ordenao de array

{Joao
aMatriz := { {Pedro

,15} , {Joao
{Pedro
,10}

,10} ,{Alberto,20}, {Maria


,15}

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

.T.
.F.

Ver 050_Array.prw

,30} }

UDC User Defined Command


Legibilidade e Manutenibilidade do Fonte

Instrues para o Compilador


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

Ver 080_UDC.prw

Semforos
Controle de numerao sequencial

GetSXENum(Alias)
ConfirmSX8()
RollBackSX8()
MayIUseCode(Alias)
APCFG110

Obtem o prximo nmero

Confirma o nmero
Reutiliza o nmero
Confirma se o nmero est mesmo disponvel
Manuteno do SXE/SXF ou Hardlock

Arquivos MS: s alias


GetSXENum(SC5)
Arquivos de usurio: alias e campo GetSXENum(SZ2, Z2_NUMERO)

Exemplo:

Exemplos em 120_TranM2

001
002
003
004
005

003
004
006
007
008

Arquivos

Famlias de Arquivos de Dados

SA
SB
SC
SD
SE
SF
SG
SH
SI
SJ
SM
SN

Cadastros
Estoques
Previses de E/S
Mov. De Estoque
Financeiro
Fiscal
Estruturas
Carga de Mquina
Contbil
Estatsticas
Miscelneas
Ativo Fixo

SO - Assist. Tcnica
SP - Ponto Eletrnico
SQ - Recr. e Seleo
SR - Folha de Pagto
ST - Manut. Industrial
SU - Telemarketing
SV - Concessionrias
SW e SY
- Export./Import.
Q? - Qualidade (Celerina)
R? - Recursos Humanos
SZ,QZ,RZ - Livres
P? - Projetos Especiais

M.E.R. Modelo de Entidades e Relacionamento

Principais Arquivos de Dados


Prefixo
SA1
SA2
SA3
SB1
SB2
SB5
SC1
SC5
SC6
SC7
SD1
SD2
SD3
SE1
SE2
SF1
SF2
SI1
SI2

Descrio
Cadastro de Clientes
Cadastro de Fornecedores
Cadastro de Vendedores
Cadastro de Produtos
Saldos dos Produtos por Almoxarifado
Dados Complementares de Produtos
Solicitaes de Compras
Cabealho dos Pedidos de Venda
Itens dos Pedidos de Venda
Pedidos de Compras
Itens das Notas Fiscais de Entrada
Itens das Notas Fiscais de Sada
Movimentaes Internas de Produtos
Ttulos a Receber
Ttulos a Pagar
Cabealho das Notas Fiscais de Entrada
Cabealho das Notas Fiscais de Sada
Plano de Contas
Lanamentos Contbeis

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
A1_COD
A1_NOME
A1_END

SA2: A2_FILIAL
A2_COD
A2_NOME
A2_END

SB1: B1_FILIAL
B1_COD
B1_DESC
B1_TIPO

QA1: QA1_FILIAL
QA1_COD
QA1_DESC

Arquivos de Dados
Modo de Acesso

Compartilhado registros compartilhados entre as filiais


Campo Filial: em branco
Exclusivo

o registro exclusivo da filial

Campo Filial: cdigo da Filial (varivel cFilAnt)

Ex: SA1 - Compartilhado


A1_FILIAL

A1_COD

A1_NOME

000015
000016
000001
000020
000007

FABRICA DE TINTAS E VERINIZES LTDA /SP


TEX MALHAS E CONFECCOES S.A /SP
CLIENTE PADRAO
ARMANDO JOSE FLORES /SC
COMERCIO SOM DO MUNDO /SP

xFilial(SA1)

Ex: SC5 - Exclusivo


C5_FILIAL

C5_NUM

C5_EMISSAO

C5_CLIENTE

C5_PROD

C5_VALOR

01
01
01

000001
000005
000007

01/01/04
01/01/04
20/01/04

000002
000023
000016

11.11014
13.13000
15.15140

15.000,00
5.600,00
5.600,00

02
02
02

000001
000005
000007

01/01/04
01/01/04
20/01/04

000002
000023
000016

11.11014
13.13000
15.15140

15.000,00
5.600,00
5.600,00

03
03
03

000001
000005
000007

01/01/04
01/01/04
20/01/04

000002
000023
000016

11.11014
13.13000
15.15140

15.000,00
5.600,00
5.600,00

xFilial(SC5) cFilAnt

Arquivos e ndices

ndice: CDIGO
CODIGO

REGISTRO

000001
000002
000007
000008
000015
000016
000019
000020
000023
000024
000026
000027
000028
000030
000033

03
09
05
07
01
02
13
04
08
06
10
11
12
15
14

Arquivo
RECNO

A1_COD

A1_NOME

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15

000015
000016
000001
000020
000007
000024
000008
000023
000002
000026
000027
000028
000019
000033
000030

FABRICA DE TINTAS E VERINIZES LTDA /SP


TEX MALHAS E CONFECCOES S.A /SP
CLIENTE PADRAO
ARMANDO JOSE FLORES /SC
COMERCIO SOM DO MUNDO /SP
JOAO DA SILVA /SP
FLORICULTURA FULO DE MARAVILHA /SP
PREFEITURA MUNICIPAL DE SAO PAULO /SP
ECOSSISTEMA DIGITAL S/A
ACTIONVEA IMP. EXP.
STARMEAL LEAK S.A.
REIZA KERN IMP. EXP.
JOAO DE ALMEIDA SILVA /RS
DESPACHANTE
IMPORTADOR EUA

Arquivos e ndices

ndice: NOME
NOME

REGISTRO

ACTIONVEA..
ARMANDO J..
CLIENTE P..
COMERCIO ..
DESPACHAN..
ECOSSISTE..
FABRICA D..
FLORICULT..
IMPORTADO..
JOAO DA S..
JOAO DE A..
PREFEITUR..
REIZA KER..
STARMEAL ..
TEX MALHA..

10
04
03
05
14
09
01
07
15
06
13
08
12
11
02

Arquivo
RECNO

A1_COD

A1_NOME

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15

000015
000016
000001
000020
000007
000024
000008
000023
000002
000026
000027
000028
000019
000033
000030

FABRICA DE TINTAS E VERINIZES LTDA /SP


TEX MALHAS E CONFECCOES S.A /SP
CLIENTE PADRAO
ARMANDO JOSE FLORES /SC
COMERCIO SOM DO MUNDO /SP
JOAO DA SILVA /SP
FLORICULTURA FULO DE MARAVILHA /SP
PREFEITURA MUNICIPAL DE SAO PAULO /SP
ECOSSISTEMA DIGITAL S/A
ACTIONVEA IMP. EXP.
STARMEAL LEAK S.A.
REIZA KERN IMP. EXP.
JOAO DE ALMEIDA SILVA /RS
DESPACHANTE
IMPORTADOR EUA

Arquivos e ndices
ndices

Arquivo: SA1990

Alias: SA1

Cadastro de Clientes

CODIGO

REG

RECNO

A1_COD

A1_NOME

000001
000002
000007
000008
000015
000016
000020
000023
000024
000026

3
9
5
7
1
2
4
8
6
10

1
2
3
4
5
6
7
8
9
10

000015
000016
000001
000020
000007
000024
000008
000023
000002
000026

FABRICA DE TINTAS E VERINIZES LTDA /SP


TEX MALHAS E CONFECCOES S.A /SP
CLIENTE PADRAO
ARMANDO JOSE FLORES /SC
COMERCIO SOM DO MUNDO /SP
JOAO DA SILVA /SP
FLORICULTURA FULO DE MARAVILHA /SP
PREFEITURA MUNICIPAL DE SAO PAULO /SP
ECOSSISTEMA DIGITAL S/A
ACTIONVEA IMP. EXP.

ndices

Arquivo: SB1990

Alias: SB1

Cadastro de Produtos

CODIGO

REG

RECNO

B1_COD

B1_DESC

B1_TIPO

B1_UM

11.11000
11.11003
11.11014
12.12006
13.13000
13.13001
15.15140
33.03323

2
5
1
3
8
4
6
7

1
2
3
4
5
6
7
8

11.11014
11.11000
12.12006
13.13001
11.11003
15.15140
33.03323
13.13000

PROD. DE REVENDA
PROD. ACABADO
MAT. PRIMA 1 QUALITY
CAIXA GRANDE PA
MAT. PRIMA
ALCOOL ETILICO
LUVA
CAIXA PEQUENA PA

PA
PA
MP
PA
MP
MC
MP
PA

UN
UN
UN
CX
UN
L
UN
CX

Arquivo: SC5990

Posicionamento de registro
dbSkip()
dbSelectArea(SB1)
dbSelectArea(SA1)
dbSkip()
dbSetOrder(1)
dbSkip()
dbSkip()
dbSeek(11.11014)
dbSeek(000002)

dbSelectArea(SA1)

Alias: SC5

dbSelectArea(SB1)

Pedidos de Venda

RECNO

C5_NUM

C5_EMISSAO

C5_CLIENTE

C5_PROD

C5_VALOR

1
2
3
4
5

000001
000005
000007
000008
000009

01/01/04
01/01/04
20/01/04
27/01/04
01/01/04

000002
000023
000016
000024
000008

11.11014
13.13000
15.15140
13.13001
11.11000

15.000,00
5.600,00
5.600,00
1.000,00
3.450,00

dbSelectArea(SC5)

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

01000001
01000005
01000007
01000008
01000009

1
2
3
4
5

1
2
3
4
5

01
01
01
01
01

000001
000005
000007
000008
000009

01/01/04
01/01/04
20/01/04
27/01/04
01/01/04

000002
000023
000016
000024
000008

11.11014
13.13000
15.15140
13.13001
11.11000

15.000,00
5.600,00
5.600,00
1.000,00
3.450,00

02000001
02000005
02000007
02000008
02000009

6
7
8
9
10

6
7
8
9
10

02
02
02
02
02

000001
000005
000007
000008
000009

01/01/04
01/01/04
20/01/04
27/01/04
01/01/04

000002
000023
000016
000024
000008

11.11014
13.13000
15.15140
13.13001
11.11000

15.000,00
5.600,00
5.600,00
1.000,00
3.450,00

03000001
03000005
03000007
03000008
03000009

11
12
13
14
15

11
12
13
14
15

03
03
03
03
03

000001
000005
000007
000008
000009

01/01/04
01/01/04
20/01/04
27/01/04
01/01/04

000002
000023
000016
000024
000008

11.11014
13.13000
15.15140
13.13001
11.11000

15.000,00
5.600,00
5.600,00
1.000,00
3.450,00

Posicionamento de Arquivos
Leitura sequencial

dbGoTop()

Posiciona no topo do arquivo

Leitura sequencial, registro a registro

While !EOF()
dbSkip()
End

FILIAL+NUMERO+ITEM

REG

RECNO

Z2_FILIAL

Z2_NUMERO

Z2_ITEM

01000101
01000102
01000103
01000201
01000202

1
2
3
4
5

1
2
3
4
5

01
01
01
01
01

0001
0001
0001
0002
0002

01
02
03
01
02

01000301
01000302
01000303

6
7
8

6
7
8

01
01
01

0003
0003
0003

01
02
03

01000401
01000402

9
10

9
10

01
01

0004
0004

01
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
01000102
01000103
01000201
01000202

1
2
3
4
5

1
2
3
4
5

01
01
01
01
01

0001
0001
0001
0002
0002

01
02
03
01
02

01000301
01000302
01000303

6
7
8

6
7
8

01
01
01

0003
0003
0003

01
02
03

01000401
01000402

9
10

9
10

01
01

0004
0004

01
02

Sobre arquivos
Nmero mximo de arquivos abertos: 512 (por thread);
A navegao nos registros em ordem do ndice selecionado - dbSetOrder(n). Se for selecionado
dbSetOrder(0), a navegao ser pela ordem fsica dos registros (Recno);
No SIX, os ndices so numerados de 1 a 9 e A, B,... (campo ORDEM). No dbSetOrder(): 1...9, 10, 11...;
dbSkip() avana 1 registro;
dbSkip(n) ou dbSkip(-n) avana ou retrocede n registros;
dbSelectArea(cAlias) seleciona o arquivo. Caso ainda no esteja aberto, abre-o neste momento.
A referncia a um campo de arquivo com o seu Alias ( ex.: MsgAlert(SA1->A1_Nome) ), tambm abre o
arquivo, caso no esteja aberto, mesmo sem um dbSelectArea() anterior.
Na abertura do arquivo, o primeiro ndice selecionado. O ponteiro de registro posicionado no primeiro
registro fsico (no pelo ndice). A funo dbGoTop(), posiciona no primeiro registro do ndice selecionado;
No Protheus MDI, os arquivos so abertos dentro da thread e fechados no seu encerramento. Na chamada
mesma rotina, mesmo em outra thread, concomitante ou no, os arquivos so 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 funo dbCloseArea() fecha o arquivo.
No MDI: a abertura e o posicionamento de um mesmo arquivo em threads diferentes so independentes,
ou seja, podem ser selecionados ndices diferentes e o ponteiro de registros podem ser posicionados em
registros diferentes tambm. O bloqueio de um mesmo registro comum, ou seja, se o registro for
bloqueado por um dos threads, o outro no poder acess-lo para alterao ou excluso.

Aula 4
AxCadastro
MBrowse
Modelo2
Modelo3

Funes de
Tratamento de
Arquivos
AxCadastro,MBrowse,Modelo2,Modelo3

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 variveis PRIVATE:

cCadastro Ttulo da janela.


aRotina

array onde devem ser incluidos os botes (no mximo, 10).


Esses botes podem ser associados a qualquer funo,
inclusive AxInclui(), AxAltera(), etc.

Ver 110_TranM1.prw

Sobre variveis
Nome := Joo

Referncia
a uma
varivel

atribui
o de
valor?

Atribui o
valor
varivel
Joo Var. Nome

Existe
um
arquivo
aberto ?

Grava o
valor no
campo
Joo Campo Nome

Cria como privada

Erro:
varivel
no existe

N
Para no confundir variveis de memria com
campos de arquivos, usa-se o ALIAS:

Nome
Joo

Existe
campo
com
este
nome ?

Cria a
varivel
Nome := Joo

Arquivo
Codigo

Varive
l existe
?

M->Z1_Nome
SZ1->Z1_Nome

N
Arquivo
Codigo

Descricao

varivel de memria
campo de arquivo

Sobre variveis

JOSE
aprovador@tecnico.com.br

Para cada campo criada uma varivel de memria com o mesmo nome,
onde os dados digitados ficam inicialmente armazenados, antes de ser
efetivamente gravados no arquivo:
M->Z1_NOME
M->Z1_EMAIL
M->Z1_EMAIL1
M->Z1_SALDO

JOSE
aprovador@tecnico.com.br

Estas variveis so usadas em Validaes, Gatilhos, etc.


ExistChav(SZ1, M->Z1_NOME, 1)

Funes de tratamento de arquivos


Ver FuncMod2
Ver MarkBrow (exemplo do Baile)

Enchoice

Modelo 2

Nmero
Nome

GetDados

Item

Data

Tipo

Histrico

Valor

Variveis
de memria

aHeader

aCols

GetDados

Enchoice

Modelo 2

Nmero
Nome

1
2
3
4
5
6
7
8
9
10

Variveis
de memria

Data

1
Item
Z2_ITEM

2
Tipo
Z2_TIPO

3
Histrico
Z2_HIST

2
0

1
0

20
0

Valor
Z2_VALOR
@E 999,999,999.99
12
2

C
SZ2
R

C
SZ2
R

C
SZ2
R

N
SZ2
R

01

Deposito

02

03
1

4
Titulo
Campo
Picture
Tamanho
Decimal
Valid.
Usado
Tipo
Arquivo
Contexto

10.000,00

.F.

Saque

300,00

.F.

Saque

2.500,00

.F.

aHeader

aCols

Modelo 2

Array aRotina

lRet
mBrowse()
.T.
Monta os parametros:
1.
2.
3.
4.

Variveis de memria
aHeader
aCols
Enchoice

Incluso

nOpc
4

lRet := Modelo2()

Ver 120_TranM2.prw

Alterao

Excluso

Modelo 2
Criao do aCols para Incluso

Modelo 2 Criao do aCols para Incluso


Adiciona uma linha no aCols

1
2
3
4
5
6
7
8
9
10
1

1
Item
Z2_ITEM

2
Tipo
Z2_TIPO

3
Histrico
Z2_HIST

2
0

1
0

20
0

Valor
Z2_VALOR
@E 999,999,999.99
12
2

C
SZ2
R

C
SZ2
R

C
SZ2
R

N
SZ2
R

Nil

Nil

Nil
Array(?)
Array(5)

4
Titulo
Campo
Picture
Tamanho
Decimal
Valid.
Usado
Tipo
Arquivo
Contexto

Nil

Nil

aHeader

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))

Modelo 2 Criao do aCols para Incluso


Preenche o aCols de acordo com o Inicializador-Padro

1
2
3
4
5
6
7
8
9
10

1
Item
Z2_ITEM

2
Tipo
Z2_TIPO

3
Histrico
Z2_HIST

2
0

1
0

20
0

Valor
Z2_VALOR
@E 999,999,999.99
12
2

C
SZ2
R

C
SZ2
R

C
SZ2
R

N
SZ2
R

1
1

Nil

2
Nil
D

Nil

Nil

Titulo
Campo
Picture
Tamanho
Decimal
Valid.
Usado
Tipo
Arquivo
Contexto

aHeader

5
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])
Next

2
3
4
1

2
3
4
1

Modelo 2 Criao do aCols para Incluso


Inicializa a ltima coluna com .F.

1
2
3
4
5
6
7
8
9
10
1

1
Item
Z2_ITEM

2
Tipo
Z2_TIPO

3
Histrico
Z2_HIST

2
0

1
0

20
0

Valor
Z2_VALOR
@E 999,999,999.99
12
2

C
SZ2
R

C
SZ2
R

C
SZ2
R

N
SZ2
R

1
Nil

2
Nil
D

3
Nil

4
Nil

Titulo
Campo
Picture
Tamanho
Decimal
Valid.
Usado
Tipo
Arquivo
Contexto

aHeader

5
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.

Modelo 2 Criao do aCols para Incluso


Inicializa a coluna do ITEM com 01

1
2
3
4
5
6
7
8
9
10

1
Item
Z2_ITEM

2
Tipo
Z2_TIPO

3
Histrico
Z2_HIST

2
0

1
0

20
0

Valor
Z2_VALOR
@E 999,999,999.99
12
2

C
SZ2
R

C
SZ2
R

C
SZ2
R

N
SZ2
R

1
1


01

2
Nil
D

3
Nil

4
Nil

Titulo
Campo
Picture
Tamanho
Decimal
Valid.
Usado
Tipo
Arquivo
Contexto

aHeader

5
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"

Modelo 2
Criao do aCols para Alterao

Modelo 2 Criao do aCols para Alterao


Inicializa as variveis de memria 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 Criao do aCols para Alterao


Posiciona no primeiro registro com o nmero 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 Criao do aCols para Alterao


Adiciona uma linha no aCols

1
2
3
4
5
6
7
8
9
10
1

1
Item
Z2_ITEM

2
Tipo
Z2_TIPO

3
Histrico
Z2_HIST

2
0

1
0

20
0

Valor
Z2_VALOR
@E 999,999,999.99
12
2

C
SZ2
R

C
SZ2
R

C
SZ2
R

N
SZ2
R

Titulo
Campo
Picture
Tamanho
Decimal
Valid.
Usado
Tipo
Arquivo
Contexto

Nil

Nil

Nil

Nil

Nil

aHeader

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))

Modelo 2 Criao do aCols para Alterao


Preenche o aCols com os dados lidos do arquivo

1
2
3
4
5
6
7
8
9
10

1
Item
Z2_ITEM

2
Tipo
Z2_TIPO

3
Histrico
Z2_HIST

2
0

1
0

20
0

Valor
Z2_VALOR
@E 999,999,999.99
12
2

C
SZ2
R

C
SZ2
R

C
SZ2
R

N
SZ2
R

1
1

Nil
01

Nil
D

Deposito
Nil

Titulo
Campo
Picture
Tamanho
Decimal
Valid.
Usado
Tipo
Arquivo
Contexto

aHeader

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

aCols[nLin][i] := CriaVar(aHeader[i][2], .T.)


EndIf
Next

4
Z2_ITEM
01
02
03

6
Z2_TIPO
D
D
S

7
Z2_HIST
Deposito
Deposito
Saque

8
Z2_VALOR
500,00
150,00
90,00

Modelo 2 Criao do aCols para Alterao


Inicializa a ltima coluna com .F.

1
2
3
4
5
6
7
8
9
10

1
Item
Z2_ITEM

2
Tipo
Z2_TIPO

3
Histrico
Z2_HIST

2
0

1
0

20
0

Valor
Z2_VALOR
@E 999,999,999.99
12
2

C
SZ2
R

C
SZ2
R

C
SZ2
R

N
SZ2
R

1
1

01

Deposito

Titulo
Campo
Picture
Tamanho
Decimal
Valid.
Usado
Tipo
Arquivo
Contexto

aHeader

5
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.

Modelo 3
Similar ao Modelo2

Diferena:
Modelo2 Cabealho e Itens so o mesmo arquivo (ex.: SC7 - Ped.
Compras)
A definio de quais campos ficaro no cabealho e quais
ficaro nos itens, feita no programa.
Modelo3 Cabealho um arquivo (ex.: SC5 Cabec. Ped. Vendas)
Itens outro arquivo
(ex.: SC6 Itens do Ped. Vendas)

Ver 130_TranM3.prw

Aula 5
Telas
Relatrios
Reposicionamento de arquivos
Integrao com Excel
SQL
OOP
Arquivos TXT e XML

Telas

Tela
EnchoiceBar barra de ferramentas com os botes padres
aButtons acrescenta botes na EnchoiceBar
Define Font cria uma fonte diferente da padro
Define MSDialog define a janela principal
Say mostra um texto na tela (normal ou como objeto)
Get campo para digitao (normal ou como objeto)
Radio Button
Check Box
Botes
Folder
Activate MSDialog ativa (desenha) a tela
Hide e Show esconde e reexibe um objeto
Mudana do texto
Exerccio: colocar o foco no campo Nome depois de clicado no boto OK

oGetNome:SetFocus()

Ver 131_Tela.prw

Tela
RDDemo e RDDemo2 mais componentes de tela

Relatrios

Relatrios
Criar um relatrio pelo Assistente de Cdigo do IDE:
IDE: menu Ferramentas / Assistente de Cdigo

Nome Data Numero Item Tipo Historico Valor


Para incluir as
ordens, digitar
no campo Ordem
e clicar neste boto

Relatrios

Alterar o nome da User Function para: Rel001()

Na funo RunReport(), aps a linha nLin := nLin + 1, que normalmente


est na linha 221, incluir os comandos de impresso dos campos:
@nLin,00
@nLin,23
@nLin,34
@nLin,41
@nLin,46
@nLin,50
@nLin,73

PSay
PSay
PSay
PSay
PSay
PSay
PSay

SZ2->Z2_Nome
SZ2->Z2_Data
SZ2->Z2_Numero
SZ2->Z2_Item
SZ2->Z2_Tipo
SZ2->Z2_Hist
SZ2->Z2_Valor Picture "@E 999,999,999.99"

Compilar e executar

Relatrios
Perguntas

Arquivo SX1

Funo Pergunte(): l as perguntas e cria as variveis correspondentes


cada pergunta: MV_PAR01, MV_PAR02, etc. Estas variveis so Private.

Sintaxe: Pergunte(cPerg, lMostra)


cPerg cdigo do grupo de perguntas
lMostra .T. abre a tela de perguntas
.F. no abre a tela; apenas cria as variveis

Relatrios
Perguntas

Abrir e compilar o programa CriaSX1.prw

Na parte inicial do programa, antes da linha Pergunte(cPerg, .F.), incluir


a chamada funo u_CriaSX1(cPerg)

Na funo RunReport(), na parte da impresso dos campos, incluir a lgica 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

Relatrios
ndice temporrio

ndices permanentes so criados no Dicionrio de Dados. A


incluso/alterao de registros, todos os ndices tambm so atualizados.

cada

Por questes de performance, somente ndices usados com muita freqncia


deveriam ser permanentes.

ndices usados esporadicamente, devero ser criados como temporrios por meio
da funo IndRegua().

Funo IndRegua(): permite criar ndices temporrios, inclusive com a


possibilidade de estabelecer um filtro.

Ao criar um ndice temporrio, os ndices originais so desativados, e devero ser


reativados por meio da funo RetIndex().

O arquivo temporrio dever ser apagado pela funo FErase().

Relatrios
ndice temporrio

Na funo RunReport(), na linha nOrdem :=


dbSetOrder(nOrdem) por:

aReturn[8], substituir

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 funo, antes da linha Return, incluir:


RetIndex("SZ2")
FErase(cArqInd + OrdBagExt())

Relatrios
Funes usadas nos programas de relatrios

SetPrint()

janela principal para definio das propriedades do relatrio (array aReturn).

aReturn[1] =
aReturn[2] =
aReturn[3] =
aReturn[4] =
aReturn[5] =
aReturn[6] =
aReturn[7] =
aReturn[8] =

Reservado para formulrio


Reservado para nmero de vias
Destinatrio
Formato: 1-Retrato, 2-Paisagem
Tipo midia: 1-Disco, 2-Via spool, 3-Direto na porta, 4-EMail
"NomeArq"-Disco, "LPT1"-Via spool, "LPT1"-Direto na porta, ""-Cancelado
Expresso do filtro
Ordem a ser selecionada

SetDefault()

Pergunte()

abre a janela de perguntas.

RptStatus()

executa a funo de impresso, mostrando uma rgua de progresso.

SetRegua()

define o limite da rgua de progresso criada pela funo RptStatus().

IncRegua()

incrementa a progresso da rgua.

prepara o ambiente de impresso de acordo com as informaes contidas no array


aReturn, obtidas atravs da funo SetPrint().

SIGARPM

Fazer um relatrio com as transaes de cada cliente, listando


todos os dados do SZ2 e tambm o e_mail e o saldo atual.

Pontos de Entrada

Crie um Ponto de Entrada para modificar o clculo do Saldo


aps um Saque, considerando apenas 60% do seu valor.

Reposicionamento de Arquivos
As funes de Ponto de Entrada que despocionarem arquivos tm a
responsabilidade de devolv-los na mesma situao em que receberam.
Para tanto, estas trs informaes devem ser guardadas:
cAlias := Alias()
nOrdem := IndexOrd()
nRecno := Recno()
Na sada, devem ser restauradas:
dbSelectArea(cAlias)
dbSetOrder(nOrdem)
dbGoTo(nRecno)

Arquivo atualmente selecionado


ndice selecionado
Nmero do registro posicionado

Reposicionamento de Arquivos
GetArea()
RestArea()

Guarda as trs informaes num array


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 funo.

Integrao com Excel

APExcel

Protheus
u_PlanMov()

Ver 170_Planilha.prw

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

Array de dados

Excel

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 clusulas do SELECT: GROUP BY, ORDER BY, HAVING,
AND, OR, IN, DISTINCT, BETWEEN, LIKE.

VIEW ou Viso. A View virtual


Ver 090_DBFSQL.prw
Ver texto Programando SQL com RDMake
Relao de Stored Procedures no PPT Oficial

MPSDU

Programa utilitrio para acesso, visualizao e pequenas manutenes de arquivos


Menu Arquivo / Abrir
3

MPSDU

TCP

4
Environment

2
Administrador
admin

MPSDU

OOP Programao Orientada a Objetos


Classes
Mtodos
Propriedades

Um objeto uma instncia da sua classe. Por exemplo, o boto da classe


tButton.
criado a partir da execuo do mtodo construtor.

oBotaoOK := tButton():New()
Suas propriedades podem ser definidas ou alteradas.
oBotaoOK:cCaption
oBotaoOK:nWidth
oBotaoOK:nHeight
oBotaoOK:bAction

:=
:=
:=
:=

Ok
50
15
{|| u_Grava() }

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


a programao baseada em comandos e funes pela orientao a objetos.
Ver 143_Objetos.prw

Arquivos Texto
O IDE possui um Assistente de Gerao e Importao de arquivos texto:

IDE: menu Ferramentas / Assistente de Cdigo


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.


necessrio criar, abaixo do diretrio \MP_DATA, o diretrio \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 diretrio \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

Contas

Efetua
transaes

Cliente

Transaes

Aguardando o
aprovador
acessar o
sistema...

Aprovador

WorkFlow
Fluxo automtico
Saldo Negativo?
Dispara um WorkFlow

Contas

WFSalNeg()

Efetua
transaes

Cliente

WFRetorno()
Transaes
Executa a funo
de retorno

Job WFRET

Caixa de
Sada

WFReturn()

E-Mail

Captura a resposta

Resposta
(Aprovado ou Reprovado)

Aprovador

Caixa de
Entrada

WebServices
Integrao de sistemas

Via troca de arquivos


Sistema
A

Sistema
B

TXT/XML

<Nome>JOSE</Nome>
http://...

<Saldo>1000</Saldo>

Web Service

Sistema
A

WSDL

Via Web Services


Sistema
B

WebServices
Configurao

O Protheus dispe de um Assistente de Configurao:


\ERP811\BIN\REMOTE\MP8WIZARD.EXE

WebServices
Configurao

WS Protheus 8 Web Services


ws
\web\ws
ENVIRONMENT

WebServices
Configurao

localhost/ws/9901

WebServices
Configurao

WebServices
Configurao MP8SRV.INI
[HTTP]
ENABLE=1
PORT=80
Acesso ao WebService:
http://localhost/ws/9901/...
http://localhost/ws1/9901/...

[localhost/ws1/9901]
[localhost/ws/9901]
ENABLE=1
ENABLE=1
PATH=C:\ERP811\MP_Data\web\ws1
PATH=C:\ERP811\MP_Data\web\ws
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
INSTANCES=1,3
INSTANCES=1,3
SIGAWEB=WS
SIGAWEB=WS
INSTANCENAME=ws1
INSTANCENAME=ws
ONSTART=__WSSTART
ONSTART=__WSSTART
ONCONNECT=__WSCONNECT
ONCONNECT=__WSCONNECT
Emp. 99, Filial 01
PREPAREIN=99,01
PREPAREIN=99,01
[ONSTART]
[ONSTART]
JOBS=JOB_WS_9901,JOB_WS1_9901
JOBS=JOB_WS_9901

[EVIRONMENT]
SourcePath=C:\ERP811\APO
RootPath=C:\ERP811\MP_Data
StartPath=\system\
...
[EVIRONMENT1]
SourcePath=C:\ERP811\APO1
RootPath=C:\ERP811\MP_Data
StartPath=\system\
...

WebServices
Aps a configurao, ver a lista de Web Services disponveis no Protheus:
Reinicializar o server
No Internet Explorer: http://localhost/ws/9901/wsindex.apw

WebServices
IDE

http://localhost/FORNECESALDO.apw?WSDL

WSDL
Cliente WSForneceSaldo
Mtodo BuscaSaldo
Nome
Saldo

http://localhost
WebService ForneceSaldo
Mtodo BuscaSaldo
Nome
Saldo

Sistema

Contas

WebServices

http://localhost
WebService ForneceSaldo

WSDL
Cliente WSForneceSaldo

Joo

ConsultaSaldo

1000,00

Mtodo BuscaSaldo
Nome
Saldo

Mtodo BuscaSaldo
Nome
Saldo

Sistema

Tela

Nome: Joo
Saldo: 1000,00
OK

Saldo(cNome)
oWS := WSForneceSaldo():New()
oWS:BuscaSaldo(cNome)

Contas

Portal Protheus
Configurao

Para o desenvolvimento de pginas Internet, via AdvPL ASP, necessrio


configurar o mdulo web Portal Protheus:

Portal Protheus
Configurao

PP Portal Protheus
pp
\web\pp
ENVIRONMENT

http://localhost/ws/9901

Portal Protheus
Configurao

localhost/pp

Portal Protheus
Configurao

HTML
Pgina esttica (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

Pgina
esttica

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

HTML + ASP
Pgina dinmica (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

Pgina
dinmica,
com a data
obtida do
servidor

Hoje <%=Date%>
</body>
</html>

AdvPL ASP
Pgina 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>
Ver
Ver
Ver
Ver
Ver

230_ASP1.prw e
240_ASP2.prw e
250_ASP3.prw e
260_ASP4.prw e
270_ASP5.prw e

235_ASP1.aph
245_ASP2.aph
255_ASP3.aph
265_ASP4.aph
275_ASP5.aph

Benvindo ao site da Empresa X


Hoje <%=Date()%>
</body>
</html>

Call Center

Telnet
Integrao com equipamentos micro-terminais

No MP8SRV.INI, acrescentar:
[TELNET]
Enable=1
Environment=Environment
Main=MTTRAN
Port=1024

Ver 330_MTTran.prw e 331_MTFunc.prw

RPO
MTTran()

DEM
Documentao Eletrnica Microsiga

Linguagem

AdvPL
Tecnologia Protheus
Dicas e Notcias
F.A.Q.
Guias de Referncia
Releases
Sistema

Top Connect com SQL

Duvidas
descrio da GetDados e da Enchoice
Porque na U_Deleta tem parametros
Qdo vai para a funo Alterar a Mbrowse j jogou os cpos para a
memoria. Porque precisa do nReg
Qdo se usa passagem por referencia. No 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

Segurana
Dicionrio
de Dados

Programa A

Dicionrio de Dados

Programa C

Programa B

Anda mungkin juga menyukai