curso advpl

214
Programação e Customizações AdvPL e Protheus

Upload: duquenuken

Post on 23-Dec-2015

65 views

Category:

Documents


3 download

DESCRIPTION

advpl

TRANSCRIPT

Page 1: Curso AdvPL

Programação e Customizações

AdvPL e Protheus

Page 2: Curso AdvPL

Aula 1Evolução e Arquitetura do Sistema

ArquivosCustomizações

Case – Sistema de Contas Correntes

Page 3: Curso AdvPL

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

Evolução do Sistema da Microsiga

Page 4: Curso AdvPL

Server (MP8SRVWIN.EXE)

Monitor

RPO (MPDP811.RPO)

Top Connect

DB2OracleSQL Server

MySQLPostGresSybase

Client (WEB)ActiveX

Remote (MP8RMT.EXE)Windows LinuxBrowser

WindowsLinux Unix

WindowsLinuxUnix

Client

AplicationServer

DatabaseServer

DBF/CTREE

Multi-Camada

Page 5: Curso AdvPL

Múltiplas configurações

..

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

..modem

modem

Servidor

Terminal

Dados

Page 6: Curso AdvPL

Estrutura Protheus

APOMATA01

0

APOMATA01

0

REMOTE

ExecutaMATA010Executa

MATA010

ExecutaMATA410Executa

MATA410

ExecutaCTBR040ExecutaCTBR040

RPO

MATA010

MATA410

CTBR040

SERVERProgramaFonte

MATA010

Cad.Produtos

Ped.Vendas

Balancete Cont.

Compilação

Page 7: Curso AdvPL

•Protheus Server•Protheus Remote•Top Connect•Monitor

Aplicativos

Page 8: Curso AdvPL

•RPO arquivo binário com os APOs•BUILD executáveis, DLLs e RPO•Patch atualizações do RPO

Conjuntos de arquivos

Page 9: Curso AdvPL

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

Remote

Page 10: Curso AdvPL

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

Terminal Remoto

Page 11: Curso AdvPL

Estrutura de pastas do sistema

ERP811

APO (RPO)

BIN

REMOTE

SERVER

INCLUDE

MP_DATA

DATA (versão ISAM)

SAMPLES

SPOOL

SYSTEM (Dic.Dados, Menus, ...)

SYSTEMLOAD

MY PROJECTS

Page 12: Curso AdvPL

Atalhos

Destino: c:\erp811\bin\server\mp811srvwin.exe –debugIniciar em: c:\erp811\bin\server

Destino: c:\erp811\bin\remote\mp811rmt.exeIniciar em: c:\erp811\bin\remote

MP8 Server

MP8 Remote

Page 13: Curso AdvPL

ERP811

APO

BIN

REMOTE

SERVER

INCLUDE

MP_DATA

DATA

SAMPLES

SPOOL

SYSTEM

SYSTEMLOAD

MY PROJECTS

SIGACFG

TCP

Environment

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

MP8SRV.INI

Page 14: Curso AdvPL

MP8SRV.INI

[environmentSQL]SourcePath=C:\ERP811\APORootPath=C:\ERP811\MP_DataStartPath=\system\RpoVersion=811RpoDb=TopLocalFiles=adslocaldbextension=.dbfRpoLanguage=portuguesePictFormat=DEFAULTDateFormat=DEFAULT

[Topconnect]Alias=BASE810ConType=TCPIPDataBase=MSSQL8Server=SrvTOP01

[Drivers]Active=TCP

[TCP]TYPE=TCPIPPort=1234

Page 15: Curso AdvPL

MP8RMT.INI

[Config]LastMainProg=sigamdi

[Drivers]Active=TCP

[TCP]Server=localhostPort=1234

Page 16: Curso AdvPL

Protheus Server

Rede

Intranet

Extranet Internet

Protheus Server

Protheus Remote

Server e Remote em máquinas separadas

Server e Remote na

mesma máquina

aradas

Protheus Remote

OU

Page 17: Curso AdvPL

SIGACFG

TCP

Environment

Configurador

Page 18: Curso AdvPL

Senha: admin

Configurador

Page 19: Curso AdvPL

Configurador

Page 20: Curso AdvPL

CONFIGURADOR

Ambiente ... Usuário ... Bases de Dados.. Empresas ... Ajuda ...

Possibilita a Permite o registro Oferece um Permite a criação Consolida umdefinição do e a manutenção de conjunto completo de bases para conjunto de dicasformato das usuários, empresas, de funções para a novas empresas e sobre os interfaces de senhas e níveis de criação e manutenção consolida todos os conceitos e acesso aos acessos. do Dicionário de fatos ocorridos no utilização domódulos do Dados (campos sistema por meio produto.

sistema, criação com suas de consulta aose manutenção de características e arquivos de LOG.menus, tabelas, seus ´gatilhos´ e

parâmetros e validações).perguntas

Configurador

Page 21: Curso AdvPL

Arquivos – Família SX

Arquivo DescriçãoSX1 Perguntas e RespostasSX2 Mapeamento de TabelasSX3 Dicionário de DadosSX4 Agenda do Schedule de ProcessosSX5 TabelasSX6 ParâmetrosSX7 GatilhosSX9 Relacionamento entre TabelasSXA Pastas Cadastrais apontadas no SX3SXB Consulta por meio da tecla F3 (Consulta Padrão)SXD Controle do Schedule de ProcessosSXE Seqüência de Documentos (+1)SXF Seqüência de Documentos (próximo)SXG Tamanho padrão para camposSXK Respostas das Perguntas (SX1) por UsuárioSXO Controle de LOGs por TabelaSIX Índices dos Arquivos

.XNU Menu de Opções dos Módulos

Pasta \SYSTEM

Page 22: Curso AdvPL

SA - CadastrosSB - EstoquesSC - Previsões de E/SSD - Mov. De EstoqueSE - FinanceiroSF - FiscalSG - EstruturasSH - Carga de MáquinaSI - ContábilSJ - EstatísticasSM - MiscelâneasSN - Ativo Fixo

SO - Assist. TécnicaSP - Ponto EletrônicoSQ - Recr. e SeleçãoSR - Folha de PagtoST - Manut. IndustrialSU - TelemarketingSV - ConcessionáriasSW e SY - Export./Import.Q? - Qualidade (Celerina)R? - Recursos HumanosSZ,QZ,RZ - LivresP? - Projetos Especiais

M.E.R. Modelo de Entidades e Relacionamento

Famílias de Arquivos de DadosPasta \DATA ou Banco de Dados

Page 23: Curso AdvPL

Principais Arquivos de Dados

Prefixo DescriçãoSA1 Cadastro de ClientesSA2 Cadastro de FornecedoresSA3 Cadastro de VendedoresSB1 Cadastro de ProdutosSB2 Saldos dos Produtos por AlmoxarifadoSB5 Dados Complementares de ProdutosSC1 Solicitações de ComprasSC5 Cabeçalho dos Pedidos de VendaSC6 Itens dos Pedidos de VendaSC7 Pedidos de ComprasSD1 Itens das Notas Fiscais de EntradaSD2 Itens das Notas Fiscais de SaídaSD3 Movimentações Internas de ProdutosSE1 Títulos a ReceberSE2 Títulos a PagarSF1 Cabeçalho das Notas Fiscais de EntradaSF2 Cabeçalho das Notas Fiscais de SaídaSI1 Plano de ContasSI2 Lançamentos Contábeis

Page 24: Curso AdvPL

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 arquivonn = Empresa

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

Page 25: Curso AdvPL

Arquivos de Dados

Nomenclatura dos campos:

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

A1_COD A2_COD B1_COD QA1_CODA1_NOME A2_NOME B1_DESC QA1_DESCA1_END A2_END B1_TIPO

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

Page 26: Curso AdvPL

Arquivos de Dados

Compartilhado registros compartilhados entre as filiaisCampo Filial: em branco

Exclusivo o registro é exclusivo da filialCampo Filial: código da Filial (variável cFilAnt)

C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR

01 000001 01/01/04 000002 11.11014 15.000,0001 000005 01/01/04 000023 13.13000 5.600,0001 000007 20/01/04 000016 15.15140 5.600,00

02 000001 01/01/04 000002 11.11014 15.000,0002 000005 01/01/04 000023 13.13000 5.600,0002 000007 20/01/04 000016 15.15140 5.600,00

03 000001 01/01/04 000002 11.11014 15.000,0003 000005 01/01/04 000023 13.13000 5.600,0003 000007 20/01/04 000016 15.15140 5.600,00

A1_FILIAL A1_COD A1_NOME

000015 FABRICA DE TINTAS E VERINIZES LTDA /SP 000016 TEX MALHAS E CONFECCOES S.A /SP 000001 CLIENTE PADRAO 000020 ARMANDO JOSE FLORES /SC 000007 COMERCIO SOM DO MUNDO /SP

xFilial(“SA1”) “ “

xFilial(“SC5”) cFilAnt

Ex: SA1 - Compartilhado

Ex: SC5 - Exclusivo

Modo de Acesso

Page 27: Curso AdvPL

Arquivos de Índices

REGISTRO A1_FILIAL A1_COD A1_NOME

01 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP02 000016 TEX MALHAS E CONFECCOES S.A /SP03 000001 CLIENTE PADRAO04 000020 ARMANDO JOSE FLORES /SC05 000007 COMERCIO SOM DO MUNDO /SP

• Todo arquivo precisa ter pelo menos um índice

• Índice Primário: acesso direto ao registro verificação de chave duplicada

• Ordenação de registros

CHAVE REGISTRO

