A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Programação e Customizações

Apresentações semelhantes


Apresentação em tema: "Programação e Customizações"— Transcrição da apresentação:

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

2 Aula 1 Evolução e Arquitetura do Sistema Arquivos Customizações
Case – Sistema de Contas Correntes Em 1974, foi escrita a primeira versão do SIGA – Sistema Integrado de Gerência Automática, em Assembly. Em 1978, foi reescrito para Natural/Adabas. Em 1983, começou a surgir os primeiros micros. E surgiu também o primeiro banco de dados para micros, o DBase II, e logo depois, o DBase III. O DBase era um banco de dados que tinha uma linguagem de programação embutida, mas era interpretada. Era obrigado a entregar os fontes. Logo veio o Clipper, como um compilador para o DBase. O Clipper dominou o mercado. Em 1990, com o Clipper 5, foi criada a maioria das facilidades de customização que o sistema tem hoje, por exemplo, o Dicionário de Dados. O usuário podia até escrever rotinas inteiras, em linguagem Clipper, e executá-las a partir do menu. Eram os chamados RDMake’s. E o sistema passou a se chamar Siga Advanced. Em 1995, o Windows já estava bem desenvolvido. Aí, o sistema foi reescrito para o ambiente Windows. Tentou-se utilizar a linguagem VO-Visual Objects, que era da mesma fabricante do Clipper (CA-Computer Associates). Mas, assim como o Clipper foi um sucesso total, o VO foi um fracasso total. Depois foi usado o Delphi e também o SQL. Até que, em 2000, a Microsiga resolveu desenvolver a sua própria linguagem de programação: o AdvPL – Advanced Protheus Language. Como, desde 1990, o sistema já permitia escrever expressões na linguagem Clipper, e até mesmo rotinas inteiras, havia muita coisa desenvolvida nessa linguagem. E como não podia jogar fora tudo isso, e nem obrigar os usuários a reescrever tudo, a Microsiga resolver adotar a mesma sintaxe do Clipper no AdvPL. E o sistema passou a se chamar Protheus. Então, o AdvPL, pelo menos nos comandos e funções básicas da linguagem, tem a mesmo sintaxe do Clipper.

3 Evolução do Sistema da Microsiga
1974  Assembler – Batch 1978  Natural Adabas – Online 1983  DBase II – III, Clipper Summer 1990  Clipper 5 – SIGA Advanced  FiveWin/Top/Coencisa, VO, Delphi, SQL 2000  AdvPL – Protheus Em 1974, foi escrita a primeira versão do SIGA – Sistema Integrado de Gerência Automática, em Assembly. Em 1978, foi reescrito para Natural/Adabas. Em 1983, começou a surgir os primeiros micros. E surgiu também o primeiro banco de dados para micros, o DBase II, e logo depois, o DBase III. O DBase era um banco de dados que tinha uma linguagem de programação embutida, mas era interpretada. Era obrigado a entregar os fontes. Logo veio o Clipper, como um compilador para o DBase. O Clipper dominou o mercado. Em 1990, com o Clipper 5, foi criada a maioria das facilidades de customização que o sistema tem hoje, por exemplo, o Dicionário de Dados. O usuário podia até escrever rotinas inteiras, em linguagem Clipper, e executá-las a partir do menu. Eram os chamados RDMake’s. E o sistema passou a se chamar Siga Advanced. Em 1995, o Windows já estava bem desenvolvido. Aí, o sistema foi reescrito para o ambiente Windows. Tentou-se utilizar a linguagem VO-Visual Objects, que era da mesma fabricante do Clipper (CA-Computer Associates). Mas, assim como o Clipper foi um sucesso total, o VO foi um fracasso total. Depois foi usado o Delphi e também o SQL. Até que, em 2000, a Microsiga resolveu desenvolver a sua própria linguagem de programação: o AdvPL – Advanced Protheus Language. Como, desde 1990, o sistema já permitia escrever expressões na linguagem Clipper, e até mesmo rotinas inteiras, havia muita coisa desenvolvida nessa linguagem. E como não podia jogar fora tudo isso, e nem obrigar os usuários a reescrever tudo, a Microsiga resolver adotar a mesma sintaxe do Clipper no AdvPL. E o sistema passou a se chamar Protheus. Então, o AdvPL, pelo menos nos comandos e funções básicas da linguagem, tem a mesmo sintaxe do Clipper.

4 Multi-Camada Client Aplication Server Database Server Windows Linux
Browser Remote (MP8RMT.EXE) Client (WEB) ActiveX Client RPO (MPDP811.RPO) Server (MP8SRVWIN.EXE) Windows Linux Unix Aplication Server Monitor DBF/CTREE Top Connect Existem programas monolíticos, onde tudo fica no mesmo lugar: a interface, o processamento (aplicação) e o tratamento dos dados. Com o surgimento das primeiras redes-locais, foi possível separar a parte dos dados num servidor de arquivos. Mas, todo o processamento continuava sendo feito nas estações. Todos os dados precisavam ser transportados do servidor para a estação. Então, havia muito tráfego na rede. Atualmente, os sistemas são multi-camadas, ou seja, a interface, a aplicação e os dados podem ficar totalmente separados. As estações não fazem nenhum processamento; só tela, teclado e mouse. Quem faz todo o processamento é a aplicação. Então, o tráfego de rede fica só entre o servidor de aplicação e o servidor de dados. Windows Linux Unix Database Server SQL Server Oracle DB2 Sybase PostGres MySQL

5 Múltiplas configurações
.. modem .. modem ..... Hub ..... Hub A aplicação e o banco de dados podem ficar numa única máquina ou pode ter um servidor de aplicação e outro de dados. O tráfego de rede vai ser entre o servidor de aplicação e o servidor de dados. Pode ter estações remotas. Servidor Terminal Dados

6 Repositório de Objetos
Protheus Server WEB Services COMPILADOR Base de Dados INTERPRETADOR Repositório de Objetos Remote Protheus Remote Protheus Remote Protheus Remote Protheus

7 Estrutura Protheus REMOTE SERVER APO MATA010 Executa RPO MATA010
Programa Fonte Cad.Produtos MATA010 Compilação APO MATA010 RPO Executa MATA010 Ped.Vendas MATA010 Executa MATA410 O programa-fonte é onde a gente escreve os comandos e funções. É um arquivo em formato texto, que pode ser editado em qualquer editor de texto, sem formatação. O sistema não consegue executar. O programa-fonte passa por um processo chamado compilação, que verifica a sintaxe e gera o APO-Advanced Protheus Object. O APO sim é executado pelo sistema. Os APOs ficam armazenados num repositório, o RPO. Inclusive as funções de usuário, também são compilados, tornam-se APOs e ficam armazenados no RPO. Um APO é executado quando o usuário clica na opção no menu. O Remote requisita o APO ao server, o server carrega do RPO e executa. MATA410 CTBR040 Executa CTBR040 Balancete Cont.

8 Repositório de Objetos
INSTÂNCIA EXECUÇÃO OBJETO INSTÂNCIA OBJETO SOLICITAÇÃO OBJETO OBJETO Repositório de Objetos EXECUÇÃO UCP Protheus EXECUÇÃO CARGA Memória Protheus

9 Interface de Software Básico (acesso ao Hardware)
SGBD. Banco de Dados Interface de Banco de Dados (Top Connect) WEB Services. Solução Protheus (Server) . Interface de Apresentação (Remote) . Interface de Software Básico (acesso ao Hardware) REDE API API API API

10 IDE Integrated Development Environment Repositório de Objetos
Programa Fonte Projeto

11 Aplicativos Protheus Server Protheus Remote Top Connect Monitor

12 Camada de Repositório de Objetos
Camada de Aplicação Camada de Interface Camadas Protheus Camada de Dados Camada de Repositório de Objetos

13 RPO  arquivo binário com os APOs BUILD  executáveis, DLLs e RPO
Conjuntos de arquivos RPO  arquivo binário com os APOs BUILD  executáveis, DLLs e RPO Patch  atualizações do RPO RPO – são os programas do ERP. Regras de negócio. BUILD – executáveis do sistema, DLLs, mais o RPO. Quando tem uma grande atualização, que alterou tanto os executáveis do sistema quanto o ERP, precisa atualizar este conjunto de arquivos. Chama-se atualização da Build. Patch – quando tem uma alteração de apenas uma parte do RPO. Por exemplo, houve uma alteração em algum imposto. Só precisa atualizar aquele programa. Então é gerado um patch para atualizar só o RPO. A atualização do patch é feita no IDE.

14 Remote Windows Linux Hand Held (Palm ou Pocket PC) ActiveX

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

16 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

17

18 Atalhos Destino: c:\erp811\bin\server\mp811srvwin.exe –debug
Iniciar em: c:\erp811\bin\server MP8 Server Destino: c:\erp811\bin\remote\mp811rmt.exe Iniciar em: c:\erp811\bin\remote No atalho do Server, precisa acrescentar –DEBUG ou –CONSOLE (é a mesma coisa). Senão, o Server não funciona. No atalho do Remote também podem ser colocados parâmetros, como por exemplo, o ambiente, o programa inicial, etc. Ver a documentação do sistema. MP8 Remote

