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

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

Programação e Customizações AdvPL e Protheus. Aula 1 Evolução e Arquitetura do Sistema Arquivos Customizações Case – Sistema de Contas Correntes.

Apresentações semelhantes


Apresentação em tema: "Programação e Customizações AdvPL e Protheus. Aula 1 Evolução e Arquitetura do Sistema Arquivos Customizações Case – Sistema de Contas Correntes."— 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

3 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 Evolução do Sistema da Microsiga

4 Server (MP8SRVWIN.EXE) Monitor RPO (MPDP811.RPO) Top Connect DB2OracleSQL Server MySQLPostGresSybase Client (WEB) ActiveX Remote (MP8RMT.EXE) Windows Linux Browser Windows Linux Unix Windows Linux Unix Client Aplication Server Database Server DBF/CTREE Multi-Camada

5 Múltiplas configurações Hub..... Hub. modem Servidor Terminal Dados

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

7 Estrutura Protheus APO MATA010 APO MATA010 REMOTE Executa MATA010 Executa MATA010 Executa MATA410 Executa MATA410 Executa CTBR040 Executa CTBR040 RPO MATA010 MATA410 CTBR040 SERVER Programa Fonte MATA010 Cad.ProdutosPed.VendasBalancete Cont. Compilação

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

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

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

11 Protheus Server Protheus Remote Top Connect Monitor Aplicativos

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

13 RPO  arquivo binário com os APOs BUILD  executáveis, DLLs e RPO Patch  atualizações do RPO Conjuntos de arquivos

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

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

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 Destino: c:\erp811\bin\remote\mp811rmt.exe Iniciar em: c:\erp811\bin\remote MP8 Server MP8 Remote

19 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

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

23 SIGACFG TCP Environment Configurador

24 Senha: admin Configurador

25

26

27 Arquivos – Família SX ArquivoDescrição SX1Perguntas e Respostas SX2Mapeamento de Tabelas SX3Dicionário de Dados SX4Agenda do Schedule de Processos SX5Tabelas SX6Parâmetros SX7Gatilhos SX9Relacionamento entre Tabelas SXAPastas Cadastrais apontadas no SX3 SXBConsulta por meio da tecla F3 (Consulta Padrão) SXDControle do Schedule de Processos SXESeqüência de Documentos (+1) SXFSeqüência de Documentos (próximo) SXGTamanho padrão para campos SXKRespostas das Perguntas (SX1) por Usuário SXOControle de LOGs por Tabela SIXÍndices dos Arquivos.XNUMenu de Opções dos Módulos Pasta \SYSTEM

28 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 Famílias de Arquivos de Dados Pasta \DATA ou Banco de Dados

29 Principais Arquivos de Dados PrefixoDescrição SA1Cadastro de Clientes SA2Cadastro de Fornecedores SA3Cadastro de Vendedores SB1Cadastro de Produtos SB2Saldos dos Produtos por Almoxarifado SB5Dados Complementares de Produtos SC1Solicitações de Compras SC5Cabeçalho dos Pedidos de Venda SC6Itens dos Pedidos de Venda SC7Pedidos de Compras SD1Itens das Notas Fiscais de Entrada SD2Itens das Notas Fiscais de Saída SD3Movimentações Internas de Produtos SE1Títulos a Receber SE2Títulos a Pagar SF1Cabeçalho das Notas Fiscais de Entrada SF2Cabeçalho das Notas Fiscais de Saída SI1Plano de Contas SI2Lançamentos Contábeis

30 Arquivos de Dados – por Empresa O sistema permite controlar até 99 Empresas. Cada Empresa pode ter até 99 Filiais: Empresa 01 – Filiais01Empresa 02 – Filiais Para cada Empresa é criado um jogo de arquivos: SXXnn0 – onde:XX = Prefixo do arquivo nn = Empresa Exemplo: Empresa 99 -> SA1990, SA2990, SB

31 Arquivos de Dados Nomenclatura dos campos: Arquivo SA1:A1_FILIALSA2:A2_FILIALSB1:B1_FILIALQA1:QA1_FILIAL A1_CODA2_CODB1_CODQA1_COD A1_NOMEA2_NOMEB1_DESCQA1_DESC A1_ENDA2_ENDB1_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 02

