Programação e Customizações

Slides:



Advertisements
Apresentações semelhantes
Programação em Java Prof. Maurício Braga
Advertisements

Premissas do Estudo de Caso
APRESENTAÇÃO ELETRÔNICA
BD em.NET: Passo a passo conexão com SQL Server 1º Semestre 2010 > PUCPR > BSI Bruno C. de Paula.
Estatística Básica Utilizando o Excel
15 Introdução à Manipulação de Planilhas Eletrônicas Planilhas Eletrônicas são tabelas usadas para comunicar informações de forma clara, precisa e sucinta.
Algoritmos e Estruturas de Dados II
Instrutor: Nilo Menezes
Introdução ao JavaScript
Emitindo seu Certificado Digital
Classes e objetos Arrays e Sobrecarga
Classes e objetos P. O. O. Prof. Grace.
Gerenciamento de Frota de Veículos
Programação I Caderno de Exercícios Nome.
MANUAL NOVA INTRANET 2010 IMPORTANTE! IMPORTANTE!
Treinamento placas General Vision
DAC – Departamento de Atendimento ao Cliente
Cadastro de produto Posto de Combustível.
Gerenciamento de Controle de Combustível
Financeiro - Cadastro de Conta Contábil
Módulo Financeiro Centro de Custo.
Automação da sua equipe de vendas. Controle em tempo real.
Cadastro de produtos por referência
Como controlar o caixa Supermercados.
Silvane Gonçalves Analista de Sistemas
Aula R Prof. Naércio Filho Técnico em Informática
Manual - Bikesys Versão 1.0 – Beta Março 2013.
Estrutura de dados, pseudocódigo
SACADO Cobrança Caixa Instalação Cadastramento inicial Parâmetros Inicio Fim Acesso ao sistema Responsáveis Grupos de sacados Sacados Títulos Relatórios.
Laboratório de Programação I Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Conheça o PDV Apresenta as principais ferramentas e
Extranet GRD – Guia de Remessa de Documentos
Tutorial Sobre o Cadastro de Produtos Empresarial soft Avançar.
DEMONSTRAÇÃO BANCA LIGHT
MICROCOMPAN Y CONTABILIDADE Dúvidas:
Inserir crédito para cliente
Entrada de Produtos Posto de Combustível.
ACCESS 2007 EDIMILSON JÚNIOR.
Compras - Pedido de Compra
Manual Protheus 11.
Banco de Dados 4P/SI – 2010/02 Prof. Carlos Alberto Seixas.
WMS Stock Locator Apresentação dos módulos padrões do WMS Stock Locator Sistema Gerenciador de Materiais.
07/04/2017 Linux Ubuntu 2.
Professor: Márcio Amador
Banco de Dados Parte 04 Ceça. Ceça Moraes 2 Conteúdo  Os três níveis da arquitetura  Mapeamentos  Arquitetura cliente-servidor.
ÁREA DE TRABALHO DO WINDOWS
Comunicação com controle e baixo custo. Atualizada em 01/11/2009.
SACADO CobCaixa Instalação Cadastramento inicial Parâmetros Inicio Fim Acesso ao sistema Usuários Sacados Grupos de Sacados Títulos Relatórios Relatório.
RMFAIS-PRODATA SISTEMA DE INFORMAÇÃO
Fiscal - Regra de imposto IdentificaçãoFIS_003 Data Revisão18/10/2013.
GESTÃO DE FICHEIROS ÍNDICE Pág. I.Instalação do Software 2 II.Selecção de Empresas / Manutenção de Empresas 5 III.Criação da Base de Dados (Clientes,
Módulo Compras Relatórios e Relações 1. Objetivo 2 Conhecer os relatórios e as relações do sistema disponibilizadas no módulo Compras.
Planilha Eletrônica - Excel
Financeiro – Contas a Receber
Contagem Sequencial do Estoque
Contagem Sequencial do Estoque
Entrada de Produtos por arquivo XML
Financeiro – Boleto: Remessa e Retorno
Financeiro – Controle de Cheque
Cadastro de Produto 1 IdentificaçãoCOM_001 Data Revisão24/08/2013.
SACADO Instalação Cadastramento inicial Parâmetros Início Fim Acesso ao sistema Responsáveis Grupos de sacados Sacados Títulos Relatórios Relatório de.
Exemplo de LSMW com Batch-Input
INFORMÁTICA PARA CONCURSOS
VBA – Visual Basic para Aplicativos
Programação para Web I AULA 2 BANCO DE DADOS.
APRESENTAÇÃO PORTAL CITI CONTA CORRENTE
Financeiro - Boleto : Remessa e Retorno
Multi-Loja.
Banco de Dados -Aprendendo conceitos -Usando o SQL Conf para:
Principais Processos WMS Entrada Expedições Reabastecimento Inventário Cadastros.
Transcrição da apresentação:

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

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.

Evolução do Sistema da Microsiga 1974  Assembler – Batch 1978  Natural Adabas – Online 1983  DBase II – III, Clipper Summer 1990  Clipper 5 – SIGA Advanced 1995  FiveWin/Top/Coencisa, VO, Delphi, SQL 2000  AdvPL – Protheus 5 ... 8 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.

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

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

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

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.

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

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

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

Aplicativos Protheus Server Protheus Remote Top Connect Monitor

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

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.

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

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

Estrutura de pastas do sistema ERP811 APO (RPO) BIN REMOTE SERVER INCLUDE MP_DATA DATA (versão ISAM) SAMPLES SPOOL SYSTEM (Dic.Dados, Menus, ...) SYSTEMLOAD MY PROJECTS

Atalhos Destino: c:\erp811\bin\server\mp811srvwin.exe –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

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.

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

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

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.

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

Configurador Senha: admin

Configurador

Configurador

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

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

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.

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

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.

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 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP 000016 TEX MALHAS E CONFECCOES S.A /SP 000001 CLIENTE PADRAO 000020 ARMANDO JOSE FLORES /SC 000007 COMERCIO SOM DO MUNDO /SP xFilial(“SA1”)  “ “ 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 000001 01/01/04 000002 11.11014 15.000,00 01 000005 01/01/04 000023 13.13000 5.600,00 01 000007 20/01/04 000016 15.15140 5.600,00 02 000001 01/01/04 000002 11.11014 15.000,00 02 000005 01/01/04 000023 13.13000 5.600,00 02 000007 20/01/04 000016 15.15140 5.600,00 03 000001 01/01/04 000002 11.11014 15.000,00 03 000005 01/01/04 000023 13.13000 5.600,00 03 000007 20/01/04 000016 15.15140 5.600,00 xFilial(“SC5”)  cFilAnt

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 000001 03 000007 05 000015 01 000016 02 000020 04 REGISTRO A1_FILIAL A1_COD A1_NOME 01 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP 02 000016 TEX MALHAS E CONFECCOES S.A /SP 03 000001 CLIENTE PADRAO 04 000020 ARMANDO JOSE FLORES /SC 05 000007 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.

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 = 1...35  função para selecionar o índice. Além dos índices originais, usuários podem incluir seus próprios índices. Caso a Microsiga inclua novos índices, os do usuário serão renumerados. 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().

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

Customização

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” 100 200 “N” 201 200 “N” 100 200 “S” 201 200 V V F F V F F V

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

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

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

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 001 - Reajuste fixo: “SC6->C6_PRCVEN * 1.25” Fórmula 002 - Reajuste se preço em dólar: “SC6->C6_PRCVEN * RecMoeda(dDataBase,’2’)” Fórmula 003 - Reajuste pelo dólar: “SC6->C6_PRCVEN * (RecMoeda(dDataBase,’2’)/ If(RecMoeda(SC5->C5_EMISSAO,’2’) <> 0, RecMoeda(SC5->C5_EMISSAO,’2’),1))”

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

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

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.

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)

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

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

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.

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