19 MP8SRV.INI MP8SRV.INI ERP811 APO BIN REMOTE SERVER INCLUDE SIGACFG
MP_DATA DATA SAMPLES SPOOL SYSTEM SYSTEMLOAD MY PROJECTS [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 SIGACFG TCP Environment É a configuração inicial do Server, ou seja, o ambiente em que o sistema vai rodar.

20 MP8SRV.INI [environmentSQL] SourcePath=C:\ERP811\APO
RootPath=C:\ERP811\MP_Data StartPath=\system\ RpoVersion=811 RpoDb=Top LocalFiles=ads localdbextension=.dbf RpoLanguage=portuguese PictFormat=DEFAULT DateFormat=DEFAULT [Topconnect] Alias=BASE810 ConType=TCPIP DataBase=MSSQL8 Server=SrvTOP01 [Drivers] Active=TCP [TCP] TYPE=TCPIP Port=1234

21 MP8RMT.INI [Config] LastMainProg=sigamdi [Drivers] Active=TCP [TCP]
Server=localhost Port=1234

22 Pode rodar o Server numa máquina e o Remote em outras máquinas
Pode rodar o Server numa máquina e o Remote em outras máquinas. Ou pode rodar o Server e o Remote na mesma máquina, como é no Caso do Chaveiro.

23 Configurador SIGACFG TCP Environment
É no Configurador que fazemos a maioria das customizações. Environment

24 Configurador Senha: admin

25 Configurador

26 Configurador

27 Arquivos – Família SX Pasta \SYSTEM Arquivo Descrição SX1
Perguntas e Respostas SX2 Mapeamento de Tabelas SX3 Dicionário de Dados SX4 Agenda do Schedule de Processos SX5 Tabelas SX6 Parâmetros SX7 Gatilhos SX9 Relacionamento entre Tabelas SXA Pastas Cadastrais apontadas no SX3 SXB Consulta por meio da tecla F3 (Consulta Padrão) SXD Controle do Schedule de Processos SXE Seqüência de Documentos (+1) SXF Seqüência de Documentos (próximo) SXG Tamanho padrão para campos SXK Respostas das Perguntas (SX1) por Usuário SXO Controle de LOGs por Tabela SIX Índices dos Arquivos .XNU Menu de Opções dos Módulos

28 M.E.R. Modelo de Entidades e Relacionamento
Famílias de Arquivos de Dados Pasta \DATA ou Banco de Dados SA - Cadastros SB - Estoques SC - Previsões de E/S SD - Mov. De Estoque SE - Financeiro SF - Fiscal SG - Estruturas SH - Carga de Máquina SI - Contábil SJ - Estatísticas SM - Miscelâneas SN - Ativo Fixo SO - Assist. Técnica SP - Ponto Eletrônico SQ - Recr. e Seleção SR - Folha de Pagto ST - Manut. Industrial SU - Telemarketing SV - Concessionárias SW e SY - Export./Import. Q? - Qualidade (Celerina) R? - Recursos Humanos SZ,QZ,RZ - Livres P? - Projetos Especiais Todos os arquivos começam com S de SIGA. Hoje temos as famílias Q, R e P. Os arquivos são divididos em grupos. Por exemplo, SA-Cadastros, SB-Estoques, etc. M.E.R. Modelo de Entidades e Relacionamento

29 Principais Arquivos de Dados
Prefixo Descrição SA1 Cadastro de Clientes SA2 Cadastro de Fornecedores SA3 Cadastro de Vendedores SB1 Cadastro de Produtos SB2 Saldos dos Produtos por Almoxarifado SB5 Dados Complementares de Produtos SC1 Solicitações de Compras SC5 Cabeçalho dos Pedidos de Venda SC6 Itens dos Pedidos de Venda SC7 Pedidos de Compras SD1 Itens das Notas Fiscais de Entrada SD2 Itens das Notas Fiscais de Saída SD3 Movimentações Internas de Produtos SE1 Títulos a Receber SE2 Títulos a Pagar SF1 Cabeçalho das Notas Fiscais de Entrada SF2 Cabeçalho das Notas Fiscais de Saída SI1 Plano de Contas SI2 Lançamentos Contábeis Dentro de cada grupo, temos os arquivos propriamente ditos.

30 Arquivos de Dados – por Empresa
O sistema permite controlar até 99 Empresas. Cada Empresa pode ter até 99 Filiais: Empresa 01 – Filiais 01 Empresa 02 – Filiais 01 02 02 99 99 Para cada Empresa é criado um jogo de arquivos: SXXnn0 – onde: XX = Prefixo do arquivo nn = Empresa Exemplo: Empresa 99 -> SA1990, SA2990, SB O nome de todos os campos começa sempre com o prefixo do nome do arquivo. Ex.: arquivo SA1, campos A1_COD, A1_NOME. Todos os arquivos tem um campo de Filial.

31 Arquivos de Dados Filiais Nomenclatura dos campos:
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 02 Nomenclatura dos campos: Arquivo SA1: A1_FILIAL SA2: A2_FILIAL SB1: B1_FILIAL QA1: QA1_FILIAL A1_COD A2_COD B1_COD QA1_COD A1_NOME A2_NOME B1_DESC QA1_DESC A1_END A2_END B1_TIPO O nome de todos os campos começa sempre com o prefixo do nome do arquivo. Ex.: arquivo SA1, campos A1_COD, A1_NOME. Todos os arquivos tem um campo de Filial.

32 Arquivos de Dados Modo de Acesso Compartilhado  registros compartilhados entre as filiais Campo Filial: em branco Exclusivo  o registro é exclusivo da filial Campo Filial: código da Filial (variável cFilAnt) Ex: SA1 - Compartilhado A1_FILIAL A1_COD A1_NOME FABRICA DE TINTAS E VERINIZES LTDA /SP TEX MALHAS E CONFECCOES S.A /SP CLIENTE PADRAO ARMANDO JOSE FLORES /SC COMERCIO SOM DO MUNDO /SP xFilial(“SA1”)  “ “ Na hora de gravar o campo Filial, ou para ler os registros, para saber se o campo Filial contém brancos ou o código da Filial, não precisa se preocupar com isso. A função xFilial() é que se encarrega disso. A função xFilial() vai no dicionário de dados e vê: se o arquivo for compartilhado, retorna dois espaços em branco; se for exclusivo, retorna o conteúdo da variável cFilAnt, que contém o código da Filial em que entramos. Ex: SC5 - Exclusivo C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 xFilial(“SC5”)  cFilAnt

33 Arquivos de Índices Índices
Todo arquivo precisa ter pelo menos um índice Índice Primário:  acesso direto ao registro  verificação de chave duplicada Ordenação de registros CHAVE REGISTRO REGISTRO A1_FILIAL A1_COD A1_NOME FABRICA DE TINTAS E VERINIZES LTDA /SP TEX MALHAS E CONFECCOES S.A /SP CLIENTE PADRAO ARMANDO JOSE FLORES /SC COMERCIO SOM DO MUNDO /SP O usuário pode incluir os seus próprios índices. Por exemplo, o arquivo SA1 tem 7 índices. O usuário pode incluir o índice 8. Acontece que, se na próxima versão, a Microsiga incluir mais índices, o índice do usuário será realocado para o final e será reenumerado. Portanto, todo índice de precisa ter um NickName, e nos programas, ao invés de usar a função dbSetOrder(), deve-se usar a função dbOrderNickName(). Só os índices de usuário podem ser NickName. Os índices da Microsiga nunca terão.

34 Arquivos de Índices X SA1 – índices do Sistema 1 2 ... 7
Um arquivo pode ter até 35 índices (1...9, A...Z) dbSetOrder(n), onde n =  função para selecionar o índice. Além dos índices originais, usuários podem incluir seus próprios índices. Caso a Microsiga inclua novos índices, os do usuário serão renumerados. SA1 – índices do Sistema 1 2 ... 7 índice do Usuário 8 A1_TIPO Nos programas: dbSetOrder(8) novo índice do Sistema 8 índice do Usuário 9 A1_TIPO NickName: TIPO índice do Usuário 8 A1_TIPO NickName: TIPO novo índice do Sistema 8 índice do Usuário 9 A1_TIPO O usuário pode incluir os seus próprios índices. Por exemplo, o arquivo SA1 tem 7 índices. O usuário pode incluir o índice 8. Acontece que, se na próxima versão, a Microsiga incluir mais índices, o índice do usuário será realocado para o final e será reenumerado. Portanto, todo índice de precisa ter um NickName, e nos programas, ao invés de usar a função dbSetOrder(), deve-se usar a função dbOrderNickName(). Só os índices de usuário podem ser NickName. Os índices da Microsiga nunca terão. Nos programas: dbOrderNickName(“TIPO”) X 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().

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

36 Customização

37 Customização V V F F V F F V Parâmetros: arquivo SX6
cESTNEG := GetMV(“MV_ESTNEG”) If cESTNEG == “S” .Or. QtdVenda < B2_Saldo tratamento normal Else tratamento de erro EndIf “S” “N” “N” “S” V V F F V F F V

38 Customização Tabelas: arquivo SX5 Tabela 12: Estados do Brasil
Tabela 13: CFOP Tabela 33: Estado Civil

39 Customização Perguntas: arquivo SX1 Do Cliente: 000010
Até Cliente: Da Data: /03/06 Até Data: /03/06 As respostas também são gravadas

40 Preço := SC6->C6_PRCVEN * 1.25
Customização Inserção de Código-Fonte Exemplo: Preço Um Pedido de Venda é incluído  100,00 Na emissão da NF, o preço deve ser reajustado em 25%  125,00 Programa-fonte MATA460A – Emissão NF Preço := SC6->C6_PRCVEN * 1.25 SERVER Fórmulas “SC6->C6_PRCVEN * 1.25” Compilação Preço := &Formula APO MATA460A Chamamos de Inserção de Código-Fonte porque é uma forma de inserir, no executável, pequenos trechos de código-fonte, que estão externos (num arquivo). RPO SC6->C6_PRCVEN * 1.25 MATA460A Execução do MATA460A Preço := SC6->C6_PRCVEN * 1.25 Emissão NF Preço := &Formula

41 Customização Inserção de Código-Fonte Fórmulas: arquivo SM4 - Expressões em AdvPL / Funções Microsiga Ex: Reajuste de preço entre o Pedido e o Faturamento: -No Pedido é preenchido o código da fórmula de reajuste (campo “Tipo Reajuste”) -No Programa de emissão da nota fiscal: Preço := &Formula (Obs: a pergunta “Reajuste na mesma NF?” precisa estar com SIM) Fórmula Reajuste fixo: “SC6->C6_PRCVEN * 1.25” Fórmula Reajuste se preço em dólar: “SC6->C6_PRCVEN * RecMoeda(dDataBase,’2’)” Fórmula Reajuste pelo dólar: “SC6->C6_PRCVEN * (RecMoeda(dDataBase,’2’)/ If(RecMoeda(SC5->C5_EMISSAO,’2’) <> 0, RecMoeda(SC5->C5_EMISSAO,’2’),1))”

42 Interpretador FONTE PCode Executável + Interpretador Executável
Tipos de Processamento Run Time Server Maquina Virtual Interpretador FONTE PCode DBase, Access Visual Basic, AdvPl Abap, Oracle,Java Executável + Interpretador Executável Clipper, Visual Objects Delphi, C

43 A = A + &B A = 7 Compilação MACRO 5 End 3 2 3 A=A+B A=5 965534567654

44 Customizaçã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) Validações servem para dizer se o que foi digitado no campo está correto ou não. Portanto, toda validação sempre deve retornar como resposta, verdadeiro ou falso.

45 Exemplo: na digitação da NF de Compra
Customização Gatilhos Gatilhos: Aciona a rotina ao sair-se de um campo (SX7) Exemplo: na digitação da NF de Compra Quant. Vr.Unit. Total 10 2,00 20,00 Campo: D1_VUNIT Contra-Dominio: D1_TOTAL Regra: Round(M->D1_VUNIT * M->D1_QUANT, 2)

46 Customização Campos: Campos dos Lançamentos Padronizados (SI5)
Campos de Arquivos Campos: Campos dos Lançamentos Padronizados (SI5) Débito: If(SD3->D3_TIPO=“MC”, “33201”+SD3->D3_CC, “11303”)

47 Customização Lançamento Padronizado (SI5) Débito: u_ContaDeb()
User Function Executa uma série de comandos, retornando um valor; Precisa ser compilado; O resultado é um objeto que é armazenado no Repositório. Ex: User Function ContaDeb() Do Case Case SB1->B1_TIPO == “MC” Conta := “11302” Case SB1->B1_TIPO == “ME” Conta := “11303” ... EndCase Return (Conta + SD3->D3_CC) A função IF() permite testar apenas uma única condição. No exemplo anterior, só é possível verificar apenas um único tipo de material. Mas, se tiver outros tipos de material? Neste caso, pode-se escrever uma função. Lançamento Padronizado (SI5) Débito: u_ContaDeb()

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

49 Exemplo de Ponto de Entrada
// PONTO DE ENTRADA NA ALTERAÇÃO DO CADASTRO DE PRODUTO #Include “RWMake.ch" User Function MT010ALT() If AllTrim(SB1->B1_TIPO) == "MO" // Trata-se de mão-de-obra. dbSelectArea("SB2") // Acessa o registro de saldos dbSetOrder(1) // e custos no SB2. dbSeek(xFilial()+SB1->B1_COD) If RecLock("SB2", .F.) // Grava em custo médio o custo standard, pois não existe custo // médio de mão-de-obra. SB2->B2_CM1 := SB1->B1_CUSTD EndIf Return Nil