32 Arquivos de Dados 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) C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR /01/ , /01/ , /01/ , /01/ , /01/ , /01/ , /01/ , /01/ , /01/ ,00 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”)  “ “ xFilial(“SC5”)  cFilAnt Ex: SA1 - Compartilhado Ex: SC5 - Exclusivo Modo de Acesso

33 Arquivos de Índices 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 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 Índices

34 Arquivos de Índices 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. Í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 índice do Usuário8A1_TIPO Nos programas: dbSetOrder(8) novo índice do Sistema8 índice do Usuário9A1_TIPO índice do Usuário8A1_TIPO NickName: TIPO novo índice do Sistema8 índice do Usuário9A1_TIPO NickName: TIPO Nos programas: dbOrderNickName(“TIPO”) X

35 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

36

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

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

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

40 APO MATA460A APO MATA460A SERVER Emissão NF Compilação Execução do MATA460A Preço := SC6->C6_PRCVEN * 1.25 Execução do MATA460A 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_PRCVEN * 1.25 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 RPO MATA460A Customização Inserção de Código-Fonte Preço := &Formula

41 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))” Customização Inserção de Código-Fonte

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

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

44 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ção Validações

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

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

47 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

48 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ção Ponto de Entrada

49 // 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 Exemplo de Ponto de Entrada

50 Dicionário de Dados Menus Configurador - SIGACFG

51 Crie um parâmetro (SX6) para o limite máximo por transação: Nome da Var.: MV_VRMAX Tipo: N Conteúdo: 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

52 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

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

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

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

56 Case Sistema de Contas Correntes

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

58 CONTAS Nome 1 Saldo Case Sistema 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 Tem Refere-se

59 Prefixo: SZ1 Path: \DATA\ Nome: SZ1990 Descrição: CONTAS Desc.Esp.: CONTAS Desc.Inglês: CONTAS Modo Acesso: COMPARTILHADO Prefixo: SZ2 Path: \DATA\ 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) Exercício – Criação de Arquivos (SX2) SIGACFG: menu Base de Dados / Dicionario / Arquivos

60 Criação de Campos (SX3) SIGACFG: menu Base de Dados / Dicionario / Base de Dados Criação dos campos dos arquivos: SZ1 – Cadastro de Contas SZ2 – 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

61 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

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

63 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. F3 Campo Z2_Nome Criação de Campos (SX3)

64 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. Exemplo:Usuário com nível 5 só terá acesso a campos com nível igual ou menor que Nível dos Campos Nível do Usuário Criação de Campos (SX3) Exemplo: no Depto. Pessoal Usuários:Campos: Gerente – nível 9Nome do Func.– nível 5 Digitador – nível 5Endereço– nível 4 Salário– nível 9

65 Criação de Campos (SX3)

66

67 CampoInform. Uso CampoTipoTam. Dec. FormatoContextoPropr. TítuloObrigUsaBrw Z1_ Car40RealAlt. Z1_ 1Car40RealAlt ,999,999.99RealVisualSaldo Cadastrar os campos do SZ1 Exercício Campo Opções Validações Lista de OpçõesInic.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_TIPOD=Deposito;S=Saque “D” Cadastrar Opções e Validações para estes campos

68 CampoInform.Uso CampoTipoTam.Dec.FormatoContextoPropr.TítuloObrigUsaBrw Z2_NUMEROCar4RealVisualNumero Z2_ITEMCar299RealAlt.Item Z2_DATAData8RealAlt.Data Z2_TIPOCar1RealAlt.Tipo Z2_HISTCar20RealAlt.Historico 999,999,999.99RealAlt.Valor 999,999,999.99VirtualVisualSaldo Z2_APROVCar3RealVisualAprovado Exercício Campos do SZ2 (já estão cadastrados)

69 ChaveNickname SZ1 Z1_Filial + Z1_NomeNOME SZ2 Z2_Filial + Z2_Numero + Z2_ItemNR_IT Z2_Filial + Z2_Nome + Z2_Numero + Z2_ItemNOME_NR_IT Exercício Criação dos Índices

70 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

71 Crie em ERP o menu do Sistema de Contas Correntes SIGACFG: menu Ambiente / Cadastro / Menus Exercício Contas Correntes 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

72 Aula 2 Programação Comandos e funções Operadores IDE Variáveis de memória Array Funções