Configurador - SIGACFG Dicionário de Dados Menus

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

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

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

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

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

Case Sistema de Contas Correntes

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

Case Tabelas do sistema CONTAS TRANSAÇÕES Sistema de Contas Correntes Nome E-Mail E-Mail1 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

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.

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

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

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

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

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

Criação de Campos (SX3)

Criação de Campos (SX3)

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_EMAIL 40 EMail Z1_EMAIL1 EMail1 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.

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

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

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.

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

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.

Programação

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

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

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

Resposta Vai na caixa com etiqueta Preta-Branca Saca uma bola Se Branca Conclui-se a outra bola é Branca e esta caixa é a Branca-Branca a caixa que está etiquetada Preta-Preta é Preta-Branca a caixa que está etiquetada Branca-Branca é Preta-Preta Se Preta a outra bola é Preta e esta caixa é a Petra-Preta a caixa que está etiquetada Preta-Preta é Branca-Branca a caixa que está etiquetada Branca-Branca é Preta-Branca

Cruzamento dos ponteiros do 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?

Resposta: 23 vezes

Travessia da passarela Quatro pessoas tem de atravessar uma passarela bamba. Há muitos buracos na passarela, que suporta apenas 2 pessoas de cada vez (mais que isso, ela cai). O grupo deve usar uma lanterna para guiar seus passos, caso 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?

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

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

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

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

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

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

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

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

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

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

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)

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

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.

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”

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

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

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