50 Configurador - SIGACFG
Dicionário de Dados Menus

51 Exercícios Crie um parâmetro (SX6) para o limite máximo por transação:
Nome da Var.: MV_VRMAX Tipo: N Conteúdo: 10000 Descrição: Valor maximo da transacao SIGACFG: menu Ambiente / Cadastros / Parâmetro Crie uma tabela (SX5) de tipos de transações: Tabela ZZ D – Depósito S – Saque E – Encargos J – Juros R – Resgates SIGACFG: menu Ambiente / Cadastros / Tabelas (tem que preencher os 3 idiomas) Ativar o Server. Chamar o Remote: -Programa Inicial: SIGACFG -Ambiente: Environment -Senha: admin

52 Exercício Crie uma Fórmula (SM4) para reajustar o preço dos produtos da Fábrica de Chaveiros: Código: 001 Descrição: REAJUSTE DE PREÇO Fórmula: SB1->B1_PRV1 * 1.25 SIGACFG: menu Ambiente / Cadastros / Formulas Crie um Gatilho que apresente o valor total do item: Campo: D1_VUNIT Sequencia: 001 Cnt. Dominio: D1_TOTAL Tipo: Primario Regra: M->D1_QUANT * M->D1_VUNIT Posiciona: Não SIGACFG: menu Base de Dados / Dicionario / Gatilhos

53 If(M->I2_Valor < GetMV(“MV_VRMAX”), .T., .F.)
Exercício Insira a validação no arquivo SI2, campo I2_VALOR: If(M->I2_Valor < GetMV(“MV_VRMAX”), .T., .F.) SIGACFG: menu Base de Dados / Dicionario / Base de Dados

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

55 Exercício Lançamento Contábil Automático
Mostrar o lançamento Requisição

56 Case Sistema de Contas Correntes

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

58 Case Tabelas do sistema CONTAS TRANSAÇÕES Sistema de Contas Correntes
Nome 1 Saldo 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 Tem Refere-se

59 Exercício – Criação de Arquivos (SX2)
SIGACFG: menu Base de Dados / Dicionario / Arquivos Prefixo: SZ1 Path: \DATA\ Nome: SZ1990 Descrição: CONTAS Desc.Esp.: CONTAS Desc.Inglês: CONTAS Modo Acesso: COMPARTILHADO Prefixo: SZ2 Nome: SZ2990 Descrição: TRANSAÇÕES Desc.Esp.: TRANSAÇÕES Desc.Inglês: TRANSAÇÕES Modo Acesso: EXCLUSIVO Modo de Acesso: Compartilhado  Filial = branco Exclusivo  Filial = número da Filial (var. pública cFilAnt) Função xFilial(Alias) ALUNOS: Descompactar o arquivo SX-Alunos.zip para a pasta \ERP811\MP_DATA\SYSTEM. O arquivo SZ2 já estará criado. PROFESSOR: Descompactar o arquivo SX.ZIP para a pasta \ERP811\MP_DATA\SYSTEM. Descompactar o arquivo SZ.ZIP para a pasta \ERP811\MP_DATA\DATA. Já estará tudo pronto, inclusive com a base de dados já alimentada com alguns dados de exemplo. Rotina: rotina a ser executada na abertura do arquivo.

60 Criação de Campos (SX3) Criação dos campos dos arquivos:
SZ1 – Cadastro de Contas SZ2 – Arquivo de Transações SIGACFG: menu Base de Dados / Dicionario / Base de Dados Ordem faz parte da chave do SX3 O cadastramento de um campo é dividido em pastas: Campo Informações Opções Validações Uso Módulo

61 Criação de Campos (SX3) Caracter, Numérico, Lógico, Data, Memo
Picture variável, que pode ser retornada por uma função Real, Virtual Alterar, Visualizar

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

63 Criação de Campos (SX3) D=Deposito;S=Saque
ComboBox. No campo será gravada a letra, no exemplo, D ou S. D=Deposito;S=Saque “D” dDataBase GetSXENum(“SZ2”, “Z2_NUMERO”) Cadastro de Contas (SZ1) Campo Z2_Nome F3

64 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 0 a 9 Define 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. 9 Nível do Usuário Nível dos Campos 9 8 8 Exemplo: Usuário com nível 5 só terá acesso a campos com nível igual ou menor que 5. 7 7 6 6 5 5 4 4 3 3 2 2 1 1

65 Criação de Campos (SX3)

66 Criação de Campos (SX3)

67 Exercício Cadastrar os campos do SZ1
Inform. Uso Tipo Tam. Dec. Formato Contexto Propr. Título Obrig Usa Brw Z1_NOME Car 20 @! Real Alt. Nome Z1_ 40 Z1_ 1 1 Z1_SALDO Num 12 2 @E 999,999,999.99 Visual Saldo Cadastrar Opções e Validações para estes campos Campo Opções Validações Lista de Opções Inic.Padrão Z1_NOME ExistChav(“SZ1”, M->Z1_NOME, 1) Z2_NOME ExistCpo(“SZ1”, M->Z2_NOME, 1) Z2_NUMERO GetSXENum(“SZ2”, “Z2_NUMERO”) Z2_ITEM ExistChav("SZ2", M->Z2_NUMERO+ M->Z2_ITEM, 1) Z2_DATA dDataBase Z2_TIPO D=Deposito;S=Saque “D” Ao terminar de criar os campos, não esquecer de ATUALIZAR o dic.de dados.

68 Exercício Campos do SZ2 (já estão cadastrados) Campo Inform. Uso Tipo
Tam. Dec. Formato Contexto Propr. Título Obrig Usa Brw Z2_NOME Car 20 @! Real Alt. Nome Z2_NUMERO 4 Visual Numero Z2_ITEM 2 99 Item Z2_DATA Data 8 Z2_TIPO 1 Z2_HIST Historico Z2_VALOR Num 12 @E 999,999,999.99 Valor Z2_SLDATU Virtual Saldo Z2_APROV 3 Aprovado

69 Exercício Criação dos Índices 2 1 3 4 SZ1 Z1_Filial + Z1_Nome NOME
Chave Nickname SZ1 Z1_Filial + Z1_Nome NOME SZ2 Z2_Filial + Z2_Numero + Z2_Item NR_IT Z2_Filial + Z2_Nome + Z2_Numero + Z2_Item NOME_NR_IT

70 Exercícios Crie a Consulta Padrão que mostre o arquivo SZ1 e insira-a no campo Z2_Nome SIGACFG: menu Base de Dados / Dicionario / Base de Dados Faça o Gatilho para atualizar o Z2_SldAtu (virtual) ao digitar-se Z2_Valor: Campo: Z2_VALOR Cnt. Dominio: Z2_SLDATU Tipo: Primario Regra: IF(M->Z2_TIPO==“D”, SZ1->Z1_SALDO + M->Z2_VALOR, SZ1->Z1_SALDO - M->Z2_VALOR) Posiciona: Sim Alias: SZ1 Ordem: 1 Chave: xFilial(“SZ1”) + M->Z2_NOME SIGACFG: menu Base de Dados / Dicionario / Gatilhos Consulta Padrão: consulta a um arquivo. Na segunda tela, no campo Consulta Analítica, pode informar o nome de uma User Function que monta uma consulta específica, que é acionada pela tecla F5. Consulta Específica: consulta montada via User Function. Consulta Usuários: permite consultar a lista dos usuários cadastrados no sistema e retornar seus dados. Consulta Grupo de Usuários: permite consultar o Grupo de Usuários.

71 Crie em ERP o menu do Sistema de Contas Correntes
Exercício Crie em ERP o menu do Sistema de Contas Correntes SIGACFG: menu Ambiente / Cadastro / Menus Contas Correntes Atualizações Consultas Programa: Con001 Relatórios Rel001 Contas Cad Transações Modelo 1 TranM1 Modelo 2 TranM2 Modelo 3 TranM3

72 Aula 2 Programação Comandos e funções Operadores IDE
Variáveis de memória Array Funções Em 1974, foi escrita a primeira versão do SIGA – Sistema Integrado de Gerência Automática, em Assembly. Em 1978, foi reescrito para Natural/Adabas. Em 1983, começou a surgir os primeiros micros. E surgiu também o primeiro banco de dados para micros, o DBase II, e logo depois, o DBase III. O DBase era um banco de dados que tinha uma linguagem de programação embutida, mas era interpretada. Era obrigado a entregar os fontes. Logo veio o Clipper, como um compilador para o DBase. O Clipper dominou o mercado. Em 1990, com o Clipper 5, foi criada a maioria das facilidades de customização que o sistema tem hoje, por exemplo, o Dicionário de Dados. O usuário podia até escrever rotinas inteiras, em linguagem Clipper, e executá-las a partir do menu. Eram os chamados RDMake’s. E o sistema passou a se chamar Siga Advanced. Em 1995, o Windows já estava bem desenvolvido. Aí, o sistema foi reescrito para o ambiente Windows. Tentou-se utilizar a linguagem VO-Visual Objects, que era da mesma fabricante do Clipper (CA-Computer Associates). Mas, assim como o Clipper foi um sucesso total, o VO foi um fracasso total. Depois foi usado o Delphi e também o SQL. Até que, em 2000, a Microsiga resolveu desenvolver a sua própria linguagem de programação: o AdvPL – Advanced Protheus Language. Como, desde 1990, o sistema já permitia escrever expressões na linguagem Clipper, e até mesmo rotinas inteiras, havia muita coisa desenvolvida nessa linguagem. E como não podia jogar fora tudo isso, e nem obrigar os usuários a reescrever tudo, a Microsiga resolver adotar a mesma sintaxe do Clipper no AdvPL. E o sistema passou a se chamar Protheus. Então, o AdvPL, pelo menos nos comandos e funções básicas da linguagem, tem a mesmo sintaxe do Clipper.

73 Programação

74 Exercícios de Lógica Aquário
3 cestos com bolas pretas e brancas e etiquetas erradas Preta Branca Preta Branca

75 3 cestos: 1ª hipótese Preta Branca Preta Branca

76 3 cestos: 2ª hipótese Preta Branca Preta Branca

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

78 Cruzamento dos ponteiros do relógio
Entre 0 horas e 24 horas quantas vezes os ponteiros se cruzam, contando inclusive o cruzamento das 0 horas e das 24 horas?

79 Resposta: 23 vezes

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

81 Resposta Vai o 1 e 2 2 Volta o 1 3 Vai o 5 e 10 13 Volta o 2 15

82 Programa Conjunto de Instruções: Comandos e Funções Instruções básicas de uma Linguagem: Aritméticas: Somar / Subtrair / Multiplicar / Dividir Entrada e Saida: Ler / Gravar / Tela / Impressão / Teclado / Atribuição Lógicas: If...Else...EndIf For...Next While...End Do Case...EndCase

