Você está na página 1de 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 1978 1983 1990 1995


Assembler Batch Natural Adabas Online DBase II III, Clipper Summer Clipper 5 SIGA Advanced FiveWin/Top/Coencisa, VO, Delphi, SQL

2000

AdvPL Protheus 5 ... 8

Multi-Camada

Windows Linux Browser

Remote (MP8RMT.EXE)

Client (WEB) ActiveX

Client

Windows Linux Unix

RPO (MPDP811.RPO)

Server (MP8SRVWIN.EXE) Monitor

Aplication Server

Windows Linux Unix

DBF/CTREE SQL Server Sybase Oracle PostGres

Top Connect

DB2 MySQL

Database Server

Mltiplas configuraes

modem

..
..

modem

.....

Hub

Hub .....

Servidor Terminal Dados

Estrutura Protheus
REMOTE

Programa Fonte
MATA010

SERVER

APO MATA010 Executa MATA010 Executa MATA410

Cad.Produtos

RPO
MATA010
MATA410 CTBR040

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
[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 [Drivers] Active=TCP [TCP] TYPE=TCPIP Port=1234

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

SIGACFG

TCP

Environment

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

OU

Server e Remote na mesma mquina aradas

Protheus Server
Rede Intranet Extranet Internet

Protheus Server Protheus Remote

Protheus Remote

Configurador

SIGACFG

TCP

Environment

Configurador

Senha: admin

Configurador

Configurador

CONFIGURADOR

Ambiente ...

Usurio ...

Bases

de

Dados..

Empresas ...

Ajuda ...

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.

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

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 01 01 01 02 02 02 03 03 03 C5_NUM 000001 000005 000007 000001 000005 000007 000001 000005 000007 C5_EMISSAO 01/01/04 01/01/04 20/01/04 01/01/04 01/01/04 20/01/04 01/01/04 01/01/04 20/01/04 C5_CLIENTE 000002 000023 000016 000002 000023 000016 000002 000023 000016 C5_PROD 11.11014 13.13000 15.15140 11.11014 13.13000 15.15140 11.11014 13.13000 15.15140 C5_VALOR 15.000,00 5.600,00 5.600,00 15.000,00 5.600,00 5.600,00 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 000001 000007 000015 000016 000020

REGISTRO 03 05 01 02 04

REGISTRO 01 02 03 04 05

A1_FILIAL

A1_COD 000015 000016 000001 000020 000007

A1_NOME 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 ndice do Sistema novo do Usurio 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 N 100 201 100 201 V S .Or. QtdVenda < B2_Saldo F V 200 F 200 If cESTNEG == 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%
Programa-fonte
MATA460A Emisso NF

Preo 100,00 125,00

SERVER Frmulas
APO MATA460A
Execuo do MATA460A
Preo := SC6->C6_PRCVEN * 1.25

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

SC6->C6_PRCVEN * 1.25

RPO
MATA460A

Preo := &Formula

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 Run Time Server


Maquina Virtual

Interpretador
FONTE
DBase, Access

PCode
Visual Basic, AdvPl Abap, Oracle,Java

Executvel + Interpretador
Clipper, Visual Objects

Executvel

Delphi, C

Compilao

A=A+B A=5 965534567654

A = A + &B
MACRO

A=7
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 Tem Refere-se

TRANSAES
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: Prefixo: Path: Nome: Descrio: Desc.Esp.: Desc.Ingls: Modo Acesso:

SZ1 \DATA\ SZ1990 CONTAS CONTAS CONTAS COMPARTILHADO 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 nvel 5 s ter Usurio Gerente nvel 9 Campos Nome do Func. nvel 5 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 Z1_NOME Z1_EMAIL Z1_EMAIL1 Z1_SALDO Tipo Car Car Car Num Tam. 20 40 40 12 2 @E 999,999,999.99 Dec. @! Formato Contexto Real Real Real Real Propr. Alt. Alt. Alt. Visual Inform. Ttulo Nome EMail EMail1 Saldo Obrig Uso Usa Brw

Cadastrar Opes e Validaes para estes campos


Opes
Campo Lista de Opes Z1_NOME Inic.Padro Validaes

ExistChav(SZ1, M->Z1_NOME, 1)

Z2_NOME
Z2_NUMERO Z2_ITEM Z2_DATA Z2_TIPO D=Deposito;S=Saque

ExistCpo(SZ1, M->Z2_NOME, 1)
GetSXENum(SZ2, Z2_NUMERO) ExistChav("SZ2", M->Z2_NUMERO+ M->Z2_ITEM, 1) dDataBase D

Exerccio
Campos do SZ2 (j esto cadastrados)
Campo Inform. Uso

Campo
Z2_NOME Z2_NUMERO Z2_ITEM Z2_DATA Z2_TIPO Z2_HIST Z2_VALOR Z2_SLDATU Z2_APROV

Tipo
Car Car Car Data Car Car Num Num Car

Tam.
20 4 2 8 1 20 12 12 3

Dec.
@!

Formato

Contexto
Real Real

Propr.
Alt. Visual Alt. Alt. Alt. Alt. Alt. Visual Visual

Ttulo
Nome Numero Item Data Tipo Historico Valor Saldo Aprovado

Obrig

Usa

Brw

99

Real Real Real Real

2 2

@E 999,999,999.99 @E 999,999,999.99

Real Virtual Real

Exerccio
Criao dos ndices

1 3

Chave SZ1

Nickname

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

Consultas Atualizaes
Programa:

Relatrios
Programa:

Con001

Rel001

Contas
Programa:

Transaes

Cad

Modelo 1
Programa:

Modelo 2
Programa:

Modelo 3
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
o1 o2 o 5 e 10 o1e2

2
3 13 15 17

Volta Vai

Volta Vai

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 Sacudir a Esposa Sair da Cama Acender a luz
Sim Est Escuro ? No Sim Sim

Resmungar

A Esposa quer $$ ? No

Dar-lhe R$ 100,00

Casado h mais de 5 anos ? No

Sim

Beijar a esposa
Casado h mais de 1 ano ? No

Beijar a esposa Ir at o carro Voltar para peg-las


No Est Com as Chaves ? Sim

Voltar para a cama Possvel Fim da rotina

Sim Est Frio ? No

Ir ao Banheiro Tomar Caf A

Dirigir-se ao escritrio Fim

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
V V F F

.And.

nQtde < nSaldo


V F V F V F F F

Operadores
Lgicos

.And.

.Or.

.Not. ou !

If cEstNeg == "S" .Or. nQtdVenda < nSaldo MsgAlert("OK, pode faturar!") Else MsgAlert("Estoque insuficiente!") EndIf

cEstNeg == S V

.Or.

nQtdeVenda < nSaldo V V

V
F F

F
V F

V
V F

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

.And.

( cEstNeg == S
V V F

.Or.

nQtdVenda < nSaldo ) V F V V V V

V
F F F F

F
V V F F

F
V F V F

F
V V V F

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

.And.

( cEstNeg == S
V V F

.Or.

nQtdVenda < nSaldo ) V F V V V V V V V

V
F F F F

F
V V F F

F
V F V F

F
V V V F

F
F F F F

Operadores
Lgicos

.And.

.Or.

.Not. ou !

If a <> b ... EndIf

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

If !a==b ... EndIf

Operadores
Atribuio

:=

+=

-=

*=

/=

^= ou **=

%=

x := 10

o mesmo que:

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

o mesmo que:

Operadores
Incremento / Decremento

i++
i++

++i

i--

--i
i := i + 1

equivale a

i := 1 MsgAlert(i++)

equivale a

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

mostra 1

i := 1 MsgAlert(++i)

equivale a

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

mostra 2

Operadores
Strings

x + y

x - y

x $ y

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

JooSilva

AB

Pertence Silva $ cNomeCompleto SILVA $ cNomeCompleto

.T. .F.

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)
Programa (.PRW)