Tipos de Variáveis de Memória Notação Húngara: cTexto nValor dData lOk Caractere “Casa” Numéricas 1234.56 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

Tipos de Variáveis de Memória Notação Húngara: cTexto nValor dData lOk Caractere “Casa” Numéricas 1234.56 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

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]

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

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

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

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 1 2 3 Gaveta 1 Gaveta 2 Gaveta 3 Gaveta 4 Joao 25 T Alberto 18 F Pedro 40 Maria 33 1 2 3

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

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

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

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.

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

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

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)

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

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

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

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

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

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

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

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

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

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

Passagem de Parâmetros Por Referência 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

Passagem de Parâmetros Por Referência User Function Param1() Local x := 1 Local y := 2 u_Param2(@x, 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

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

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

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.

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

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

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’)”

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

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

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

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

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

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

Arquivos

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

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

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

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.

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 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP 000016 TEX MALHAS E CONFECCOES S.A /SP 000001 CLIENTE PADRAO 000020 ARMANDO JOSE FLORES /SC 000007 COMERCIO SOM DO MUNDO /SP xFilial(“SA1”)  “ “ Ex: SC5 - Exclusivo C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR 01 000001 01/01/04 000002 11.11014 15.000,00 01 000005 01/01/04 000023 13.13000 5.600,00 01 000007 20/01/04 000016 15.15140 5.600,00 02 000001 01/01/04 000002 11.11014 15.000,00 02 000005 01/01/04 000023 13.13000 5.600,00 02 000007 20/01/04 000016 15.15140 5.600,00 03 000001 01/01/04 000002 11.11014 15.000,00 03 000005 01/01/04 000023 13.13000 5.600,00 03 000007 20/01/04 000016 15.15140 5.600,00 xFilial(“SC5”)  cFilAnt

Arquivos e Índices Índice: CÓDIGO Arquivo CODIGO REGISTRO RECNO A1_COD A1_NOME 000001 03 000002 09 000007 05 000008 07 000015 01 000016 02 000019 13 000020 04 000023 08 000024 06 000026 10 000027 11 000028 12 000030 15 000033 14 01 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP 02 000016 TEX MALHAS E CONFECCOES S.A /SP 03 000001 CLIENTE PADRAO 04 000020 ARMANDO JOSE FLORES /SC 05 000007 COMERCIO SOM DO MUNDO /SP 06 000024 JOAO DA SILVA /SP 07 000008 FLORICULTURA FULO DE MARAVILHA /SP 08 000023 PREFEITURA MUNICIPAL DE SAO PAULO /SP 09 000002 ECOSSISTEMA DIGITAL S/A 10 000026 ACTIONVEA IMP. EXP. 11 000027 STARMEAL LEAK S.A. 12 000028 REIZA KERN IMP. EXP. 13 000019 JOAO DE ALMEIDA SILVA /RS 14 000033 DESPACHANTE 15 000030 IMPORTADOR EUA

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 01 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP 02 000016 TEX MALHAS E CONFECCOES S.A /SP 03 000001 CLIENTE PADRAO 04 000020 ARMANDO JOSE FLORES /SC 05 000007 COMERCIO SOM DO MUNDO /SP 06 000024 JOAO DA SILVA /SP 07 000008 FLORICULTURA FULO DE MARAVILHA /SP 08 000023 PREFEITURA MUNICIPAL DE SAO PAULO /SP 09 000002 ECOSSISTEMA DIGITAL S/A 10 000026 ACTIONVEA IMP. EXP. 11 000027 STARMEAL LEAK S.A. 12 000028 REIZA KERN IMP. EXP. 13 000019 JOAO DE ALMEIDA SILVA /RS 14 000033 DESPACHANTE 15 000030 IMPORTADOR EUA

