programação e customizações advpl e protheus. aula 1 evolução e arquitetura do sistema...
Post on 21-Apr-2015
236 Views
Preview:
TRANSCRIPT
Programação e Customizações
AdvPL e Protheus
Aula 1Evolução e Arquitetura do Sistema
ArquivosCustomizações
Case – Sistema de Contas Correntes
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
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
Múltiplas configurações
..
.....Hub .....Hub
..modem
modem
Servidor
Terminal
Dados
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
•Protheus Server•Protheus Remote•Top Connect•Monitor
Aplicativos
•RPO arquivo binário com os APOs•BUILD executáveis, DLLs e RPO•Patch atualizações do RPO
Conjuntos de arquivos
•Windows•Linux•Hand Held (Palm ou Pocket PC)•ActiveX
Remote
•Thin Client•Baixo tráfego na rede•Multi-plataforma•Atualização automática•ASP - Aplication Server Provider•Browser Internet (HTML)
Terminal Remoto
Estrutura de pastas do sistema
ERP811
APO (RPO)
BIN
REMOTE
SERVER
INCLUDE
MP_DATA
DATA (versão ISAM)
SAMPLES
SPOOL
SYSTEM (Dic.Dados, Menus, ...)
SYSTEMLOAD
MY PROJECTS
Atalhos
Destino: c:\erp811\bin\server\mp811srvwin.exe –debugIniciar em: c:\erp811\bin\server
Destino: c:\erp811\bin\remote\mp811rmt.exeIniciar em: c:\erp811\bin\remote
MP8 Server
MP8 Remote
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
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
MP8RMT.INI
[Config]LastMainProg=sigamdi
[Drivers]Active=TCP
[TCP]Server=localhostPort=1234
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
SIGACFG
TCP
Environment
Configurador
Senha: admin
Configurador
Configurador
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
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
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
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
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...
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
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
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
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
•Parâmetros, Tabelas, Perguntas•Fórmulas - Expressões em AdvPL / User Function
•Validações, Gatilhos, Campos de Arquivos•User Function via menu•Pontos de Entrada•Dicionário de Dados Ativo•SigaRPM, Crystal, Excel
Customização
Customização
Parâmetros: 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
Tabelas: arquivo SX5
Tabela 12: Estados do Brasil Tabela 13: CFOP Tabela 33: Estado Civil
CustomizaçãoTabelas
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
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
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
FONTE
InterpretadorRun TimeServerMaquina Virtual
PCode
Executável +Interpretador Executável
Delphi, CClipper, Visual Objects
Visual Basic, AdvPlAbap, Oracle,Java
DBase, Access
Tipos de Processamento
A=A+BA=5
965534567654
23456
7654
A = A + &B
3
MACRO
End 35
A = 7
Compilação
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
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
Campos: Campos dos Lançamentos Padronizados (SI5)
Débito: If(SD3->D3_TIPO=“MC”, “33201”+SD3->D3_CC, “11303”)
CustomizaçãoCampos de Arquivos
• 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
•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
// 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
•Dicionário de Dados•Menus
Configurador - SIGACFG
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
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
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:
Crie um Ponto de Entrada para modificar o cálculo do Saldo após um Saque, considerando apenas 60% do seu valor.
Exercício
Mostrar o lançamento 666 - RequisiçãoLançamento Contábil Automático
Exercício
Case
Sistema de Contas Correntes
•Contas •Transações•Consultas•Relatórios•Excel•WorkFlow•TXT / XML•WebServices•AdvPL ASP
CaseSistema de Contas Correntes
CONTAS
Nome
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
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
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
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
Criação de Campos (SX3)
Nome do cliente
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)
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
Criação de Campos (SX3)
Criação de Campos (SX3)
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
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)
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
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
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
Aula 2Programação
Comandos e funçõesOperadores
IDEVariáveis de memória
ArrayFunções
Programação
• Aquário
• 3 cestos com bolas pretas e brancas e etiquetas erradas
Exercícios de Lógica
PretaBranca
BrancaBranca
PretaPreta
PretaBranca
BrancaBranca
PretaPreta
3 cestos: 1ª hipótese
PretaBranca
BrancaBranca
PretaPreta
3 cestos: 2ª hipótese
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
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
Resposta: 23 vezes
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
•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
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
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
+ - * / ** ou ^ %
Operadores
x := 10 + 20
nValor := nQtde * nPreco
nValor := nValor + (nValor * 18 / 100)
Matemáticos
< > = = <= >= <> ou # ou !=
If nQtde < nSaldo
MsgAlert(“Pedido liberado”)
Else
MsgAlert(“Pedido bloqueado: estoque insuficiente”)
EndIf
If nSalario > 1257
nIR := 15
EndIf
OperadoresRelacionais
.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
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
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
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
If a <> b If .Not. a==b If !a==b
... ... ...
EndIf EndIf EndIf
Operadores
.And. .Or. .Not. ou !
Lógicos
:= += -= *= /= ^= 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
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
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
( ) 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
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
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
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
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
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
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
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
Gaveta 1
Gaveta 2
Gaveta 3
Gaveta 4
Joao
Alberto
Pedro
Maria
Array, Vetor ou Matriz
aMatriz := {{“Joao”,25,.T.}, {“Alberto”,18,.F.}, {“Pedro”,40,.T.}, {“Maria”,33,.F.}}
aMatriz := {{“Joao” , 25, .T.},;
{“Alberto”, 18, .F.},;
{“Pedro” , 40, .T.},;
{“Maria” , 33, .F.}}
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
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
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.}}
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
Funções
User Function Teste()
Comandos Comandos Comandos Comandos
Return
Execução (chamada) da função: u_Teste()
Programa.PRW
Conjunto de Comandos
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
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
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
Local Visível somente na função em que foi criada
Private Visível na função em que foi criada e nas funções seguintes
Public Visível em todas as funções, a partir do momento em que foi criada
Static Visível somente no programa (PRW)
Escôpo das Variávies
User Function Func1()
Local cVar := "Func1"
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Aula 3Macro
Bloco de CódigoUDC
SemáforosArquivos e Índices
Macro-Substituição
User Function Reajuste()
dbSelectArea("SB1")
dbGoTop()
While !SB1->(Eof())
RecLock("SB1")
SB1->B1_Prv1 := SB1->B1_Prv1 * 1.25
MSUnlock()
SB1->(dbSkip())
End
MsgInfo("Terminou!")
Return
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
•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
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
Ver AEval em 050_Array.prw
aNomes := {“Joao”, “Alberto”, “Pedro”, “Maria”}
AEval(aNomes, {|x| MsgAlert(x)})
DBEval()
Bloco de Código
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
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
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
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
Arquivos
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
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
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...
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
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
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
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
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
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”))
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
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
Sobre arquivos…
• Número máximo de arquivos abertos: 512 (por thread);
• A navegação nos registros é em ordem do índice selecionado - dbSetOrder(n). Se for selecionado dbSetOrder(0), a navegação será pela ordem física dos registros (Recno);
• No SIX, os índices são numerados de 1 a 9 e A, B,... (campo ORDEM). No dbSetOrder(): 1...9, 10, 11...;
• dbSkip() – avança 1 registro;
• dbSkip(n) ou dbSkip(-n) – avança ou retrocede n registros;
• dbSelectArea(cAlias) – seleciona o arquivo. Caso ainda não esteja aberto, abre-o neste momento.
• A referência a um campo de arquivo com o seu Alias ( ex.: MsgAlert(SA1->A1_Nome) ), também abre o arquivo, caso não esteja aberto, mesmo sem um dbSelectArea() anterior.
• Na abertura do arquivo, o primeiro índice é selecionado. O ponteiro de registro é posicionado no primeiro registro físico (não pelo índice). A função dbGoTop(), posiciona no primeiro registro do índice selecionado;
• No Protheus MDI, os arquivos são abertos dentro da thread e fechados no seu encerramento. Na chamada à mesma rotina, mesmo em outra thread, concomitante ou não, os arquivos são reabertos e posicionados no topo e com o primeiro índice selecionado.
• No Protheus SDI, uma vez abertos, os arquivos permanecem assim, inclusive com o último posicionamento do ponteiro de registro e o índice selecionado. A função dbCloseArea() fecha o arquivo.
• No MDI: a abertura e o posicionamento de um mesmo arquivo em threads diferentes são independentes, ou seja, podem ser selecionados índices diferentes e o ponteiro de registros podem ser posicionados em registros diferentes também. O bloqueio de um mesmo registro é comum, ou seja, se o registro for bloqueado por um dos threads, o outro não poderá acessá-lo para alteração ou exclusão.
Aula 4AxCadastro
MBrowseModelo2Modelo3
Funções de Tratamento de
ArquivosAxCadastro,MBrowse,Modelo2,Mo
delo3
AxCadastro
AxPesqui()
AxVisual()
AxInclui()
AxAltera()
AxDeleta()
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
AxCadastro
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
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
Sobre variáveis…
JOSEaprovador@tecnico.com.br
Para cada campo é criada uma variável de memória com o mesmo nome, onde os dados digitados ficam inicialmente armazenados, antes de ser efetivamente gravados no arquivo:
M->Z1_NOME 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
aprovador@tecnico.com.br
• Ver FuncMod2• Ver MarkBrow (exemplo do Baile)
Funções de tratamento de arquivos
Modelo 2
Item Tipo Histórico Valor
Nome
Número
Data
En
choic
e
Variáveisde memória
GetD
ad
os
aHeader
aCols
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.
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
Criação do aCols para Inclusão
Modelo 2
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)
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”
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
“ ““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
Modelo 2
Criação do aCols para Alteração
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
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”
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
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
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
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
Aula 5Telas
RelatóriosReposicionamento de arquivos
Integração com ExcelSQLOOP
Arquivos TXT e XML
Telas
Tela
• EnchoiceBar – barra de ferramentas com os botões padrões• aButtons – acrescenta botões na EnchoiceBar• Define Font – cria uma fonte diferente da padrão• Define MSDialog – define a janela principal• Say – mostra um texto na tela (normal ou como objeto)• Get – campo para digitação (normal ou como objeto)• Radio Button• Check Box• Botões• Folder• Activate MSDialog – ativa (desenha) a tela• Hide e Show – esconde e reexibe um objeto• Mudança do texto• Exercício: colocar o foco no campo Nome depois de clicado no
botão OK oGetNome:SetFocus() Ver 131_Tela.prw
RDDemo e RDDemo2 – mais componentes de tela
Tela
Relatórios
Relatórios
Criar um relatório pelo Assistente de Código do IDE:IDE: menu Ferramentas / Assistente de Código
Nome Data Numero Item Tipo Historico Valor
Para incluir asordens, digitar
no campo Ordeme clicar neste botão
• 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
• 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
• 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
• Índices permanentes são criados no Dicionário de Dados. A cada inclusão/alteração de registros, todos os índices também são atualizados.
• Por questões de performance, somente índices usados com muita freqüência deveriam ser permanentes.
• Índices usados esporadicamente, deverão ser criados como temporários por meio da função IndRegua().
• Função IndRegua(): permite criar índices temporários, inclusive com a possibilidade de estabelecer um filtro.
• Ao criar um índice temporário, os índices originais são desativados, e deverão ser reativados por meio da função RetIndex().
• O arquivo temporário deverá ser apagado pela função FErase().
RelatóriosÍndice temporário
• Na função RunReport(), na linha “nOrdem := aReturn[8]”, substituir dbSetOrder(nOrdem) por:
If nOrdem < 3
dbSetOrder(nOrdem)
Else
cArqInd := CriaTrab(Nil, .F.)
cChave := "xFilial('SZ2') + DtoS(Z2_Data)" cFiltro := "Z2_Filial==xFilial('SZ2') .And. Z2_Tipo == '" + If(mv_Par05==1,"D","S") + "'"
cOrdem := " "
lMostra := .T.
IndRegua("SZ2", cArqInd, cChave, cOrdem, cFiltro, "Indexando...", lMostra)
EndIf
• No final da função, antes da linha “Return”, incluir: RetIndex("SZ2")
FErase(cArqInd + OrdBagExt())
RelatóriosÍndice temporário
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
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
Pontos de Entrada
Crie um Ponto de Entrada para modificar o cálculo do Saldo após um Saque, considerando apenas 60% do seu valor.
Reposicionamento de Arquivos
As funções de Ponto de Entrada que despocionarem arquivos têm a responsabilidade de devolvê-los na mesma situação em que receberam.
Para tanto, estas três informações devem ser guardadas:
cAlias := Alias() Arquivo atualmente selecionadonOrdem := IndexOrd() Índice selecionadonRecno := Recno() Número do registro posicionado
Na saída, devem ser restauradas:
dbSelectArea(cAlias)
dbSetOrder(nOrdem)
dbGoTo(nRecno)
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.
Integração com Excel
Ver 170_Planilha.prw
Protheus Excel
APExcel
=MSGetArray(A1;Siga("U_PLANMOV"))
Array de dadosu_PlanMov()
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
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
MPSDU
OOP – Programação Orientada a Objetos
• Classes• Métodos• Propriedades
Um objeto é uma instância da sua classe. Por exemplo, o botão é da classe tButton.
É criado a partir da execução do método construtor.
oBotaoOK := tButton():New()
Suas propriedades podem ser definidas ou alteradas.
oBotaoOK:cCaption := “Ok” oBotaoOK:nWidth := 50 oBotaoOK:nHeight := 15 oBotaoOK:bAction := {|| u_Grava() }
O AdvPL permite usar as classes pré-definidas ou criar novas classes, substituindo a programação baseada em comandos e funções pela orientação a objetos.
Ver 143_Objetos.prw
Arquivos Texto
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
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>
Aula 6Workflow
WebServicesAdvPL ASP
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
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
Resposta
(Aprovado ou Reprovado)
Captura a resposta
Executa a funçãode retorno
Grava a resposta
(Aprovado ou Reprovado)
Cliente
Aprovador
WorkFlowFluxo automático
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
O Protheus dispõe de um Assistente de Configuração:
\ERP811\BIN\REMOTE\MP8WIZARD.EXE
WebServicesConfiguração
WebServicesConfiguração
WS – Protheus 8 Web Services
ws
\web\ws
ENVIRONMENT
WebServicesConfiguração
localhost/ws/9901
WebServicesConfiguração
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
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
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
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
Para o desenvolvimento de páginas Internet, via AdvPL ASP, é necessário configurar o módulo web Portal Protheus:
Portal ProtheusConfiguração
Portal ProtheusConfiguração
PP – Portal Protheus
pp
\web\pp
ENVIRONMENT
http://localhost/ws/9901
Portal ProtheusConfiguração
localhost/pp
Portal ProtheusConfiguração
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)
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)
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
Call Center
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
DEM
•Linguagem AdvPL•Tecnologia Protheus•Dicas e Notícias•F.A.Q.•Guias de Referência•Releases•Sistema
Documentação Eletrônica Microsiga
Top Connect com SQL
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
Dicionário de Dados
Programa A Programa C
Back-Up
Segurança
Dicionário de Dados
Programa B
top related