000001 03000007 05000015 01000016 02000020 04

Índices

Page 28: Curso AdvPL

Arquivos de Índices

•Um arquivo pode ter até 35 índices (1...9, A...Z)•dbSetOrder(n), onde n = 1...35 função para selecionar o índice.•Além dos índices originais, usuários podem incluir seus próprios índices.•Caso a Microsiga inclua novos índices, os do usuário serão renumerados.

Índices

• Portanto, índices de usuário devem sempre ter um NickName. Deve-se usar a função dbOrderNickName(“NICKNAME”)

• Índices do sistema, nunca terão NickName. Usa-se dbSetOrder().

SA1 – índices do Sistema 12...7

índice do Usuário 8 A1_TIPO

Nos programas: dbSetOrder(8)

novo índice do Sistema 8 índice do Usuário 9 A1_TIPO

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

Nos programas: dbOrderNickName(“TIPO”)

X

Page 29: Curso AdvPL

•Parâmetros, Tabelas, Perguntas•Fórmulas - Expressões em AdvPL / User Function

•Validações, Gatilhos, Campos de Arquivos•User Function via menu•Pontos de Entrada•Dicionário de Dados Ativo•SigaRPM, Crystal, Excel

Customização

Page 30: Curso AdvPL

Customização

Page 31: Curso AdvPL

Parâmetros: arquivo SX6

cESTNEG := GetMV(“MV_ESTNEG”)

If cESTNEG == “S” .Or. QtdVenda < B2_Saldo tratamento normal Else tratamento de erro EndIf

“S” 100 200V V“S” 201 200V F“N” 100 200F V“N” 201 200F F

CustomizaçãoParâmetros

Page 32: Curso AdvPL

Tabelas: arquivo SX5

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

CustomizaçãoTabelas

Page 33: Curso AdvPL

Perguntas: arquivo SX1

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

As respostas também são gravadas

CustomizaçãoPerguntas

Page 34: Curso AdvPL

APOMATA460A

APOMATA460A

SERVER

Emissão NF

Compilação

Execução doMATA460A

Preço := SC6->C6_PRCVEN * 1.25

Execução doMATA460A

Preço := SC6->C6_PRCVEN * 1.25

Programa-fonte

MATA460A – Emissão NF

Preço := SC6->C6_PRCVEN * 1.25“SC6->C6_PRCVEN * 1.25”

Fórmulas

SC6->C6_P

RCVEN *

1.25

Exemplo: PreçoUm Pedido de Venda é incluído 100,00Na emissão da NF, o preço deve ser reajustado em 25% 125,00

RPO

MATA460A

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

Preço := &Formula

Preço := &Formula

Page 35: Curso AdvPL

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

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

-No Pedido é preenchido o código da fórmula de reajuste (campo “Tipo Reajuste”)

-No Programa de emissão da nota fiscal: Preço := &Formula (Obs: a pergunta “Reajuste na mesma NF?” precisa estar com SIM)

Fórmula 001 - Reajuste fixo:

“SC6->C6_PRCVEN * 1.25”

Fórmula 002 - Reajuste se preço em dólar:

“SC6->C6_PRCVEN * RecMoeda(dDataBase,’2’)”

Fórmula 003 - Reajuste pelo dólar:

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

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

Page 36: Curso AdvPL

FONTE

InterpretadorRun TimeServerMaquina Virtual

PCode

Executável +Interpretador Executável

Delphi, CClipper, Visual Objects

Visual Basic, AdvPlAbap, Oracle,Java

DBase, Access

Tipos de Processamento

Page 37: Curso AdvPL

A=A+BA=5

965534567654

23456

7654

A = A + &B

3

MACRO

End 35

A = 7

Compilação

Page 38: Curso AdvPL

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

Campo Cód.Cliente: ExistChav(“SA1”) Campo Natureza: ExistCpo(“SED”) Campo Estado: ExistCpo(“SX5”, “12”+M->A1_EST) Campo CNPJ: CGC(M->A1_CGC)

CustomizaçãoValidações

Page 39: Curso AdvPL

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

CustomizaçãoGatilhos

Campo: D1_VUNITContra-Dominio: D1_TOTALRegra: Round(M->D1_VUNIT * M->D1_QUANT, 2)

Exemplo: na digitação da NF de Compra

Quant. Vr.Unit. Total

10 2,00 20,00

Page 40: Curso AdvPL

Campos: Campos dos Lançamentos Padronizados (SI5)

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

CustomizaçãoCampos de Arquivos

Page 41: Curso AdvPL

• Executa uma série de comandos, retornando um valor;• Precisa ser compilado;• O resultado é um objeto que é armazenado no Repositório.

Ex:

Customização

Lançamento Padronizado (SI5)

Débito: u_ContaDeb()

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)

User Function

Page 42: Curso AdvPL

•São pontos pré-determinados, onde o usuário pode escrever uma nova rotina em substituição àquela existente ou adicionar algum processamento.

•Cada Ponto de Entrada é identificado pelo nome de uma Função.

If ExistBlock(“CalcSaldo”) u_CalcSaldo() EndIf

•Para utilizá-lo, deve-se escrever uma função com este mesmo nome.

User Function CalcSaldo() ... Return

•Os Pontos de Entrada estão descritos no DEM.

•Exemplo: pode-se alterar a rotina de cálculo do ICMS ou do IPI no programa de Preparação de Nota Fiscal de Vendas escrevendo um P.E.

CustomizaçãoPonto de Entrada

Page 43: Curso AdvPL

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

#Include “RWMake.ch"

User Function MT010ALT()

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

Return Nil

Exemplo de Ponto de Entrada

Page 44: Curso AdvPL

•Dicionário de Dados•Menus

Configurador - SIGACFG

Page 45: Curso AdvPL

Crie um parâmetro (SX6) para o limite máximo por transação:

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

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

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

Exercícios

Page 46: Curso AdvPL

Crie uma Fórmula (SM4) para reajustar o preço dos produtos da Fábrica de Chaveiros:

Código: 001

Descrição: REAJUSTE DE PREÇO

Fórmula: SB1->B1_PRV1 * 1.25 SIGACFG: menu Ambiente / Cadastros / Formulas

Exercício

Crie um Gatilho que apresente o valor total do item:

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

Page 47: Curso AdvPL

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

Exercício

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

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

Page 48: Curso AdvPL

Crie um Ponto de Entrada para modificar o cálculo do Saldo após um Saque, considerando apenas 60% do seu valor.

Exercício

Page 49: Curso AdvPL

Mostrar o lançamento 666 - RequisiçãoLançamento Contábil Automático

Exercício

Page 50: Curso AdvPL

Case

Sistema de Contas Correntes

Page 51: Curso AdvPL

•Contas •Transações•Consultas•Relatórios•Excel•WorkFlow•TXT / XML•WebServices•AdvPL ASP

CaseSistema de Contas Correntes

Page 52: Curso AdvPL

CONTAS

Nome

E-Mail

E-Mail1

Saldo

CaseSistema de Contas Correntes

Tabelas do sistema

TRANSAÇÕES

Nome

Número da Transação

Item da Transação

Tipo (Depósito ou Saque)

Data

Histórico

Saldo Atual (virtual)

Valor

Aprovação

TemRefere-se

Page 53: Curso AdvPL

Prefixo: SZ1Path: \DATA\Nome: SZ1990Descrição: CONTASDesc.Esp.: CONTASDesc.Inglês: CONTASModo Acesso: COMPARTILHADO

Prefixo: SZ2Path: \DATA\Nome: SZ2990Descrição: TRANSAÇÕESDesc.Esp.: TRANSAÇÕESDesc.Inglês: TRANSAÇÕESModo Acesso: EXCLUSIVO

Modo de Acesso:

Compartilhado Filial = branco Exclusivo Filial = número da Filial (var. pública cFilAnt)

Função xFilial(Alias)

Exercício – Criação de Arquivos (SX2)

SIGACFG: menu Base de Dados / Dicionario / Arquivos

Page 54: Curso AdvPL

Criação de Campos (SX3)

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

Criação dos campos dos arquivos:

SZ1 – Cadastro de ContasSZ2 – Arquivo de Transações

•Ordem faz parte da chave do SX3•O cadastramento de um campo é dividido em pastas:

– Campo– Informações– Opções– Validações– Uso– Módulo

Page 55: Curso AdvPL

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

Real, Virtual

Alterar, Visualizar

Criação de Campos (SX3)

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

Page 56: Curso AdvPL

Criação de Campos (SX3)

Nome do cliente

Page 57: Curso AdvPL

D=Deposito;S=Saque

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

Cadastro de Contas (SZ1)

ComboBox. No campo será gravada a letra, no exemplo, D ou S.

F3Campo Z2_Nome

Criação de Campos (SX3)

Page 58: Curso AdvPL

01

23

45

67

89

0 a 9Define a permissão de acesso ao campo.

O Usuário só terá acesso a campos de nível igual ou menor que o seu nível.Exemplo: Usuário com nível

5 só terá acesso a campos com nível igual ou menor que 5.

01

23

45

67

89Nível dos

CamposNível doUsuário

Criação de Campos (SX3)

Exemplo: no Depto. Pessoal

Usuários: Campos:

Gerente – nível 9 Nome do Func.

– nível 5

Digitador – nível 5 Endereço – nível 4

Salário – nível 9

Page 59: Curso AdvPL

Criação de Campos (SX3)

Page 60: Curso AdvPL

Criação de Campos (SX3)

Page 61: Curso AdvPL

Campo Inform. Uso

Campo Tipo Tam. Dec. Formato Contexto Propr. Título Obrig Usa Brw