83 A Inicio Armar Despertador Resmungar Desligar Despertador Dar-lhe
A Esposa quer $$ ? Armar Despertador Sim Resmungar Desligar Despertador Não Casado há mais de 5 anos ? Dar-lhe R$ 100,00 Sim Bocejar Repetir 3 vezes Não Sacudir a Esposa Beijar a esposa Sair da Cama Casado há mais de 1 ano ? Sim Sim Está Escuro ? Não Acender a luz Beijar a esposa Não Sim Está Frio ? Ir até o carro Voltar para a cama Não Está Com as Chaves ? Voltar para pegá-las Não Possível Fim da rotina Ir ao Banheiro Sim Tomar Café Dirigir-se ao escritório A Fim

84 Operadores + - * / ** ou ^ % x := 10 + 20 nValor := nQtde * nPreco
Matemáticos * / ** ou ^ % x := nValor := nQtde * nPreco nValor := nValor + (nValor * 18 / 100)

85 Operadores < > = = <= >= <> ou # ou != Relacionais
If nQtde < nSaldo MsgAlert(“Pedido liberado”) Else MsgAlert(“Pedido bloqueado: estoque insuficiente”) EndIf If nSalario > 1257 nIR := 15

86 Operadores .And. .Or. .Not. ou ! Lógicos
If cCredito == “OK” .And. nQtde < nSaldo Liberar venda EndIf cCredito == “OK” .And. nQtde < nSaldo V F

87 nQtdeVenda < nSaldo
Operadores Lógicos .And. .Or. .Not. ou ! If cEstNeg == "S" .Or. nQtdVenda < nSaldo MsgAlert("OK, pode faturar!") Else MsgAlert("Estoque insuficiente!") EndIf cEstNeg == “S” .Or. nQtdeVenda < nSaldo V F

88 nQtdVenda < nSaldo )
Operadores Lógicos .And. .Or. .Not. ou ! If cCredito == "OK" .And. (cEstNeg == "S" .Or. nQtdVenda < nSaldo) MsgAlert("OK, pode faturar!") Else MsgAlert("Sem credito ou estoque insuficiente!") EndIf cCredito == “OK” .And. ( cEstNeg == “S” .Or. nQtdVenda < nSaldo ) V F

89 nQtdVenda < nSaldo )
Operadores Lógicos .And. .Or. .Not. ou ! If cCredito == "OK" .And. (cEstNeg == "S" .Or. nQtdVenda < nSaldo) MsgAlert("OK, pode faturar!") Else MsgAlert("Sem credito ou estoque insuficiente!") EndIf cCredito == “OK” .And. ( cEstNeg == “S” .Or. nQtdVenda < nSaldo ) V F

90 Operadores .And. .Or. .Not. ou ! Lógicos
If a <> b If .Not. a==b If !a==b EndIf EndIf EndIf

91 Operadores := += -= *= /= ^= ou **= %= x := 10 x := x + 20
Atribuição := += -= *= /= ^= ou **= %= x := 10 x := x + 20 é o mesmo que: x += 20 nValor := nValor + (nValor * 18 / 100) é o mesmo que: nValor += (nValor * 18 / 100)

92 Operadores i++ ++i i-- --i i++ equivale a i := i + 1 i := 1
Incremento / Decremento i i i i i equivale a i := i + 1 i := 1 MsgAlert(i++) MsgAlert(++i) i := 1 equivale a MsgAlert(i)  mostra 1 i := i + 1 i := 1 equivale a i := i + 1 MsgAlert(i)  mostra 2

93 Operadores x + y x - y x $ y Concatenação cNome := “João”
Strings x + y x - y x $ y Concatenação cNome := “João” cSobreNome := “Silva” cNomeCompleto := cNome + cSobreNome  “JoãoSilva” “A ” - “B”  “AB ” Pertence “Silva” $ cNomeCompleto  .T. “SILVA” $ cNomeCompleto  .F.

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

95 IDE – Primeiro Programa
Criar atalho do IDE (\erp811\bin\remote\mp8ide.exe) Criar um novo projeto Criar um novo arquivo Digitar o primeiro programa Salvá-lo na pasta \erp811\My Projects Inseri-lo no projeto Compilar: Usuário: Administrador Senha: admin Executar User Function Se() Local nX := 10 If nX > 5 MsgAlert("Maior") EndIf Return Ver 010_If.prw / 020_For.prw / 030_While.prw / 040_Case.prw

96 Organização dos Programas-Fonte
Projeto (.PRJ) Programa (.PRW) Função Função Função Programa (.PRW) Função Função Função Programa (.PRW) Função Função Função

97 Variáveis de Memória Memória CPU Armazenamento temporário de dados
Cadastro Nome: José Memória Nome José Valor 1000 A1_NOME José D2_VALOR ICMS = Valor * 18 / 100 1000 CPU

98 Tipos de Variáveis de Memória
Notação Húngara: cTexto nValor dData lOk Caractere “Casa” Numéricas Data CtoD(“25/10/05”) Lógicas .T. .F. nX é numérico X é numérico n X := 1 X agora é caracter cX é caracter c X := “José” Operação matemática ERRO ! n X := X + 1 n

99 Tipos de Variáveis de Memória
Notação Húngara: cTexto nValor dData lOk Caractere “Casa” Numéricas Data CtoD(“25/10/05”) Lógicas .T. .F. Função ValType(NomeVar)  tipo da variável: C, N, D, L, A, U Exemplo: cNome := “Jose” ValType(cNome)  “C” nValor := 1000 ValType(nValor)  “N” x := Nil ValType(x)  “U” Ver Operadores.PRW Exercicio

100 Array, Vetor ou Matriz Variáveis do tipo Caracter: uma para cada nome
cNome1 := “Joao” cNome2 := “Alberto” cNome3 := “Pedro” cNome4 := “Maria” Memória cNome1 cNome2 cNome3 cNome4 Joao Alberto Pedro Maria aNomes Joao Alberto Pedro Maria Variáveis do tipo Array: todos os nomes numa única variável aNomes := {“Joao”, “Alberto”, “Pedro”, “Maria”} aNomes[1] aNomes[2] aNomes[3] aNomes[4]

101 Array, Vetor ou Matriz Variáveis Array Armário 1 Armário 2 Armário 3
Joao Alberto Pedro Maria Array Armário Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4 Joao Alberto Pedro Maria

102 Array, Vetor ou Matriz Gaveta 1 Joao Gaveta 2 Alberto Gaveta 3 Pedro
Maria Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4

103 Array, Vetor ou Matriz Um array pode conter tipos diferentes de dados
aPessoa := {“Joao”, 25, .T.} Um array pode conter outros arrays: Matriz aMatriz := {{“Joao”,25,.T.}, {“Alberto”,18,.F.}, {“Pedro”,40,.T.}, {“Maria”,33,.F.}} aMatriz[1] aMatriz[1][1] aMatriz[1][2] aMatriz[1][3] aMatriz[2] aMatriz[2][1] aMatriz[2][2] aMatriz[2][3] aMatriz := {{“Joao” , 25, .T.},; {“Alberto”, 18, .F.},; {“Pedro” , 40, .T.},; {“Maria” , 33, .F.}}

104 Array, Vetor ou Matriz aMatriz := {{“Joao” , 25, .T.},;
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 Maria 33 Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4 Joao 25 T Alberto 18 F Pedro 40 Maria 33 1 2 3

105 Array, Vetor ou Matriz Adicionar elementos num array vazio
aNomes := {“Joao”, “Alberto”, “Pedro”} aNomes := {“Joao”, “Alberto”, “Pedro”, “Maria”} aNomes := {} aNomes := {“Joao”, “Alberto”} aNomes := {“Joao”} AAdd(aNomes, “Joao”) AAdd(aNomes, “Alberto”) AAdd(aNomes, “Pedro”) AAdd(aNomes, “Maria”) AAdd(aMatriz, {“Joao”,25,.T.}) AAdd(aMatriz, {“Alberto”,18,.F.}) AAdd(aMatriz, {“Pedro”,40,.T.}) AAdd(aMatriz, {“Maria”,33,.F.}) aMatriz: {{“Joao”,25,.T.}, {“Alberto”,18,.F.}, {“Pedro”,40,.T.}, {“Maria”,33,.F.}}

106 Array, Vetor ou Matriz Função Array(n): retorna um array com n elementos nulos aArray := Array(5) aArray  {Nil, Nil, Nil, Nil, Nil} Atribuição de valor aos elementos do array aArray[1] := “A” aArray[2] := “B” aArray[3] := “C” aArray[4] := “D” aArray[5] := “E” aArray  {“A”, “B”, “C”, “D”, “E”} Ver 050_Array.prw Exercicio: fazer o sort de um array

107 Funções Execução (chamada) da função: u_Teste() Programa.PRW
Conjunto de Comandos Programa.PRW User Function Teste() Comandos Return Execução (chamada) da função: u_Teste()

108 Funções Rotinas repetitivas User Function CadCli() Comandos
If CGC(cCGC) continua Else abandona EndIf Return User Function CadFor() Comandos If CGC(cCGC) continua Else abandona EndIf Return CGC do Fornecedor CGC do Cliente Function CGC(cCGC) If cCGC OK lOK := .T. Else lOK := .F. EndIf Return lOK .T. ou .F. .T. ou .F.

109 Funções Programação Estruturada User Function Relato() u_PreparaImpr()
u_LeDados() u_Imprime() Return User Function PreparaImpr() ... User Function LeDados() User Function Imprime()

110 Funções Passagem de parâmetros User Function Venda()
nImposto := u_ICMS(“NE”, 1000) 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” 1000

111 Escôpo das Variávies Local Visível somente na função em que foi criada Private Visível na função em que foi criada e nas funções seguintes Public Visível em todas as funções, a partir do momento em que foi criada Static Visível somente no programa (PRW)

112 Escôpo das Variávies LOCAL Conteúdo PRIVATE Conteúdo PUBLIC Conteúdo
User Function Func1() Local cVar := "Func1" u_Func2() Return LOCAL Conteúdo User Function Func2() Local cVar := "Func2" Local cVar1 := "Func2" Private cVar2 := "Private Func2" Public cVar3 := "Public Func2" u_Func3() Return PRIVATE Conteúdo PUBLIC Conteúdo User Function Func3() cVar2 := “ABC" Return

113 Escôpo das Variávies LOCAL Conteúdo cVar Func1 PRIVATE Conteúdo PUBLIC
User Function Func1() Local cVar := "Func1" u_Func2() Return LOCAL Conteúdo cVar Func1 User Function Func2() Local cVar := "Func2" Local cVar1 := "Func2" Private cVar2 := "Private Func2" Public cVar3 := "Public Func2" u_Func3() Return PRIVATE Conteúdo PUBLIC Conteúdo User Function Func3() cVar2 := “ABC" Return

114 Escôpo das Variávies LOCAL Conteúdo PRIVATE Conteúdo PUBLIC Conteúdo
User Function Func1() Local cVar := "Func1" u_Func2() Return LOCAL Conteúdo cVar cVar1 Func2 User Function Func2() Local cVar := "Func2" Local cVar1 := "Func2" Private cVar2 := "Private Func2" Public cVar3 := "Public Func2" u_Func3() Return PRIVATE Conteúdo cVar2 Private Func2 PUBLIC Conteúdo cVar3 Public Func2 User Function Func3() cVar2 := “ABC" Return

115 Escôpo das Variávies LOCAL Conteúdo PRIVATE Conteúdo PUBLIC Conteúdo
User Function Func1() Local cVar := "Func1" u_Func2() Return LOCAL Conteúdo User Function Func2() Local cVar := "Func2" Local cVar1 := "Func2" Private cVar2 := "Private Func2" Public cVar3 := "Public Func2" u_Func3() Return PRIVATE Conteúdo cVar2 ABC PUBLIC Conteúdo cVar3 Public Func2 User Function Func3() cVar2 := “ABC" Return

116 Escôpo das Variávies LOCAL Conteúdo PRIVATE Conteúdo PUBLIC Conteúdo
User Function Func1() Local cVar := "Func1" u_Func2() Return LOCAL Conteúdo cVar cVar1 Func2 User Function Func2() Local cVar := "Func2" Local cVar1 := "Func2" Private cVar2 := "Private Func2" Public cVar3 := "Public Func2" u_Func3() Return PRIVATE Conteúdo cVar2 ABC PUBLIC Conteúdo cVar3 Public Func2 User Function Func3() cVar2 := “ABC" Return

117 Escôpo das Variávies LOCAL Conteúdo cVar Func1 PRIVATE Conteúdo PUBLIC
User Function Func1() Local cVar := "Func1" u_Func2() Return LOCAL Conteúdo cVar Func1 User Function Func2() Local cVar := "Func2" Local cVar1 := "Func2" Private cVar2 := "Private Func2" Public cVar3 := "Public Func2" u_Func3() Return PRIVATE Conteúdo De preferência, devem ser usadas variáveis LOCAIS. PUBLIC Conteúdo cVar3 Public Func2 User Function Func3() cVar2 := “ABC" Return Ver 052_EscopoVar.prw

118 São criadas variáveis LOCAIS
Passagem de Parâmetros Por Valor User Function Venda() Local cRegiao := “NE” Local nValor := 1000 nImposto := ICMS(cRegiao, nValor) Return “NE” 1000 User Function ICMS(cRegiao, nValor) If cRegiao == “SE” nICMS := nValor * 18 / 100 ElseIf cRegiao == “NE” nICMS := nValor * 7 / 100 Else nICMS := nValor * 12 / 100 EndIf Return nICMS São criadas variáveis LOCAIS “NE” 1000

119 Passagem de Parâmetros
Por Valor User Function Param1() Local x := 1 Local y := 2 u_Param2(x, y) MsgAlert(x+y) Return x = 1 y = 2 User Function Param2(x, y) x := 50 y := 100 Return Ver 060_Param.prw

120 Passagem de Parâmetros
Por Valor User Function Param1() Local x := 1 Local y := 2 u_Param2(x, y) MsgAlert(x+y) Return x = 1 y = 2 User Function Param2(x, y) x := 50 y := 100 Return x = 50 y = 100 Ver 060_Param.prw

121 Passagem de Parâmetros
Por Valor User Function Param1() Local x := 1 Local y := 2 u_Param2(x, y) MsgAlert(x+y) Return x = 1 y = 2 User Function Param2(x, y) x := 50 y := 100 Return Ver 060_Param.prw

122 Passagem de Parâmetros
Por Referência User Function Param1() Local x := 1 Local y := 2 y) MsgAlert(x+y) Return x = 1 y = 2 User Function Param2(x, y) x := 50 y := 100 Return Ver 060_Param.prw