Funo Funo Funo


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 Numricas Data Lgicas Casa 1234.56 CtoD(25/10/05) .T. .F. cTexto

nValor
dData lOk
n X := 1
nX numrico X numrico

c X := Jos

X agoracaracter cX caracter

n X := n X + 1

Operao matemtica ERRO !

Tipos de Variveis de Memria


Notao Hngara:

Caractere
Numricas Data Lgicas

Casa
1234.56 CtoD(25/10/05) .T. .F.

cTexto nValor dData lOk

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


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

Ver Operadores.PRW Exercicio

Array, Vetor ou Matriz


Variveis do tipo Caracter: uma para cada nome cNome1 cNome2 cNome3 cNome4 := := := := Joao Alberto Pedro Maria
Memria
cNome1 Joao aNomes Joao Alberto Pedro Maria cNome2 Alberto cNome3 Pedro cNome4 Maria

Variveis do tipo Array: todos os nomes numa nica varivel aNomes := {Joao, Alberto, Pedro, Maria} aNomes[1] aNomes[2] aNomes[3] aNomes[4]

Array, Vetor ou Matriz


Variveis
Armrio 1
Joao

Armrio 2
Alberto

Armrio 3
Pedro

Armrio 4
Maria

Array
Armrio
Gaveta 1 Joao Gaveta 2 Alberto Gaveta 3 Pedro Gaveta 4 Maria