Z1_NOME Car 20 @! Real Alt. Nome

Z1_EMAIL Car 40 Real Alt. EMail

Z1_EMAIL1 Car 40 Real Alt. EMail1

Z1_SALDO Num 12 2 @E 999,999,999.99 Real Visual Saldo

Cadastrar os campos do SZ1

Exercício

CampoOpções

ValidaçõesLista de Opções Inic.Padrão

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

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

Z2_NUMERO GetSXENum(“SZ2”, “Z2_NUMERO”)

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

Z2_DATA dDataBase

Z2_TIPO D=Deposito;S=Saque “D”

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

Page 62: Curso AdvPL

Campo Inform. Uso

Campo Tipo Tam. Dec. Formato Contexto Propr. Título Obrig Usa Brw

Z2_NOME Car 20 @! Real Alt. Nome

Z2_NUMERO Car 4 Real Visual Numero

Z2_ITEM Car 2 99 Real Alt. Item

Z2_DATA Data 8 Real Alt. Data

Z2_TIPO Car 1 Real Alt. Tipo

Z2_HIST Car 20 Real Alt. Historico

Z2_VALOR Num 12 2 @E 999,999,999.99 Real Alt. Valor

Z2_SLDATU Num 12 2 @E 999,999,999.99 Virtual Visual Saldo

Z2_APROV Car 3 Real Visual Aprovado

ExercícioCampos do SZ2 (já estão cadastrados)

Page 63: Curso AdvPL

Chave Nickname

SZ1 Z1_Filial + Z1_Nome NOME

SZ2 Z2_Filial + Z2_Numero + Z2_Item NR_ITZ2_Filial + Z2_Nome + Z2_Numero + Z2_Item NOME_NR_IT

Exercício

34

2

1

Criação dos Índices

Page 64: Curso AdvPL

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

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

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

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

SIGACFG: menu Base de Dados / Dicionario / Gatilhos

Exercícios

Page 65: Curso AdvPL

Crie em ERP o menu do Sistema de Contas CorrentesSIGACFG: menu Ambiente / Cadastro / Menus

Exercício

Contas Corrente

s

Atualizações

Consultas

Programa:

Con001

Relatórios

Programa:

Rel001

Contas

Programa:

Cad

Transações

Modelo 1

Programa:

TranM1

Modelo 2

Programa:

TranM2

Modelo 3

Programa:

TranM3

Page 66: Curso AdvPL

Aula 2Programação

Comandos e funçõesOperadores

IDEVariáveis de memória

ArrayFunções

Page 67: Curso AdvPL

Programação

Page 68: Curso AdvPL

• Aquário

• 3 cestos com bolas pretas e brancas e etiquetas erradas

Exercícios de Lógica

PretaBranca

BrancaBranca

PretaPreta

Page 69: Curso AdvPL

PretaBranca

BrancaBranca

PretaPreta

3 cestos: 1ª hipótese

Page 70: Curso AdvPL

PretaBranca

BrancaBranca

PretaPreta

3 cestos: 2ª hipótese

Page 71: Curso AdvPL

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

Page 72: Curso AdvPL

Entre 0 horas e 24 horas quantas vezes os ponteiros se cruzam, contando inclusive o cruzamento das 0 horas e das 24 horas?

Cruzamento dos ponteiros do relógio

Page 73: Curso AdvPL

Resposta: 23 vezes

Page 74: Curso AdvPL

Quatro pessoas tem de atravessar uma passarela bamba. Há muitos buracos na passarela, que suporta apenas 2 pessoas de cada vez (mais que isso, ela cai). O grupo deve usar uma lanterna para guiar seus passos, caso contrário acabará caindo no buraco e morrendo. Só há uma lanterna. As 4 pessoas andam em velocidades diferentes. Antonio cruza a passarela em 1 minuto. Bernardo em 2 minutos. Carlos leva 5 minutos. O mais lento, Roberto, leva 10 minutos. A passarela vai ruir dentro de exatamente 17 minutos.

Como os 4 podem atravessá-la?

Travessia da passarela

Page 75: Curso AdvPL

•Vai o 1 e 2 2

•Volta o 1 3

•Vai o 5 e 10 13

•Volta o 2 15

•Vai o 1 e 2 17

Resposta

Page 76: Curso AdvPL

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

Instruções básicas de uma Linguagem:

Programa

Aritméticas:

Somar / Subtrair / Multiplicar / Dividir

Entrada e Saida:

Ler / Gravar / Tela / Impressão / Teclado / Atribuição

Lógicas:

If...Else...EndIf For...Next While...End Do Case...EndCase

Page 77: Curso AdvPL

Inicio

ArmarDespertador

DesligarDespertador

Bocejar

Sair da Cama

Sacudir aEsposa

Está Escuro ?

Está Frio ?

Ir ao Banheiro

Tomar Café

A

Ir até ocarro

Voltarpara pegá-las

Beijar aesposa

Dirigir-seao escritório

Resmungar

Beijar aesposa

Dar-lheR$ 100,00

Acendera luz

Voltar para a cama

Fim

EstáCom as

Chaves ?

Casado há mais de

1 ano ?

A Esposaquer $$ ?

Casadohá mais de

5 anos ?

A

Sim

Sim

Sim

Sim

Não

Sim

Não

Não

Não

Repetir3

vezes

Não

PossívelFim

da rotina

Não

Sim

Page 78: Curso AdvPL

+ - * / ** ou ^ %

Operadores

x := 10 + 20

nValor := nQtde * nPreco

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

Matemáticos

Page 79: Curso AdvPL

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

If nQtde < nSaldo

MsgAlert(“Pedido liberado”)

Else

MsgAlert(“Pedido bloqueado: estoque insuficiente”)

EndIf

If nSalario > 1257

nIR := 15

EndIf

OperadoresRelacionais

Page 80: Curso AdvPL

.And. .Or. .Not. ou !

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

Liberar venda

EndIf

cCredito == “OK”

.And.

nQtde < nSaldo

V V V

V F F

F V F

F F F

OperadoresLógicos

Page 81: Curso AdvPL

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

MsgAlert("OK, pode faturar!")

Else

MsgAlert("Estoque insuficiente!")

EndIf

cEstNeg == “S”

.Or.nQtdeVenda <

nSaldo

V V V

V F V

F V V

F F F

Operadores

.And. .Or. .Not. ou !

Lógicos

Page 82: Curso AdvPL

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 )

V V V V

V V F V

V F V V

V F F F

F V V V

F V F V

F F V V

F F F F

Operadores

.And. .Or. .Not. ou !

Lógicos

Page 83: Curso AdvPL

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 )

V V V V V

V V F V V

V F V V V

V F F F F

F V V V F

F V F V F

F F V V F

F F F F F

Operadores

.And. .Or. .Not. ou !

Lógicos

Page 84: Curso AdvPL

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

... ... ...

EndIf EndIf EndIf

Operadores

.And. .Or. .Not. ou !

Lógicos

Page 85: Curso AdvPL

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

x := 10

x := x + 20

é o mesmo que: x += 20

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

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

OperadoresAtribuição

Page 86: Curso AdvPL

i++ equivale a i := i + 1

i := 1

MsgAlert(i++)

i := 1

MsgAlert(++i)

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

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

i := i + 1

i := 1equivale a i := i + 1

MsgAlert(i) mostra 2

OperadoresIncremento / Decremento

Page 87: Curso AdvPL

x + y x - y x $ y

Concatenação cNome := “João”

cSobreNome := “Silva”

cNomeCompleto := cNome + cSobreNome “JoãoSilva”

“A ” - “B” “AB ”

Pertence “Silva” $ cNomeCompleto .T.

“SILVA” $ cNomeCompleto .F.

OperadoresStrings

Page 88: Curso AdvPL

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

: Objetos oBotao:cCaption := “OK”

OperadoresEspeciais

Page 89: Curso AdvPL

1. Criar atalho do IDE (\erp811\bin\remote\mp8ide.exe)2. Criar um novo projeto3. Criar um novo arquivo4. Digitar o primeiro programa5. Salvá-lo na pasta \erp811\My Projects6. Inseri-lo no projeto7. Compilar: Usuário: Administrador

Senha: admin

8. Executar

IDE – Primeiro Programa

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

User Function Se()

Local nX := 10

If nX > 5

MsgAlert("Maior")

EndIf

Return

Page 90: Curso AdvPL

Organização dos Programas-Fonte

Projeto (.PRJ)

Programa (.PRW) FunçãoFunçãoFunção

Programa (.PRW) FunçãoFunçãoFunção

Programa (.PRW) FunçãoFunçãoFunção

Page 91: Curso AdvPL

Cadastro

Nome:

Variáveis de Memória

José

Nome

A1_NOMEJosé

D2_VALOR1000

1000

Valor

ICMS = Valor * 18 / 100

Memória

José

CPU

Armazenamento temporário de dados

Page 92: Curso AdvPL

Caractere “Casa”

Numéricas 1234.56

Data CtoD(“25/10/05”)

Lógicas .T. .F.

Tipos de Variáveis de Memória

Notação Húngara:

cTexto

nValor

dData

lOk

X := 1

X := X + 1

X := “José”

n

c

n n

X é numérico

Operação matemática

X agora é caracter

ERRO !

nX é numérico

cX é caracter

Page 93: Curso AdvPL

Caractere “Casa”

Numéricas 1234.56

Data CtoD(“25/10/05”)

Lógicas .T. .F.

Tipos de Variáveis de Memória

Ver Operadores.PRWExercicio

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

Exemplo:

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

Notação Húngara:

cTexto

nValor

dData

lOk

Page 94: Curso AdvPL

Array, Vetor ou Matriz

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

aNomes[1]

aNomes[2]

aNomes[3]

aNomes[4]

cNome1 := “Joao”

cNome2 := “Alberto”

cNome3 := “Pedro”

cNome4 := “Maria”

Variáveis do tipo Caracter: uma para cada nome

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

Joao Alberto Pedro Maria

Joao Alberto Pedro Maria

cNome1 cNome2 cNome3 cNome4

aNomes

Memória

Page 95: Curso AdvPL

Joao Alberto Pedro Maria

Joao Alberto Pedro Maria

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

Armário

Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4

Variáveis

Array

Array, Vetor ou Matriz

Page 96: Curso AdvPL

Gaveta 1

Gaveta 2

Gaveta 3

Gaveta 4

Joao

Alberto

Pedro

Maria

Array, Vetor ou Matriz

Page 97: Curso AdvPL

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

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

{“Alberto”, 18, .F.},;

{“Pedro” , 40, .T.},;

{“Maria” , 33, .F.}}

aMatriz[1][1]

aMatriz[1][2]

aMatriz[1][3]

aMatriz[2][1]

aMatriz[2][2]

aMatriz[2][3]

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

Um array pode conter tipos diferentes de dados

Um array pode conter outros arrays: Matriz

aMatriz[1]

aMatriz[2]

Array, Vetor ou Matriz

Page 98: Curso AdvPL

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

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

{“Alberto”, 18, .F.},;

{“Pedro” , 40, .T.},;

{“Maria” , 33, .F.}}

Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4

Joao 25 T Alberto 18 F Pedro 40 T Maria 33 F

1 2 3 1 2 3 1 2 3 1 2 3

Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4

Joao

25

T

Alberto

18

F

Pedro

40

T

Maria

33

F

1

2

3

1

2

3

1

2

3

1

2

3

Array, Vetor ou Matriz

Page 99: Curso AdvPL

aNomes := {}

AAdd(aNomes, “Joao”)

AAdd(aNomes, “Alberto”)

AAdd(aNomes, “Pedro”)

AAdd(aNomes, “Maria”)

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

Adicionar elementos num array vazio

Array, Vetor ou Matriz

AAdd(aMatriz, {“Joao”,25,.T.})

AAdd(aMatriz, {“Alberto”,18,.F.})

AAdd(aMatriz, {“Pedro”,40,.T.})

AAdd(aMatriz, {“Maria”,33,.F.})

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

Page 100: Curso AdvPL

aArray := Array(5)

aArray {Nil, Nil, Nil, Nil, Nil}

Atribuição de valor aos elementos do array

aArray[1] := “A”

aArray[2] := “B”

aArray[3] := “C”

aArray[4] := “D”

aArray[5] := “E”

aArray {“A”, “B”, “C”, “D”, “E”}Ver 050_Array.prw

Exercicio: fazer o sort de um array

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

Array, Vetor ou Matriz

Page 101: Curso AdvPL

Funções

User Function Teste()

Comandos Comandos Comandos Comandos

Return

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

Programa.PRW

Conjunto de Comandos

Page 102: Curso AdvPL

Funções

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

Return lOK

User Function CadFor()

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

Return

CGC do Cliente

CGC

do F

orne

cedo

r

.T. o

u .F.

.T. o

u .F.

Rotinas repetitivas

Page 103: Curso AdvPL

Funções

User Function Relato() u_PreparaImpr() u_LeDados() u_Imprime()Return

User Function PreparaImpr() ...Return

User Function LeDados() ...Return

User Function Imprime() ...Return

Programação Estruturada

Page 104: Curso AdvPL

Funções

User Function Venda() nImposto := u_ICMS(“NE”, 1000)

ReturnUser Function ICMS(cRegiao, nValor)

If cRegiao == “SE”

nICMS := nValor * 18 / 100

ElseIf cRegiao == “NE”

nICMS := nValor * 7 / 100

Else

nICMS := nValor * 12 / 100

EndIf

Return nICMS

“NE” 1000

Passagem de parâmetros

Page 105: Curso AdvPL

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

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

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

Static Visível somente no programa (PRW)

Escôpo das Variávies

Page 106: Curso AdvPL

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 Conteúdo

PRIVATE Conteúdo

PUBLIC Conteúdo

Escôpo das Variávies

Page 107: Curso AdvPL

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 Conteúdo

cVar Func1

PRIVATE Conteúdo

PUBLIC Conteúdo

Escôpo das Variávies

Page 108: Curso AdvPL

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 Conteúdo

cVar

cVar1

Func2

Func2

PRIVATE Conteúdo

cVar2 Private Func2

PUBLIC Conteúdo

cVar3 Public Func2

Escôpo das Variávies

Page 109: Curso AdvPL

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

PRIVATE Conteúdo

cVar2 ABC

PUBLIC Conteúdo

cVar3 Public Func2

LOCAL Conteúdo

Escôpo das Variávies

Page 110: Curso AdvPL

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 Conteúdo

cVar

cVar1

Func2

Func2

PRIVATE Conteúdo

cVar2 ABC

PUBLIC Conteúdo

cVar3 Public Func2

Escôpo das Variávies

Page 111: Curso AdvPL

Ver 052_EscopoVar.prw

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 Conteúdo

cVar Func1

PRIVATE Conteúdo

PUBLIC Conteúdo

cVar3 Public Func2

Escôpo das Variávies

Page 112: Curso AdvPL

Passagem de Parâmetros

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

User Function ICMS(cRegiao, nValor)

If cRegiao == “SE”

nICMS := nValor * 18 / 100

ElseIf cRegiao == “NE”

nICMS := nValor * 7 / 100

Else

nICMS := nValor * 12 / 100

EndIf

Return nICMS

“NE” 1000São

criadas variáveis LOCAIS

“NE” 1000

Por Valor

Page 113: Curso AdvPL

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

x = 1y = 2

Ver 060_Param.prw

Passagem de ParâmetrosPor Valor

Page 114: Curso AdvPL

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

x = 1y = 2

x = 50y = 100

Passagem de ParâmetrosPor Valor

Ver 060_Param.prw

Page 115: Curso AdvPL

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

x = 1y = 2

Passagem de ParâmetrosPor Valor

Ver 060_Param.prw

Page 116: Curso AdvPL

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

x = 1y = 2

Passagem de ParâmetrosPor Referência

Ver 060_Param.prw

Page 117: Curso AdvPL

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

x = 50y = 2

y = 100

Passagem de ParâmetrosPor Referência

Ver 060_Param.prw

Page 118: Curso AdvPL

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

x = 50y = 2

Passagem de ParâmetrosPor Referência

Ver 060_Param.prw

Page 119: Curso AdvPL

Funções de Caracteres, Números e Datas

Ver 053_Tratamentos.PRW

•Manipulação de textos (strings)•Conversão de números•Funções de data e hora•Conversão de datas

Page 120: Curso AdvPL

Aula 3Macro

Bloco de CódigoUDC

SemáforosArquivos e Índices

Page 121: Curso AdvPL

Macro-Substituição

User Function Reajuste()

dbSelectArea("SB1")

dbGoTop()

While !SB1->(Eof())

RecLock("SB1")

SB1->B1_Prv1 := SB1->B1_Prv1 * 1.25

MSUnlock()

SB1->(dbSkip())

End

MsgInfo("Terminou!")

Return

Page 122: Curso AdvPL

User Function Reajuste()

Local cFormula

dbSelectArea("SM4")dbSetOrder(1)dbSeek(xFilial("SM4") + "001")cFormula := SM4->M4_Formula

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

MsgInfo("Terminou!")

Return

Ver Reajuste.PRW

&(SB1->B1_Prv1 * 1.25)SB1->B1_Prv1 * 1.25

M4_FILIAL: “01”

M4_CODIGO: “001”

M4_FORMULA: “SB1->B1_Prv1 * 1.25”

Arquivo SM4 - Fórmulas

“SB1->B1_Prv1 * 1.25”

Macro-Substituição

Page 123: Curso AdvPL

•Validações “If(M->I2_Valor < GetMV(‘MV_VRMAX’), .T., .F.)”

•Gatilhos “M->D1_QUANT * M->D1_VUNIT”

•Fórmulas “SB1->B1_Prv1 * 1.25”

•Lançamentos Contábeis Automáticos “If(SD3->D3_TIPO=‘MC’, ‘33201’+SD3->D3_CC, ‘11303’)”

Macro-SubstituiçãoAplicação de Macros

Page 124: Curso AdvPL

Bloco de Código

bBloco := {|| 2 * 10}

nResult := EVal(bBloco)

bBloco := {|x| x * 2}

nResult := EVal(bBloco, 5)

nResult = 20

nResult = 10

Ver 051_Bloco.prw

Page 125: Curso AdvPL

Ver AEval em 050_Array.prw

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

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

DBEval()

Bloco de Código

Page 126: Curso AdvPL

aMatriz := { , , , }

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

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

Ver 050_Array.prw

Bloco de Código

{“Joao ”,15} {“Maria ”,30}{“Pedro ”,10}

.T..F..T.

Ordenação de array

Page 127: Curso AdvPL

aMatriz := { , , , }

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

{“Joao ”,15} {“Pedro ”,10}{“Joao ”,15}

Bloco de Código

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

.F..T..T.

Ordenação de array

Ver 050_Array.prw

Page 128: Curso AdvPL

Instruções para o Compilador

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

UDC – User Defined Command

Ver 080_UDC.prw

Legibilidade e Manutenibilidade do Fonte