123 Passagem de Parâmetros
Por Referência User Function Param1() Local x := 1 Local y := 2 y) MsgAlert(x+y) Return x = 50 y = 2 User Function Param2(x, y) x := 50 y := 100 Return y = 100 Ver 060_Param.prw

124 Passagem de Parâmetros
Por Referência User Function Param1() Local x := 1 Local y := 2 y) MsgAlert(x+y) Return x = 50 y = 2 User Function Param2(x, y) x := 50 y := 100 Return Ver 060_Param.prw

125 Funções de Caracteres, Números e Datas
Manipulação de textos (strings) Conversão de números Funções de data e hora Conversão de datas Ver 053_Tratamentos.PRW

126 Aula 3 Macro Bloco de Código UDC Semáforos Arquivos e Índices
Em 1974, foi escrita a primeira versão do SIGA – Sistema Integrado de Gerência Automática, em Assembly. Em 1978, foi reescrito para Natural/Adabas. Em 1983, começou a surgir os primeiros micros. E surgiu também o primeiro banco de dados para micros, o DBase II, e logo depois, o DBase III. O DBase era um banco de dados que tinha uma linguagem de programação embutida, mas era interpretada. Era obrigado a entregar os fontes. Logo veio o Clipper, como um compilador para o DBase. O Clipper dominou o mercado. Em 1990, com o Clipper 5, foi criada a maioria das facilidades de customização que o sistema tem hoje, por exemplo, o Dicionário de Dados. O usuário podia até escrever rotinas inteiras, em linguagem Clipper, e executá-las a partir do menu. Eram os chamados RDMake’s. E o sistema passou a se chamar Siga Advanced. Em 1995, o Windows já estava bem desenvolvido. Aí, o sistema foi reescrito para o ambiente Windows. Tentou-se utilizar a linguagem VO-Visual Objects, que era da mesma fabricante do Clipper (CA-Computer Associates). Mas, assim como o Clipper foi um sucesso total, o VO foi um fracasso total. Depois foi usado o Delphi e também o SQL. Até que, em 2000, a Microsiga resolveu desenvolver a sua própria linguagem de programação: o AdvPL – Advanced Protheus Language. Como, desde 1990, o sistema já permitia escrever expressões na linguagem Clipper, e até mesmo rotinas inteiras, havia muita coisa desenvolvida nessa linguagem. E como não podia jogar fora tudo isso, e nem obrigar os usuários a reescrever tudo, a Microsiga resolver adotar a mesma sintaxe do Clipper no AdvPL. E o sistema passou a se chamar Protheus. Então, o AdvPL, pelo menos nos comandos e funções básicas da linguagem, tem a mesmo sintaxe do Clipper.

127 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

128 Macro-Substituição 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 Arquivo SM4 - Fórmulas M4_FILIAL: “01” M4_CODIGO: “001” M4_FORMULA: “SB1->B1_Prv1 * 1.25” “SB1->B1_Prv1 * 1.25” SB1->B1_Prv1 * 1.25 &(SB1->B1_Prv1 * 1.25) Ver Reajuste.PRW

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

130 Bloco de Código bBloco := {|| 2 * 10} nResult := EVal(bBloco)
bBloco := {|x| x * 2} nResult := EVal(bBloco, 5) nResult = 10 Ver 051_Bloco.prw

131 AEval(aNomes, {|x| MsgAlert(x)})
Bloco de Código aNomes := {“Joao”, “Alberto”, “Pedro”, “Maria”} AEval(aNomes, {|x| MsgAlert(x)}) DBEval() Ver AEval em 050_Array.prw

132 Bloco de Código .T. .T. .F. Ordenação de array aMatriz := { , , , }
ASort(aMatriz,,,{|aX,aY| aX[2] < aY[2]}) {“Joao ”,15} {“Pedro ”,10} {“Alberto”,20} {“Alberto”,20} {“Pedro ”,10} {“Maria ”,30} .T. .T. .F. Ver 050_Array.prw

133 Bloco de Código .F. .T. .T. Ordenação de array aMatriz := { , , , }
ASort(aMatriz,,,{|aX,aY| aX[2] < aY[2]}) {“Pedro ”,10} {“Joao ”,15} {“Joao ”,15} {“Pedro ”,10} {“Alberto”,20} {“Maria ”,30} .F. .T. .T. Ver 050_Array.prw

134 UDC – User Defined Command
Legibilidade e Manutenibilidade do Fonte Instruções para o Compilador #DEFINE #IFDEF...#ELSE...#ENDIF #IFNDEF #INCLUDE #COMMAND Ver 080_UDC.prw

135 Semáforos GetSXENum(Alias) Obtem o próximo número
Controle de numeração sequencial GetSXENum(Alias) Obtem o próximo número ConfirmSX8() Confirma o número RollBackSX8() Reutiliza o número MayIUseCode(Alias) Confirma se o número está mesmo disponível APCFG110 Manutenção do SXE/SXF ou Hardlock Arquivos MS: só alias GetSXENum(“SC5”) Arquivos de usuário: alias e campo GetSXENum(“SZ2”, “Z2_NUMERO”) Exemplo: 001 002 003 004 005 003 004 006 007 008 Exemplos em 120_TranM2

136 Arquivos

137 M.E.R. Modelo de Entidades e Relacionamento
Famílias de Arquivos de Dados SA - Cadastros SB - Estoques SC - Previsões de E/S SD - Mov. De Estoque SE - Financeiro SF - Fiscal SG - Estruturas SH - Carga de Máquina SI - Contábil SJ - Estatísticas SM - Miscelâneas SN - Ativo Fixo SO - Assist. Técnica SP - Ponto Eletrônico SQ - Recr. e Seleção SR - Folha de Pagto ST - Manut. Industrial SU - Telemarketing SV - Concessionárias SW e SY - Export./Import. Q? - Qualidade (Celerina) R? - Recursos Humanos SZ,QZ,RZ - Livres P? - Projetos Especiais M.E.R. Modelo de Entidades e Relacionamento

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

139 Arquivos de Dados – por Empresa
O sistema permite controlar até 99 Empresas. Cada Empresa pode ter até 99 Filiais: Empresa 01 – Filiais 01 Empresa 02 – Filiais 01 02 02 99 99 Para cada Empresa é criado um jogo de arquivos: SXXnn0 – onde: XX = Prefixo do arquivo nn = Empresa Exemplo: Empresa 99 -> SA1990, SA2990, SB O nome de todos os campos começa sempre com o prefixo do nome do arquivo. Ex.: arquivo SA1, campos A1_COD, A1_NOME. Todos os arquivos tem um campo de Filial.

140 Arquivos de Dados – por Empresa
Os dados das Filiais ficam dentro do arquivo de cada Empresa. Todo arquivo, exceto SM2, tem um campo XX_Filial que identifica a Filial: 01 02 Nomenclatura dos campos: Arquivo SA1: A1_FILIAL SA2: A2_FILIAL SB1: B1_FILIAL QA1: QA1_FILIAL A1_COD A2_COD B1_COD QA1_COD A1_NOME A2_NOME B1_DESC QA1_DESC A1_END A2_END B1_TIPO O nome de todos os campos começa sempre com o prefixo do nome do arquivo. Ex.: arquivo SA1, campos A1_COD, A1_NOME. Todos os arquivos tem um campo de Filial.

141 Arquivos de Dados Modo de Acesso Compartilhado  registros compartilhados entre as filiais Campo Filial: em branco Exclusivo  o registro é exclusivo da filial Campo Filial: código da Filial (variável cFilAnt) Ex: SA1 - Compartilhado A1_FILIAL A1_COD A1_NOME FABRICA DE TINTAS E VERINIZES LTDA /SP TEX MALHAS E CONFECCOES S.A /SP CLIENTE PADRAO ARMANDO JOSE FLORES /SC COMERCIO SOM DO MUNDO /SP xFilial(“SA1”)  “ “ Ex: SC5 - Exclusivo C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 xFilial(“SC5”)  cFilAnt