73 Programação

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

75 Branca Preta 3 cestos: 1ª hipótese

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

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

78 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

79 Resposta: 23 vezes

80 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

81 Vai o 1 e 22 Volta o 13 Vai o 5 e 1013 Volta o 215 Vai o 1 e 217 Resposta

82 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

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

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

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

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

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

88 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 ) VVVV VVFV VFVV VFFF FVVV FVFV FFVV FFFF Operadores.And..Or..Not. ou ! Lógicos

89 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 ) VVVV  V VVFV  V VFVV  V VFFF  F FVVV  F FVFV  F FFVV  F FFFF  F Operadores.And..Or..Not. ou ! Lógicos

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

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

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

93 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. Operadores Strings

94 ( ) Funcao() { } Array, bloco de código [ ] Array & Macro || Bloco de código -> Alias de arquivo e var. de memória SA1->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” Operadores Especiais

95 1. Criar atalho do IDE (\erp811\bin\remote\mp8ide.exe) 2. Criar um novo projeto 3. Criar um novo arquivo 4. Digitar o primeiro programa 5. Salvá-lo na pasta \erp811\My Projects 6. Inseri-lo no projeto 7. 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

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

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

98 Caractere “Casa” Numéricas 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 nn X é numérico Operação matemática X agora é caracter ERRO ! nX é numérico cX é caracter

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

100 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 JoaoAlbertoPedroMaria JoaoAlbertoPedroMaria cNome1cNome2cNome3cNome4 aNomes Memória

101 JoaoAlbertoPedroMaria JoaoAlbertoPedroMaria Armário 1Armário 2Armário 3Armário 4 Armário Gaveta 1Gaveta 2Gaveta 3Gaveta 4 Variáveis Array Array, Vetor ou Matriz

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

103 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

104 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 1Gaveta 2Gaveta 3Gaveta 4 Joao25TAlberto18FPedro40TMaria33F Gaveta 1Gaveta 2Gaveta 3Gaveta 4 Joao 25 T Alberto 18 F Pedro 40 T Maria 33 F Array, Vetor ou Matriz

105 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.}}

106 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

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

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

109 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

110 Funções 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 Passagem de parâmetros

111 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

112 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 LOCALConteúdo PRIVATEConteúdo PUBLICConteúdo Escôpo das Variávies

113 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 LOCALConteúdo cVarFunc1 PRIVATEConteúdo PUBLICConteúdo Escôpo das Variávies

114 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 LOCALConteúdo cVar cVar1 Func2 PRIVATEConteúdo cVar2Private Func2 PUBLICConteúdo cVar3Public Func2 Escôpo das Variávies

115 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 PRIVATEConteúdo cVar2ABC PUBLICConteúdo cVar3Public Func2 LOCALConteúdo Escôpo das Variávies

116 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 LOCALConteúdo cVar cVar1 Func2 PRIVATEConteúdo cVar2ABC PUBLICConteúdo cVar3Public Func2 Escôpo das Variávies

117 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 LOCALConteúdo cVarFunc1 PRIVATEConteúdo PUBLICConteúdo cVar3Public Func2 Escôpo das Variávies

118 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”1000 São criadas variáveis LOCAIS “NE”1000 Por Valor

119 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 = 1 y = 2 Ver 060_Param.prw Passagem de Parâmetros Por Valor

120 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 = 1 y = 2 x = 50 y = 100 Passagem de Parâmetros Por Valor Ver 060_Param.prw

121 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 = 1 y = 2 Passagem de Parâmetros Por Valor Ver 060_Param.prw

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

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

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

125 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

126 Aula 3 Macro Bloco de Código UDC Semáforos Arquivos e Índices

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

129 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ção Aplicação de Macros

130 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

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

132 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

133 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. Ordenação de array Ver 050_Array.prw

134 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

135 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”) Exemplo: Exemplos em 120_TranM2 Controle de numeração sequencial

136 Arquivos

137 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 Famílias de Arquivos de Dados