Page 129: Curso AdvPL

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

ConfirmSX8() Confirma o número

RollBackSX8() Reutiliza o número

MayIUseCode(Alias) Confirma se o número está mesmo disponível

APCFG110 Manutenção do SXE/SXF ou Hardlock

Semáforos

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

001002003004005

003004006007008

Exemplo:

Exemplos em 120_TranM2

Controle de numeração sequencial

Page 130: Curso AdvPL

Arquivos

Page 131: Curso AdvPL

SA - CadastrosSB - EstoquesSC - Previsões de E/SSD - Mov. De EstoqueSE - FinanceiroSF - FiscalSG - EstruturasSH - Carga de MáquinaSI - ContábilSJ - EstatísticasSM - MiscelâneasSN - Ativo Fixo

SO - Assist. TécnicaSP - Ponto EletrônicoSQ - Recr. e SeleçãoSR - Folha de PagtoST - Manut. IndustrialSU - TelemarketingSV - ConcessionáriasSW e SY - Export./Import.Q? - Qualidade (Celerina)R? - Recursos HumanosSZ,QZ,RZ - LivresP? - Projetos Especiais

M.E.R. Modelo de Entidades e Relacionamento

Famílias de Arquivos de Dados

Page 132: Curso AdvPL

Principais Arquivos de Dados

Prefixo DescriçãoSA1 Cadastro de ClientesSA2 Cadastro de FornecedoresSA3 Cadastro de VendedoresSB1 Cadastro de ProdutosSB2 Saldos dos Produtos por AlmoxarifadoSB5 Dados Complementares de ProdutosSC1 Solicitações de ComprasSC5 Cabeçalho dos Pedidos de VendaSC6 Itens dos Pedidos de VendaSC7 Pedidos de ComprasSD1 Itens das Notas Fiscais de EntradaSD2 Itens das Notas Fiscais de SaídaSD3 Movimentações Internas de ProdutosSE1 Títulos a ReceberSE2 Títulos a PagarSF1 Cabeçalho das Notas Fiscais de EntradaSF2 Cabeçalho das Notas Fiscais de SaídaSI1 Plano de ContasSI2 Lançamentos Contábeis

Page 133: Curso AdvPL

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 arquivonn = Empresa

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

Page 134: Curso AdvPL

Arquivos de Dados – por Empresa

Nomenclatura dos campos:

Arquivo SA1: A1_FILIAL SA2:A2_FILIAL SB1:B1_FILIAL QA1:QA1_FILIALA1_COD A2_COD B1_COD QA1_CODA1_NOME A2_NOME B1_DESC QA1_DESCA1_END A2_END B1_TIPO

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

Page 135: Curso AdvPL

Arquivos de Dados

Compartilhado registros compartilhados entre as filiaisCampo Filial: em branco

Exclusivo o registro é exclusivo da filialCampo Filial: código da Filial (variável cFilAnt)

C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR

01 000001 01/01/04 000002 11.11014 15.000,0001 000005 01/01/04 000023 13.13000 5.600,0001 000007 20/01/04 000016 15.15140 5.600,00

02 000001 01/01/04 000002 11.11014 15.000,0002 000005 01/01/04 000023 13.13000 5.600,0002 000007 20/01/04 000016 15.15140 5.600,00

03 000001 01/01/04 000002 11.11014 15.000,0003 000005 01/01/04 000023 13.13000 5.600,0003 000007 20/01/04 000016 15.15140 5.600,00

A1_FILIAL A1_COD A1_NOME

000015 FABRICA DE TINTAS E VERINIZES LTDA /SP 000016 TEX MALHAS E CONFECCOES S.A /SP 000001 CLIENTE PADRAO 000020 ARMANDO JOSE FLORES /SC 000007 COMERCIO SOM DO MUNDO /SP

xFilial(“SA1”) “ “

xFilial(“SC5”) cFilAnt

Ex: SA1 - Compartilhado

Ex: SC5 - Exclusivo

Modo de Acesso

Page 136: Curso AdvPL

01 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP02 000016 TEX MALHAS E CONFECCOES S.A /SP03 000001 CLIENTE PADRAO04 000020 ARMANDO JOSE FLORES /SC05 000007 COMERCIO SOM DO MUNDO /SP06 000024 JOAO DA SILVA /SP07 000008 FLORICULTURA FULO DE MARAVILHA /SP08 000023 PREFEITURA MUNICIPAL DE SAO PAULO /SP09 000002 ECOSSISTEMA DIGITAL S/A10 000026 ACTIONVEA IMP. EXP.11 000027 STARMEAL LEAK S.A.12 000028 REIZA KERN IMP. EXP.13 000019 JOAO DE ALMEIDA SILVA /RS14 000033 DESPACHANTE15 000030 IMPORTADOR EUA

000001 03000002 09000007 05000008 07000015 01000016 02000019 13000020 04000023 08000024 06000026 10000027 11000028 12000030 15000033 14

RECNO A1_COD A1_NOMECODIGO REGISTRO

ArquivoÍndice: CÓDIGO

Arquivos e Índices

Page 137: Curso AdvPL

01 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP02 000016 TEX MALHAS E CONFECCOES S.A /SP03 000001 CLIENTE PADRAO04 000020 ARMANDO JOSE FLORES /SC05 000007 COMERCIO SOM DO MUNDO /SP06 000024 JOAO DA SILVA /SP07 000008 FLORICULTURA FULO DE MARAVILHA /SP08 000023 PREFEITURA MUNICIPAL DE SAO PAULO /SP09 000002 ECOSSISTEMA DIGITAL S/A10 000026 ACTIONVEA IMP. EXP.11 000027 STARMEAL LEAK S.A.12 000028 REIZA KERN IMP. EXP.13 000019 JOAO DE ALMEIDA SILVA /RS14 000033 DESPACHANTE15 000030 IMPORTADOR EUA

RECNO A1_COD A1_NOMENOME REGISTRO

ArquivoÍndice: NOME

ACTIONVEA.. 10ARMANDO J.. 04CLIENTE P.. 03COMERCIO .. 05DESPACHAN.. 14ECOSSISTE.. 09FABRICA D.. 01FLORICULT.. 07IMPORTADO.. 15JOAO DA S.. 06JOAO DE A.. 13PREFEITUR.. 08REIZA KER.. 12STARMEAL .. 11TEX MALHA.. 02

Arquivos e Índices

Page 138: Curso AdvPL

RECNO C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR

1 000001 01/01/04 000002 11.11014 15.000,002 000005 01/01/04 000023 13.13000 5.600,003 000007 20/01/04 000016 15.15140 5.600,004 000008 27/01/04 000024 13.13001 1.000,005 000009 01/01/04 000008 11.11000 3.450,00

Arquivo: SC5990 Alias: SC5 Pedidos de Venda

RECNO A1_COD A1_NOME

1 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP2 000016 TEX MALHAS E CONFECCOES S.A /SP3 000001 CLIENTE PADRAO4 000020 ARMANDO JOSE FLORES /SC5 000007 COMERCIO SOM DO MUNDO /SP6 000024 JOAO DA SILVA /SP7 000008 FLORICULTURA FULO DE MARAVILHA /SP8 000023 PREFEITURA MUNICIPAL DE SAO PAULO /SP9 000002 ECOSSISTEMA DIGITAL S/A10 000026 ACTIONVEA IMP. EXP.

Arquivo: SA1990 Alias: SA1 Cadastro de Clientes

CODIGO REG

000001 3000002 9000007 5000008 7000015 1000016 2000020 4000023 8000024 6000026 10

Índices

RECNO B1_COD B1_DESC B1_TIPO B1_UM

1 11.11014 PROD. DE REVENDA PA UN2 11.11000 PROD. ACABADO PA UN3 12.12006 MAT. PRIMA 1 – QUALITY MP UN4 13.13001 CAIXA GRANDE – PA PA CX5 11.11003 MAT. PRIMA MP UN6 15.15140 ALCOOL ETILICO MC L7 33.03323 LUVA MP UN8 13.13000 CAIXA PEQUENA – PA PA CX

CODIGO REG

11.11000 211.11003 511.11014 112.12006 313.13000 813.13001 415.15140 633.03323 7

Arquivo: SB1990 Alias: SB1 Cadastro de ProdutosÍndices

dbSelectArea(“SA1”)dbSetOrder(1)dbSeek(“000002”)

dbSelectArea(“SB1”)dbSetOrder(1)dbSeek(“11.11014”)

dbSelectArea(“SA1”)

dbSelectArea(“SB1”)

dbSelectArea(“SC5”)

Posicionamento de registrodbSkip()

dbSkip()dbSkip()dbSkip()

Arquivos e Índices

Page 139: Curso AdvPL

Posicionamento de Arquivos

RECNO C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR

1 01 000001 01/01/04 000002 11.11014 15.000,002 01 000005 01/01/04 000023 13.13000 5.600,003 01 000007 20/01/04 000016 15.15140 5.600,004 01 000008 27/01/04 000024 13.13001 1.000,005 01 000009 01/01/04 000008 11.11000 3.450,00

6 02 000001 01/01/04 000002 11.11014 15.000,007 02 000005 01/01/04 000023 13.13000 5.600,008 02 000007 20/01/04 000016 15.15140 5.600,009 02 000008 27/01/04 000024 13.13001 1.000,0010 02 000009 01/01/04 000008 11.11000 3.450,00

11 03 000001 01/01/04 000002 11.11014 15.000,0012 03 000005 01/01/04 000023 13.13000 5.600,0013 03 000007 20/01/04 000016 15.15140 5.600,0014 03 000008 27/01/04 000024 13.13001 1.000,0015 03 000009 01/01/04 000008 11.11000 3.450,00