Posicionamento de registro Arquivos e Índices RECNO A1_COD A1_NOME 1 000015 FABRICA DE TINTAS E VERINIZES LTDA /SP 2 000016 TEX MALHAS E CONFECCOES S.A /SP 3 000001 CLIENTE PADRAO 4 000020 ARMANDO JOSE FLORES /SC 5 000007 COMERCIO SOM DO MUNDO /SP 6 000024 JOAO DA SILVA /SP 7 000008 FLORICULTURA FULO DE MARAVILHA /SP 8 000023 PREFEITURA MUNICIPAL DE SAO PAULO /SP 9 000002 ECOSSISTEMA DIGITAL S/A 10 000026 ACTIONVEA IMP. EXP. Arquivo: SA1990 Alias: SA1 Cadastro de Clientes CODIGO REG 000001 3 000002 9 000007 5 000008 7 000015 1 000016 2 000020 4 000023 8 000024 6 000026 10 Índices dbSelectArea(“SA1”) RECNO B1_COD B1_DESC B1_TIPO B1_UM 1 11.11014 PROD. DE REVENDA PA UN 2 11.11000 PROD. ACABADO PA UN 3 12.12006 MAT. PRIMA 1 – QUALITY MP UN 4 13.13001 CAIXA GRANDE – PA PA CX 5 11.11003 MAT. PRIMA MP UN 6 15.15140 ALCOOL ETILICO MC L 7 33.03323 LUVA MP UN 8 13.13000 CAIXA PEQUENA – PA PA CX CODIGO REG 11.11000 2 11.11003 5 11.11014 1 12.12006 3 13.13000 8 13.13001 4 15.15140 6 33.03323 7 Arquivo: SB1990 Alias: SB1 Cadastro de Produtos Índices dbSelectArea(“SB1”) RECNO C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR 1 000001 01/01/04 000002 11.11014 15.000,00 2 000005 01/01/04 000023 13.13000 5.600,00 3 000007 20/01/04 000016 15.15140 5.600,00 4 000008 27/01/04 000024 13.13001 1.000,00 5 000009 01/01/04 000008 11.11000 3.450,00 Arquivo: SC5990 Alias: SC5 Pedidos de Venda dbSelectArea(“SC5”) Posicionamento de registro dbSkip() dbSelectArea(“SA1”) dbSetOrder(1) dbSeek(“000002”) dbSelectArea(“SB1”) dbSetOrder(1) dbSeek(“11.11014”) dbSkip() dbSkip() dbSkip()

Posicionamento de Arquivos Empresa: XX Filial: 02 dbGoTop() dbSeek(xFilial(“SC5”)) FILIAL+NUM REG 01000001 1 01000005 2 01000007 3 01000008 4 01000009 5 02000001 6 02000005 7 02000007 8 02000008 9 02000009 10 03000001 11 03000005 12 03000007 13 03000008 14 03000009 15 RECNO C5_FILIAL C5_NUM C5_EMISSAO C5_CLIENTE C5_PROD C5_VALOR 1 01 000001 01/01/04 000002 11.11014 15.000,00 2 01 000005 01/01/04 000023 13.13000 5.600,00 3 01 000007 20/01/04 000016 15.15140 5.600,00 4 01 000008 27/01/04 000024 13.13001 1.000,00 5 01 000009 01/01/04 000008 11.11000 3.450,00 6 02 000001 01/01/04 000002 11.11014 15.000,00 7 02 000005 01/01/04 000023 13.13000 5.600,00 8 02 000007 20/01/04 000016 15.15140 5.600,00 9 02 000008 27/01/04 000024 13.13001 1.000,00 10 02 000009 01/01/04 000008 11.11000 3.450,00 11 03 000001 01/01/04 000002 11.11014 15.000,00 12 03 000005 01/01/04 000023 13.13000 5.600,00 13 03 000007 20/01/04 000016 15.15140 5.600,00 14 03 000008 27/01/04 000024 13.13001 1.000,00 15 03 000009 01/01/04 000008 11.11000 3.450,00