138 Principais Arquivos de Dados PrefixoDescrição SA1Cadastro de Clientes SA2Cadastro de Fornecedores SA3Cadastro de Vendedores SB1Cadastro de Produtos SB2Saldos dos Produtos por Almoxarifado SB5Dados Complementares de Produtos SC1Solicitações de Compras SC5Cabeçalho dos Pedidos de Venda SC6Itens dos Pedidos de Venda SC7Pedidos de Compras SD1Itens das Notas Fiscais de Entrada SD2Itens das Notas Fiscais de Saída SD3Movimentações Internas de Produtos SE1Títulos a Receber SE2Títulos a Pagar SF1Cabeçalho das Notas Fiscais de Entrada SF2Cabeçalho das Notas Fiscais de Saída SI1Plano de Contas SI2Lanç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 – Filiais01Empresa 02 – Filiais Para cada Empresa é criado um jogo de arquivos: SXXnn0 – onde:XX = Prefixo do arquivo nn = Empresa Exemplo: Empresa 99 -> SA1990, SA2990, SB

140 Arquivos de Dados – por Empresa Nomenclatura dos campos: Arquivo SA1:A1_FILIALSA2:A2_FILIALSB1:B1_FILIALQA1:QA1_FILIAL A1_CODA2_CODB1_CODQA1_COD A1_NOMEA2_NOMEB1_DESCQA1_DESC A1_ENDA2_ENDB1_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 02

141 Arquivos de Dados 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) C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR /01/ , /01/ , /01/ , /01/ , /01/ , /01/ , /01/ , /01/ , /01/ ,00 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”)  “ “ xFilial(“SC5”)  cFilAnt Ex: SA1 - Compartilhado Ex: SC5 - Exclusivo Modo de Acesso

142 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 RECNO A1_COD A1_NOMECODIGO REGISTRO ArquivoÍndice: CÓDIGO Arquivos e Índices

143 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 RECNO A1_COD A1_NOMENOME REGISTRO ArquivoÍndice: 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 Arquivos e Índices

144 RECNO C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR /01/ , /01/ , /01/ , /01/ , /01/ ,00 Arquivo: SC5990 Alias: SC5 Pedidos de Venda 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: SA1990 Alias: SA1 Cadastro de Clientes CODIGO REG Índices 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: SB1990 Alias: SB1 Cadastro de ProdutosÍndices dbSelectArea(“SA1”) dbSetOrder(1) dbSeek(“000002”) dbSelectArea(“SB1”) dbSetOrder(1) dbSeek(“ ”) dbSelectArea(“SA1”) dbSelectArea(“SB1”) dbSelectArea(“SC5”) Posicionamento de registro dbSkip() Arquivos e Índices

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

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

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

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

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

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

152 AxInclui() Ver 100_Cad.prw AxCadastro

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

154 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

155 Sobre variáveis… Referência a uma variável Variáve l 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 SN 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ória SZ1->Z1_Nome  campo de arquivo Arquivo CodigoNome João Arquivo CodigoDescricao

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 Ver FuncMod2 Ver MarkBrow (exemplo do Baile) Funções de tratamento de arquivos

158 Modelo 2 ItemTipoHistóricoValor Nome Número Data Enchoice Variáveis de memória GetDados aHeader aCols

159 Modelo 2 Item Z2_ITEM 2 0 C SZ2 R Tipo Z2_TIPO 1 0 C SZ2 R Histórico Z2_HIST 20 0 C SZ2 R Valor 999,999, N SZ2 R Nome Número Data Enchoice GetDados aHeader aCols Variáveis de memória Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto D Deposito ,00.F. 02 S Saque 300,00.F. 03 S Saque 2.500,00.F.

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

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

162 Item Z2_ITEM 2 0 C SZ2 R Tipo Z2_TIPO 1 0 C SZ2 R Histórico Z2_HIST 20 0 C SZ2 R Valor 999,999, N SZ2 R aHeader aCols Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto // 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 Adiciona uma linha no aCols Array(?) Array(5)

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

164 Item Z2_ITEM 2 0 C SZ2 R Tipo Z2_TIPO 1 0 C SZ2 R Histórico Z2_HIST 20 0 C SZ2 R Valor 999,999, N SZ2 R aHeader aCols Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto 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

165 “ “01“ Item Z2_ITEM 2 0 C SZ2 R Tipo Z2_TIPO 1 0 C SZ2 R Histórico Z2_HIST 20 0 C SZ2 R Valor 999,999, N SZ2 R aHeader aCols Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto 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 01 Modelo 2 – Criação do aCols para Inclusão

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

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