FILIAL+NUM REG

01000001 101000005 201000007 301000008 401000009 5

02000001 602000005 702000007 802000008 902000009 10

03000001 1103000005 1203000007 1303000008 1403000009 15

dbGoTop()

Empresa: XX Filial: 02

dbSeek(xFilial(“SC5”))

Page 140: Curso AdvPL

Posicionamento de Arquivos

RECNO Z2_FILIAL Z2_NUMERO Z2_ITEM

1 01 0001 012 01 0001 023 01 0001 034 01 0002 015 01 0002 02

6 01 0003 017 01 0003 028 01 0003 03

9 01 0004 0110 01 0004 02

FILIAL+NUMERO+ITEM REG

01000101 101000102 201000103 301000201 401000202 5

01000301 601000302 701000303 8

01000401 901000402 10

dbGoTop() Posiciona no topo do arquivo

While !EOF()

dbSkip() Leitura sequencial, registro a registro

End

EOF() .T.

Leitura sequencial

Page 141: Curso AdvPL

Posicionamento de Arquivos

RECNO Z2_FILIAL Z2_NUMERO Z2_ITEM

1 01 0001 012 01 0001 023 01 0001 034 01 0002 015 01 0002 02

6 01 0003 017 01 0003 028 01 0003 03

9 01 0004 0110 01 0004 02

FILIAL+NUMERO+ITEM REG

01000101 101000102 201000103 301000201 401000202 5

01000301 601000302 701000303 8

01000401 901000402 10

dbSeek(xFilial(“SZ2”)+”0003”+”02”) Chave completa

Por chave completa ou parcial

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

Acesso direto ao registro

Page 142: Curso AdvPL

Sobre arquivos…

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

• A navegação nos registros é em ordem do índice selecionado - dbSetOrder(n). Se for selecionado dbSetOrder(0), a navegação será pela ordem física dos registros (Recno);

• No SIX, os índices são numerados de 1 a 9 e A, B,... (campo ORDEM). No dbSetOrder(): 1...9, 10, 11...;

• dbSkip() – avança 1 registro;

• dbSkip(n) ou dbSkip(-n) – avança ou retrocede n registros;

• dbSelectArea(cAlias) – seleciona o arquivo. Caso ainda não esteja aberto, abre-o neste momento.

• A referência a um campo de arquivo com o seu Alias ( ex.: MsgAlert(SA1->A1_Nome) ), também abre o arquivo, caso não esteja aberto, mesmo sem um dbSelectArea() anterior.

• Na abertura do arquivo, o primeiro índice é selecionado. O ponteiro de registro é posicionado no primeiro registro físico (não pelo índice). A função dbGoTop(), posiciona no primeiro registro do índice selecionado;

• No Protheus MDI, os arquivos são abertos dentro da thread e fechados no seu encerramento. Na chamada à mesma rotina, mesmo em outra thread, concomitante ou não, os arquivos são reabertos e posicionados no topo e com o primeiro índice selecionado.

• No Protheus SDI, uma vez abertos, os arquivos permanecem assim, inclusive com o último posicionamento do ponteiro de registro e o índice selecionado. A função dbCloseArea() fecha o arquivo.

• No MDI: a abertura e o posicionamento de um mesmo arquivo em threads diferentes são independentes, ou seja, podem ser selecionados índices diferentes e o ponteiro de registros podem ser posicionados em registros diferentes também. O bloqueio de um mesmo registro é comum, ou seja, se o registro for bloqueado por um dos threads, o outro não poderá acessá-lo para alteração ou exclusão.

Page 143: Curso AdvPL

Aula 4AxCadastro

MBrowseModelo2Modelo3

Page 144: Curso AdvPL

Funções de Tratamento de

ArquivosAxCadastro,MBrowse,Modelo2,Mo

delo3

Page 145: Curso AdvPL

AxCadastro

AxPesqui()

AxVisual()

AxInclui()

AxAltera()

AxDeleta()

Page 146: Curso AdvPL

AxInclui()

Ver 100_Cad.prw

AxCadastro

Page 147: Curso AdvPL

Cadastre algumas contas

No campo E-Mail, coloque:[email protected]

E no E-Mail1, coloque:[email protected]

AxCadastro

Page 148: Curso AdvPL

MBrowse

Ver 110_TranM1.prw

Precisa de duas variáveis PRIVATE:

cCadastro Título da janela.

aRotina array onde devem ser incluidos os botões (no máximo, 10).

Esses botões podem ser associados a qualquer função, inclusive AxInclui(), AxAltera(), etc.

Permite uma flexibilidade maior que a AxCadastro

Page 149: Curso AdvPL

Sobre variáveis…

Referência a uma

variável

Variável

existe ?

Atribui o valor à variável

Existe um

arquivo aberto ?

Existe campo

com este

nome ?

Grava o valor no campo

É atribuiçã

o de valor?

Cria a variável

Erro: variável

não existe

Nome := “João”

“João” Var. Nome

“João” Campo Nome

Nome := “João”

Cria como privada

S

N

S

N

S N

S

N

Para não confundir variáveis de memória com campos de arquivos, usa-se o ALIAS:

M->Z1_Nome variável de memóriaSZ1->Z1_Nome campo de arquivo

Arquivo

Codigo Nome

João

Arquivo

Codigo Descricao

Page 150: Curso AdvPL

Sobre variáveis…

[email protected]

Para cada campo é criada uma variável de memória com o mesmo nome, onde os dados digitados ficam inicialmente armazenados, antes de ser efetivamente gravados no arquivo:

M->Z1_NOME M->Z1_EMAIL M->Z1_EMAIL1 M->Z1_SALDO

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

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

JOSE

[email protected]

Page 151: Curso AdvPL

• Ver FuncMod2• Ver MarkBrow (exemplo do Baile)

Funções de tratamento de arquivos

Page 152: Curso AdvPL

Modelo 2

Item Tipo Histórico Valor

Nome

Número

Data

En

choic

e

Variáveisde memória

GetD

ad

os

aHeader

aCols

Page 153: Curso AdvPL

Modelo 2

ItemZ2_ITEM

20

CSZ2R

TipoZ2_TIPO

10

CSZ2R

HistóricoZ2_HIST

200

CSZ2R

ValorZ2_VALOR@E 999,999,999.99122

NSZ2R

Nome

Número

Data

En

choic

eG

etD

ad

os

aHeader

aCols

Variáveisde memória

TituloCampoPictureTamanhoDecimalValid.UsadoTipoArquivoContexto

1

2

3

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6 7 8 910

01 D Deposito 10.000,00 .F.

02 S Saque 300,00 .F.

03 S Saque 2.500,00 .F.

Page 154: Curso AdvPL

mBrowse()

Monta os parametros:

1. Variáveis de memória2. aHeader3. aCols4. Enchoice

lRet := Modelo2()

Array aRotina

lRet

.T.

nOpc3

Inclusão

Alteração

4

5Exclusão

Modelo 2

Ver 120_TranM2.prw

Page 155: Curso AdvPL

Criação do aCols para Inclusão

Modelo 2

Page 156: Curso AdvPL

ItemZ2_ITEM

20

CSZ2R

TipoZ2_TIPO

10

CSZ2R

HistóricoZ2_HIST

200

CSZ2R

ValorZ2_VALOR@E 999,999,999.99122

NSZ2R

aHeader

aCols

TituloCampoPictureTamanhoDecimalValid.UsadoTipoArquivoContexto

1

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6 7 8 910

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

Nil

4

Modelo 2 – Criação do aCols para Inclusão

Nil Nil Nil Nil

Adiciona uma linha no aCols

Array(?)Array(5)

Page 157: Curso AdvPL

Nil Nil Nil Nil“ “ “D” “ “ 0,00

ItemZ2_ITEM

20

CSZ2R

TipoZ2_TIPO

10

CSZ2R

HistóricoZ2_HIST

200

CSZ2R

ValorZ2_VALOR@E 999,999,999.99122

NSZ2R

aHeader

aCols

TituloCampoPictureTamanhoDecimalValid.UsadoTipoArquivoContexto

1

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6 7 8 910

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

For i := 1 To Len(aHeader)

aCols[1][i] := CriaVar(aHeader[i][2])

Next1 1

Nil

2 23 34 4

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

“Z2_ITEM”“Z2_TIPO”“Z2_HIST”“Z2_VALOR”

Page 158: Curso AdvPL

ItemZ2_ITEM

20

CSZ2R

TipoZ2_TIPO

10

CSZ2R

HistóricoZ2_HIST

200

CSZ2R

ValorZ2_VALOR@E 999,999,999.99122

NSZ2R

aHeader

aCols

TituloCampoPictureTamanhoDecimalValid.UsadoTipoArquivoContexto

1

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6 7 8 910

Nil Nil Nil Nil Nil“ “ “D” “ “ 0,00

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

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

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

4

.F.

Inicializa a última coluna com .F.Modelo 2 – Criação do aCols para Inclusão

Page 159: Curso AdvPL

“ ““01“

ItemZ2_ITEM

20

CSZ2R

TipoZ2_TIPO

10

CSZ2R

HistóricoZ2_HIST

200

CSZ2R

ValorZ2_VALOR@E 999,999,999.99122

NSZ2R

aHeader

aCols

TituloCampoPictureTamanhoDecimalValid.UsadoTipoArquivoContexto

1

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6 7 8 910

Nil Nil Nil Nil“D” “ “ 0,00 .F.

// Inicializa a coluna do ITEM com 01.