Posicionamento de Arquivos Leitura sequencial dbGoTop()  Posiciona no topo do arquivo While !EOF() dbSkip()  Leitura sequencial, registro a registro End FILIAL+NUMERO+ITEM REG 01000101 1 01000102 2 01000103 3 01000201 4 01000202 5 01000301 6 01000302 7 01000303 8 01000401 9 01000402 10 RECNO Z2_FILIAL Z2_NUMERO Z2_ITEM 1 01 0001 01 2 01 0001 02 3 01 0001 03 4 01 0002 01 5 01 0002 02 6 01 0003 01 7 01 0003 02 8 01 0003 03 9 01 0004 01 10 01 0004 02 EOF() .T.

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 01000101 1 01000102 2 01000103 3 01000201 4 01000202 5 01000301 6 01000302 7 01000303 8 01000401 9 01000402 10 RECNO Z2_FILIAL Z2_NUMERO Z2_ITEM 1 01 0001 01 2 01 0001 02 3 01 0001 03 4 01 0002 01 5 01 0002 02 6 01 0003 01 7 01 0003 02 8 01 0003 03 9 01 0004 01 10 01 0004 02

Sobre arquivos… Número máximo de arquivos abertos: 512 (por thread); A navegação nos registros é em ordem do índice selecionado - dbSetOrder(n). Se for selecionado dbSetOrder(0), a navegação será pela ordem física dos registros (Recno); No SIX, os índices são numerados de 1 a 9 e A, B,... (campo ORDEM). No dbSetOrder(): 1...9, 10, 11...; dbSkip() – avança 1 registro; dbSkip(n) ou dbSkip(-n) – avança ou retrocede n registros; dbSelectArea(cAlias) – seleciona o arquivo. Caso ainda não esteja aberto, abre-o neste momento. A referência a um campo de arquivo com o seu Alias ( ex.: MsgAlert(SA1->A1_Nome) ), também abre o arquivo, caso não esteja aberto, mesmo sem um dbSelectArea() anterior. Na abertura do arquivo, o primeiro índice é selecionado. O ponteiro de registro é posicionado no primeiro registro físico (não pelo índice). A função dbGoTop(), posiciona no primeiro registro do índice selecionado; No Protheus MDI, os arquivos são abertos dentro da thread e fechados no seu encerramento. Na chamada à mesma rotina, mesmo em outra thread, concomitante ou não, os arquivos são reabertos e posicionados no topo e com o primeiro índice selecionado. No Protheus SDI, uma vez abertos, os arquivos permanecem assim, inclusive com o último posicionamento do ponteiro de registro e o índice selecionado. A função dbCloseArea() fecha o arquivo. No MDI: a abertura e o posicionamento de um mesmo arquivo em threads diferentes são independentes, ou seja, podem ser selecionados índices diferentes e o ponteiro de registros podem ser posicionados em registros diferentes também. O bloqueio de um mesmo registro é comum, ou seja, se o registro for bloqueado por um dos threads, o outro não poderá acessá-lo para alteração ou exclusão.

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

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

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

AxCadastro AxInclui() Ver 100_Cad.prw

AxCadastro Cadastre algumas contas No campo E-Mail, coloque: aprovador@tecnico.com.br E no E-Mail1, coloque: aprovador1@tecnico.com.br

MBrowse 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

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

Sobre variáveis… JOSE aprovador@tecnico.com.br Para cada campo é criada uma variável de memória com o mesmo nome, onde os dados digitados ficam inicialmente armazenados, antes de ser efetivamente gravados no arquivo: M->Z1_NOME M->Z1_EMAIL M->Z1_EMAIL1 M->Z1_SALDO Estas variáveis são usadas em Validações, Gatilhos, etc. ExistChav(“SZ1”, M->Z1_NOME, 1) JOSE aprovador@tecnico.com.br

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

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

Modelo 2 Enchoice GetDados aHeader aCols Variáveis de memória Número Nome Data 1 2 3 4 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 01 D Deposito 10.000,00 .F. aCols 02 S Saque 300,00 .F. 03 S Saque 2.500,00 .F. 1 2 3 4 5

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

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

Array(5) Array(?) Modelo 2 – Criação do aCols para Inclusão aHeader Adiciona uma linha no aCols 1 2 3 4 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 1 2 3 4 5 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

Modelo 2 – Criação do aCols para Inclusão Preenche o aCols de acordo com o Inicializador-Padrão 1 2 3 4 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 1 2 3 4 5 “ “ 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

Modelo 2 – Criação do aCols para Inclusão Inicializa a última coluna com .F. 1 2 3 4 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 1 2 3 4 5 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