142 Arquivos e Índices Índice: CÓDIGO Arquivo CODIGO REGISTRO
RECNO A1_COD A1_NOME FABRICA DE TINTAS E VERINIZES LTDA /SP TEX MALHAS E CONFECCOES S.A /SP CLIENTE PADRAO ARMANDO JOSE FLORES /SC COMERCIO SOM DO MUNDO /SP JOAO DA SILVA /SP FLORICULTURA FULO DE MARAVILHA /SP PREFEITURA MUNICIPAL DE SAO PAULO /SP ECOSSISTEMA DIGITAL S/A ACTIONVEA IMP. EXP. STARMEAL LEAK S.A. REIZA KERN IMP. EXP. JOAO DE ALMEIDA SILVA /RS DESPACHANTE IMPORTADOR EUA

143 Arquivos e Índices Índice: NOME Arquivo NOME REGISTRO
RECNO A1_COD A1_NOME ACTIONVEA.. 10 ARMANDO J.. 04 CLIENTE P.. 03 COMERCIO .. 05 DESPACHAN.. 14 ECOSSISTE.. 09 FABRICA D.. 01 FLORICULT.. 07 IMPORTADO.. 15 JOAO DA S.. 06 JOAO DE A.. 13 PREFEITUR.. 08 REIZA KER.. 12 STARMEAL .. 11 TEX MALHA.. 02 FABRICA DE TINTAS E VERINIZES LTDA /SP TEX MALHAS E CONFECCOES S.A /SP CLIENTE PADRAO ARMANDO JOSE FLORES /SC COMERCIO SOM DO MUNDO /SP JOAO DA SILVA /SP FLORICULTURA FULO DE MARAVILHA /SP PREFEITURA MUNICIPAL DE SAO PAULO /SP ECOSSISTEMA DIGITAL S/A ACTIONVEA IMP. EXP. STARMEAL LEAK S.A. REIZA KERN IMP. EXP. JOAO DE ALMEIDA SILVA /RS DESPACHANTE IMPORTADOR EUA

144 Posicionamento de registro
Arquivos e Índices RECNO A1_COD A1_NOME FABRICA DE TINTAS E VERINIZES LTDA /SP TEX MALHAS E CONFECCOES S.A /SP CLIENTE PADRAO ARMANDO JOSE FLORES /SC COMERCIO SOM DO MUNDO /SP JOAO DA SILVA /SP FLORICULTURA FULO DE MARAVILHA /SP PREFEITURA MUNICIPAL DE SAO PAULO /SP ECOSSISTEMA DIGITAL S/A ACTIONVEA IMP. EXP. Arquivo: SA Alias: SA Cadastro de Clientes CODIGO REG Índices dbSelectArea(“SA1”) RECNO B1_COD B1_DESC B1_TIPO B1_UM PROD. DE REVENDA PA UN PROD. ACABADO PA UN MAT. PRIMA 1 – QUALITY MP UN CAIXA GRANDE – PA PA CX MAT. PRIMA MP UN ALCOOL ETILICO MC L LUVA MP UN CAIXA PEQUENA – PA PA CX CODIGO REG Arquivo: SB Alias: SB Cadastro de Produtos Índices dbSelectArea(“SB1”) RECNO C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 Arquivo: SC Alias: SC Pedidos de Venda dbSelectArea(“SC5”) Posicionamento de registro dbSkip() dbSelectArea(“SA1”) dbSetOrder(1) dbSeek(“000002”) dbSelectArea(“SB1”) dbSetOrder(1) dbSeek(“ ”) dbSkip() dbSkip() dbSkip()

145 Posicionamento de Arquivos
Empresa: XX Filial: 02 dbGoTop() dbSeek(xFilial(“SC5”)) FILIAL+NUM REG RECNO C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00 /01/ ,00

146 Posicionamento de Arquivos
Leitura sequencial dbGoTop()  Posiciona no topo do arquivo While !EOF() dbSkip()  Leitura sequencial, registro a registro End FILIAL+NUMERO+ITEM REG RECNO Z2_FILIAL Z2_NUMERO Z2_ITEM EOF() .T.

147 Posicionamento de Arquivos
Acesso direto ao registro Por chave completa ou parcial dbSeek(xFilial(“SZ2”)+”0003”+”02”)  Chave completa dbSeek(xFilial(“SZ2”)+”0003”)  Chave parcial FILIAL+NUMERO+ITEM REG RECNO Z2_FILIAL Z2_NUMERO Z2_ITEM

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

149 Aula 4 AxCadastro MBrowse Modelo2 Modelo3
Em 1974, foi escrita a primeira versão do SIGA – Sistema Integrado de Gerência Automática, em Assembly. Em 1978, foi reescrito para Natural/Adabas. Em 1983, começou a surgir os primeiros micros. E surgiu também o primeiro banco de dados para micros, o DBase II, e logo depois, o DBase III. O DBase era um banco de dados que tinha uma linguagem de programação embutida, mas era interpretada. Era obrigado a entregar os fontes. Logo veio o Clipper, como um compilador para o DBase. O Clipper dominou o mercado. Em 1990, com o Clipper 5, foi criada a maioria das facilidades de customização que o sistema tem hoje, por exemplo, o Dicionário de Dados. O usuário podia até escrever rotinas inteiras, em linguagem Clipper, e executá-las a partir do menu. Eram os chamados RDMake’s. E o sistema passou a se chamar Siga Advanced. Em 1995, o Windows já estava bem desenvolvido. Aí, o sistema foi reescrito para o ambiente Windows. Tentou-se utilizar a linguagem VO-Visual Objects, que era da mesma fabricante do Clipper (CA-Computer Associates). Mas, assim como o Clipper foi um sucesso total, o VO foi um fracasso total. Depois foi usado o Delphi e também o SQL. Até que, em 2000, a Microsiga resolveu desenvolver a sua própria linguagem de programação: o AdvPL – Advanced Protheus Language. Como, desde 1990, o sistema já permitia escrever expressões na linguagem Clipper, e até mesmo rotinas inteiras, havia muita coisa desenvolvida nessa linguagem. E como não podia jogar fora tudo isso, e nem obrigar os usuários a reescrever tudo, a Microsiga resolver adotar a mesma sintaxe do Clipper no AdvPL. E o sistema passou a se chamar Protheus. Então, o AdvPL, pelo menos nos comandos e funções básicas da linguagem, tem a mesmo sintaxe do Clipper.

150 Funções de Tratamento de Arquivos
AxCadastro,MBrowse,Modelo2,Modelo3

151 AxCadastro AxPesqui() AxVisual() AxInclui() AxAltera() AxDeleta()

152 AxCadastro AxInclui() Ver 100_Cad.prw

153 AxCadastro Cadastre algumas contas
No campo , coloque: E no 1, coloque:

154 MBrowse Precisa de duas variáveis PRIVATE:
Permite uma flexibilidade maior que a AxCadastro Precisa de duas variáveis PRIVATE: cCadastro  Título da janela. aRotina  array onde devem ser incluidos os botões (no máximo, 10). Esses botões podem ser associados a qualquer função, inclusive AxInclui(), AxAltera(), etc. Ver 110_TranM1.prw

155 Sobre variáveis… S S N N N S S N Referência a uma variável
Nome := “João” É atribuição de valor? S Cria a variável Variável existe ? Atribui o valor à variável S N Nome := “João” Cria como privada “João”  Var. Nome N Erro: variável não existe Existe um arquivo aberto ? 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ória SZ1->Z1_Nome  campo de arquivo Arquivo Codigo Nome S João Existe campo com este nome ? Grava o valor no campo S N Arquivo Codigo Descricao “João”  Campo Nome

156 Sobre variáveis… JOSE 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_ M->Z1_ 1 M->Z1_SALDO Estas variáveis são usadas em Validações, Gatilhos, etc. ExistChav(“SZ1”, M->Z1_NOME, 1) JOSE

157 Funções de tratamento de arquivos
Ver FuncMod2 Ver MarkBrow (exemplo do Baile)

158 Modelo 2 Enchoice GetDados aHeader aCols Variáveis de memória Número
Nome Data aHeader Item Tipo Histórico Valor GetDados aCols

159 Modelo 2 Enchoice GetDados aHeader aCols Variáveis de memória Número
Nome Data 1 2 3 4 5 6 7 8 9 10 Item Z2_ITEM 2 C SZ2 R Tipo Z2_TIPO 1 Histórico Z2_HIST 20 Valor Z2_VALOR @E 999,999,999.99 12 N Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto aHeader GetDados 1 2 3 D Deposito ,00 .F. aCols S Saque ,00 .F. S Saque ,00 .F.

160 Modelo 2 Array aRotina lRet mBrowse() .T. Monta os parametros:
Variáveis de memória aHeader aCols Enchoice nOpc 3 5 Inclusão Exclusão 4 lRet := Modelo2() Alteração Ver 120_TranM2.prw

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

162 Array(5) Array(?) Modelo 2 – Criação do aCols para Inclusão aHeader
Adiciona uma linha no aCols 1 2 3 4 5 6 7 8 9 10 Item Z2_ITEM 2 C SZ2 R Tipo Z2_TIPO 1 Histórico Z2_HIST 20 Valor Z2_VALOR @E 999,999,999.99 12 N Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto aHeader 1 Array(5) Array(?) Nil Nil Nil Nil Nil aCols // Como cada elemento de aCols sempre contera um elemento a mais que o aHeader, // adiciona em aCols um ARRAY com o "num.elementos de aHeader + 1", ou seja, 5 elementos. AAdd(aCols, Array(Len(aHeader)+1)) 4

163 Modelo 2 – Criação do aCols para Inclusão
Preenche o aCols de acordo com o Inicializador-Padrão 1 2 3 4 5 6 7 8 9 10 Item Z2_ITEM 2 C SZ2 R Tipo Z2_TIPO 1 Histórico Z2_HIST 20 Valor Z2_VALOR @E 999,999,999.99 12 N Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto aHeader 1 “ “ Nil “D” Nil “ “ Nil 0,00 Nil Nil aCols // 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]) Next “Z2_VALOR” “Z2_ITEM” “Z2_HIST” “Z2_TIPO” 2 3 4 1 1 2 3 4

164 Modelo 2 – Criação do aCols para Inclusão
Inicializa a última coluna com .F. 1 2 3 4 5 6 7 8 9 10 Item Z2_ITEM 2 C SZ2 R Tipo Z2_TIPO 1 Histórico Z2_HIST 20 Valor Z2_VALOR @E 999,999,999.99 12 N Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto aHeader 1 Nil “ “ “D” Nil “ “ Nil 0,00 Nil Nil .F. aCols // Inicializa a ultima coluna para o controle da GetDados: deletado ou nao. // aCols[1][5] := .F. aCols[1][Len(aHeader)+1] := .F. 4

165 Modelo 2 – Criação do aCols para Inclusão
Inicializa a coluna do ITEM com 01 1 2 3 4 5 6 7 8 9 10 Item Z2_ITEM 2 C SZ2 R Tipo Z2_TIPO 1 Histórico Z2_HIST 20 Valor Z2_VALOR @E 999,999,999.99 12 N Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto aHeader 1 “01“ “ “ “D” Nil “ “ Nil 0,00 Nil Nil .F. aCols // Inicializa a coluna do ITEM com 01. // aCols[1][1] := "01" <-- teria problema se o usuario alterasse a posicao do // campo Z2_ITEM no Dic. de Dados. aCols[1][AScan(aHeader, {|x|Trim(x[2])=="Z2_ITEM"})] := "01" 1

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