168 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 01PEDRO0003 Modelo 2 – Criação do aCols para Alteração Posiciona no primeiro registro com o número PEDRO 30/03/06 “01” + “0003” “01” + “0004”

169 Item Z2_ITEM 2 0 C SZ2 R Tipo Z2_TIPO 1 0 C SZ2 R Histórico Z2_HIST 20 0 C SZ2 R Valor 999,999, N SZ2 R aHeader aCols Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto // 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 Adiciona uma linha no aCols Modelo 2 – Criação do aCols para Alteração

170 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 Item Z2_ITEM 2 0 C SZ2 R Tipo Z2_TIPO 1 0 C SZ2 R Histórico Z2_HIST 20 0 C SZ2 R Valor 999,999, N SZ2 R aHeader aCols Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto Nil 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 Z2_ITEMZ2_TIPOZ2_HISTZ2_VALOR 01DDeposito500,00 02DDeposito150,00 03SSaque 90, “01““D”“Deposito“ 500,00

171 Item Z2_ITEM 2 0 C SZ2 R Tipo Z2_TIPO 1 0 C SZ2 R Histórico Z2_HIST 20 0 C SZ2 R Valor 999,999, N SZ2 R aHeader aCols Titulo Campo Picture Tamanho Decimal Valid. Usado Tipo Arquivo Contexto 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

172 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 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) Similar ao Modelo2

173 Aula 5 Telas Relatórios Reposicionamento de arquivos Integração com Excel SQL OOP Arquivos TXT e XML

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 Tela

177 Relatórios

178 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 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 PSay PSay PSay PSay PSay PSay PSay SZ2->Z2_Valor Picture 999,999,999.99" Compilar e executar Relatórios

180 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 Relatórios Perguntas

181 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 <= PSay SZ2->Z2_Nome... EndIf Relatórios Perguntas

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

183 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

184 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. Relatórios Funções usadas nos programas de relatórios

185 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

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 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 array RestArea()Restaura Obs.: esta regra vale para qualquer função.

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

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 Administrador admin MPSDU TCP Environment Menu Arquivo / Abrir

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

195 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 JOSE /03/06 D Deposito inicial /03/06 S Pagto. conta de luz 300

196 Aula 6 Workflow WebServices AdvPL ASP

197 WorkFlow Efetua transações Contas Transa- ções Atualiza saldo Grava transação Saldo Aprova ou Reprova Cliente Aprovador Aguardando o aprovador acessar o sistema... Fluxo manual

198 Efetua transações Contas Transa- ções Saldo Negativo? Dispara um WorkFlow WFSalNeg() WFRetorno() Caixa de Saída Caixa de Entrada Job WFRET WFReturn() Atualiza saldo Grava transação Saldo Resposta (Aprovado ou Reprovado) Captura a resposta Executa a função de retorno Grava a resposta (Aprovado ou Reprovado) Cliente Aprovador WorkFlow Fluxo automático

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

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

201 WebServices Configuração WS – Protheus 8 Web Services ws \web\ws ENVIRONMENT

202 WebServices Configuração localhost/ws/9901

203 WebServices Configuração

204 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: [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 [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

205 Após a configuração, ver a lista de Web Services disponíveis no Protheus: Reinicializar o server No Internet Explorer: WebServices

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

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

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

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 Benvindo ao site da Empresa X Hoje é 10/08/05 Servidor Internet inicio.htm Benvindo ao site da Empresa X Hoje é 10/08/05 Browser Página estática Página estática (html)

213 Servidor Internet 21/02/06 Benvindo ao site da Empresa X Hoje é inicio.htm HTML + ASP Browser 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)

214 Servidor Internet Protheus 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 Benvindo ao site da Empresa X Hoje é Pagina.aph Browser Benvindo ao site da Empresa X Hoje é 21/02/06 Página com html + AdvPL ASP 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: [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

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

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 Dicionário de Dados Programa A Programa C Back-Up Segurança Dicionário de Dados Programa B


Carregar ppt "Programação e Customizações AdvPL e Protheus. Aula 1 Evolução e Arquitetura do Sistema Arquivos Customizações Case – Sistema de Contas Correntes."

Apresentações semelhantes


Anúncios Google