Apostila de ADVPL I
ÍNDICE................................................................................................................................... 2
SIMBOLOGIA......................................................................................................................... 9
INTRODUÇÃO ..................................................................................................................... 12
TREINAMENTOS ............................................................................................................... 13
CONSULTORIA EM TREINAMENTOS .................................................................................. 14
OBJETIVO ............................................................................................................................ 15
INSTRUÇÃO/COMANDO......................................................................................................... 18
FUNÇÃO............................................................................................................................. 18
PROGRAMA ........................................................................................................................ 19
COMPILAÇÃO ...................................................................................................................... 19
RPO ................................................................................................................................. 19
SISTEMA/SOFTWARE............................................................................................................. 19
SERVER .............................................................................................................................. 19
REMOTE ............................................................................................................................ 20
Exercício 1 .................................................................................................................... 22
OBJETIVO ........................................................................................................................... 23
ACESSANDO A FERRAMENTA ................................................................................................... 23
CONFIGURANDO O IDE ......................................................................................................... 23
OBJETIVO ........................................................................................................................... 46
ACESSANDO O MÓDULO ........................................................................................................ 46
UTILIZANDO O MENU ARQUIVOS OU ATALHOS ............................................................................ 47
REGISTRO ........................................................................................................................... 50
ARQUIVOS .......................................................................................................................... 50
TABELAS ............................................................................................................................ 50
FAMÍLIA DE ARQUIVOS .......................................................................................................... 51
ARQUIVOS SX´S ................................................................................................................... 52
ÍNDICE DE ARQUIVOS ............................................................................................................ 53
MODO DE ACESSO ÀS TABELAS ................................................................................................ 55
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 3
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Exercício 1 .................................................................................................................... 58
Exercício 2 .................................................................................................................... 59
OBJETIVO ........................................................................................................................... 60
USUÁRIOS .......................................................................................................................... 60
Pasta Superior .............................................................................................................. 63
Pasta restrições de acesso ............................................................................................ 63
Pasta horário................................................................................................................ 63
Pasta Parametrização .................................................................................................. 64
Pasta Impressão ........................................................................................................... 65
Pasta Log de operações ................................................................................................ 66
Pasta vínculo funcional ................................................................................................. 67
Retrições de rotinas do menu ....................................................................................... 67
Exercício 1 .................................................................................................................... 70
DICIONARIO DE DADOS .......................................................................................................... 71
ARQUIVOS .......................................................................................................................... 72
Pasta Campos............................................................................................................... 77
Pasta Informações ........................................................................................................ 79
Pasta opções ................................................................................................................ 80
Pasta Validações .......................................................................................................... 81
Pasta Uso ..................................................................................................................... 82
Pasta módulos .............................................................................................................. 83
Opção Pastas ............................................................................................................... 83
Opção Índices ............................................................................................................... 86
GATILHOS........................................................................................................................... 93
TABELAS GENERICAS ............................................................................................................. 95
Incluindo Tabelas.......................................................................................................... 96
Editando tabelas .......................................................................................................... 97
Excluindo Tabelas ......................................................................................................... 99
Visualizando tabelas ................................................................................................... 100
GABARITO......................................................................................................................... 290
SOBRE A NFT
TREINAMENTOS
CONSULTORIA EM TREINAMENTOS
Preparaçã
Levantamen Realizaçã
o Inicial
to o
NFT NFT NFT
O objetivo deste curso é dar uma base inicial aos alunos sobre como desenvolver na
linguagem ADVPL utilizada no ERP Protheus. Com este curso básico incial você
será capaz de efetuar algumas customizações no ERP Protheus, mas para isso é
importante que pratique bastante após o curso.
Programa
SERVER Remote
Fatp0001 1-
.prw Compilaçã
Instruçõe o
s do Gera APO 3-Executa
2-Gera Fatp0001.prw
programa e grava no
RPO
... RPO
Lê RPO e 3-Executa
RPO devolve as
4-Lê RPO
Fatp0001.p informaçõ
rw es para o Comr002.prw
Comr002.pr Remote
w
INSTRUÇÃO/COMANDO
São frases que indicam as ações a serem executadas. São compostas de um verbo
no imperativo/infinitivo mais um complemento. Ex. Bata(bater) duas claras em
neve,ligue os faróis, abra a porta.
FUNÇÃO
É um conjunto de comandos para chegar a um objetivo. Função para calcular o
salário de um funcionário.
PROGRAMA
Ações de um algoritmo obedecendo à sintaxe de uma linguagem de programação. É
um conjunto de comandos e funções para chegar a um objetivo. Programa de
cálculo da folha de pagamento (utiliza a função de cálculo de salário do funcionário
além de outros comandos e outras funções).
COMPILAÇÃO
É o processo de verificação de erros de sintaxe, os quais verificam se as funções e
comandos foram escritas corretamente. Esse processo é necessário, pois o
Protheus não executa o programa diretamente, somente executa os APO´s
(Advanced Protheus Object´s) contidos no RPO. O RPO é gerado através da
compilação.
RPO
Repositório de objetos que contém todos os programas padrões compilados pela
Microsiga e também todos os programas do usuário (customizações).
SISTEMA/SOFTWARE
É um conjunto de programas para chegar a vários objetivos. Sistema de folha de
pagamento: calcular folha de pagamento, controlar admissões e demissões, calcular
férias, calcular rescisões etc.
SERVER
É o aplicativo do Protheus responsável pela compilação e execução dos APO´s.
Essa inteligência permite que as rotinas sejam descarregadas dinamicamente do
servidor para os terminais, com isso a perfomance é alta e não requer muitos
recursos da máquina para a execução do servidor.
REMOTE
É o aplicativo do Protheus que será utilizado pelo usuário para utilizar o sistema. O
remote requisita o APO ao server, o server carrega o APO do RPO, executa e
devolve o resultado ao remote.
EXERCÍCIO 1
Defina :
Programa
Remote
Server
Apo
RPO
OBJETIVO
ACESSANDO A FERRAMENTA
CONFIGURANDO O IDE
CRIAÇÃO DO PROJETO
Ex.: Nome do projeto "Projeto Principal Empresa", nome do subprojeto "Projeto teste
ByYou",nome do grupo de fontes "Faturamento"
Será aberta uma janela em branco, a qual serve para digitar o código do programa.
São sinais gráficos que atribuem ou modificam valores de variáveis. Servem também
para indicar se um valor é verdadeiro ou falso. Também servem para identificar uma
entidade.
OPERADORES MATEMÁTICOS
OPERADORES LÓGICOS
OPERADORES DE STRING
OPERADORES RELACIONAIS
EXERCÍCIO 2
MEMÓRIA
TIPOS DE VARIÁVEIS
Temos basicamente quatro tipo de variáveis: numéricas, alfanuméricas, lógicas e
array.
Numéricas: armazenam exclusivamente números, sendo que os números podem
ser:
Inteiro: números que não possuem casas decimais, apenas a parte inteira e podem
ser positivos ou negativos (ex: 1, 2, 67, 999)
Real: números que possuem casas decimais e também podem ser positivos
Exemplos:
nQtde = 100
nPreco = 250.80
Lógicas: armazenam exclusivamente valores lógicos que podem ser verdadeiro (T)
ou falso (F).
Exemplos:
lExiste =.T.
lEncontrou=.F.
LENCONTROU
Local: são visíveis apenas no escopo da função em que foram declaradas, ou seja,
outras funções não enxergam essa variável.
Exemplo: Function Teste2()
Function Teste() nC := nA * nB -> Erro de variável não existe
Local nA := 2 .
Local nB := 2 .
Local nC := nA * nB .
. mais comandos
Filha() Return .t.
.
mais comandos Function Filha()
Return .t. nC := nA * nB -> erro de variável não existe
Return .t.
OBJETIVO
ACESSANDO O MÓDULO
O ByYou - MPSDU permite que escolha-se os ícones da barra de ferramentas a
serem utilizados. Para configurar a barra de ferramenta siga os passos abaixo:
1. Acesse o MPSDU
ferramentas no ícone
Será aberta uma janela contendo todas as tabelas do sistema, digite o nome da
REGISTRO
Um registro pode ser considerado um cadastro de cliente realizado. Significa que no
cadastro de cliente foi registrado um cliente.Caso tenha 2 clientes cadastrados
consideramos 2 registros.
ARQUIVOS
Arquivo é um agrupamento de registros que seguem uma regra estrutural, e que
contém informações (dados) sobre uma área específica, registrados no disco rígido
do computador. Exemplo: arquivos .DBF.
TABELAS
No modelo de dados relacional (SQL, por exemplo), tabela é um conjunto de dados
dispostos em número finito de colunas e número ilimitado de linhas ou registros.
As colunas são tipicamente consideradas os campos da tabela, e caracterizam os
tipos de dados que deverão constar na tabela (numéricos, alfanuméricos, datas etc).
Pode conter linhas idênticas dependendo do objetivo da tabela. A forma de
referenciar inequivocamente uma única linha é a utilização de uma chave primária.
Além dos tipos de dados inerentes a todas as colunas de uma tabela, algumas
podem ter associadas restrições: a unicidade (chave única), delimitação de valores,
proibição de valores etc.
FAMÍLIA DE ARQUIVOS
O Protheus trabalha com família de arquivos para identificar a quais módulos
pertencem tais arquivos. Abaixo, segue as principais famílias de arquivos do
Protheus:
Exemplo de arquivos:
Arquivo Descrição
SA1 Cadastro de Clientes
SA2 Cadastro de Fornecedores
SB1 Cadastro de Produtos
SC5 Cabeçalho Pedido de Vendas
SC6 Itens do Pedido de Vendas
ARQUIVOS SX´S
Os arquivos SX´s contém todas as informações padrões e também customizadas de
toda base de dados.
Abaixo temos os principais arquivos SX´s do sistema:
Arquivo Descrição
SX1 Perguntas
SX2 Arquivos
SX3 Dicionário de dados
SX5 Tabelas Genéricas
SX6 Parâmetros
SX7 Gatilhos
SXE/SXF Seqüência de numeração de documentos
SINDEX/SIX Índices
ÍNDICE DE ARQUIVOS
Ao gravar dados em um arquivo, as informações são gravadas seqüencialmente, ou
seja, linha após linha. Desta maneira, para ler uma informação do arquivo é
necessário ler linha a linha até achar a informação desejada.
#include "rwmake.ch"
User Function TMun1()
Local cMun := "POTIM"
DbSelectArea("CC2")
DbGoTop()
Do While !Eof()
If CC2->CC2 = cMun
MsgInfo("Municipio Encontrado", "Busca Municipio")
Exit
Endif
DbSkip()
EndDo
Return
#include "rwmake.ch"
User Function TMun2()
Local cMun := "POTIM"
DbSelectArea("CC2")
DbSetOrder(2)
If DbSeek(Xfilial("CC2") + cMun)
MsgInfo("Municipio encontrado","Busca municipio")
Else
MsgInfo("Municipio nao encontrado","Busca municipio")
Endif
Return
SX - SXX??0
XX Prefixo do arquivo
?? Empresa
0 fixo
Empresa 99
Dicionário de dados -> SX3990
Cadastro de Clientes -> SA1990
Empresa 03
Dicionário de dados -> SX3030
Cadastro de Clientes -> SA1030
Pode existir arquivo índice sem o campo filial ? Caso a resposta seja
negativa, justifique.
OBJETIVO
USUÁRIOS
Esta área é responsavel por cadastrar os usuários com diversas informações e
configurações para que possam utilizar o sistema.
Selecione a opção desejada para ter acesso ao cadastro. Caso o usuário não tenha
muito conhecimento sobre o cadastramento de usuários é recomendado utilizar a
Usuário bloqueado - Informe a situação do usuário. Caso o usuário não esteja mais
ativo, coloque "Sim" no campo.
E-mail - Informe o e-mail do usuário. O e-mail do usuário poderá ser utilizado para
autenticação ( LogOn ), para envio de senha em caso de esquecimento e envio de
mensagens do sistema ( relatório, eventos de processamento, workflow, etc... )
Número de dígitos do ano - Informe o número de digitos para o ano que o sistema
irá utilizar na apresentação dos dados do tipo data.
PASTA SUPERIOR
Tecle "F3" e selecione o superior do usuário.
PASTA HORÁRIO
Para cada dia da semana, informar:
Hora Inicial - Informe a hora inicial em que o acesso é permitido.
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 63
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Hora final - Informe a hora final em que o acesso ao sistema é permitido.
No exemplo acima, para Domingo o usuário não terá acesso, pois o horário inicial e
final são iguais.
PASTA PARAMETRIZAÇÃO
Ativar listner de ligação - utilizada quando houver integração do Protheus Call Center
com uma plataforma de CTI (Computer Telephone Integration). O objetivo é verificar
se o usuário que está acessando o sistema está habilitado a utilizar o Listner de
Ligações e reativar o Remote de monitoração de chamadas.
PASTA IMPRESSÃO
Diretório de impressão padrão - Informe o diretório padrão de impressão.
Tipo de impressão padrão - indique qual será o tipo de impressão padrão: disco, via
windows ou direto na porta.
E-mail - Informe se o log envio de relatórios por e-mail do sistema deve ser
habilitado. A utilização deste log pode acarretar perda de performace em alguns
ambientes. Recomendamos que seja utilizado.
Para dar acesso, basta marcar a caixa de seleção e clicar no botão para
definir quais acessos o usuário terá na rotina.
Cadastre um usuário.
DICIONARIO DE DADOS
É um conjunto de tabelas que definem a organização dos dados, tais como estrutura
das tabelas, nomes, características de cada campo, perguntas de parametrização e
outros.
O dicionário pode ser personalizado, conforme necessidade.
As tabelas são gravadas no diretório "\SYSTEM" e são identificadas pelo prefixo
"SX".
A manutenção da maioria das tabelas é feita pelo Configurador, porém outras
tabelas são de uso interno do sistema e devido a isso não é possível fazer
manutenção nas mesmas.
ARQUIVOS
São os dados que constam na tabela SX2.
A rotina de arquivos faz a manutenção dos dados e facilita ao usuário determinar
determinar a localização, nome, descrição e modo de acesso dos arquivos.
Para cada empresa existem arquivos próprios, mas através desta rotina é possível
definir o uso comum de qualquer arquivo após a instalação do Sistema.
O campo "Filial" somente será gravado com brancos quando a Empresa, Unidade de
Negócios e a Filial forem compartilhadas. Em caso de uso exclusivo, este campo
recebe a identificação da Empresa, Unidade de Negócios e Filial conforme a
configuração do Grupo de Empresas. Assim, o usuário tem acesso somente aos
dados da sua Empresa, Unidade de Negócios e Filial.
Será aberta a tela abaixo, clique em para ver todas as opções do arquivo:
Rotina - nome da rotina que será executada quando o sistema abrir o arquivo.
Display -
Neste momento o arquivo só foi incluído, mas não foram definidos os campos e
índices o arquivo (estrutura do arquivo) .
Clique na opção Campos para incluir os campos da tabela, note que o sistema já
traz o campo Filial, o qual não pode ser alterado.
Campo - Nome do campo de arquivo, respeite o mesmo prefixo que foi criado para o
campo Filial (Z1_FILIAL)
Inic. Padrão - inicializador padrão do campo. Conteúdo que será preenchido quando
o campo for acessado. A função GETSXENUM é usada para criar uma numeração
automática para o campo.
Modo de edição - condição em que o campo será editado. Ex. Caso desejar que o
campo seja editado apenas na inclusão, pode-se incluir neste campo o conteúdo
INCLUI (variável publica do sistema que indica que tipo de manutenção está sendo
feita). Pode-se colocar também uma função, caso a mesma retorne falso (.F.) o
campo não sera acessado pelo usuário.
PASTA VALIDAÇÕES
Val. Sistema - reservado para Totvs, validação dos campos padrões do sistema.
Nível - Nível de acesso para o campo. Este nível limita o acesso de usuários a
informação contida no campo.Ex. Usuários de nível 5 não verão campos de nível 6.
Marque os módulos em que o campo será utilizado, ou escolha "Utilizado por todos
os módulos", caso o mesmo for utilizado por todos os módulos.
OPÇÃO PASTAS
Essa opção é utilizada para organizar os campos do arquivo confor-me o tipo de
informação, por exemplo, o cadastro de clientes possui as pastas: cadastro, fiscais,
vendas etc.
Para criar uma pasta - clique em Pastas
OPÇÃO ÍNDICES
Todo arquvo deve ter pelo menos um índice. Os índices são utilizados como chave
de pesquisas nas consultas do sistema.
Chave - indica a ordem do índice e sempre deverá conter o campo FILIAL como
primeiro campo da chave.
Mostra pesq. - Informe se o índice deverá ser mostrados nas pesquisas do browse.
Clique no botão
Clique no botão
Aguarde o processamento.
Na tela abaixo serão exibidos todos os grupos possíveis de alteração, para alterar o
tamanho, selecione o grupo desejado e clique em . Vamos alterar o grupo
Parcela:
GATILHOS
Regra - O que será gravado no campo. Pode ser qualquer expressão ADVPL.
TABELAS GENERICAS
INCLUINDO TABELAS
As tabelas da Totvs inciam-se com o código 00.
Para incluir uma tabela acesse Ambiente - Cadastros - Tabelas
EDITANDO TABELAS
Para editar uma tabela acesse Ambiente - Cadastros - Tabelas
O sistema apresentará todas as tabelas do sistema:
EXCLUINDO TABELAS
Para excluir uma tabela acesse Ambiente - Cadastros - Tabelas
O sistema apresentará todas as tabelas do sistema:
VISUALIZANDO TABELAS
Para visualizar uma tabela acesse Ambiente - Cadastros - Tabelas
O sistema apresentará todas as tabelas do sistema:
PARAMETROS
São variáveis que alteram o processamento de uma rotina. Elas são elementos
chaves na execução das rotinas do sistema. Todos os parâmetros começam com
"MV_".
Os parâmetros podem ser definidos por filiais ou serem comuns para a Empresa.
Através do help do sistema, dentro da rotina que está sendo utilizada é possível
verificar quais os parâmetros existentes na mesma. Para isso, acesse a rotina
desejada e pressione a tecla F1.
Clique em "parâmetros"
PESQUISANDO PARÂMETROS
Para pesquisar um parâmetro, acesse Ambiente - Cadastros - Parâmetros -
Pesquisar
VISUALIZANDO PARÂMETROS
Para visualizar um parâmetro, acesse Ambiente - Cadastros - Parâmetros -
Pesquisar
ALTERANDO PARÂMETROS
Para alterar um parâmetro, acesse Ambiente - Cadastros - Parâmetros - Pesquisar
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 108
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Clique no botão
INCLUINDO PARÂMETROS CUSTOMIZADOS
Para alterar um parâmetro, acesse Ambiente - Cadastros - Parâmetros
Pasta descrição
Clique no botão
EXCLUINDO PARÂMETROS
Para excluir um parâmetro, acesse Ambiente - Cadastros - Parâmetros - Pesquisar
PERGUNTAS
OPÇÃO PERGUNTAS
As perguntas são utilizadas nas telas parâmetros de relatório e de processos do
sistema.
Serão exibidos as perguntas existentes no sistema.
CONSULTA PADRÃO.
Habilitar inclusão - habilita esse campo, caso desejar que o usuário faça inclusões
através da consulta.
Para incluir outros índices, proceda como explicado no item 1 e para amarrar
os campos ao índice proceda como explicado no item 2. Somente após isso siga os
passos abaixo.
Clique no botão para informar o retorno da consulta, ou seja, o campo que após
o usuário pressionar F3 será retornado para a tela.
Retorno - informe o nome do rdmake que trará o retorno da consulta (clique no botão
Clique no botão
Ex.:
#INCLUDE "PROTHEUS.CH"
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄ¿
//³ Declaracao de Variaveis ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÙ
Local oListBox
Local oPanel
Local aPars := {}
Local nPosList := 0
If cVar == "M->Z1_CODIGO"
lOk := .F.
cConteudo := &(ReadVar())
If !Empty(cConteudo)
nPosList := ASCAN(aCodRel, {|aVal| aVal[1] == Upper(cConteudo)})
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 129
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
EndIf
If nPosList > 0
oListBox:nAT := nPosList
oListBox:bLine := {
||{aCodRel[oListBox:nAT][1],aCodRel[oListBox:nAT][2]}}
oConf:SetFocus()
EndIf
Return lOk
Return (M->Z1_CODIGO)
Consulta Usuários
A consulta usuários permite que o campo de uma tabela realize consultas de
campos de outras tabelas, permitindo que o retorno seja vinculado a definidos
usuários.
Para a criação de uma Consulta de usuário clique em Consulta Padrão.
Clique em
Clique em
MENUS
Por padrão o Protheus já vem com o menu de cada módulo pronto, porém
geralmente é necessário configurar esse menu de acordo com o perfil de cada
usuário, uma vez que os menus padrão contém todas as opções do sistema e nem
sempre os usuários poderão acessar todas as opções.
Neste programa, deve ser definido um menu para cada usuário e na configuração de
senhas, associa-se este menu com a senha do usuário que determinará quais
ambientes, rotinas, empresas e filiais ele poderá acessar.
REDEFINDO MENU
Para redefinir um menu acesse Ambiente - Cadastro - Menus
Será exibida uma tela contendo todos os menus padrão do sistema (pasta \system).
O sistema apresenta uma tela dividida em dois lados, do lado esquerdo contém os
menus de origem selecionados pelo usuário, do lado esquerdo é apresentada a
Agora vamos inserir itens no grupo Entidades, marque a pasta Entidades. Depois no
menu de origem Compras, vamos selecionar o item Fornecedores e clicar em
Status do menu -
Habilitado - exibe a opção no menu e permite a sua seleção.
Desabilitado - desativa a opção posicionada, não exibindo-a no menu.
Inibido - apresenta a opção no menu, porém não permite a sua seleção.
Módulo - Selecione o ambiente cujo tratamento deve ser aplicado à opção, por
exemplo, selecionada a opção “Fornecedores” que deve se comportar como no
Ambiente Compras
Rotinas do Browse - Permite definir o acesso às opções dos menus nas telas
browse. O Sistema apresenta 10 opções equivalentes às funções de cada programa
na seqüência em que aparecem. Por exemplo: em um programa de atualização,
temos a opção
Tabelas:
Marque as tabelas utilizadas pela rotina.
MSDIALOG
É uma janela da aplicação.Ela é base para os outros componentes visuais da
aplicação.
DEFINE MSDIALOG oObjetoDLG TITLE cTitulo FROM nLinIni,nColIni TO nLiFim,
nColFim OF oObjetoRef UNIDADE
oObjetoDLG - Posição do objeto Say em função da janela em que ele será definido.
cTitulo - Título da janela de diálogo.
nLinIni, nColIni - Posição inicial em linha / coluna da janela.
nLiFim, nColFim -Posição final em linha / coluna da janela.
oObjetoRef - Objeto dialog no qual a janela será definida.
UNIDADE - Unidade de medida das dimensões: PIXEL
#include "protheus.ch"
User Function XMDiag()
Local cTitulo := "Teste MsDialog"
// Variaveis para a MsAdvSize
Local lEnchBar := .F. // Se a janela de diálogo possuirá enchoicebar (.T.)
Local lPadrao := .F. // Se a janela deve respeitar as medidas padrões do //Protheus
(.T.) ou usar o máximo disponível (.F.)
Local nMinY := 400 // Altura mínima da janela
Local aSize := MsAdvSize(lEnchBar, lPadrao, nMinY)
Return
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 149
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
ENCHOICE
Tela para dilgitação de vários campos com os seus respectivos textos explicativos. É
composta diversos objetos Tsay() e Tget() para visualisar ou editar as informações.
Utilizada geralmente em cadastros ou processos de movimentações simples.
Ex. Enchoice para o cadastro de fornecedores "SA2"
Função Enchoice - mais utilizada. Não retorna um objeto para a função chamadora,
Enchoice(cAlias, nReg,nOpc,aCra,cLetra,cTexto,aAcho,aPos,aCpos,nModelo,
nColmens, cMensagem, cTudoOk, oWnd, lF3, lMemoria, lColumn, caTela,
lNoFolder, lProperty)
Retorno = Nil
#include "protheus.ch"
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "A2_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
DEFINE MSDIALOG oDlg TITLE cCadastro From aSize[7],0 to aSize[6],aSize[5] of
oMainWnd PIXEL
RegToMemory("SA2", If(nOpc==3,.T.,.F.))
EnChoice( cAliasE, nReg, nOpc,,,,aCpoEnch, aPosObj[1],aAlterEnch , , , , , , , .T.)
MSMGET
Classe do objeto Enchoice que inicia um objeto e o retorna para a função
chamadora.
MsMGet():New( cAlias, nReg, nOpc, aCRA, cLetra, cTexto, aAcho, aPos, aCpos,
nModelo, nColMens, cMensagem, cTudoOk, oWnd, lF3, lMemoria, lColumn,
caTela, lNoFolder, lProperty)
#include "protheus.ch"
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "A2_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
IF nOpc == 3 //Incluir
FOR nI:=1 to SA2->(FCOUNT())
M->&(SA2->(FIELDNAME(nI) )) := Criavar(SA2->(FIELDNAME(nI)))
NEXT
ELSEIF nOpc == 2 .OR. nOpc == 4 .OR. nOpc == 5 //outras opções exeto
pesquisar
FOR nI:=1 to SA2->(FCOUNT())
M->&(SA2->(FIELDNAME(nI) )) := SA2->(FIELDGET(nI))
NEXT
IF nOpc == 5
// PODE INCLUIR UM A FUNÇÃO DE VALIDACAO ANTES DE EXCLUIR O
FORNECEDOR
//Return .F. SE A FUNÇÃO FALHAR
ENDIF
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 157
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
IF nOpc == 4
// PODE INCLUIR UM A FUNÇÃO DE VALIDACAO ANTES DE ALTERAR O
FORNECEDOR
//Return .F. SE A FUNCAO FALHAR
ENDIF
ENDIF
oDlg := MSDIALOG():New(000,000,400,600,cCadastro,,,,,,,,,.T.)
RegToMemory(cAliasE, If(nOpc==3,.T.,.F.))
//oEnch := MsMGet():New(cAliasE, nReg, nOpc, /*aCRA*/, /*cLetra*/,/*cTexto*/,
aCpoEnch, aPos, aAlterEnch, nModelo, /*nColMens*/,/*cMensagem*/,
/*cTudoOk*/,oDlg,lF3,lMemoria,lColumn, caTela,lNoFolder, lProperty)
oEnch := MsMGet() :New(cAlias, nReg, nOpc, , , , aCpoEnch, PosDlg(oDlg),
aAlterEnch, 3 )
oDlg:lCentered := .T.
ACTIVATE MSDIALOG oDlg ON INIT
ENCHOICEBAR(oDlg,bOk,bCancel)//CENTERED
IF lOk .AND. nOpc <> 2
IF nOpc == 3 .OR. nOpc == 4 //INCLUIR E ALTERAR
BEGIN Transaction
SA2->(DBSETORDER(1))
lInclui := !SA2->(DBSEEK(xFILIAL("SA2")+M->A2_COD))
dbSelectArea("SA2")
SA2->(RECLOCK('SA2',lInclui))
SA2->A2_FILIAL := xFilial("SA2")
FOR nI:=1 to SA2->(FCOUNT())
FIELDPUT(nI,M->&(SA2->(FIELDNAME(nI)) ))
NEXT
SA2->(MSUNLOCK())
END Transaction
ELSEIF nOpc == 5 // Deletar
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 158
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
BEGIN Transaction
SA2->(RECLOCK('SA2',.F.))
SA2->(DBDELETE())
SA2->(MSUNLOCK())
END Transaction
ENDIF
ENDIF
Return
MSGETDB
Grid digitável baseado em uma tabela temporária.
MsGetDB():New(nTop, nLeft, nBottom, nRight, nOpc, cLinhaOk, cTudoOk, IniCpos,
lDelete, aAlter, nFreeze, lEmpty, uPar1, cTRB, cFieldOk, lCondicional, lAppend,
oWnd, lDisparos, uPar2, cDelOk, cSuperDel)
Retorno: oMsGetDB - objeto do tipo MsGetDB()
#include "protheus.ch"
User Function XGetDb()
Local oDlg
Local oGetDB
Local nUsado := 0
Local aStruct := {}
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
Private aRotina := {{"Pesquisar", "AxPesqui", 0, 1},;
{"Visualizar", "AxVisual", 0, 2},;
{"Incluir", "AxInclui", 0, 3},;
{"Alterar", "AxAltera", 0, 4},;
{"Excluir", "AxDeleta", 0, 5}}
DbSelectArea("SX3")
DbSetOrder(1)
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 160
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
DbSeek("ZZ1")
While !Eof() .and. SX3->X3_ARQUIVO == "ZZ1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
AADD(aHeader,{Trim(X3Titulo()),;
SX3->X3_CAMPO,;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;
SX3->X3_TIPO,;
"",;
"" })
AADD(aStruct,{SX3->X3_CAMPO,SX3->X3_TIPO,SX3-
>X3_TAMANHO,;
SX3->X3_DECIMAL})
EndIf
DbSkip()
End
AADD(aStruct,{"FLAG","L",1,0})
cCriaTrab := CriaTrab(aStruct,.T.)
DbUseArea(.T.,__LocalDriver,cCriaTrab,,.T.,.F.)
oDlg := MSDIALOG():New(000,000,300,400, "MsGetDB – ZZ1",,,,,,,,,.T.)
oGetDB := MsGetDB():New(05,05,145,195,3,"U_LINHAOK", "U_TUDOOK",
"+ZZ1_COD", ;
.T.,{"ZZ1_NOME"},1,.F.,,cCriaTrab,"U_FIELDOK",,.T.,oDlg, .T., ,"U_DELOK",;
"U_SUPERDEL")
oDlg:lCentered := .T.
oDlg:Activate()
DbSelectArea(cCriaTrab)
DbCloseArea()
Return
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 161
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
MSNEWGETDADOS
Grid digitável baseado em um array.
Variáveis private:
aRotina - Vetor com as rotinas que serão executadas na MBrowse e que definira o
tipo de operação que esta sendo executada (inclusão, alteração, exclusão,
visualização, pesquisa, ...) no formato:
{cTitulo, cRotina, nOpção, nAcesso}, aonde:
nOpção segue o padrão do ERP Protheus para:
1- Pesquisar
2- Visualizar
3- Incluir
4- Alterar
5- Excluir
aHeader - Vetor com informações das colunas no formato:
Variáveis públicas:
N - Indica qual a linha posicionada do aCols.
Funções de validação:
cLinhaOk - Função de validação na mudança das linhas da grid. Não pode ser
definida como Static Function.
cTudoOk - Função de validação da confirmação da operação com o grid.
Não pode ser definida como Static Function.
Métodos adicionais:
ForceRefresh() - Atualiza a MsNewGetDados com a tabela e posiciona na primeira
linha.
Hide() - Oculta a MsNewGetDados.
Show() - Mostra a MsNewGetDados.
#include "protheus.ch"
User Function XNewGetd()
Private aHeader := {}
Private aCols := {}
PRIVATE N := 1
PRIVATE aGEMCVnd := {"",{},{}}
Private cCadastro := "Pedidos de Venda"
Private aRotina := {{"Pesquisar" , "axPesqui" , 0, 1},;
{"Visualizar" , "U_ModGtd" , 0, 2},;
{"Incluir" , "U_ModGtd" , 0, 3}}
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 165
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Private aSize := MsAdvSize(,.F.,430)
Private aObjects := {}
Private aPosObj := {}
// Devolve o tamanho da tela atualmente no micro do usuario.
Private aSizeAut := MsAdvSize()
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
ENCHOICEBAR
Função para criar uma barra de botões padrão utilizado pelas interfaces de cadastro.
Além disso permite adicionar botões com a utilização do parâmetros aButtons.
#include "protheus.ch"
User Function XEnchBar()
Local oDlg, oBtn
Local aButtons := {}
DEFINE MSDIALOG oDlg TITLE "Teste EnchoiceBar" FROM 000,000 TO 400,600
PIXEL OF;
oMainWnd
AADD( aButtons, {"USER", {|| U_XUser()}, "Usuario","Usuario",{|| .T.}} )
@ -15,-15 BUTTON oBtn PROMPT "..." SIZE 1,1 PIXEL OF oDlg
ACTIVATE MSDIALOG oDlg ;
ON INIT (EnchoiceBar(oDlg,{||lOk:=.T.,oDlg:End()},{||oDlg:End()},,@aButtons))
Return
MODELO 1 - AXCADASTRO
Função de cadastro simples, com poucas opções de customizações. não é possível
utilizar o conceito de cabeçalho e itens nessa interface. É composta por um browse
para a apresentação dos dados e possui funções de pesquisa, visualização,
inclusão, alteração e exclusão.
AxCadastro(cAlias, cTitulo, cVldExc, cVldAlt)
cAlias - alias do arquivo a ser utilizado
cTitulo - título da janela
cVldExc - função de validação de exclusão
cVldAlt - função de validação de alteração
#include "rwmake.ch"
User Function XCadSA1()
Local cAlias := "SA1"
Local cTitulo := "Cadastro de Clientes"
Local cVldExc := "U_VldSA1"
Local cVldAlt := ".T."
DbSelectArea(cAlias)
DbSetOrder(1)
AxCadastro(cAlias,cTitulo,cVldExc,cVldAlt)
Return
User Function VldSA1(cAlias,nReg,nOpc)
Local nRet := .T.
Local aArea := GetArea()
SC5->(DbSetOrder(3))
If SC5->(MsSeek (XFilial("SC5") + SA1->A1_COD + SA1->A1_LOJA) )
MsgStop("Cliente nao pode ser excluido, pois tem pedido de
venda","Exclusao de cliente")
lRet:= .F.
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 173
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Else
nOpcao := AxExclui(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Exclusão concluída com sucesso!")
Endif
Endif
RestArea(aArea)
Return lRet
MBROWSE
Função de cadastro com mais opções de recursos para manipulação das
informações do que a Axcadastro.
MBrowse(nLin1,nCol1,nLin2,nCol2,cAlias,aFixe,cCpo,nPar08,cfun,nClickDef,aColors
,cTopFun,cBotFun,nPar14,bInitBloc,lNoMnuFilter,lSeeAll,lChgAll)
nLin1 - número da linha inicial
nCol1- número da coluna inicial
nLin2 - número da linha final
nCol2 - número da coluna final
cAlias - nome do arquivo que será visualizado no browse
aFixe - Array bi-dimensional que contém o nome dos campos, ou a definição das
colunas quando a função é utilizada com arquivos de trabalho.
Variáveis privates:
aRotina - array que contém as funções (inclusão, alteração, exclusão etc) a serem
executadas pela mBrowse.
[n] [1] - Título
[n] [2] - Rotina
[n] [3] - Reservado
[n] [4] - 1 ou 2 ou 3 ou 4 ou 5 (1-pesquisa, 2-visualização, 3-inclusão, 4-
alteração, 5-exclusão)
#include "protheus.ch"
User Function XBrwSA6()
Local cAlias := "SA6"
Private cCadastro := "Cadastro de Bancos"
Private aRotina := {}
AADD(aRotina,{"Pesquisar" ,"AxPesqui",0,1})
AADD(aRotina,{"Visualizar" ,"AxVisual",0,2})
AADD(aRotina,{"Incluir" ,"AxInclui",0,3})
AADD(aRotina,{"Alterar" ,"AxAltera",0,4})
AADD(aRotina,{"Excluir" ,"AxDeleta",0,5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return Nil
dbSelectArea(cAlias)
dbSetOrder(1)
Eval(bFiltraBrw) // GERA O FILTRO
dbSelectArea(cAlias)
dbGoTop()
mBrowse(6,1,22,75,cAlias,,,,,,aCores)
EndFilBrw(cAlias,aIndexSA1) // LIMPA O FILTRO
Return Nil
nOpcao := AxAltera(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Alteração efetuada com sucesso!")
Else
MsgInfo("Alteração cancelada!")
Endif
Return Nil
MODELO 2
É utilizada para manipulação de dados que tratam estrutura de cabeçalho e itens na
mesma tabela.
Pode ser utilizada através da Função Modelo2(), a qual tem como objetivo facilitar a
codificação, mas não trata as regras de visualização, inclusão, exclusão como uma
AxCadastro() ou AxFunction().
Permite utilizar os seguintes componentes visuais:
MsDialog()
Tsay()
Tget()
MsNewGetDados()
EnchoiceBar()
Modelo2([cTitulo],[aCab],[aRoda],[aGrid],[nOpc],[cLinhaOk],[cTudoOk])
cTitulo - título da janela
aCab - array que contém o cabeçalho da Enchoice().
Cab[n][1] (Caractere) := Nome da variável private que será vinculada ao
campo da Enchoice().
aCab[n][2] (Array) := Array com as coordenadas do campo na tela {Linha, Coluna}
aCab[n][3] (Caractere) := Título do campo na tela
aCab[n][4] (Caractere) := Picture de formatação do get() do campo.
aCab[n][5] (Caractere) := Função de validação do get() do campo.
aCab[n][6] (Caractere) := Nome da consulta padrão que será executada
para o campo via tecla F3
aCab[n][7] (Lógico) := Se o campo estará livre para digitação.
aRoda - Array contendo as informações que serão exibidas no cabeçalho na forma
de Enchoice(), no mesmo formato que o aCab.
aGrid - Array contendo as coordenadas da GetDados() na tela. Padrão :=
{44,5,118,315}
nOpc - Opção selecionada na MBrowse, ou que deseje ser passada para controle
da Modelo2, aonde:2 – Visualizar, 3 – Incluir, 4 - Alterar, 5 - Excluir
cLinhaOk - Função para validação da linha na GetDados()
cTudoOk - Função para validação na confirmação da tela de interface da Modelo2().
#include "protheus.ch"
USER FUNCTION XMOD2()
Local cAlias := "SX5"
Private cCadastro := "Arquivo de Tabelas"
Private aRotina := {}
Private cDelFunc := ".T." // Pode-se utilizar ExecBlock
AADD(aRotina,{"Pesquisar" ,"AxPesqui" ,0,1})
AADD(aRotina,{"Visualizar" ,"U_SX5Vis" ,0,2})
AADD(aRotina,{"Incluir" ,"U_SX5Inc" ,0,3})
AADD(aRotina,{"Alterar" ,"U_SX5Alt" ,0,4})
AADD(aRotina,{"Excluir" ,"U_SX5Exc" ,0,5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse( 6,1,22,75,cAlias)
Return
// Montagem do aHeader
AADD(aHeader,{"Chave" ,"X5_CHAVE","@!",5,0,"AllwaysTrue()","","C","","R"})
AADD(aHeader,{"Descricao" ,"X5_DESCRI","@!",40,0,"AllwaysTrue()","","C","","R"})
// Montagem do aCols
aCols := Array(1,Len(aHeader)+1)
// Inicialização do aCols
For nColuna := 1 to Len(aHeader)
If aHeader[nColuna][8] == "C"
aCols[1][nColuna] := SPACE(aHeader[nColuna][4])
ElseIf aHeader[nColuna][8] == "N"
aCols[1][nColuna] := 0
ElseIf aHeader[nColuna][8] == "D"
aCols[1][nColuna] := CTOD("")
ElseIf aHeader[nColuna][8] == "L"
aCols[1][nColuna] := .F.
ElseIf aHeader[nColuna][8] == "M"
aCols[1][nColuna] := ""
Endif
Next nColuna
lRetMod2 := Modelo2(cTitulo,aCab,aRoda,aGrid,nOpc,cLinhaOk,cTudoOk)
IF lRetMod2
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 184
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
For nLinha := 1 to len(aCols)
// Campos de Cabeçalho
Reclock("SX5",.T.)
SX5->X5_FILIAL := cX5Filial
SX5->X5_TABELA := cX5Tabela
For nColuna := 1 to Len(aHeader)
SX5->&(aHeader[nColuna][2]) := aCols[nLinha][nColuna]
Next nColuna
MsUnLock()
Next nLinha
ELSE
MsgAlert("Você cancelou a operação","Exclusão Tabela")
ENDIF
Return
// Montagem do aHeader
AADD(aHeader,{"Chave" ,"X5_CHAVE","@!",5,0,"AllwaysTrue()","","C","","R"})
AADD(aHeader,{"Descricao" ,"X5_DESCRI","@!",40,0,"AllwaysTrue()","","C","","R"})
// Montagem do aCols
aCols := Array(1,Len(aHeader)+1)
// Inicialização do aCols
For nColuna := 1 to Len(aHeader)
If ( aHeader[nColuna][10] != "V")
aCols[Len(aCols)][nColuna] :=
FieldGet(FieldPos(aHeader[nColuna][2]))
Else
aCols[Len(aCols)][nColuna] := CriaVar(aHeader[nColuna][2])
EndIf
Next nColuna
aCols[1][Len(aHeader)+1] := .F. // Linha não deletada
lRetMod2 := Modelo2(cTitulo,aCab,aRoda,aGrid,nOpc,cLinhaOk,cTudoOk)
Return
// Montagem do aHeader
AADD(aHeader,{"Chave" ,"X5_CHAVE","@!",5,0,"AllwaysTrue()","","C","","R"})
AADD(aHeader,{"Descricao" ,"X5_DESCRI","@!",40,0,"AllwaysTrue()","","C","","R"})
// Montagem do aCols
aCols := Array(1,Len(aHeader)+1)
// Inicialização do aCols
For nColuna := 1 to Len(aHeader)
If ( aHeader[nColuna][10] != "V")
aCols[Len(aCols)][nColuna] :=
FieldGet(FieldPos(aHeader[nColuna][2]))
Else
aCols[Len(aCols)][nColuna] := CriaVar(aHeader[nColuna][2])
EndIf
Next nColuna
aCols[1][Len(aHeader)+1] := .F. // Linha não deletada
lRetMod2 := Modelo2(cTitulo,aCab,aRoda,aGrid,nOpc,cLinhaOk,cTudoOk)
IF lRetMod2
For nLinha := 1 to len(aCols)
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 187
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
// Campos de Cabeçalho
Reclock("SX5",.F.)
SX5->(DbDelete())
MsUnLock()
Next nLinha
ELSE
MsgAlert("Você cancelou a operação","Exclusão Tabela")
ENDIF
Return
#include "protheus.ch"
User Function xMod2Rec()
Private cCadastro := "Modelo 2 com Recursos"
Private aRotina := {}
AADD( aRotina, {"Pesquisar" ,"AxPesqui" ,0,1})
AADD( aRotina, {"Visualizar" ,'U_Mod2Mnt',0,2})
AADD( aRotina, {"Incluir" ,'U_Mod2Inc',0,3})
AADD( aRotina, {"Alterar" ,'U_Mod2Mnt',0,4})
Local oTPanel1
Local oTPAnel2
Local cFilial := SPACE(02)
Private cTabela := SPACE(02)
Private aHeader := {}
Private aCOLS := {}
Private aREG := {}
dbSelectArea( cAlias )
dbSetOrder(1)
Mod2aHeader( cAlias )
Mod2aCOLS( cAlias, nReg, nOpc )
DEFINE MSDIALOG oDlg TITLE cCadastro From 8,0 To 28,80 OF oMainWnd
oTPanel1 := TPanel():New(0,0,"",oDlg,NIL,.T. , .F.,NIL,NIL,0,16,.T.,.F.)
oTPanel1:Align := CONTROL_ALIGN_TOP
@ 4, 006 SAY "Filial:" SIZE 70,7 PIXEL OF oTPanel1
@ 4, 062 SAY "Tabela:" SIZE 70,7 PIXEL OF oTPanel1
@ 3, 026 MSGET cFilial PICTURE "@!" SIZE 030,7 PIXEL OF oTPanel1
@ 3, 080 MSGET cTabela PICTURE "@!" VALID !EMPTY(cTabela) SIZE 78,7
PIXEL OF oTPanel1
oTPanel2 := TPanel():New(0,0,"",oDlg,NIL,.T.,.F.,NIL,NIL,0,16,.T.,.F.)
oTPanel2:Align := CONTROL_ALIGN_BOTTOM
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 189
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
oGet := MSGetDados():New(0,0,0,0,nOpc,"U_Mod2LOk()",".T.","+X5_CHAVE",.T.)
oGet:oBrowse:Align := CONTROL_ALIGN_ALLCLIENT
ACTIVATE MSDIALOG oDlg CENTER ON INIT EnchoiceBar(oDlg,{||
IIF(U_Mod2TOk(), Mod2GrvI(),( oDlg:End(), NIL ) )},{|| oDlg:End() })
Return
oGet:oBrowse:Align := CONTROL_ALIGN_ALLCLIENT
ACTIVATE MSDIALOG oDlg CENTER ON INIT EnchoiceBar(oDlg,{|| ( IIF( nOpc==4,
Mod2GrvA(), IIF( nOpc==5, Mod2GrvE(), oDlg:End() ) ), oDlg:End() ) },{|| oDlg:End()
})
Return
//Efetivação da alteração
Static Function Mod2GrvA()
Local cTabela := SX5->X5_TABELA
Local aArea := GetArea()
Local nI := 0
Local nX := 0
dbSelectArea("SX5")
//Efetivação da exclusão
Static Function Mod2GrvE()
Local nI := 0
dbSelectArea("SX5")
For nI := 1 To Len( aCOLS )
dbGoTo(aREG[nI])
RecLock("SX5",.F.)
dbDelete()
MsUnLock()
Next nI
Return
MODELO 3
É utilizada para manipulação de dados que tratam estrutura de cabeçalho e itens em
tabelas diferentes.
Pode ser utilizada através da Função Modelo3(), a qual tem como objetivo facilitar a
codificação, mas não trata as regras de visualização, inclusão, exclusão como uma
AxCadastro() ou AxFunction().
Permite utilizar os seguintes componentes visuais:
MsDialog()
Enchoice() (a inicialização dos campos utilizados na Enchoice deve ser feito através
da função RegtoMemory())
EnchoiceBar()
MsNewGetDados()
Modelo3([cTitulo],[cAliasE],[cAliasGetD],[aPosE],[cLinOK],[cTudOK],[nOpcE],[nOpcG
],[cFieldOK])
cTitulo - Título da janela
cAliasE - alias da tabela que será utilizado na Enchoice()
cAliasGetD - alias da tabela que será utilizado na GetDados()
aPosE - nome dos campos da Enchoice()
AADD(aCamposE,{nome_campo})
cLinOk - função de validação da GetDados()
cTudOK - função de validação na confirmação da gravação de dados
nOpcE - opção selecionada na Mbrowse, ou que deseja passar como controle para
a Enchoice():
2 - Visualizar
3 - Incluir
4 - Alterar
5 - Excluir
nOpcG - opção selecionada na Mbrowse, ou que deseja passar como controle para
a GetDados():
2 - Visualizar
3 - Incluir
4 - Alterar
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 196
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
5 - Excluir
cFieldOK - validação dos campos da enchoice
#INCLUDE "protheus.ch"
User Function XMod3()
Private cCadastro := "Modelo 3"
Private aRotina := {}
Private cDelFunc := ".T."
Private cAlias := "ZZ2"
Private bCampo := {|nCPO| Field(nCPO) }
AADD(aRotina,{ "Pesquisa","AxPesqui" ,0,1})
AADD(aRotina,{ "Visual" ,"U_MntPed" ,0,2})
AADD(aRotina,{ "Inclui" ,"U_MntPed" ,0,3})
AADD(aRotina,{ "Altera" ,"U_MntPed" ,0,4})
AADD(aRotina,{ "Exclui" ,"U_MntPed" ,0,5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse( 6,1,22,75,cAlias)
Return
If nOpcx==3 // Incluir
aCols:={Array(nUsado+1)}
aCols[1,nUsado+1]:=.F.
For nX:=1 to nUsado
aCols[1,nX]:=CriaVar(aHeader[nX,2])
Next
Else
aCols:={}
dbSelectArea("ZZ3")
dbSetOrder(1)
dbSeek(xFilial()+M->ZZ2_NUM)
While !eof().and.ZZ3_NUM==M->ZZ2_NUM
AADD(aCols,Array(nUsado+1))
For nX:=1 to nUsado
aCols[Len(aCols),nX]:=FieldGet(FieldPos(aHeader[nX,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
If Len(aCols)>0
// Executa a Modelo 3
aCposE := {"ZZ2_NUM","ZZ2_CLIENTE"}
lRetMod3 := Modelo3(cTitulo, cAliasE, cAliasG, aCposE, cLinOk,
cTudOk,nOpcE, nOpcG,cFieldOk)
If lRetMod3
If nOpcX == 3 // Inclusao
RecLock("ZZ2",IIF(inclui,.T.,.F.))
For i := 1 TO FCount()
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 199
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
If "FILIAL"$Field(i)
FieldPut(i,xFilial())
Else
FieldPut(i,M->&(EVAL(bCampo,i)))
EndIf
Next i
MsUnLock()
For nx := 1 to len(aCols)
RecLock("ZZ3",.T.)
For ni := 1 to Len(aHeader)
ZZ3->&(aHeader[ni][2]) := aCols[nx][ni]
Next ni
MsUnLock()
Next nx
Endif
Aviso("Pedido","Confirmada operacao!",{"Ok"})
Endif
Endif
Return
dbSelectArea("ZZ3")
dbSetOrder(1)
dbGoTop()
MBrowse(,,,,"ZZ2")
Return
//Função de Inclusão
User Function Mod3Inc( cAlias, nReg, nOpc )
Local oDlg
Local oGet
Local nX := 0
Local nOpcA := 0
Private aHeader := {}
Private aCOLS := {}
Private aGets := {}
Private aTela := {}
dbSelectArea( cAlias )
dbSetOrder(1)
For nX := 1 To FCount()
M->&( Eval( bCampo, nX ) ) := CriaVar( FieldName( nX ), .T. )
Next nX
Mod3aHeader()
Mod3aCOLS( nOpc )
DEFINE MSDIALOG oDlg TITLE cCadastro FROM aSize[7],aSize[1] TO
aSize[6],aSize[5] OF oMainWnd PIXEL
EnChoice( cAlias, nReg, nOpc, , , , , aPObj[1])
// Atualização do nome do cliente
@ aPObj[3,1],aPGet[1,1] SAY "Cliente: " SIZE 70,7 OF oDlg PIXEL
@ aPObj[3,1],aPGet[1,2] SAY oCliente VAR cCliente SIZE 98,7 OF oDlg PIXEL
// Atualização do total
@ aPObj[3,1],aPGet[1,3] SAY "Valor Total: " SIZE 70,7 OF oDlg PIXEL
U_Mod3Cli()
oGet :=
MSGetDados():New(aPObj[2,1],aPObj[2,2],aPObj[2,3],aPObj[2,4],nOpc,"U_Mod3LO
k()",".T.","+ZZ3_ITEM",.T.)
ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,{|| IIF(
Mod3TOk().And.Obrigatorio( aGets, aTela ), ( nOpcA := 1, oDlg:End() ),NIL ) },{||
oDlg:End() })
If nOpcA == 1 .And. ( nOpc == 4 .Or. nOpc == 5 )
Mod3Grv( nOpc, aREG )
Endif
Return
If nOpc <> 3
cChave := ZZ2->ZZ2_NUM
dbSelectArea( cAlias )
dbSetOrder(1)
dbSeek( xFilial( cAlias ) + cChave )
While !EOF() .And. ZZ3->( ZZ3_FILIAL + ZZ2_NUM ) == xFilial( cAlias ) +
cChave
AADD( aREG, ZZ3->( RecNo() ) )
AADD( aCOLS, Array( Len( aHeader ) + 1 ) )
For nI := 1 To Len( aHeader )
If aHeader[nI,10] == "V"
aCOLS[Len(aCOLS),nI] := CriaVar(aHeader[nI,2],.T.)
Else
aCOLS[Len(aCOLS),nI] :=
FieldGet(FieldPos(aHeader[nI,2]))
Endif
Next nI
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 205
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
aCOLS[Len(aCOLS),Len(aHeader)+1] := .F.
dbSkip()
End
Else
AADD( aCOLS, Array( Len( aHeader ) + 1 ) )
For nI := 1 To Len( aHeader )
aCOLS[1, nI] := CriaVar( aHeader[nI, 2], .T. )
Next nI
aCOLS[1, GdFieldPos("ZZ3_ITEM")] := "01"
aCOLS[1, Len( aHeader )+1 ] := .F.
Endif
Restarea( aArea )
Return
Next i
Return( lRet )
EXERCÍCIO 1
EXERCÍCIO 2
IMPCADAST
Função para impressão simples de cadastros com opção de parâmetros "de/para".
Retorno: Nenhum .
Roda(uPar01,uPar02,cSize)
uPar01 - nao utilizado
uPar02- nao utilizado
cSize- tamanho do relatorio P, M ou G
Ms_Flush()
Envia o spool de impressão para o dispositivo especificado com a utilização das
funções AVALIMP() ou SETPRINT()
#Include "PROTHEUS.CH"
User Function XImpCad()
Imprime()
Return
nconta := 0
cabec1 := "RELACAO DECADASTRO DE BANCOS"
cabec2 := " "
cabec3 := " "
cString :="SA6"
aOrd := {" Por Codigo "," Alfabetica "}
wnrel :="XIMPCAD"
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 216
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Private AParDef := {}
wnrel:=SetPrint(cString,wnrel,"ParamDef(cAlias)",@Titulo,cDesc1,cDesc2,cDesc3,.T
.,aOrd,,Tamanho)
If nLastKey = 27
dbClearFilter()
Return
Endif
SetDefault(aReturn,cString)
If nLastKey = 27
dbClearFilter()
Return
Endif
RptStatus({|lEnd|
XImp(@lEnd,Cabec1,Cabec2,Cabec3,limite,tamanho,nconta,wnrel)},Titulo)
Return
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄ¿
//³ Monta Array para identificacao dos campos dos arquivos ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÙ
if Len(aReturn) > 8
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 217
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Mont_Dic(cString)
else
Mont_Array(cString)
endif
ImpCadast(Cabec1,Cabec2,Cabec3,NomeProg,Tamanho,Limite,cString,@lEnd)
IF li != 80
roda(nconta,cbtxt,"M")
EndIF
dbSelectArea("SA6")
dbClearFilter()
dbSetOrder(1)
If aReturn[5] = 1
Set Printer TO
dbCommitAll()
ourspool(wnrel)
Endif
MS_FLUSH()
Return
SETPRINT
Função para gerar relatórios em formato não gráficos. Este tipo de relatório é
caracterizado por um formato de impressão tipo PostScript®, e permite a geração de
um arquivo em formato texto (.txt), com uma extensão própria da aplicação ERP
(.##R).
Através da SetPrint() é criada uma uma interface padrão de impressão para que o
usuário possa fazer a configuração das opções do relatório.
Variáveis privates:
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 221
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
m_pag - numérica - utilizada para controlar o número de páginas.
aReturn - array - contém as opções de impressão.
Setdefault(< aReturn > , < cAlias > , [ uParm3 ] , [ uParm4 ] ,[cSize] , [ nFormat ])
Configura o ambiente de impressão de acordo com o array aReturn
aReturn - array com as wconfigurações de impressão
cAlias - apelido do arquivo de impressão
uParm3 - reservado
uParm4 - reservado
cSize - tamanho da página a ser impressa: "P", "M" ou "G"
nFormat - orientação da página: 1 - retrato ou 2 - paisagem.
Retorno : nenhum
OurSpoos(cArquivo)
Permite a visualização do arquivo de impressao do Protheus (extensão "##R").
cArquivo - nome do arquivo a ser visualizado.
Ex: uso da setprint() para impressão de Código, loja, nome, tipo e data da última
compra do cliente. Opção do usuário escolher a ordem de impressão, em que
dispositivo quer imprimir (disco, tela, e-mail). Opção para gerar arquivo XLS. e abrir
após geração do relatório.
#include "protheus.ch"
User Function XSetPr()
Local cDesc1 := "Este relatório imprimira o cadastro de clientes conforme"
Local cDesc2 := "parâmetros recebidos. Será gerado um arquivo no diretório "
Local cDesc3 := "Spool - CLIENTE_????.XLS, onde ???? e o nome do usuário."
Private cString := "SA1"
Private Tamanho := "M"
Private aReturn := { "Zebrado",2,"Administração",2,2,1,"",1 }
Private wnrel := "CLIENTE"
Private NomeProg := "CLIENTE"
Private nLastKey := 0
Private Limite := 132
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 223
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Private Titulo := "Clientes - ultimas compras "
Private cPerg := "CLIENTE"
Private nTipo := 0
Private cbCont := 0
Private cbTxt := "registro(s) lido(s)"
Private Li := 80
Private m_pag := 1
Private aOrd := {}
// 1 2 3
//123456789012345678901234567890123456789
Private Cabec1 := "CLIENTE LOJA TIPO ULT.COMPRA NOME"
Private Cabec2 := ""
/*
+----------------------
| Parâmetros do aReturn
+----------------------
aReturn - Preenchido pelo SetPrint()
aReturn[1] - Reservado para formulário
aReturn[2] - Reservado para numero de vias
aReturn[3] - Destinatário
aReturn[4] - Formato 1=Paisagem 2=Retrato
aReturn[5] - Mídia 1-Disco 2=Impressora
aReturn[6] – Porta ou arquivo 1-Lpt1... 4-Com1...
aReturn[7] - Expressão do filtro
aReturn[8] - Ordem a ser selecionada
aReturn[9] [10] [n] - Campos a processar se houver
*/
AADD( aOrd, "Cliente" )
AADD( aOrd, "Nome" )
//+-------------------------------------------------------------+
CriaSx1()
//+-------------------------------------------------
//| Disponibiliza para usuário digitar os parâmetros
//+-------------------------------------------------
Pergunte(cPerg,.F.)
//cPerg -> Nome do grupo de perguntas, .T. mostra a tela,.F. somente carrega as
variáveis
//+---------------------------------------------------
//| Solicita ao usuário a parametrização do relatório.
//+---------------------------------------------------
wnrel := SetPrint(cString,wnrel,cPerg,@Titulo,cDesc1,cDesc2,cDesc3,.F.,aOrd,.F.,
Tamanho,.F.,.F.)
//SetPrint(cAlias,cNome,cPerg,cDesc,cCnt1,cCnt2,cCnt3,lDic,aOrd,lCompres,cSize,a
Filter,lFiltro,lCrystal,cNameDrv,lNoAsk,lServer,cPortToPrint)
//+--------------------
//| Se teclar ESC, sair
//+--------------------
If nLastKey == 27
Return
Endif
//+------------------------------------------------------------------
//| Estabelece os padrões para impressão, conforme escolha do usuário
//+------------------------------------------------------------------
SetDefault(aReturn,cString)
//+-------------------------------------
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 225
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
//| Verificar se será reduzido ou normal
//+-------------------------------------
nTipo := IIF(aReturn[4] == 1, 15, 18)
//+--------------------
//| Se teclar ESC, sair
//+--------------------
If nLastKey == 27
Return
Endif
//+-----------------------------------
//| Chama função que processa os dados
//+-----------------------------------
RptStatus({|lEnd| ImpRel(@lEnd) }, Titulo, "Processando e imprimindo
dados,aguarde...", .T. )
Return
If Li <> 80
Roda(cbCont,cbTxt,Tamanho)
Endif
//+----------------------------------------------------------------------
//| Gera arquivo do tipo .DBF com extensão .XLS p/ usuário abrir no Excel
//+----------------------------------------------------------------------
cArqExcel := __RELDIR+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS"
Copy To &cArqExcel
#IFNDEF TOP
dbSelectArea(cAliasImp)
RetIndex(cAliasImp)
Set Filter To
#ELSE
dbSelectArea(cAliasImp)
dbCloseArea()
#ENDIF
If aReturn[5] == 1
Set Printer TO
dbCommitAll()
OurSpool(wnrel)
EndIf
//+------------------------
//| Abrir planilha MS-Excel
//+------------------------
If mv_par07 == 1
CpyS2T( cArqExcel , cPath, .T. )
If ! ApOleClient("MsExcel")
MsgAlert("MsExcel não instalado")
Return
Endif
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 229
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
oExcelApp := MsExcel():New()
oExcelApp:WorkBooks:Open( cPath +
NomeProg+"_"+Substr(cUsuario,7,4)+".XLS" )
oExcelApp:SetVisible(.T.)
Endif
Ms_Flush()
Return
Caso o usuário optar em abrir o Excel, o mesmo será aberto, caso contrário o
mesmo será gravado na pasta de impressão de relatórios.
FUNÇÕES DE VALIDAÇÃO
EXISTCHAV(CALIAS, CCONTEUDO, NINDICE)
NAOVAZIO()
Retorna .T. ou .F. se o conteúdo do campo posicionado no momento não está vazio.
PERTENCE(CSTRING)
Retorna .T. ou .F. se o conteúdo digitado para o campo está contido na string
definida como parâmetro da função.
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 237
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
NEGATIVO()
Retorna .T. ou .F. se o conteúdo digitado para o campo é negativo.
POSITIVO()
Retorna .T. ou .F. se o conteúdo digitado para o campo é positivo.
TEXTO()
Retorna .T. ou .F. se o conteúdo digitado para o campo contém apenas números ou
alfanuméricos.
VAZIO()
Retorna .T. ou .F. se o conteúdo do campo posicionado no momento está vazio.
POSICIONE()
Permite o retorno do conteúdo de um campo de um registro de uma tabela
especificado através de uma chave de busca.
Ex: Aceitar uma data no máximo 90 dias menor que a data do sistema.
#Include "Protheus.ch"
// exemplo para aceitar no maximo uma data 90 dias menor que a data do sistema.
User Function xCtod()
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 238
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Local cData := "31/12/2010"
Local dDtLim := dDatabase - 90
If CtoD(cData) < dDtLim
MsgStop("Data maior que 90 dias. Nao permitido","Teste CtoD")
Else
MsgInfo("Data OK","Teste CtoD" )
Endif
Return
DTOC(DDATA)
Converte uma data em formato data (dd/mm/aaaa) em formato caracter.
dData - campo data contendo a data a ser convertida.
Um campo data sempre tem que ser convertido antes de ser mostrado em tela
ou impresso. Para isso utiliza-se a função Dtoc().
#Include "Protheus.ch"
User Function xDtoC()
MsgInfo(DtoC(dDatabase),"Teste DtoC" )
Return
DTOS(DDATA)
Converte uma data em formato data (dd/mm/aaaa) em formato caracter, porém no
formato "AAAAMMDD"
dData - campo data contendo a data a ser convertida.
#Include "Protheus.ch"
User Function xDtoS()
MsgInfo(DtoS(dDatabase),"Teste DtoS" )
Return
STOD(CDATA)
Converte uma data em formato caracter ("AAAAMMDD") em formato data.
cData - campo caracter contendo a data a ser convertida.
#Include "Protheus.ch"
User Function xStoD()
Local dData := StoD("20110503")
MsgInfo("A data antiga era 20110503, a nova data e " + DtoC(dData),"Teste StoD" )
Return
STR(NVALOR)
Converte um número em um caracter colocando espaços à direita
nValor - número a ser convertido.
Um campo numérico sempre tem que ser convertido antes de ser mostrado em
tela ou impresso.
#Include "Protheus.ch"
User Function xStr()
Local nValor := 100.24
MsgInfo("O valor e " + Str(nValor),"Teste Str" )
Return
STRZERO(NVALOR,NTAMANHO)
Converte um número em um caracter colocando zeros à esquerda com um tamanho
específico.
nValor - número a ser convertido.
nTamanho - tamanho do campo.
#Include "Protheus.ch"
User Function xStrZero()
Local nValor := 90
MsgInfo("O valor e " + StrZero(nValor,6),"Teste StrZero" )
Return
´
VAL(CVALOR)
Converte uma informação em caracter em um valor numérico
#Include "Protheus.ch"
User Function xVal()
Local cValor := "102.32"
Local nValor := Val(cValor) * 2
MsgInfo("O valor e " + Str(nValor),"Teste Val" )
Return
#Include "Protheus.ch"
User Function xAlltrim()
Local cValor := " NFT "
Local cVal2 := Alltrim(cValor)
MsgInfo("O valor inicial e " + cValor + ", o atual e " + cVal2 ,"Teste Alltrim" )
Return
LTRIM(CSTRING)
Retira os espaços à esquerda de uma string.
#Include "Protheus.ch"
User Function xLtrim()
Local cValor := " NFT "
Local cVal2 := Ltrim(cValor)
MsgInfo("O valor inicial e " + cValor + ", o atual e " + cVal2 ,"Teste Ltrim" )
Return
RTRIM(CSTRING)
Retira os espaços à direita de uma string.
#Include "Protheus.ch"
User Function xRtrim()
Local cValor := " NFT "
Local cVal2 := Rtrim(cValor)
MsgInfo("O valor inicial e " + cValor + ", o atual e " + cVal2 ,"Teste Rtrim" )
Return
REPLICATE(CCARACTER,CNUM)
Replica um caracter de acordo com o número especificado no parâmetro
#Include "Protheus.ch"
User Function xReplicate()
Local cVal1 := " NFT "
Local cVal2 := Replicate("*",5)
Local cVal3 := cVal2 + cVal1 + cVal2
MsgInfo( cVal3 ,"Teste Replicate" )
Return
SUBSTR(CSTRING,NPOS1,NCARACTERES)
Retorna parte de uma string de acordo com a posição inicial do parâmetro e a
quantidade de caracteres indicada. Quando omitido o parâmetro de quantidade de
caracteres, é assumido até a posição final da string.
#Include "Protheus.ch"
User Function xSubstr()
Local cString := "NUCLEO DE FORMACAO TECNOLOGICA"
Local cVal2 := Substr(cString,11,8)
MsgInfo( cVal2 ,"Teste Substr" )
Return
TRANSFORM(CEXP,CPICTURE)
Formata campos numéricos, datas, strings com pictures específicadas.
#Include "Protheus.ch"
User Function xTransform()
Local nValor := 1250.67
MsgInfo( Transform(nValor,"@E 9,999.99") ,"Teste Transform" )
Return
AT(CCARACTER, CSTRING)
Verifica se um caracter existe em uma string, se exitir retorna a posição do mesmo,
do contrário retorna zero.
cCaracter - caracter a ser procurado
cString - string na qual o caracter será procurado
#Include "Protheus.ch"
User Function xAt()
Local cValor := "NUCLEO DE FORMACAO TECNOLOGICA"
Local nAt := At("F",cValor)
MsgInfo("A posicao e " + Str(nAt),"Teste AT" )
Return
LEN(CSTRING)
Retorna o tamanho da string.
#Include "Protheus.ch"
User Function xLen()
Local cValor := "NUCLEO DE FORMACAO TECNOLOGICA"
Local nLen := Len(cValor)
MsgInfo("O tamanho e " + Alltrim(Str(nLen)),"Teste LEN" )
Return
INT(NVALOR)
Retorna o valor inteiro de um número
#Include "Protheus.ch"
User Function xInt()
Local nValor := int(12.44)
MsgInfo( "O inteiro e " + alltrim(STR(nValor)) ,"Teste Int" )
Return
NOROUND(NVALOR, NCASAS)
Retorna o valor truncando as casas decimais de acordo com o número de casas
decimais definida no parâmetro
#Include "Protheus.ch"
User Function xNoround()
Local nValor := NoRound(12.4489,2)
MsgInfo( "O valor truncado em duas casas e " + alltrim(STR(nValor)) ,"Teste
Noround" )
Return
ROUND(NVALOR, NCASAS)
Retorna o valor arredondando as casas decimais de acordo com o número de casas
decimais definida no parâmetro
#Include "Protheus.ch"
User Function xRound()
Local nValor := Round(12.4489,2)
MsgInfo( "O valor arredondado em duas casas e " + alltrim(STR(nValor)) ,"Teste
Round" )
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 254
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Return
DAY(DDATA)
Retorna o dia de uma data
#Include "Protheus.ch"
User Function xDay()
Local nValor := Day( dDatabase)
MsgInfo( "O dia e " + alltrim(STR(nValor)) ,"Teste Day" )
Return
MONTH(DDATA)
Retorna o mês de uma data
#Include "Protheus.ch"
User Function xMonth()
Local nValor := Month( dDatabase)
MsgInfo( "O mes e " + alltrim(STR(nValor)) ,"Teste Month" )
Return
#Include "Protheus.ch"
User Function xYear()
Local nValor := Year( dDatabase)
MsgInfo( "O ano e " + alltrim(STR(nValor)) ,"Teste Year" )
Return
TIME()
Retorna a hora atual no formato HH:MM:SS
#Include "Protheus.ch"
User Function xTime()
Local cValor := Time()
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 257
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
MsgInfo( "A hora e " + cValor ,"Teste Time" )
Return
ELAPTIME(CHORA1,CHORA2)
Retorna a diferença entre duas horas no formato HH:MM:SS
#Include "Protheus.ch"
User Function xElapTime()
Local cValor1 := "14:32:20"
Local cValor2 := "18:45:39"
Local cValor3 := ElapTime(cValor1,cValor2)
MsgInfo( "O tempo passado entre " + cValor1 + " e " + cValor2 + " = " + cValor3
,"Teste Time" )
Return
BOF()
Determina se o o começo do arquivo foi encontrado . Ocorre quando tenta-se mover
o ponteiro do registro antes do início do arquivo.
#include "rwmake.ch"
User Function xBof()()
DbSelectArea("SB1")
Return
EOF()
Determina se o o fim do arquivo foi encontrado . Ocorre quando o tenta-se mover o
ponteiro do registro após o final do arquivo.
#include "rwmake.ch"
User Function xEof()()
DbSelectArea("SB1")
DbGoBottom() // Posiciona no ultimo registro
DbSkip() // posiciona o ponteiro do registro no proximo registro.
If Eof()
MsgInfo("Cadastro de produtos esta no fim", "Teste Eof()")
Endif
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 260
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Return
DBCLOSEAREA()
Fecha a área corrente e libera todos os "lock´s" e gravações pendentes.
Ex. Vide exemplo da SetPrint()
DbSelectArea(nArea ou cArea)
Seleciona a área especificada como sendo a área ativa. Todas as operações
subseqüentes serão referentes a área selecionada a não ser que se referencie a
outra área.
nArea - número do índice da área
cArea - nome do arquivo
Ex. Selecionar o cadastro de clientes
DbSelectArea("SA1")
DBGOTOP()
Posiciona o arquivo no primeiro registro.
#include "rwmake.ch"
User Function xDbGoTop()
DbSelectArea("SA1")
DbGoTop()
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 261
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
MsgInfo("Primeiro cliente: " + SA1->A1_COD ,"Teste DbGoTop()")
Return
DBGOBOTTON()
Posiciona o arquivo no último registro.
Ex. Selecionar o cadastro de clientes e posicionar no último registro
#include "rwmake.ch"
User Function xDbGoBottom()
DbSelectArea("SA1")
DbGoBottom()
MsgInfo("Ultimo cliente: " + SA1->A1_COD ,"Teste DbGoBottom()")
Return
DBSETORDER(NORDEM)
Seleciona o índice que será utilizado pela área ativa.
nOrdem - número do índice a ser utilizado
Ex. Selecionar o índice 3 do cadastro de clientes
DbSelectArea("SA1")
DbSetOrder(3)
DBORDERNICKNAME(NICKNAME)
Define o indice de usuário a ser utilizado para a tabela.
Nickname - Nome do arquivo índice customizado
DBSEEK(CCHAVE,LSOFT,LLAST)
Posiciona o cursor no registro da área ativa,conforme a chave de busca.
cChave - dado do registro que se deseja localizar de acordo com a chave de busca
indicada pelo comando DbSetOrder().
LSoft - indica se o cursor deve ser posicionado no final próximo registro ou no final
do arquivo caso o registro não seja encontrado. Padrão .F. (posiciona em final de
arquivo caso não encontre)
lLast - define se o cursor se posicionará no primeiro ou último registro quando
existirem intervalos com as mesmas informações. Padrão .F. (posiciona no primeiro)
Retorno: .T. quando encontra o registro ou .F., caso não encontre o registro.
MSSEEK(CCHAVE,LSOFT,LLAST)
Função idêntica ao DbSeek, porém foi desenvolvida pela Microsiga. Essa função
mantém em memória os dados necessários para reposicionar os registros já
localizados pelo DbSeek() de forma que a aplicação não necessita executar
novamente a busca. É mais rápida que o DbSeek().
DBSETFILTER(BCONDIÇÃO,CCONDIÇÃO)
Cria um filtro para a área de trabalho ativa. Pode ser utilizado um bloco de código ou
uma condição simples.
bCondição - bloco de código contendo a expressão do filtro
cCondição - string simples contendo a expressão do filtro
Ex. Criar filtro no cadastro de clientes para códigos entre '00001' e '00010', usando
bloco de código.
Local bCondicao := { || A1_COD >= '00001' .AND. A1_COD <= '000010' }
DbSelectArea("SA1")
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 265
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
DbSetOrder(1)
DbSetFilter(bCondicao)
DbGoBotton()
MsgInfo("Codigo do cliente","Codigo") // deve mostrar um codigo menor igual a
'000010'
Ex. Criar filtro no cadastro de clientes para códigos entre '00001' e '00010', usando
condição simples..
Local cCondicao := "A1_COD >= '00001' .AND. A1_COD <= '000010' "
DbSelectArea("SA1")
DbSetOrder(1)
DbSetFilter(,cCondicao)
DbGoBotton()
MsgInfo("Codigo do cliente","Codigo") // deve mostrar um codigo menor igual a
'000010'
DbClearFilter()
Salva as atualizações na tabela corrente e limpa todas as condições do filtro da área
corrente.
Ex. Criar filtro no cadastro de clientes para códigos entre '00001' e '00010', usando
condição simples..
Local cCondicao := "A1_COD >= '00001' .AND. A1_COD <= '000010' "
DbSelectArea("SA1")
DbSetOrder(1)
DbSetFilter(,cCondicao)
DbGoBotton()
MsgInfo("Codigo do cliente","Codigo") // deve mostrar um codigo menor igual a
'000010'
DbClearFilter()
Select([cAlias])
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 266
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Retorna o número da área de trabalho de um alias.
cAlias - nome do alias o qual deseja saber o número da área. Quando não
especificado é utilizado o alias da área corrente. Quando o alias existe é retornado o
número da área, caso contrário é retornado zero.
RECLOCK(CALIAS,LINCLUI)
Trava o registro da área especificada, permitindo a inclusão, alteração o exclusão do
registro.
cAlias - nome do arquivo a ser travado
lInclui - .T. trava o registro e inclui um novo registro em branco. Utilizado para
inclusão
.F. trava o registro corrente para alteração ou exclusão.
MSUNLOCK()
Destrava o registro corrente e efetiva todas as atualizações efetuadas.
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 267
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
DBDELETE()
Marca o registro corrente como apagado logicamente. Para sua utilização o registro
deve estar travado com o Reclock() e depois deve ser destravado com o
MsUnlock().
Ex. Excluir o cliente "000003"
#include "rwmake.ch"
User Function xDbdel()
Local cCliente := "000003"
DbSelectArea("SA1")
DbSetOrder(1)
If MsSeek(XFilial("SA1") + cCliente)
Reclock("SA1",.F.)
DbDelete()
MsgInfo("Cliente excluido !","Teste DbDelete()")
MsUnlock()
Endif
Return
DELETED()
Retorna o status de exclusão do registro atual.
Retorno = .T. - o registro está marcado para exclusão ou .F., o registro não está
marcado para exclusão.
#include "rwmake.ch"
User Function xDeleted()
DbSelectArea("SA1")
DbGoTop()
Set Delete Off // tira o filtro de registros deletados (mostra)
Do While ! SA1->(Eof())
If Deleted()
MsgInfo("Cliente " + SA1->A1_COD + " excluido!","Teste DbDelete()")
Endif
SA1->(DbSkip())
Enddo
Set Delete On // filtra os registros deletados (nao mostra)
Return
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 269
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
DBSKIP(NREGISTROS)
Move o cursor para o próximo registro ou anterior, de acordo com o parâmetro
informado e com o índice ativo.
nRegistros - quantidade de registros a serem deslocados.
#include "rwmake.ch"
User Function xDbSkip()
DbSelectArea("SA1")
DbGoTop()
MsgInfo("O Primeiro codigo e : " + SA1->A1_COD , "Teste DbSkip")
Dbskip(2)
MsgInfo("Apos DbSkip(2) o codigo e : " + SA1->A1_COD , "Teste DbSkip")
DbSkip(-1)
MsgInfo("Apos DbSkip(-1) o codigo e : " + SA1->A1_COD , "Teste DbSkip")
DbSkip(-1)
MsgInfo("Apos DbSkip(-1) o codigo e : " + SA1->A1_COD , "Teste DbSkip")
Return
RECNO()
Retorna a posição do registro onde o ponteiro está selecionado.
DBGOTO(NREG)
Posiciona o ponteiro em um registro especificado.
nReg - número do registro a ser posicionado.
Ex. Guardar a posição atual do cadastro de clientes e depois retorná-la após uma
pesquisa.
MENSAGENS
MSG ALERT(CMENSAGEM,CTITULO)
Exibe um alerta para o usuário com a mensagem e o título dos parâmetros enviados.
MSGSTOP(CMENSAGEM,CTITULO)
Exibe informação para o usuário com a mensagem e o título dos parâmetros
enviados.
MSGYESNO(CMENSAGEM,CTITULO)
Exibe informação para o usuário com a mensagem e o título dos parâmetros
enviados com opção do usuário escolher as opções "Sim" ou "Não".
PROCESSA(BACAO,BMSG)
Regua de progresso de processamento que contém apenas uma régua indicativa.
bAcao - bloco de código contendo o que deve ser executado.
cMsg - mensagem da régua de progressso
SETPROC(NMAX)
Funçao utilizada em conjunto com a processa e serve para definir o tamanho
máximo da barra de progresso.
cMsg - mensagem da régua de progressso
INCPROC(CMSG)
Funçao utilizada em conjunto com a processa e serve para incrementar a barra de
progresso.
cMsg - mensagem da régua de progressso
RPTSTATUS(BACAO,BMSG)
Regua de progresso de processamento que contém apenas uma régua indicativa
utilizada nas rotinas de relatórios que utilizam a função setprint().
bAcao - bloco de código contendo o que deve ser executado.
cMsg - mensagem da régua de progressso
INCREGUA(CMSG)
Funçao utilizada em conjunto com a processa e serve para incrementar a barra de
progresso.
cMsg - mensagem da régua de progressso
#include "protheus.ch"
User Function XSetRegua()
Local cDesc1 := "Este relatório imprimira o cadastro de clientes conforme"
Local cDesc2 := "parâmetros recebidos. Será gerado um arquivo no diretório "
Local cDesc3 := "Spool - CLIENTE_????.XLS, onde ???? e o nome do usuário."
Private cString := "SA1"
Private Tamanho := "M"
Private aReturn := { "Zebrado",2,"Administração",2,2,1,"",1 }
Private wnrel := "CLIENTE"
Private NomeProg := "CLIENTE"
Private nLastKey := 0
Private Limite := 132
Private Titulo := "Clientes - ultimas compras "
Private cPerg := "CLIENTE"
Private nTipo := 0
Private cbCont := 0
Private cbTxt := "registro(s) lido(s)"
Private Li := 80
Private m_pag := 1
Private aOrd := {}
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 279
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Private nMax := 0
// 1 2 3
//123456789012345678901234567890123456789
Private Cabec1 := "CLIENTE LOJA TIPO ULT.COMPRA NOME"
Private Cabec2 := ""
/*
+----------------------
| Parâmetros do aReturn
+----------------------
aReturn - Preenchido pelo SetPrint()
aReturn[1] - Reservado para formulário
aReturn[2] - Reservado para numero de vias
aReturn[3] - Destinatário
aReturn[4] - Formato 1=Paisagem 2=Retrato
aReturn[5] - Mídia 1-Disco 2=Impressora
aReturn[6] – Porta ou arquivo 1-Lpt1... 4-Com1...
aReturn[7] - Expressão do filtro
aReturn[8] - Ordem a ser selecionada
aReturn[9] [10] [n] - Campos a processar se houver
*/
AADD( aOrd, "Cliente" )
AADD( aOrd, "Nome" )
#IFNDEF TOP
dbSelectArea(cAliasImp)
RetIndex(cAliasImp)
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 284
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Set Filter To
#ELSE
dbSelectArea(cAliasImp)
dbCloseArea()
#ENDIF
If aReturn[5] == 1
Set Printer TO
dbCommitAll()
OurSpool(wnrel)
EndIf
Ms_Flush()
Return
CAPÍTULO 1
Exercício 1:
Respostas:
Programa: é onde são escritas todas as instruções, comandos e funções para
montar uma rotina, relatório, consulta, job´s etc.
Remote: É o aplicativo do Protheus que será utilizado pelo usuário para utilizar o
sistema. O remote requisita o APO ao server, o server carrega o APO do RPO,
executa e devolve o resultado ao remote.
CAPÍTULO 3
Exercício 1:
Respostas:
A:= 5 > 3
A) correto
Exercício 2:
Respostas:
a= "Jonas,1" - Alfanumérica
b= 120 - numérica
c=.T. - lógica
d={1,2} – array
CAPÍTULO 4
Exercício 1:
Respostas:
A:= 2 * 5
Resposta A = 10
C:= A < 2
Resposta .F. ( A = 10, 10 < 2)
D:= 13 % 2
Resposta D =1
E:= A++ / 2
Resposta E = 5 , (A=10 , 10 / 2, atribui depois)
F:= ++A - 1
Resposta F = 10, ( A=10 , (10+1) - 1)
CAPÍTULO 6
Exercício 1
Resposta : A principal vantagem é não ter que digitar o mesmo registro para
todas as filiais.
Exercício 2
Resposta: Não pode existir tabela sem o campo filial, pois o mesmo é chave
para identificar de qual filial pertence o registro.
CAPÍTULO 7
Exercício 1
Resposta:
1) Acesse Senhas - Usuários
CAPÍTULO 8
Exercício 1
Resposta:
#include "rwmake.ch"
User Function XCadZZ1()
Local cAlias := "ZZ1"
Local cTitulo := "Cadastro de Clientes"
Local cVldExc := ".T."
Local cVldAlt := ".T."
DbSelectArea(cAlias)
DbSetOrder(1)
AxCadastro(cAlias,cTitulo,cVldExc,cVldAlt)
Return
Return lRet
Exercício 2
Resposta: A diferença entre a função Modelo 2 e a Modelo3 é que a Modelo
2 é utilizada para ,anipulação de dados que tratam estrutura de cabeçalho e
itens na mesma tabela e a Modelo 3 é utilizada para manipulação de dados
que tratam estrutura de cabeçalho e itens em tabelas diferentes.
Exercício 3
Resposta:
#INCLUDE "protheus.ch"
User Function XEx3Cap6()
Local cFiltra := "ZZ2_FILIAL == '"+xFilial('ZZ2')+"' .And. ZZ2_MOEDA == 1"
Local aCores := {}
Private cCadastro := "Exercicio 3 - Cap 6"
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 296
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Private aRotina := {}
Private cDelFunc := ".T."
Private cAlias := "ZZ2"
Private aIndexZZ2 := {}
Private bFiltraBrw:= { || FilBrowse(cAlias,@aIndexZZ2,@cFiltra) }
Private bCampo := {|nCPO| Field(nCPO) }
AADD(aRotina,{ "Pesquisa","AxPesqui" ,0,1})
AADD(aRotina,{ "Visual" ,"U_MNTZZ2" ,0,2})
AADD(aRotina,{ "Inclui" ,"U_MNTZZ2" ,0,3})
AADD(aRotina,{ "Altera" ,"U_MNTZZ2" ,0,4})
AADD(aRotina,{ "Exclui" ,"U_MNTZZ2" ,0,5})
AADD(aRotina,{ "Legenda","BLegenda" ,0,3})
dbSelectArea(cAlias)
dbSetOrder(1)
Eval(bFiltraBrw)
DbGoTop()
mBrowse( 6,1,22,75,cAlias)
EndFilBrw(cAlias,aIndexZZ2)
Return
aCols[Len(aCols),nX]:=FieldGet(FieldPos(aHeader[nX,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
If Len(aCols)>0
// Executa a Modelo 3
aCposE := {"ZZ2_NUM","ZZ2_CLIENTE"}
lRetMod3 := Modelo3(cTitulo, cAliasE, cAliasG, aCposE, cLinOk,
cTudOk,nOpcE, nOpcG,cFieldOk)
If lRetMod3
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 299
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
CAPÍTULO 9
Exercício 1
Resposta:
#include "protheus.ch"
User Function XEx1Cap7()
Local cDesc1 := "Este relatório imprimira os pedidos de venda conforme"
Local cDesc2 := "parâmetros recebidos. "
Local cDesc3 := ""
Private cString := "SC5"
Private Tamanho := "G"
Private aReturn := { "Zebrado",2,"Administração",2,2,1,"",1 }
Private wnrel := "PEDVEN"
Private NomeProg := "PEDVEN"
Private nLastKey := 0
Private Limite := 132
Private Titulo := "Saldos de Pedido de Vendas "
Private cPerg := "xPedVen"
Private nTipo := 0
Private cbCont := 0
Private cbTxt := "registro(s) lido(s)"
Private Li := 80
Private m_pag := 1
Private aOrd := {}
// 1 2 3 4 5 6 7 8 9
10
//1234567890123456789012345678901234567890123456789012345678901
234567890123456789012345678901234567890123456789
Private Cabec1 := "PEDIDO EMISSAO CLIENTE C.PAGTO PRODUTO
QTDE PED. QTDE ENTREGUE SALDO P.UNIT P.TOTAL"
// 99/99/99 9999.999,99 9999.999,99
9999.999,99 999.999.999,99 999.999.999,99
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 302
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Private Cabec2 := ""
/*
+----------------------
| Parâmetros do aReturn
+----------------------
aReturn - Preenchido pelo SetPrint()
aReturn[1] - Reservado para formulário
aReturn[2] - Reservado para numero de vias
aReturn[3] - Destinatário
aReturn[4] - Formato 1=Paisagem 2=Retrato
aReturn[5] - Mídia 1-Disco 2=Impressora
aReturn[6] – Porta ou arquivo 1-Lpt1... 4-Com1...
aReturn[7] - Expressão do filtro
aReturn[8] - Ordem a ser selecionada
aReturn[9] [10] [n] - Campos a processar se houver
*/
AADD( aOrd, "Pedido" )
AADD( aOrd, "Emissao" )
AADD( aOrd, "Cliente" )
//+-------------------------------------------------------------+
CriaSx1()
//+-------------------------------------------------
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 303
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
//| Disponibiliza para usuário digitar os parâmetros
//+-------------------------------------------------
Pergunte(cPerg,.F.)
//cPerg -> Nome do grupo de perguntas, .T. mostra a tela,.F. somente
carrega as variáveis
//+---------------------------------------------------
//| Solicita ao usuário a parametrização do relatório.
//+---------------------------------------------------
wnrel :=
SetPrint(cString,wnrel,cPerg,@Titulo,cDesc1,cDesc2,cDesc3,.F.,aOrd,.F.,
Tamanho,.F.,.F.)
//SetPrint(cAlias,cNome,cPerg,cDesc,cCnt1,cCnt2,cCnt3,lDic,aOrd,lCompres,
cSize,aFilter,lFiltro,lCrystal,cNameDrv,lNoAsk,lServer,cPortToPrint)
//+--------------------
//| Se teclar ESC, sair
//+--------------------
If nLastKey == 27
Return
Endif
//+------------------------------------------------------------------
//| Estabelece os padrões para impressão, conforme escolha do usuário
//+------------------------------------------------------------------
SetDefault(aReturn,cString)
//+-------------------------------------
//| Verificar se será reduzido ou normal
//+-------------------------------------
nTipo := IIF(aReturn[4] == 1, 15, 18)
//+--------------------
//| Se teclar ESC, sair
//+--------------------
If nLastKey == 27
Return
Endif
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 304
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
//+-----------------------------------
//| Chama função que processa os dados
//+-----------------------------------
RptStatus({|lEnd| ImpRel(@lEnd) }, Titulo, "Processando e imprimindo
dados,aguarde...", .T. )
Return
cAliasImp := GetNextAlias()
cQuery := "SELECT "
cQuery += "C5_FILIAL, C5_NUM, C5_CLIENTE , C5_CONDPAG,
C5_EMISSAO, C6_PRODUTO, C6_QTDVEN, C6_PRCVEN, C6_VALOR,
C6_QTDENT "
cQuery += "FROM "+RetSqlName("SC5")+" SC5, " +
RetSqlName("SC6") + " SC6 "
cQuery += "WHERE C5_FILIAL = '"+xFilial("SC5")+"' "
cQuery += "AND C5_NUM >= '"+mv_par01+"' "
cQuery += "AND C5_NUM <= '"+mv_par02+"' "
cQuery += "AND C5_CLIENTE >= '"+mv_par03+"' "
cQuery += "AND C5_CLIENTE <= '"+mv_par04+"' "
cQuery += "AND C5_EMISSAO >= '"+Dtos(mv_par05)+"' "
cQuery += "AND C5_EMISSAO <= '"+Dtos(mv_par06)+"' "
cQuery += "AND SC5.D_E_L_E_T_ = '' "
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 305
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
cQuery += "AND SC6.D_E_L_E_T_ = '' "
cQuery += "AND SC5.C5_NUM = SC6.C6_NUM "
cQuery += "AND SC6.C6_FILIAL = '"+xFilial("SC6")+"' "
IF MV_PAR07 = 2 // NAO IMPRIMIR SALDO ZERADO
cQuery += " AND C6_QTDVEN > C6_QTDENT "
ENDIF
cQuery += "ORDER BY "
If aReturn[8] == 1 //PEDIDO
cQuery += "C5_NUM"
Elseif aReturn[8] == 2 //EMISSAO
cQuery += "C5_EMISSAO"
Else
cQuery += "C5_CLIENTE"
Endif
dbUseArea( .T., "TOPCONN", TcGenQry(,,cQuery), cAliasImp, .T., .F.
)
dbSelectArea(cAliasImp)
dbGoTop()
SetRegua(0)
// IMPRESSAO
AADD( aCol, 001 ) //PEDIDO
AADD( aCol, 008 ) //EMISSAO
AADD( aCol, 017 ) //CLIENTE
AADD( aCol, 026 ) // CONDICAO PAGAMENTO
AADD( aCol, 034 ) //PRODUTO
AADD( aCol, 051 ) //QTDE PEDIDA
AADD( aCol, 063 ) //QTDE ENTREGUE
AADD( aCol, 077 ) //SALDO
AADD( aCol, 089 ) //PRECO UNITARIO
AADD( aCol, 104 ) //PRECO TOTAL
cPed := "#$%%%"
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 306
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
While !Eof() .And. !lEnd
If Li > 55
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
Endif
If cPed <> (cAliasImp)->C5_NUM
@ Li, aCol[1] PSay (cAliasImp)->C5_NUM
@ Li, aCol[2] PSay right((cAliasImp)->C5_EMISSAO,2) + '/' +
SUBSTR((cAliasImp)->C5_NUM,5,2) + '/' + SUBSTR((cAliasImp)-
>C5_NUM,2,2)
@ Li, aCol[3] PSay (cAliasImp)->C5_CLIENTE
@ Li, aCol[4] PSay (cAliasImp)->C5_CONDPAG
cPed := (cAliasImp)->C5_NUM
ENDIF
@ Li, aCol[5] PSay (cAliasImp)->C6_PRODUTO
@ Li, aCol[6] PSay TRANSFORM((cAliasImp)->C6_QTDVEN,"@E
9999,999.99")
@ Li, aCol[7] PSay TRANSFORM((cAliasImp)->C6_QTDENT,"@E
9999,999.99")
@ Li, aCol[8] PSay TRANSFORM((cAliasImp)->C6_QTDVEN -
(cAliasImp)->C6_QTDENT,"@E 9999,999.99")
@ Li, aCol[9] PSay TRANSFORM((cAliasImp)->C6_PRCVEN,"@E
999,999,999.99")
@ Li, aCol[10] PSay TRANSFORM((cAliasImp)->C6_VALOR,"@E
999,999,999.99")
Li ++
(cAliasImp)->(DBSKIP())
End
If lEnd
@ Li, aCol[1] PSay cCancel
Return
Endif
If Li <> 80
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 307
ADVPL I
Versão 1.0 25/07/2011 – Todos direitos reservados
Roda(cbCont,cbTxt,Tamanho)
Endif
#IFNDEF TOP
dbSelectArea(cAliasImp)
RetIndex(cAliasImp)
Set Filter To
#ELSE
dbSelectArea(cAliasImp)
dbCloseArea()
#ENDIF
If aReturn[5] == 1
Set Printer TO
dbCommitAll()
OurSpool(wnrel)
EndIf
Ms_Flush()
Return