// aCols[1][1] := "01" <-- teria problema se o usuario alterasse a posicao do

// campo Z2_ITEM no Dic. de Dados.

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

1

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

Page 160: Curso AdvPL

Modelo 2

Criação do aCols para Alteração

Page 161: Curso AdvPL

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

M->Z2_Numero := (cAlias)->Z2_Numero

M->Z2_Data := (cAlias)->Z2_Data

0003PEDRO

30/03/06

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

Page 162: Curso AdvPL

dbSelectArea(cAlias)

dbSetOrder(2) // Z2_Filial + Z2_Nome + Z2_Numero + Z2_Item

dbSeek(xFilial(cAlias) + M->Z2_Nome + M->Z2_Numero)

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

...

dbSkip()

End

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

M->Z2_Numero := (cAlias)->Z2_Numero

M->Z2_Data := (cAlias)->Z2_Data

01 PEDRO 0003

Modelo 2 – Criação do aCols para AlteraçãoPosiciona no primeiro registro com o número 0003

0003PEDRO

30/03/06

“01” + “0003” “01” + “0003”“01” + “0004”

Page 163: Curso AdvPL

ItemZ2_ITEM

20

CSZ2R

TipoZ2_TIPO

10

CSZ2R

HistóricoZ2_HIST

200

CSZ2R

ValorZ2_VALOR@E 999,999,999.99122

NSZ2R

aHeader

aCols

TituloCampoPictureTamanhoDecimalValid.UsadoTipoArquivoContexto

1

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6 7 8 910

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

Nil

4

Nil Nil Nil Nil

Adiciona uma linha no aColsModelo 2 – Criação do aCols para Alteração

Page 164: Curso AdvPL

For i := 1 To Len(aHeader)

If aHeader[i][10] == "R“

aCols[nLin][i] := FieldGet(FieldPos(aHeader[i][2]))

Else

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

EndIf

Next

Nil Nil Nil Nil

ItemZ2_ITEM

20

CSZ2R

TipoZ2_TIPO

10

CSZ2R

HistóricoZ2_HIST

200

CSZ2R

ValorZ2_VALOR@E 999,999,999.99122

NSZ2R

aHeader

aCols

TituloCampoPictureTamanhoDecimalValid.UsadoTipoArquivoContexto

1

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6 7 8 910

1 1

Nil

2 23 34 4

Preenche o aCols com os dados lidos do arquivo

“Z2_ITEM”“Z2_TIPO”“Z2_HIST”“Z2_VALOR”

Modelo 2 – Criação do aCols para Alteração

4 6 7 8Z2_ITEM Z2_TIPO Z2_HISTZ2_VALOR01 D Deposito 500,0002 D Deposito 150,0003 S Saque 90,00

4678

“01“ “D” “Deposito“ 500,00

Page 165: Curso AdvPL

ItemZ2_ITEM

20

CSZ2R

TipoZ2_TIPO

10

CSZ2R

HistóricoZ2_HIST

200

CSZ2R

ValorZ2_VALOR@E 999,999,999.99122

NSZ2R

aHeader

aCols

TituloCampoPictureTamanhoDecimalValid.UsadoTipoArquivoContexto

1

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6 7 8 910

Nil

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

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

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

4

.F.

Inicializa a última coluna com .F.Modelo 2 – Criação do aCols para Alteração

“01“ “D” “Deposito“ 500,00

Page 166: Curso AdvPL

Modelo 3

Ver 130_TranM3.prw

Diferença:

Modelo2 – Cabeçalho e Itens são o mesmo arquivo (ex.: SC7 - Ped.

Compras)A definição de quais campos ficarão no cabeçalho e

quaisficarão nos itens, é feita no programa.

Modelo3 – Cabeçalho é um arquivo (ex.: SC5 – Cabec. Ped. Vendas)

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

Similar ao Modelo2

Page 167: Curso AdvPL

Aula 5Telas

RelatóriosReposicionamento de arquivos

Integração com ExcelSQLOOP

Arquivos TXT e XML

Page 168: Curso AdvPL

Telas

Page 169: Curso AdvPL

Tela

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

botão OK oGetNome:SetFocus() Ver 131_Tela.prw

Page 170: Curso AdvPL

RDDemo e RDDemo2 – mais componentes de tela

Tela

Page 171: Curso AdvPL

Relatórios

Page 172: Curso AdvPL

Relatórios

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

Nome Data Numero Item Tipo Historico Valor

Para incluir asordens, digitar

no campo Ordeme clicar neste botão

Page 173: Curso AdvPL

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

• Na função RunReport(), após a linha “nLin := nLin + 1”, que normalmente está na linha 221, incluir os comandos de impressão dos campos:

@nLin,00 PSay SZ2->Z2_Nome

@nLin,23 PSay SZ2->Z2_Data

@nLin,34 PSay SZ2->Z2_Numero

@nLin,41 PSay SZ2->Z2_Item

@nLin,46 PSay SZ2->Z2_Tipo

@nLin,50 PSay SZ2->Z2_Hist

@nLin,73 PSay SZ2->Z2_Valor Picture "@E 999,999,999.99"

• Compilar e executar

Relatórios

Page 174: Curso AdvPL

• Arquivo SX1

• Função Pergunte(): lê as perguntas e cria as variáveis correspondentes à cada pergunta: MV_PAR01, MV_PAR02, etc. Estas variáveis são Private.

• Sintaxe: Pergunte(cPerg, lMostra)

cPerg código do grupo de perguntaslMostra .T. abre a tela de perguntas

.F. não abre a tela; apenas cria as variáveis

RelatóriosPerguntas

Page 175: Curso AdvPL

• Abrir e compilar o programa CriaSX1.prw

• Na parte inicial do programa, antes da linha “Pergunte(cPerg, .F.)”, incluir a chamada à função u_CriaSX1(cPerg)

• Na função RunReport(), na parte da impressão dos campos, incluir a lógica para imprimir somente se o Nome e a Data estiverem dentro dos limites informados nas perguntas “Conta de”, “Conta até”, “Data de” e “Data até”

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

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

@nLin,00 PSay SZ2->Z2_Nome

...

EndIf

RelatóriosPerguntas

Page 176: Curso AdvPL

• Índices permanentes são criados no Dicionário de Dados. A cada inclusão/alteração de registros, todos os índices também são atualizados.

• Por questões de performance, somente índices usados com muita freqüência deveriam ser permanentes.

• Índices usados esporadicamente, deverão ser criados como temporários por meio da função IndRegua().

• Função IndRegua(): permite criar índices temporários, inclusive com a possibilidade de estabelecer um filtro.

• Ao criar um índice temporário, os índices originais são desativados, e deverão ser reativados por meio da função RetIndex().

• O arquivo temporário deverá ser apagado pela função FErase().

RelatóriosÍndice temporário

Page 177: Curso AdvPL

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

If nOrdem < 3

dbSetOrder(nOrdem)

Else

cArqInd := CriaTrab(Nil, .F.)

cChave := "xFilial('SZ2') + DtoS(Z2_Data)" cFiltro := "Z2_Filial==xFilial('SZ2') .And. Z2_Tipo == '" + If(mv_Par05==1,"D","S") + "'"

cOrdem := " "

lMostra := .T.

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

EndIf

• No final da função, antes da linha “Return”, incluir: RetIndex("SZ2")

FErase(cArqInd + OrdBagExt())

RelatóriosÍndice temporário

Page 178: Curso AdvPL

SetPrint() janela principal para definição das propriedades do relatório (array aReturn).

aReturn[1] = Reservado para formulárioaReturn[2] = Reservado para número de viasaReturn[3] = DestinatárioaReturn[4] = Formato: 1-Retrato, 2-PaisagemaReturn[5] = Tipo midia: 1-Disco, 2-Via spool, 3-Direto na porta, 4-EMailaReturn[6] = "NomeArq"-Disco, "LPT1"-Via spool, "LPT1"-Direto na porta, ""-

CanceladoaReturn[7] = Expressão do filtroaReturn[8] = Ordem a ser selecionada

SetDefault() prepara o ambiente de impressão de acordo com as informações contidas no array aReturn, obtidas através da função SetPrint().

Pergunte() abre a janela de perguntas.

RptStatus() executa a função de impressão, mostrando uma régua de progressão.

SetRegua() define o limite da régua de progressão criada pela função RptStatus().

IncRegua() incrementa a progressão da régua.

RelatóriosFunções usadas nos programas de relatórios

Page 179: Curso AdvPL

Fazer um relatório com as transações de cada cliente, listando todos os dados do SZ2 e também o e_mail e o saldo atual.

SIGARPM

Page 180: Curso AdvPL

Pontos de Entrada

Crie um Ponto de Entrada para modificar o cálculo do Saldo após um Saque, considerando apenas 60% do seu valor.

Page 181: Curso AdvPL

Reposicionamento de Arquivos

As funções de Ponto de Entrada que despocionarem arquivos têm a responsabilidade de devolvê-los na mesma situação em que receberam.

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

cAlias := Alias() Arquivo atualmente selecionadonOrdem := IndexOrd() Índice selecionadonRecno := Recno() Número do registro posicionado

Na saída, devem ser restauradas:

dbSelectArea(cAlias)

dbSetOrder(nOrdem)

dbGoTo(nRecno)

Page 182: Curso AdvPL

Reposicionamento de Arquivos

User Function MT010Inc()

Local aAreaSA1 := SA1->(GetArea())

Local aAreaSB1 := SB1->(GetArea())

Local aAreaSC5 := SC5->(GetArea())

...

RestArea(aAreaSA1)