Array, Vetor ou Matriz

Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4

Joao Alberto Pedro 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 ,

25, 18, 40, 33,

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

Gaveta 1
1
Joao

Gaveta 2
3
T

Gaveta 3
3
F

Gaveta 4
3
T

2
25

1
Alberto

2
18

1
Pedro

2
40

1
Maria

2
33

3
F

Gaveta 1
1
Joao 25 T

Gaveta 2
1
Alberto 18 F

Gaveta 3
1
Pedro 40 T

Gaveta 4
1
Maria 33 F

2
3

2
3

2
3

2
3

Array, Vetor ou Matriz


Adicionar elementos num array vazio
aNomes := {Joao, Alberto} Pedro} Maria} {Joao} Alberto, Pedro, {} 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 := := := := := A B C D E

{A, B, C, D, E}

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

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() Comandos If CGC(cCGC) continua Else abandona EndIf Comandos Comandos Comandos Return Function CGC(cCGC) If cCGC OK lOK := .T. Else lOK := .F. EndIf User Function CadFor() Comandos Comandos Comandos If CGC(cCGC) continua Else abandona EndIf Comandos Return

.T. ou .F.

.T. ou .F.

Return lOK

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

LOCAL

Contedo

PRIVATE

Contedo

PUBLIC

Contedo

Escpo das Varivies


User Function Func1() Local cVar := "Func1" 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

LOCAL cVar

Contedo Func1

PRIVATE

Contedo

PUBLIC

Contedo

Escpo das Varivies


User Function Func1() Local cVar := "Func1" 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

LOCAL
cVar cVar1

Contedo
Func2 Func2

PRIVATE
cVar2

Contedo
Private Func2

PUBLIC
cVar3

Contedo
Public Func2

Escpo das Varivies


User Function Func1() Local cVar := "Func1" 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

LOCAL

Contedo

PRIVATE
cVar2

Contedo
ABC

PUBLIC
cVar3

Contedo
Public Func2

Escpo das Varivies


User Function Func1() Local cVar := "Func1" 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

LOCAL
cVar cVar1

Contedo
Func2 Func2

PRIVATE
cVar2

Contedo
ABC

PUBLIC
cVar3

Contedo
Public Func2

Escpo das Varivies


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

LOCAL cVar

Contedo Func1

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

PRIVATE

Contedo

PUBLIC
cVar3

Contedo
Public Func2

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=1 y=2

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

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=1 y=2

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=1 y=2

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

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=1 y=2

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

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=2

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=2

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

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 * 1.25 SM4->M4_Formula
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) * * 1.25) SB1->B1_Prv1 &(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)

nResult = 10

Ver 051_Bloco.prw

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 ,10} ,{Pedro ,10}, {Maria {Alberto,20} {Alberto,20}

,30} }

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

.F. .T.

Ver 050_Array.prw

Bloco de Cdigo
Ordenao de array