167 Modelo 2 – Criação do aCols para Alteração
Inicializa as variáveis de memória da Enchoice M->Z2_Nome := (cAlias)->Z2_Nome M->Z2_Numero := (cAlias)->Z2_Numero M->Z2_Data := (cAlias)->Z2_Data PEDRO 0003 30/03/06

168 Modelo 2 – Criação do aCols para Alteração
Posiciona no primeiro registro com o número 0003 M->Z2_Nome := (cAlias)->Z2_Nome M->Z2_Numero := (cAlias)->Z2_Numero M->Z2_Data := (cAlias)->Z2_Data PEDRO 0003 30/03/06 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 01 PEDRO 0003 “01” + “0003” “01” + “0003” “01” + “0004”

169 Modelo 2 – Criação do aCols para Alteração
Adiciona uma linha no aCols 1 2 3 4 5 6 7 8 9 10 Item Z2_ITEM 2 C SZ2 R Tipo Z2_TIPO 1 Histórico Z2_HIST 20 Valor Z2_VALOR @E 999,999,999.99 12 N Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto aHeader 1 Nil Nil Nil Nil Nil aCols // Como cada elemento de aCols sempre contera um elemento a mais que o aHeader, // adiciona em aCols um ARRAY com o "num.elementos de aHeader + 1", ou seja, 5 elementos. AAdd(aCols, Array(Len(aHeader)+1)) 4

170 Modelo 2 – Criação do aCols para Alteração
Preenche o aCols com os dados lidos do arquivo 1 2 3 4 5 6 7 8 9 10 Item Z2_ITEM 2 C SZ2 R Tipo Z2_TIPO 1 Histórico Z2_HIST 20 Valor Z2_VALOR @E 999,999,999.99 12 N Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto aHeader 1 “01“ Nil “D” Nil “Deposito“ Nil 500,00 Nil Nil aCols 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 “Z2_VALOR” “Z2_ITEM” “Z2_HIST” “Z2_TIPO” 4 1 3 2 4 2 3 1 7 4 6 8 Z2_ITEM Z2_TIPO Z2_HIST Z2_VALOR 01 D Deposito 500,00 02 D Deposito 150,00 03 S Saque 90,00

171 Modelo 2 – Criação do aCols para Alteração
Inicializa a última coluna com .F. 1 2 3 4 5 6 7 8 9 10 Item Z2_ITEM 2 C SZ2 R Tipo Z2_TIPO 1 Histórico Z2_HIST 20 Valor Z2_VALOR @E 999,999,999.99 12 N Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto aHeader 1 “01“ “D” “Deposito“ 500,00 Nil .F. aCols // Inicializa a ultima coluna para o controle da GetDados: deletado ou nao. // aCols[1][5] := .F. aCols[nLin][Len(aHeader)+1] := .F. 4

172 Modelo 3 Similar ao Modelo2 Diferença: Modelo2 – Cabeçalho e Itens são o mesmo arquivo (ex.: SC7 - Ped. Compras) A definição de quais campos ficarão no cabeçalho e quais ficarão nos itens, é feita no programa. Modelo3 – Cabeçalho é um arquivo (ex.: SC5 – Cabec. Ped. Vendas) Itens é outro arquivo (ex.: SC6 – Itens do Ped. Vendas) Ver 130_TranM3.prw

173 Aula 5 Telas Relatórios Reposicionamento de arquivos
Integração com Excel SQL OOP Arquivos TXT e XML Em 1974, foi escrita a primeira versão do SIGA – Sistema Integrado de Gerência Automática, em Assembly. Em 1978, foi reescrito para Natural/Adabas. Em 1983, começou a surgir os primeiros micros. E surgiu também o primeiro banco de dados para micros, o DBase II, e logo depois, o DBase III. O DBase era um banco de dados que tinha uma linguagem de programação embutida, mas era interpretada. Era obrigado a entregar os fontes. Logo veio o Clipper, como um compilador para o DBase. O Clipper dominou o mercado. Em 1990, com o Clipper 5, foi criada a maioria das facilidades de customização que o sistema tem hoje, por exemplo, o Dicionário de Dados. O usuário podia até escrever rotinas inteiras, em linguagem Clipper, e executá-las a partir do menu. Eram os chamados RDMake’s. E o sistema passou a se chamar Siga Advanced. Em 1995, o Windows já estava bem desenvolvido. Aí, o sistema foi reescrito para o ambiente Windows. Tentou-se utilizar a linguagem VO-Visual Objects, que era da mesma fabricante do Clipper (CA-Computer Associates). Mas, assim como o Clipper foi um sucesso total, o VO foi um fracasso total. Depois foi usado o Delphi e também o SQL. Até que, em 2000, a Microsiga resolveu desenvolver a sua própria linguagem de programação: o AdvPL – Advanced Protheus Language. Como, desde 1990, o sistema já permitia escrever expressões na linguagem Clipper, e até mesmo rotinas inteiras, havia muita coisa desenvolvida nessa linguagem. E como não podia jogar fora tudo isso, e nem obrigar os usuários a reescrever tudo, a Microsiga resolver adotar a mesma sintaxe do Clipper no AdvPL. E o sistema passou a se chamar Protheus. Então, o AdvPL, pelo menos nos comandos e funções básicas da linguagem, tem a mesmo sintaxe do Clipper.

174 Telas

175 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

176 RDDemo e RDDemo2 – mais componentes de tela

177 Relatórios

178 Relatórios Criar um relatório pelo Assistente de Código do IDE:
IDE: menu Ferramentas / Assistente de Código Nome Data Numero Item Tipo Historico Valor Para incluir as ordens, digitar no campo Ordem e clicar neste botão

179 Relatórios Alterar o nome da User Function para: Rel001()
Na função RunReport(), após a linha “nLin := nLin + 1”, que normalmente está na linha 221, incluir os comandos de impressão dos campos: @nLin,00 PSay SZ2->Z2_Nome @nLin,23 PSay SZ2->Z2_Data @nLin,34 PSay SZ2->Z2_Numero @nLin,41 PSay SZ2->Z2_Item @nLin,46 PSay SZ2->Z2_Tipo @nLin,50 PSay SZ2->Z2_Hist @nLin,73 PSay SZ2->Z2_Valor Picture 999,999,999.99" Compilar e executar

180 Relatórios Perguntas Arquivo SX1 Função Pergunte(): lê as perguntas e cria as variáveis correspondentes à cada pergunta: MV_PAR01, MV_PAR02, etc. Estas variáveis são Private. Sintaxe: Pergunte(cPerg, lMostra) cPerg  código do grupo de perguntas lMostra  .T. abre a tela de perguntas  .F. não abre a tela; apenas cria as variáveis

181 Relatórios Perguntas Abrir e compilar o programa CriaSX1.prw
Na parte inicial do programa, antes da linha “Pergunte(cPerg, .F.)”, incluir a chamada à função u_CriaSX1(cPerg) Na função RunReport(), na parte da impressão dos campos, incluir a lógica para imprimir somente se o Nome e a Data estiverem dentro dos limites informados nas perguntas “Conta de”, “Conta até”, “Data de” e “Data até” If SZ2->Z2_Nome >= mv_Par01 .And. SZ2->Z2_Nome <= mv_Par02 .And.; SZ2->Z2_Data >= mv_Par03 .And. SZ2->Z2_Data <= mv_Par04 @nLin,00 PSay SZ2->Z2_Nome ... EndIf

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

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

184 Relatórios Funções usadas nos programas de relatórios
SetPrint()  janela principal para definição das propriedades do relatório (array aReturn). aReturn[1] = Reservado para formulário aReturn[2] = Reservado para número de vias aReturn[3] = Destinatário aReturn[4] = Formato: 1-Retrato, 2-Paisagem aReturn[5] = Tipo midia: 1-Disco, 2-Via spool, 3-Direto na porta, 4- aReturn[6] = "NomeArq"-Disco, "LPT1"-Via spool, "LPT1"-Direto na porta, ""-Cancelado aReturn[7] = Expressão do filtro aReturn[8] = Ordem a ser selecionada SetDefault()  prepara o ambiente de impressão de acordo com as informações contidas no array aReturn, obtidas através da função SetPrint(). Pergunte()  abre a janela de perguntas. RptStatus()  executa a função de impressão, mostrando uma régua de progressão. SetRegua()  define o limite da régua de progressão criada pela função RptStatus(). IncRegua()  incrementa a progressão da régua.

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

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

187 Reposicionamento de Arquivos
As funções de Ponto de Entrada que despocionarem arquivos têm a responsabilidade de devolvê-los na mesma situação em que receberam. Para tanto, estas três informações devem ser guardadas: cAlias := Alias() Arquivo atualmente selecionado nOrdem := IndexOrd() Índice selecionado nRecno := Recno() Número do registro posicionado Na saída, devem ser restauradas: dbSelectArea(cAlias) dbSetOrder(nOrdem) dbGoTo(nRecno)

188 Reposicionamento de Arquivos
GetArea() Guarda as três informações num array RestArea() Restaura User Function MT010Inc() Local aAreaSA1 := SA1->(GetArea()) Local aAreaSB1 := SB1->(GetArea()) Local aAreaSC5 := SC5->(GetArea()) ... RestArea(aAreaSA1) RestArea(aAreaSB1) RestArea(aAreaSC5) Return Obs.: esta regra vale para qualquer função.

189 =MSGetArray(A1;Siga("U_PLANMOV"))
Integração com Excel Protheus Excel APExcel =MSGetArray(A1;Siga("U_PLANMOV")) Array de dados u_PlanMov() Ver 170_Planilha.prw

190 SQL - Structured Query Language
SELECT Natureza, Data, Valor FROM Movto SELECT MOVTO.Natureza, MOVTO.Data, MOVTO.Valor, ORCADO.Tipo FROM MOVTO, ORCADO SELECT * FROM Movto WHERE Valor > 100 SELECT * FROM Orcado WHERE Natureza = ‘Casa’ Outras cláusulas do SELECT: GROUP BY, ORDER BY, HAVING, AND, OR, IN, DISTINCT, BETWEEN, LIKE. VIEW ou Visão. A View é virtual Ver 090_DBFSQL.prw Ver texto Programando SQL com RDMake Relação de Stored Procedures no PPT Oficial

191 MPSDU Programa utilitário para acesso, visualização e pequenas manutenções de arquivos Menu Arquivo / Abrir 1 MPSDU TCP Environment 3 4 2 Administrador admin

192 MPSDU

193 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

194 Arquivos Texto O IDE possui um Assistente de Geração e Importação de arquivos texto: IDE: menu Ferramentas / Assistente de Código SZ1JOSE SZ230/03/06DDeposito inicial SZ230/03/06SPagto. conta de luz SZ230/03/06SSupermercado SZ1MARIA SZ230/03/06DAbertura de conta SZ230/03/06SLojas Marina SZ1PEDRO SZ230/03/06DDeposito SZ230/03/06DDeposito SZ230/03/06SConta de telefone Programa TXT: gera e lê arquivos TXT. É necessário criar, abaixo do diretório \MP_DATA, o diretório \TXT, onde será gravado o arquivo CONTAS.TXT. Ver 150_TXT.prw