RestArea(aAreaSB1)

RestArea(aAreaSC5)

Return

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

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

Page 183: Curso AdvPL

Integração com Excel

Ver 170_Planilha.prw

Protheus Excel

APExcel

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

Array de dadosu_PlanMov()

Page 184: Curso AdvPL

SQL - Structured Query Language

SELECT Natureza, Data, Valor FROM Movto

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

ORCADO.Tipo FROM MOVTO, ORCADO

SELECT * FROM Movto WHERE Valor > 100

SELECT * FROM Orcado WHERE Natureza = ‘Casa’

Outras cláusulas do SELECT: GROUP BY, ORDER BY, HAVING, AND, OR, IN, DISTINCT, BETWEEN, LIKE.

VIEW ou Visão. A View é virtual

Ver 090_DBFSQL.prwVer texto Programando SQL com RDMakeRelação de Stored Procedures no PPT Oficial

Page 185: Curso AdvPL

MPSDU

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

Administrador

admin

MPSDU

TCP

Environment

Menu Arquivo / Abrir1

2

3

4

Page 186: Curso AdvPL

MPSDU

Page 187: Curso AdvPL

OOP – Programação Orientada a Objetos

• Classes• Métodos• Propriedades

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

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

oBotaoOK := tButton():New()

Suas propriedades podem ser definidas ou alteradas.

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

O AdvPL permite usar as classes pré-definidas ou criar novas classes, substituindo a programação baseada em comandos e funções pela orientação a objetos.

Ver 143_Objetos.prw

Page 188: Curso AdvPL

Arquivos Texto

Ver 150_TXT.prw

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

IDE: menu Ferramentas / Assistente de Código

Programa TXT: gera e lê arquivos TXT.

É necessário criar, abaixo do diretório \MP_DATA, o diretório \TXT, onde será gravado o arquivo CONTAS.TXT.

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

Page 189: Curso AdvPL

XML

Programa XML: gera e lê arquivos XML.

Será gravado no diretório \TXT, o arquivo CONTAS.XML. Este arquivo poderá ser visualizado no Internet Explorer.

Ver 160_XML.prw

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

Page 190: Curso AdvPL

Aula 6Workflow

WebServicesAdvPL ASP

Page 191: Curso AdvPL

WorkFlow

Efetuatransações

Contas

Transa-ções

Atualiza saldo

Grava transação

Saldo

Aprova ou Reprova

Cliente Aprovador

Aguardando o aprovador acessar o sistema...

Fluxo manual

Page 192: Curso AdvPL

Efetuatransações

Contas

Transa-ções

Saldo Negativo?Dispara um WorkFlow

WFSalNeg()

WFRetorno()

Caixa de Saída

Caixa de Saída

Caixa de Entrada

Caixa de Entrada

Job WFRET

WFReturn()

Atualiza saldo

Grava transação

Saldo

E-Mai

l

E-Mail

Resposta

(Aprovado ou Reprovado)

Captura a resposta

Executa a funçãode retorno

Grava a resposta

(Aprovado ou Reprovado)

Cliente

Aprovador

WorkFlowFluxo automático

Page 193: Curso AdvPL

WebServices

Via troca de arquivos

SistemaA

SistemaB

TXT/XML

Via Web Services

SistemaA W

SD

L <Nome>JOSE</Nome>

<Saldo>1000</Saldo>

SistemaB

Web S

erv

ice

http://...

Integração de sistemas

Page 194: Curso AdvPL

O Protheus dispõe de um Assistente de Configuração:

\ERP811\BIN\REMOTE\MP8WIZARD.EXE

WebServicesConfiguração

Page 195: Curso AdvPL

WebServicesConfiguração

WS – Protheus 8 Web Services

ws

\web\ws

ENVIRONMENT

Page 196: Curso AdvPL

WebServicesConfiguração

localhost/ws/9901

Page 197: Curso AdvPL

WebServicesConfiguração

Page 198: Curso AdvPL

WebServices

[HTTP]

ENABLE=1

PORT=80

[localhost/ws/9901]

ENABLE=1

PATH=C:\ERP811\MP_Data\web\ws

ENVIRONMENT=ENVIRONMENT

INSTANCENAME=ws

RESPONSEJOB=JOB_WS_9901

DEFAULTPAGE=wsindex.apw

[JOB_WS_9901]

TYPE=WEBEX

ENVIRONMENT=ENVIRONMENT

INSTANCES=1,3

SIGAWEB=WS

INSTANCENAME=ws

ONSTART=__WSSTART

ONCONNECT=__WSCONNECT

PREPAREIN=99,01

[ONSTART]

JOBS=JOB_WS_9901

Acesso ao WebService:http://localhost/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\

...

Emp. 99, Filial 01

[localhost/ws1/9901]

ENABLE=1

PATH=C:\ERP811\MP_Data\web\ws1

ENVIRONMENT=ENVIRONMENT1

INSTANCENAME=ws1

RESPONSEJOB=JOB_WS1_9901

DEFAULTPAGE=wsindex.apw

[JOB_WS1_9901]

TYPE=WEBEX

ENVIRONMENT=ENVIRONMENT1

INSTANCES=1,3

SIGAWEB=WS

INSTANCENAME=ws1

ONSTART=__WSSTART

ONCONNECT=__WSCONNECT

PREPAREIN=99,01

[ONSTART]

JOBS=JOB_WS_9901,JOB_WS1_9901

http://localhost/ws1/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\

...

Configuração – MP8SRV.INI

Page 199: Curso AdvPL

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

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

WebServices

Page 200: Curso AdvPL

WebService ForneceSaldo

Método BuscaSaldo Nome Saldo

http://localhost

IDE

http://localhost/FORNECESALDO.apw?WSDL

Contas

Sistema

WSDL

Cliente WSForneceSaldo

Método BuscaSaldo Nome Saldo

WebServices

Page 201: Curso AdvPL

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

WSDL

Cliente WSForneceSaldo

Método BuscaSaldo Nome Saldo

WebService ForneceSaldo

Método BuscaSaldo Nome Saldo

http://localhost

Nome:Saldo:

OK

ConsultaSaldo

João

1000,00

João

João

João

1000,001000,00

João

1000,00

Contas

Sistema

1000,00

Tela

WebServices

Page 202: Curso AdvPL

Para o desenvolvimento de páginas Internet, via AdvPL ASP, é necessário configurar o módulo web Portal Protheus:

Portal ProtheusConfiguração

Page 203: Curso AdvPL

Portal ProtheusConfiguração

PP – Portal Protheus

pp

\web\pp

ENVIRONMENT

http://localhost/ws/9901

Page 204: Curso AdvPL

Portal ProtheusConfiguração

localhost/pp

Page 205: Curso AdvPL

Portal ProtheusConfiguração

Page 206: Curso AdvPL

HTML

<html>

<body>

Benvindo ao site da Empresa X

Hoje é 10/08/05

</body>

</html>

Servidor Internet

inicio.htm

Benvindo ao site da Empresa X

Hoje é 10/08/05

Browserhttp://www.empresax.com.br/inicio.htm

Página estática

Página estática (html)

Page 207: Curso AdvPL

Servidor Internet

21/02/06

<html>

<body>

Benvindo ao site da Empresa X

Hoje é <%=Date%>

</body>

</html>

inicio.htm

HTML + ASP

Browserhttp://www.empresax.com.br/inicio.htm

Benvindo ao site da Empresa X

Hoje é 21/02/06

Página dinâmica,

com a data obtida do servidor

Página dinâmica (html + ASP)

Page 208: Curso AdvPL

Servidor InternetProtheus

21/02/06

RPO

AdvPL ASP

User Function Inicio()

Local cHtml

WEB EXTENDED INIT cHtml

cHtml := ExecInPage(“Pagina”)

WEB EXTENDED END

Return cHtml

inicio.prw

<html>

<body>

Benvindo ao site da Empresa X

Hoje é <%=Date()%>

</body>

</html>

Pagina.aph

Browserhttp://www.empresax.com.br/u_inicio.apw

Benvindo ao site da Empresa X

Hoje é 21/02/06

Página com html + AdvPL ASP

Ver 230_ASP1.prw e 235_ASP1.aphVer 240_ASP2.prw e 245_ASP2.aphVer 250_ASP3.prw e 255_ASP3.aphVer 260_ASP4.prw e 265_ASP4.aphVer 270_ASP5.prw e 275_ASP5.aph

Page 209: Curso AdvPL

Call Center

Page 210: Curso AdvPL

Telnet

No MP8SRV.INI, acrescentar:

[TELNET]

Enable=1

Environment=Environment

Main=MTTRAN

Port=1024

RPO

MTTran()

Ver 330_MTTran.prw e 331_MTFunc.prw

Integração com equipamentos micro-terminais

Page 211: Curso AdvPL

DEM

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

Documentação Eletrônica Microsiga

Page 212: Curso AdvPL

Top Connect com SQL

Page 213: Curso AdvPL

Duvidas

descrição da GetDados e da EnchoicePorque na U_Deleta tem parametrosQdo vai para a função Alterar a Mbrowse já jogou os cpos para a memoria. Porque precisa do nRegQdo se usa passagem por referencia. Não é o mesmo que Private/localExemplos de CodeBlock com Eval, aEval e DBEvalO que é o ultimo parametro do IndRegua (.T.). Como faz para funcionar o D de descendenteNo Modelo 2 toda vez ele lê o SX3?Como funcionar a UDC #command

Page 214: Curso AdvPL

Dicionário de Dados

Programa A Programa C

Back-Up

Segurança

Dicionário de Dados

Programa B