{Joao aMatriz := { {Pedro

,15} {Pedro ,10} , {Joao

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

,30} }

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

.T. .F.

Ver 050_Array.prw

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:

001 002 003 004 005

003 004 006 007 008

Exemplos em 120_TranM2

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 01 01 01 02 02 02 03 03 03 C5_NUM 000001 000005 000007 000001 000005 000007 000001 000005 000007 C5_EMISSAO 01/01/04 01/01/04 20/01/04 01/01/04 01/01/04 20/01/04 01/01/04 01/01/04 20/01/04 C5_CLIENTE 000002 000023 000016 000002 000023 000016 000002 000023 000016 C5_PROD 11.11014 13.13000 15.15140 11.11014 13.13000 15.15140 11.11014 13.13000 15.15140 C5_VALOR 15.000,00 5.600,00 5.600,00 15.000,00 5.600,00 5.600,00 15.000,00 5.600,00 5.600,00

xFilial(SC5) cFilAnt

Arquivos e ndices

ndice: CDIGO
CODIGO 000001 000002 000007 000008 000015 000016 000019 000020 000023 000024 000026 000027 000028 000030 000033 REGISTRO 03 09 05 07 01 02 13 04 08 06 10 11 12 15 14 RECNO 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 A1_COD 000015 000016 000001 000020 000007 000024 000008 000023 000002 000026 000027 000028 000019 000033 000030 A1_NOME

Arquivo

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 10 04 03 05 14 09 01 07 15 06 13 08 12 11 02 RECNO 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 A1_COD 000015 000016 000001 000020 000007 000024 000008 000023 000002 000026 000027 000028 000019 000033 000030 A1_NOME

Arquivo

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

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
CODIGO 000001 000002 000007 000008 000015 000016 000020 000023 000024 000026 REG 3 9 5 7 1 2 4 8 6 10

Arquivo: SA1990
RECNO 1 2 3 4 5 6 7 8 9 10 A1_COD 000015 000016 000001 000020 000007 000024 000008 000023 000002 000026

Alias: SA1
A1_NOME

Cadastro de Clientes

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.

dbSelectArea(SA1)

ndices CODIGO 11.11000 11.11003 11.11014 12.12006 13.13000 13.13001 15.15140 33.03323 REG 2 5 1 3 8 4 6 7

Arquivo: SB1990 RECNO 1 2 3 4 5 6 7 8 B1_COD

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

Cadastro de Produtos B1_TIPO PA PA MP PA MP MC MP PA B1_UM UN UN UN CX UN L UN CX

11.11014 11.11000 12.12006 13.13001 11.11003 15.15140 33.03323 13.13000

dbSelectArea(SB1)

Arquivo: SC5990 RECNO Posicionamento de registro dbSkip() dbSelectArea(SB1) dbSelectArea(SA1) dbSkip() dbSetOrder(1) dbSkip() dbSkip() dbSeek(11.11014) dbSeek(000002) 1 2 3 4 5 C5_NUM 000001 000005 000007 000008 000009

Alias: SC5 C5_EMISSAO 01/01/04 01/01/04 20/01/04 27/01/04 01/01/04 C5_CLIENTE 000002 000023 000016 000024 000008

Pedidos de Venda C5_PROD 11.11014 13.13000 15.15140 13.13001 11.11000 C5_VALOR 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 01000001 01000005 01000007 01000008 01000009 02000001 02000005 02000007 02000008 02000009 03000001 03000005 03000007 03000008 03000009 REG 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 RECNO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 C5_FILIAL 01 01 01 01 01 02 02 02 02 02 03 03 03 03 03 C5_NUM 000001 000005 000007 000008 000009 000001 000005 000007 000008 000009 000001 000005 000007 000008 000009 C5_EMISSAO 01/01/04 01/01/04 20/01/04 27/01/04 01/01/04 01/01/04 01/01/04 20/01/04 27/01/04 01/01/04 01/01/04 01/01/04 20/01/04 27/01/04 01/01/04 C5_CLIENTE 000002 000023 000016 000024 000008 000002 000023 000016 000024 000008 000002 000023 000016 000024 000008 C5_PROD 11.11014 13.13000 15.15140 13.13001 11.11000 11.11014 13.13000 15.15140 13.13001 11.11000 11.11014 13.13000 15.15140 13.13001 11.11000 C5_VALOR 15.000,00 5.600,00 5.600,00 1.000,00 3.450,00 15.000,00 5.600,00 5.600,00 1.000,00 3.450,00 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

While !EOF()
dbSkip() End

Leitura sequencial, registro a registro

FILIAL+NUMERO+ITEM 01000101 01000102 01000103 01000201 01000202 01000301 01000302 01000303 01000401 01000402

REG 1 2 3 4 5 6 7 8 9 10

RECNO 1 2 3 4 5 6 7 8 9 10

Z2_FILIAL 01 01 01 01 01 01 01 01 01 01

Z2_NUMERO 0001 0001 0001 0002 0002 0003 0003 0003 0004 0004

Z2_ITEM 01 02 03 01 02 01 02 03 01 02

EOF() .T.

Posicionamento de Arquivos
Acesso direto ao registro

Por chave completa ou parcial


dbSeek(xFilial(SZ2)+0003+02) dbSeek(xFilial(SZ2)+0003)

Chave completa Chave parcial

FILIAL+NUMERO+ITEM 01000101 01000102 01000103 01000201 01000202 01000301 01000302 01000303 01000401 01000402

REG 1 2 3 4 5 6 7 8 9 10

RECNO 1 2 3 4 5 6 7 8 9 10

Z2_FILIAL 01 01 01 01 01 01 01 01 01 01

Z2_NUMERO 0001 0001 0001 0002 0002 0003 0003 0003 0004 0004

Z2_ITEM 01 02 03 01 02 01 02 03 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?

Cria a varivel
Nome := Joo

Atribui o valor varivel


Joo Var. Nome

Varive l existe ?

N
Erro: varivel no existe

Cria como privada

Arquivo
Codigo Nome Joo

Existe um arquivo aberto ?

N
Para no confundir variveis de memria com campos de arquivos, usa-se o ALIAS: M->Z1_Nome SZ1->Z1_Nome
Arquivo Codigo Descricao

S
Existe campo com este nome ?

Grava o valor no campo


Joo Campo Nome

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)