195 XML Programa XML: gera e lê arquivos XML.
<Contas> <Conta> <Nome>JOSE</Nome> <Saldo>9560</Saldo> <Transacao> <Data>30/03/06</Data> <Tipo>D</Tipo> <Hist>Deposito inicial</Hist> <Valor>10000</Valor> </Transacao> <Tipo>S</Tipo> <Hist>Pagto. conta de luz</Hist> <Valor>300</Valor> </Conta> </Contas> Programa XML: gera e lê arquivos XML. Será gravado no diretório \TXT, o arquivo CONTAS.XML. Este arquivo poderá ser visualizado no Internet Explorer. Ver 160_XML.prw

196 Aula 6 Workflow WebServices AdvPL ASP
Em 1974, foi escrita a primeira versão do SIGA – Sistema Integrado de Gerência Automática, em Assembly. Em 1978, foi reescrito para Natural/Adabas. Em 1983, começou a surgir os primeiros micros. E surgiu também o primeiro banco de dados para micros, o DBase II, e logo depois, o DBase III. O DBase era um banco de dados que tinha uma linguagem de programação embutida, mas era interpretada. Era obrigado a entregar os fontes. Logo veio o Clipper, como um compilador para o DBase. O Clipper dominou o mercado. Em 1990, com o Clipper 5, foi criada a maioria das facilidades de customização que o sistema tem hoje, por exemplo, o Dicionário de Dados. O usuário podia até escrever rotinas inteiras, em linguagem Clipper, e executá-las a partir do menu. Eram os chamados RDMake’s. E o sistema passou a se chamar Siga Advanced. Em 1995, o Windows já estava bem desenvolvido. Aí, o sistema foi reescrito para o ambiente Windows. Tentou-se utilizar a linguagem VO-Visual Objects, que era da mesma fabricante do Clipper (CA-Computer Associates). Mas, assim como o Clipper foi um sucesso total, o VO foi um fracasso total. Depois foi usado o Delphi e também o SQL. Até que, em 2000, a Microsiga resolveu desenvolver a sua própria linguagem de programação: o AdvPL – Advanced Protheus Language. Como, desde 1990, o sistema já permitia escrever expressões na linguagem Clipper, e até mesmo rotinas inteiras, havia muita coisa desenvolvida nessa linguagem. E como não podia jogar fora tudo isso, e nem obrigar os usuários a reescrever tudo, a Microsiga resolver adotar a mesma sintaxe do Clipper no AdvPL. E o sistema passou a se chamar Protheus. Então, o AdvPL, pelo menos nos comandos e funções básicas da linguagem, tem a mesmo sintaxe do Clipper.

197 Aguardando o aprovador acessar o sistema...
WorkFlow Fluxo manual Contas Atualiza saldo Saldo Efetua transações Aguardando o aprovador acessar o sistema... Transa- ções Grava transação Aprova ou Reprova Cliente Aprovador Copiar o arquivo 190_WFSALNEG.HTM para a pasta \ERP811\MP_Data\workflow

198 WorkFlow Fluxo automático Cliente Aprovador Efetua transações
Contas Saldo Negativo? Dispara um WorkFlow WFSalNeg() WFRetorno() Atualiza saldo Saldo Efetua transações Transa- ções Grava a resposta (Aprovado ou Reprovado) Grava transação Cliente Executa a função de retorno Job WFRET WFReturn() Caixa de Saída Se não funcionar: -Ver se o campo do cadastro de Contas está preenchido com -Ver se o ArgoMail está ativo. -Testar se o está funcionando: no Outlook, enviar um de teste para Deverá receber de volta. -Conferir as configurações no SIGACFG: conta Workflow e Schedule. -Se o job foi desconectado pelo Monitor, para compilação, o Server deverá ser reinicializado. -Ver se o arquivo 190-WFSalNeg.htm está na pasta \MP_DATA\WORKFLOW. Captura a resposta Caixa de Entrada Resposta (Aprovado ou Reprovado) Aprovador

199 WebServices Via troca de arquivos Via Web Services
Integração de sistemas Via troca de arquivos Sistema A B TXT/XML Via Web Services Sistema A WSDL Sistema B Web Service <Nome>JOSE</Nome> <Saldo>1000</Saldo>

200 WebServices O Protheus dispõe de um Assistente de Configuração:
\ERP811\BIN\REMOTE\MP8WIZARD.EXE O Wizard configura o MP8SRV.INI

201 WebServices Configuração WS – Protheus 8 Web Services ws \web\ws
ENVIRONMENT Instâncias são usadas para individualizar as configurações dos módulos Web, possibilitando ter diferentes configurações para um mesmo módulo Web. Por exemplo, se a empresa deseja ter imagens diferentes para o site de cada filial ou acessar ambientes (environment) específicos a cada momento, poderá criar diferentes instâncias. Diretório raiz das imagens Pasta para o armazenamento dos arquivos de imagens (gif, jpeg, html, etc.). Fica abaixo do ROOTPATH. Habilitar processos na inicialização do Servidor Na incialização do Protheus Server, inicia todas as threads que irão atender as requisições recebidas pelos WebServices. Caso não seja habilitado, as threads serão iniciadas individualmente, no momento em que chegar a requisição, resultando na queda de performance ou mensagem de erro (“No free working-threads”).

202 WebServices Configuração localhost/ws/9901
Deve-se criar um HOST para cada Empresa/Filial. Tem a ver com o acesso aos dados da Empresa/Filial. Exemplo: localhost/ws/ > Empresa 01, Filial 01 localhost/ws/ > Empresa 01, Filial 02 O mesmo host não pode ser relacionado a mais de uma Empresa/Filial. Os hosts são virtuais. Fisicamente, podem estar no mesmo servidor.

203 WebServices Configuração
Quantidade de usuários que poderão acessar simultaneamente o WebService. Cada thread processa até 10 usuários. Mínimo usuários: 1 -> 1 thread Máximo usuários: 30 -> 3 threads Se chegarem 31 usuários, o 31º. não será atendido. O servidor dará a mensagem “No free working-threads”. Neste caso, deve-se aumentar o número máximo de usuários.

204 WebServices Configuração – MP8SRV.INI [HTTP] ENABLE=1 PORT=80
[localhost/ws/9901] PATH=C:\ERP811\MP_Data\web\ws ENVIRONMENT=ENVIRONMENT INSTANCENAME=ws RESPONSEJOB=JOB_WS_9901 DEFAULTPAGE=wsindex.apw [JOB_WS_9901] TYPE=WEBEX INSTANCES=1,3 SIGAWEB=WS ONSTART=__WSSTART ONCONNECT=__WSCONNECT PREPAREIN=99,01 [ONSTART] JOBS=JOB_WS_9901 Acesso ao WebService: [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 INSTANCES=1,3 SIGAWEB=WS ONSTART=__WSSTART ONCONNECT=__WSCONNECT PREPAREIN=99,01 [ONSTART] JOBS=JOB_WS_9901,JOB_WS1_9901 A WebService é invocada pela sua URL. O Response Job é a chave no .INI que indica qual é a instância de WS que irá responder as requisições. Aponta para um Environment, que indica o RPO que contém o WS invocado. Só estarão disponíveis os WS que foram compilados no RPO apontando no Environment. O termo JOB não é o mesmo dos jobs que são executados pelo Schedule. [EVIRONMENT] SourcePath=C:\ERP811\APO RootPath=C:\ERP811\MP_Data StartPath=\system\ ... [EVIRONMENT1] SourcePath=C:\ERP811\APO1 [EVIRONMENT] SourcePath=C:\ERP811\APO RootPath=C:\ERP811\MP_Data StartPath=\system\ ... [EVIRONMENT1] SourcePath=C:\ERP811\APO1 Emp. 99, Filial 01

205 WebServices Após a configuração, ver a lista de Web Services disponíveis no Protheus: Reinicializar o server No Internet Explorer: Serão listados os WS compilados no RPO relacionado a esta instância (URL).

206 WebServices IDE http://localhost WebService ForneceSaldo
WebService ForneceSaldo Método BuscaSaldo Nome Saldo WSDL Cliente WSForneceSaldo Método BuscaSaldo Nome Saldo Contas Sistema

207 WebServices http://localhost WebService ForneceSaldo Método BuscaSaldo
Nome Saldo WSDL Cliente WSForneceSaldo Método BuscaSaldo Nome Saldo João 1000,00 1000,00 João ConsultaSaldo João 1000,00 Contas Sistema Saldo(cNome) oWS := WSForneceSaldo():New() oWS:BuscaSaldo(cNome) Tela Nome: Saldo: João 1000,00 OK 1000,00 João

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

209 Portal Protheus Configuração PP – Portal Protheus pp \web\pp
ENVIRONMENT

210 Portal Protheus Configuração localhost/pp

211 Portal Protheus Configuração

212 HTML Servidor Internet Browser Página estática (html)
inicio.htm Benvindo ao site da Empresa X Hoje é 10/08/05 <html> <body> Benvindo ao site da Empresa X Hoje é 10/08/05 </body> </html> Página estática

213 com a data obtida do servidor
HTML + ASP Página dinâmica (html + ASP) Servidor Internet 21/02/06 Browser inicio.htm Benvindo ao site da Empresa X Hoje é 21/02/06 <html> <body> Benvindo ao site da Empresa X Hoje é <%=Date%> </body> </html> Página dinâmica, com a data obtida do servidor

214 AdvPL ASP Servidor Internet Protheus Browser
Página com html + AdvPL ASP Servidor Internet Protheus 21/02/06 Browser RPO inicio.prw Benvindo ao site da Empresa X Hoje é 21/02/06 User Function Inicio() Local cHtml WEB EXTENDED INIT cHtml cHtml := ExecInPage(“Pagina”) WEB EXTENDED END Return cHtml Se não funcionar: -Verificar porta 80. Se na inicialização do servidor, aparecer a mensagem “trying connect to port 80 - bind error #10048”, é porque a porta 80 está bloqueada. -Conferir as configurações no Wizard. <html> <body> Benvindo ao site da Empresa X Hoje é <%=Date()%> </body> </html> Pagina.aph Ver 230_ASP1.prw e 235_ASP1.aph Ver 240_ASP2.prw e 245_ASP2.aph Ver 250_ASP3.prw e 255_ASP3.aph Ver 260_ASP4.prw e 265_ASP4.aph Ver 270_ASP5.prw e 275_ASP5.aph

215 Call Center

216 Telnet No MP8SRV.INI, acrescentar:
Integração com equipamentos micro-terminais No MP8SRV.INI, acrescentar: [TELNET] Enable=1 Environment=Environment Main=MTTRAN Port=1024 RPO MTTran() Ver 330_MTTran.prw e 331_MTFunc.prw

217 DEM Linguagem AdvPL Tecnologia Protheus Dicas e Notícias F.A.Q.
Documentação Eletrônica Microsiga Linguagem AdvPL Tecnologia Protheus Dicas e Notícias F.A.Q. Guias de Referência Releases Sistema

218 Top Connect com SQL

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

220 Sistema Gerenciador de
Back-Up Sistema Gerenciador de Banco de Dados Segurança Dicionário de Dados Dicionário de Dados Programa A Programa C Programa B


Carregar ppt "Programação e Customizações"

Apresentações semelhantes


Anúncios Google