Modelo 2 – Criação do aCols para Inclusão Inicializa a coluna do ITEM com 01 1 2 3 4 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 1 2 3 4 5 “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

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

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

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”

Modelo 2 – Criação do aCols para Alteração Adiciona uma linha no aCols 1 2 3 4 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 1 2 3 4 5 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

Modelo 2 – Criação do aCols para Alteração Preenche o aCols com os dados lidos do arquivo 1 2 3 4 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 1 2 3 4 5 “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 4 6 7 8 Z2_ITEM Z2_TIPO Z2_HIST Z2_VALOR 01 D Deposito 500,00 02 D Deposito 150,00 03 S Saque 90,00

Modelo 2 – Criação do aCols para Alteração Inicializa a última coluna com .F. 1 2 3 4 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 1 2 3 4 5 “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

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

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.

Telas

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

RDDemo e RDDemo2 – mais componentes de tela

Relatórios

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

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 "@E 999,999,999.99" Compilar e executar

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

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

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

Relatórios Índice temporário Na função RunReport(), na linha “nOrdem := aReturn[8]”, substituir dbSetOrder(nOrdem) por: If nOrdem < 3 dbSetOrder(nOrdem) Else cArqInd := CriaTrab(Nil, .F.) cChave := "xFilial('SZ2') + DtoS(Z2_Data)" cFiltro := "Z2_Filial==xFilial('SZ2') .And. Z2_Tipo == '" + If(mv_Par05==1,"D","S") + "'" cOrdem := " " lMostra := .T. IndRegua("SZ2", cArqInd, cChave, cOrdem, cFiltro, "Indexando...", lMostra) EndIf No final da função, antes da linha “Return”, incluir: RetIndex("SZ2") FErase(cArqInd + OrdBagExt())

Relatórios 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-EMail 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.

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.

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

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

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.

=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

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

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

MPSDU

OOP – Programação Orientada a Objetos Classes Métodos Propriedades Um objeto é uma instância da sua classe. Por exemplo, o botão é da classe tButton. É criado a partir da execução do método construtor. oBotaoOK := tButton():New() Suas propriedades podem ser definidas ou alteradas. oBotaoOK:cCaption := “Ok” oBotaoOK:nWidth := 50 oBotaoOK:nHeight := 15 oBotaoOK:bAction := {|| u_Grava() } O AdvPL permite usar as classes pré-definidas ou criar novas classes, substituindo a programação baseada em comandos e funções pela orientação a objetos. Ver 143_Objetos.prw

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

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

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.

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

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 E-Mail Job WFRET WFReturn() Caixa de Saída Se não funcionar: -Ver se o campo E-Mail do cadastro de Contas está preenchido com “aprovador@tecnico.com.br” -Ver se o ArgoMail está ativo. -Testar se o e-mail está funcionando: no Outlook, enviar um e-mail de teste para aprovador@tecnico.com.br. 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. E-Mail Captura a resposta Caixa de Entrada Resposta (Aprovado ou Reprovado) Aprovador

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 http://... <Nome>JOSE</Nome> <Saldo>1000</Saldo>

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

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

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/0101 -> Empresa 01, Filial 01 localhost/ws/0102 -> 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.

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.

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: http://localhost/ws/9901/... [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 http://localhost/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

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

WebServices IDE http://localhost WebService ForneceSaldo http://localhost/FORNECESALDO.apw?WSDL WebService ForneceSaldo Método BuscaSaldo Nome Saldo http://localhost WSDL Cliente WSForneceSaldo Método BuscaSaldo Nome Saldo Contas Sistema

WebServices http://localhost WebService ForneceSaldo Método BuscaSaldo Nome Saldo http://localhost 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

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

Portal Protheus Configuração PP – Portal Protheus pp \web\pp ENVIRONMENT http://localhost/ws/9901

Portal Protheus Configuração localhost/pp

Portal Protheus Configuração

HTML Servidor Internet Browser Página estática (html) http://www.empresax.com.br/inicio.htm 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

com a data obtida do servidor HTML + ASP Página dinâmica (html + ASP) Servidor Internet 21/02/06 Browser http://www.empresax.com.br/inicio.htm 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

AdvPL ASP Servidor Internet Protheus Browser Página com html + AdvPL ASP Servidor Internet Protheus 21/02/06 Browser RPO http://www.empresax.com.br/u_inicio.apw 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

Call Center

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

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

Top Connect com SQL

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

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