Modelo 2 Enchoice

Nmero Nome Data

Variveis de memria

Item

Tipo

Histrico

Valor

aHeader

GetDados

aCols

Modelo 2 Enchoice

Nmero Nome 1 Item Z2_ITEM 2 0 C SZ2 R 01 02 03 1 2 Tipo Z2_TIPO 1 0 C SZ2 R D S S 2 3 Histrico Z2_HIST 20 0 C SZ2 R Deposito Saque Saque 3 Data 4

Variveis de memria

GetDados

1 2 3 4 5 6 7 8 9 10 1 2 3

Valor Z2_VALOR @E 999,999,999.99 12 2


N SZ2 R 10.000,00 300,00 2.500,00 4

Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto .F. .F. .F. 5

aHeader

aCols

Modelo 2

Array aRotina

lRet mBrowse() .T. Monta os parametros: 1. 2. 3. 4. Variveis de memria aHeader aCols Enchoice 3 5

Incluso

nOpc 4

Excluso

lRet := Modelo2()

Alterao

Ver 120_TranM2.prw

Modelo 2
Criao do aCols para Incluso

Modelo 2 Criao do aCols para Incluso


Adiciona uma linha no aCols
1 Item Z2_ITEM 2 0 C SZ2 R 1 1 Nil 2 Tipo Z2_TIPO 1 0 C SZ2 R 2 Nil 3 Histrico Z2_HIST 20 0 C SZ2 R Nil Array(?) Array(5) 3 4

1 2 3 4 5 6 7 8 9 10

Valor Z2_VALOR @E 999,999,999.99 12 2


N SZ2 R 4 Nil

Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto 5 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 Item Z2_ITEM 2 0 C SZ2 R 1 1 Nil 2 Tipo Z2_TIPO 1 0 C SZ2 R 2 D Nil 3 Histrico Z2_HIST 20 0 C SZ2 R 3 Nil 4

1 2 3 4 5 6 7 8 9 10

Valor Z2_VALOR @E 999,999,999.99 12 2


N SZ2 R 4 Nil

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

aHeader

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

4 3 2 1

4 3 2 1

Modelo 2 Criao do aCols para Incluso


Inicializa a ltima coluna com .F.
1 Item Z2_ITEM 2 0 C SZ2 R 1 Nil 2 Tipo Z2_TIPO 1 0 C SZ2 R 2 Nil D 3 Histrico Z2_HIST 20 0 C SZ2 R 3 Nil 4

1 2 3 4 5 6 7 8 9 10 1

Valor Z2_VALOR @E 999,999,999.99 12 2


N SZ2 R 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 Item Z2_ITEM 2 0 C SZ2 R 1 1 01 2 Tipo Z2_TIPO 1 0 C SZ2 R 2 Nil D 3 Histrico Z2_HIST 20 0 C SZ2 R 3 Nil 4

1 2 3 4 5 6 7 8 9 10

Valor Z2_VALOR @E 999,999,999.99 12 2


N SZ2 R 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 Item Z2_ITEM 2 0 C SZ2 R 1 1 Nil 2 Tipo Z2_TIPO 1 0 C SZ2 R 2 Nil 3 Histrico Z2_HIST 20 0 C SZ2 R 3 Nil 4

1 2 3 4 5 6 7 8 9 10

Valor Z2_VALOR @E 999,999,999.99 12 2


N SZ2 R 4 Nil

Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto 5 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 Item Z2_ITEM 2 0 C SZ2 R 1 1 01 Nil 2 Tipo Z2_TIPO 1 0 C SZ2 R 2 D Nil 3 Histrico Z2_HIST 20 0 C SZ2 R 3 Deposito Nil 4

1 2 3 4 5 6 7 8 9 10

Valor Z2_VALOR @E 999,999,999.99 12 2


N SZ2 R 4

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

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 3 2

8 4 7 6

1 3 2 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 Item Z2_ITEM 2 0 C SZ2 R 1 1 01 2 Tipo Z2_TIPO 1 0 C SZ2 R 2 D 3 Histrico Z2_HIST 20 0 C SZ2 R 3 Deposito 4

1 2 3 4 5 6 7 8 9 10

Valor Z2_VALOR @E 999,999,999.99 12 2


N SZ2 R 4

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

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

SetDefault() Pergunte() RptStatus()

prepara o ambiente de impresso de acordo com as informaes contidas no array aReturn, obtidas atravs da funo SetPrint(). abre a janela de perguntas. executa a funo de impresso, mostrando uma rgua de progresso.

SetRegua()
IncRegua()

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


incrementa a progresso da rgua.

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

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

Excel

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 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 WFSalNeg() WFRetorno() Transaes
Executa a funo de retorno

Contas

Efetua transaes

Cliente

Job WFRET

Caixa de Sada
E-Mail

WFReturn()

Captura a resposta

Resposta (Aprovado ou Reprovado)

Caixa de Entrada

Aprovador

WebServices
Integrao de sistemas

Via troca de arquivos


Sistema A Sistema B

TXT/XML

Via Web Services


Sistema A
WSDL <Nome>JOSE</Nome> http://... Web Service

<Saldo>1000</Saldo>

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

http://localhost WebService ForneceSaldo Mtodo BuscaSaldo Nome Saldo

WSDL Cliente WSForneceSaldo Mtodo BuscaSaldo Nome Saldo

Sistema

Contas

WebServices

http://localhost WSDL Cliente WSForneceSaldo Mtodo BuscaSaldo Nome Saldo ConsultaSaldo


Tela

WebService ForneceSaldo Mtodo BuscaSaldo Nome Saldo


1000,00 Joo

Sistema

Nome: Joo Saldo: 1000,00


OK

Contas

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

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
Benvindo ao site da Empresa X Hoje 10/08/05
<html> <body>
Benvindo ao site da Empresa X

inicio.htm

Pgina esttica

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

HTML + ASP
Pgina dinmica (html + ASP)

Servidor Internet

Browser
http://www.empresax.com.br/inicio.htm
Benvindo ao site da Empresa X Hoje 21/02/06
<html> <body>

21/02/06

inicio.htm

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

Browser
http://www.empresax.com.br/u_inicio.apw
Benvindo ao site da Empresa X Hoje 21/02/06

21/02/06

RPO inicio.prw

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

RPO MTTran()

Ver 330_MTTran.prw e 331_MTFunc.prw

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

Dicionrio de Dados

Programa A

Programa C

Programa B