Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
________________________________________________
PROGRAMAÇÃO ADVPL OOP
Índice
______________________________________________________________________________________________________________
Prefácio .........................................................................................................8
O Que é Fazer um Programa com Inteligência................................................................... 8
Programando Simples, mas Certo ...................................................................................... 9
Erros que Podem ser Evitados .......................................................................................... 10
A Importância de Programas Documentados ................................................................... 10
Cabeçalho de Programa / Função ..................................................................................... 11
Padrão de Desenvolvimento – ORGANON TI Campinas.....................12
Nomenclatura de Variáveis .............................................................................................. 12
Índices............................................................................................................................... 12
Operadores Básicos ...................................................................................13
Criação de Variáveis..................................................................................13
A Declaração .................................................................................................................... 14
O Tipo de Variável ........................................................................................................... 14
Tipos Existentes................................................................................................................ 14
Public ............................................................................................................................ 14
Private........................................................................................................................... 14
Local ............................................................................................................................. 14
Static ............................................................................................................................. 15
Inicialização...................................................................................................................... 15
Padronização de Variáveis ............................................................................................... 15
Criando uma Variável Utilizando a Função CRIAVAR() ............................................... 15
Declarando e utilizando vetores e matrizes ...................................................................... 16
Utilizando Estruturas de Controle ..........................................................17
While... ............................................................................................................................. 17
For..................................................................................................................................... 17
If… ................................................................................................................................... 18
If ().................................................................................................................................... 18
Do Case ............................................................................................................................ 18
Problemas com Looping de Programas ............................................................................ 19
Comandos definidos pelo usuário (UDC’s).............................................20
Uso de Strings................................................................................................................... 21
Funções para Manipulação de Mensagens ..............................................22
MsAlert............................................................................................................................. 22
MsgStop............................................................................................................................ 22
MsgInfo ............................................................................................................................ 22
MsgBox ............................................................................................................................ 23
MsgYesNo ........................................................................................................................ 23
Funções para Manipulação de Strings.....................................................24
SubStr ............................................................................................................................... 24
Len .................................................................................................................................... 24
Trim .................................................................................................................................. 24
LTrim................................................................................................................................ 24
AllTrim ............................................................................................................................. 24
Val .................................................................................................................................... 24
DtoC ................................................................................................................................. 25
Oficina AdvPl Object Página: 1
organon TI Consultoria e Treinamento
Capital............................................................................................................................... 25
Funções para Manipulação de Datas.......................................................25
CtoD ................................................................................................................................. 25
Day ................................................................................................................................... 25
Month ............................................................................................................................... 25
Year .................................................................................................................................. 25
DOW................................................................................................................................. 26
Funções para Manipulação de Números..................................................26
Int...................................................................................................................................... 26
Str ..................................................................................................................................... 26
StrZero .............................................................................................................................. 26
Round ............................................................................................................................... 26
Funções Básicas para Criação de Telas...................................................27
@...To...Dialog ................................................................................................................. 27
Activate Dialog................................................................................................................. 27
@ ...TO ............................................................................................................................. 27
@... GET........................................................................................................................... 28
@... SAY .......................................................................................................................... 28
@...Button......................................................................................................................... 28
@...BmpButton................................................................................................................. 29
@...CheckBox...Var.......................................................................................................... 29
@...ComboBox...Itens...Size ............................................................................................ 29
@...Radio .......................................................................................................................... 30
@... Bitmap... Size............................................................................................................ 30
@..To...MultiLine............................................................................................................. 30
Enchoicebar ...................................................................................................................... 31
AxCadastro ....................................................................................................................... 31
MarkBrowse ..................................................................................................................... 32
MBrowse .......................................................................................................................... 32
Modelo2............................................................................................................................ 33
Modelo3............................................................................................................................ 34
Funções para Manipulação de Réguas de Processamento.....................34
Processa ............................................................................................................................ 34
ProcRegua......................................................................................................................... 34
IncProc.............................................................................................................................. 35
RptStatus........................................................................................................................... 35
SetRegua........................................................................................................................... 35
IncRegua........................................................................................................................... 36
Funções para Criação de Relatórios Padronizados ...............................36
Variáveis de Relatórios..................................................................................................... 36
Cabec ................................................................................................................................ 37
PSay.................................................................................................................................. 38
SetPrint ............................................................................................................................. 38
SetDefault ......................................................................................................................... 38
Funções para Tratamento de Usuários do Sistema................................39
AllUsers ............................................................................................................................ 39
AllGroups ......................................................................................................................... 40
Oficina AdvPl Object Página: 2
organon TI Consultoria e Treinamento
PswAdmin ........................................................................................................................ 41
PswID ............................................................................................................................... 41
PswName .......................................................................................................................... 42
PswSeek............................................................................................................................ 42
PswOrder .......................................................................................................................... 42
PswRet ........................................................................................................42
Funções Genéricas do ADVPL ..................................................................43
Aleatorio ........................................................................................................................... 43
CGC .................................................................................................................................. 43
Condicao........................................................................................................................... 44
ConvMoeda ...................................................................................................................... 44
DataValida ........................................................................................................................ 45
Digito11 ............................................................................................................................ 45
EANDigito........................................................................................................................ 45
Entre ................................................................................................................................. 46
Extenso ............................................................................................................................. 46
Formula............................................................................................................................. 46
GetArea............................................................................................................................. 47
GetMV .............................................................................................................................. 47
Help .................................................................................................................................. 47
LetterOrNum .................................................................................................................... 48
MesExtenso ...................................................................................................................... 48
NaoVazio .......................................................................................................................... 48
Negativo ........................................................................................................................... 49
Pergunte ............................................................................................................................ 49
Pertence ............................................................................................................................ 49
PesqPict ............................................................................................................................ 50
PesqPictQt ........................................................................................................................ 50
Positivo ............................................................................................................................. 50
RestArea ........................................................................................................................... 51
Tabela ............................................................................................................................... 51
Variação............................................................................................................................ 51
Vazio................................................................................................................................. 51
XFilial............................................................................................................................... 52
Funções para Tratamento de Bases de Dados.........................................52
AbreExcl........................................................................................................................... 52
Contar ............................................................................................................................... 53
CriaTrab............................................................................................................................ 53
DbSelectArea.................................................................................................................... 54
DbSetOrder....................................................................................................................... 54
DbSeek ............................................................................................................................. 54
DbSkip .............................................................................................................................. 55
RecLock............................................................................................................................ 55
MSUnlock......................................................................................................................... 55
ExistChav ......................................................................................................................... 55
ExistCpo ........................................................................................................................... 56
ExistIni ............................................................................................................................. 56
IndRegua........................................................................................................................... 57
Posicione........................................................................................................................... 57
RetIndex ........................................................................................................................... 57
Tabela ............................................................................................................................... 58
TamSX3............................................................................................................................ 58
Índices............................................................................................................................... 58
Criando e Deletando Arquivos de Índice (Temporários.) ............................................... 59
Utilizando Querys no lugar de índices temporários ......................................................... 59
Cuidados com Posicionamento de Registros.................................................................... 59
Conceito de Filial e Compartilhamento de Arquivos ....................................................... 61
Arquivos Compartilhados............................................................................................. 61
Arquivos Exclusivos..................................................................................................... 61
Técnicas para Filtragem.................................................................................................... 62
Chaves Primárias .............................................................................................................. 62
Chaves Estrangeiras.......................................................................................................... 62
Integridade Referencial..................................................................................................... 62
Funções para Tratamento do Módulo de Contabilidade .......................63
CalcSaldo.......................................................................................................................... 63
Credito .............................................................................................................................. 64
Debito ............................................................................................................................... 64
MovimCC ......................................................................................................................... 64
Movimento ....................................................................................................................... 64
Orcado .............................................................................................................................. 65
OrcadoCC ......................................................................................................................... 65
Periodo.............................................................................................................................. 65
Saldo ................................................................................................................................. 66
SaldoCC............................................................................................................................ 66
SaldoCusto........................................................................................................................ 66
SomaSaldo ........................................................................................................................ 67
SumMovimCC.................................................................................................................. 67
SomaContas ...................................................................................................................... 67
Funções para Tratamento do Módulo de Estoque/Custos.....................68
CalcEst.............................................................................................................................. 68
Estrut................................................................................................................................. 68
SaldoSB2 .......................................................................................................................... 68
Funções do Módulo Financeiro.................................................................69
FuncaMoeda ..................................................................................................................... 69
Media ................................................................................................................................ 69
RecMoeda......................................................................................................................... 69
SldBco .............................................................................................................................. 70
SldCliente ......................................................................................................................... 70
SldFornece ........................................................................................................................ 70
SldPagar............................................................................................................................ 70
SldReceber........................................................................................................................ 71
XMoeda ............................................................................................................................ 71
Pontos de Entrada......................................................................................71
Objetivo dos Pontos de Entrada ....................................................................................... 71
Prefácio
Para muitos profissionais de desenvolvimento, entrar ou se aprimorar no
desenvolvimento de rotinas ADVPL é garantia de galgar melhores oportunidades
profissionais.
De acordo com essa definição, se pretendemos utilizar nosso bem mais precioso
em nosso trabalho, vamos precisar desenvolver alguns hábitos:
Ao realizar os testes, defina critérios. Antes de começar defina onde quer chegar.
Não basta consistir suas alterações. O fato de suas alterações estarem funcionando
como previstas não garante a não existência de erros.
Não limite-se a testar sua alteração na base que você utilizou durante o
desenvolvimento, pois você criou o ambiente perfeito para que o programa
funcione.
• Salve a ordem e a área e o registro do arquivo que será utilizado para que
no final do processo se recupere estes valores;
Documentar bem, não significa que tenhamos que escrever dezenas de linhas de
comentários a cada linha de código. Significa que os comentários têm passar
alguma informação relevante. Vemos comentários assim: “compara A com B” e só.
Isso é óbvio, a leitura do código já nos diz isso. A documentação deve se ater a
conceitos, por exemplo: “Se A for maior que B, o arquivo de saldos será atualizado,
caso contrário o registro será rejeitado para que o saldo não fique negativo.”. Isto
sim transmite alguma informação.
Também se pode utilizar desse recurso para fazer lembretes a fatos importantes
que, se forem deixados de lado, podem comprometer o funcionamento das rotinas.
Por exemplo: “Ao acionar esta função, o arquivo XXX DEVE estar posicionado no
índice 1”.
Enfim, como foi dito, não é preciso escrever um livro a cada programa, basta ser
objetivo e se colocar na posição de quem não conhece o programa tão pouco o
assunto. Algum dia você mesmo poderá estar nessa posição.
Lembre-se que um bom livro começa com um bom prefácio, e um bom programa
começa com um cabeçalho útil e legível.
Nomenclatura de Variáveis
O nome das variáveis deve ter sempre no seu início o caracter “_” (underline).
Além disso, deve-se ter um caracter que identifique se essa variável é do tipo
caracter, numérica, data ou lógica. Sugerimos a letra “C” para referenciar uma
variável do tipo caracter, “N” uma variável do tipo numérico, “D” uma variável do
tipo data, “L” do uma variável do tipo lógica e “A” uma variável do tipo array . O
final do nome fica a critério do programador, sempre tendo o bom-senso de
escolher algo que tem a ver com o tipo de dado que ela irá referenciar. Veja modelo
abaixo:
Caracter: _cNome
Numérica: _nTotal
Data: _dSaida
Lógica: _lEof
Array: _aCampos
Obs: Vale observar que o total de caracteres do nome não deve ultrapassar 8
posições e a primeira letra após o caracter identificador (C, N, D, L e A) deve ser
maiúscula.
Índices
A criação do índice e o uso do mesmo nas rotinas devem receber um tratamento
especial. Na criação, os primeiros campos como o alias do arquivo, ordem, chave
do índice e descrição do mesmo, recebem informações normais. O campo PROPRI
deve ser preenchido com o caracter “U” (usuário) e o campo NICKNAME deve ser
preenchido obedecendo a seguinte regra:
Ex:
dbSelectArea(“SA1”)
dbSetNickName(“SA1”, “SA12”)
dbOrderNickName(“SA12”)
Operadores Básicos
Pode-se utilizar os seguintes operadores no ADVPL:
Tipo Ação
= Igualdade
!= ou <> ou # Diferença
:= Atribuição
== Igualdade absoluta
> Maior que
>= Maior e igual a
< Menor que
<= Menor igual a
+ Adição
- Subtração
* Multiplicação
/ Divisão
** ou ^ Exponenciação
SQRT(argumento) Raiz Quadrada
.AND. E lógico
.OR. OU lógico
.NOT. ou ! Não lógico
& Macro Substituição
Criação de Variáveis
Na criação de uma variável deve-se ter em mente alguns pontos fundamentais:
• A declaração
• O tipo de variável
• A função CRIAVAR()
• A inicialização
• Padronização de variáveis
A Declaração
Deve ser feita preferencialmente sempre no início da rotina que for utilizá-la, como
no exemplo:
Function a910VerCod()
Return
O Tipo de Variável
O tipo de variável serve para identificar a utilização que a mesma terá no decorrer
da rotina. Toda variável deve estar tipada durante sua criação. Quando
programamos nativamente em “C”, isto se torna obrigatório. Devemos fazer o
mesmo no AP5, pois isto demonstra que a variável foi conscientemente declarada.
Tipos Existentes
Public
Esta variável será inicializada em um valor lógico falso (.F.) até que seja atribuído
um valor específico a ela. Esta variável permanece definida por toda a duração da
aplicação e pode ser vista (assim como usada, alterada e avaliada) por qualquer
função. Esta variável gera um token (indicação) na tabela de símbolos, isto significa
que o módulo principal conterá símbolos para esta classe de variável, o que, por
sua vez, ocupa mais espaço de memória. Deve-se evitar a utilização deste tipo, a
não ser em casos extremos.
Private
Esta variável será inicializada em valor nulo (NIL) e uma vez declarada,
permanecerá assim durante toda a duração do fluxo da função, até que este volte
ao procedimento inicial que a chamou. Em essência, uma variável de memória
PRIVATE inicializada logo no início do Protheus, agirá como um variável PUBLIC.
Esta variável pode ser vista por uma sub-rotina da função e modificada de maneira
correspondente. Esta variável também gera um token na tabela de símbolos
comentada acima.
Local
Esta variável de memória será inicializada com valor nulo (NIL) e só é visível
dentro da função que a inicializa, mesmo que esta última, contenha funções
incorporadas a seu conteúdo. Este tipo de variável é o mais adequado a ser
utilizado em funções, pois não gera símbolos na tabela de símbolos, por
conseqüência ocupa pouco espaço de memória e, o compilador avalia as variáveis
LOCAL e STATIC mais rapidamente que os outros tipos (PUBLIC e PRIVATE).
Cuidado para não sucumbir à teoria de que se pode obter economia de memória,
mudando qualquer referência PRIVATE para uma referência LOCAL. Se você fizer
Static
A variável STATIC é idêntica à classe de armazenamento LOCAL, com uma
exceção. Uma variável STATIC é retida dentro de sua sub-rotina, mesmo depois
que o fluxo da função a tenha deixado. Isto é particularmente útil para funções
independentes tipo “caixa-preta”, que contém seu próprio conjunto de variáveis
exclusivas e devem manter esses valores de interação em interação.
Inicialização
Quando não atribuímos nenhum valor a uma variável no momento de sua
declaração, corremos o risco de utilizá-la com valor “NIL” e causar erros fatais. Por
isso, a inicialização de uma variável é de extrema importância.
Padronização de Variáveis
É importante que ao lermos o nome de uma variável, possamos saber se o seu tipo
é numérico, caracter, data ou lógico. O nome da variável de get não deve coincidir
com uma variável de outro programa, pois toda variável de get possui um help
específico.
Exemplo:
a variável dBaixa (get da baixa no programa de Títulos a Receber), já possui um
texto help que indica seu conteudo e não deverá ser criada outra variável para
outra finalidade com este mesmo nome.
N ⇒ Numéricas
L ⇒ Lógicas
D ⇒ Data
C ⇒ Caracter
A ⇒ Array (matriz)
O ⇒ Objeto
U ⇒ Sem definição
Sintaxe
_uRet := CriaVar(_cCampo,_lIniPad,_cLado)
Onde :
Local _aDupl := {} ou
Local _aDupl := Array(5,3)
Ex.:
Local _nDup := 0
Ou
_nDup += 1
_aDupl [nDup,1] := E1_NUM
_aDupl [nDup,2] := E1_VALOR
_aDupl [nDup,3] := E1_VENCTO
dbSkip()
End
Exemplo:
_lCond := .T.
While _lCond
// Processamento de seu programa
_lCond := .F.
End
Este Comando acima será executado até que a sua condição se torne Verdadeira a
partir do registro do corrente. Nesta condição poderemos utilizar quaisquer dos
operadores lógicos descritos acima.
For....
Exit ou
Loop
Next
Exemplo:
Local _nMaximo
Local _nContador
_nMaximo := 1000
Este Comando acima será executado até que a variável nContador se torne igual a
Variável _nMaximo a partir do registro do corrente, neste caso poderemos ter
quantos For quiser dentro de um outro For. Nesta condição poderemos utilizar
quaisquer dos operadores lógicos descritos acima.
If…
ElseIf ou
Else
EndIf
Exemplo:
If _lCondição
// Processamento de seu programa caso a Condição acima
seja verdadeira .
Else
// Processamento de seu programa caso a cCondição acima
seja falsa .
EndIf
Este Comando acima será executado caso a condição especificada for verdadeira e
também caso a condição seja falsa a partir do registro do corrente. Nesta condição
poderemos utilizar quaisquer dos operadores lógicos descritos acima.
If ()
Exemplo:
IF(_lCondição, Processamento A , Processamento B)
Do Case
OtherWise
EndCase
Exemplo:
Do Case
Case _lCondição
// Processamento de seu programa
Case _lCondição
// Processamento de seu programa
Case _lCondição
// Processamento de seu programa
Otherwise
Oficina AdvPl Object Página: 18
organon TI Consultoria e Treinamento
Exemplo:
dbSeek(xFilial(“SE1”)+DTOS(_dDtIni))
Do While SE1->(!Eof())
…
…
---------- Falta um DbSkip()
Enddo
Outro exemplo:
_aCampos := {}
Do while .T.
Aadd(_aCampos, “Teste”)
Enddo
No exemplo acima o caso é ainda mais crítico, pois além utilizar todo o recurso de
processamento do servidor, em dado momento haverá uma queda do aplicativo,
devido a limitação da variável tipo Array, criada acima. E quando este limite for
ultrapassado, o sistema será interrompido abruptamente e todos os demais
usuários ficarão impossibilitados de utilizarem o sistema.
Estes mesmos comandos poderiam estar embutidos na função, mas para facilitar a
manutenção, um único arquivo “.CH”, pode ser incluído (comando include) em
várias funções ao mesmo tempo. Não há a necessidade de colocar o comando
include em cada função. Uma única menção ao “.CH” no arquivo “.PR?”, servirá
ao propósito de todas as funções nele embutidas.
#DEFINE
#IFDEF, ou #IFNDEF
#ELSE
#ENDIF
#INCLUDE
Cada um destes comandos pode ser colocado em qualquer parte do arquivo fonte,
que será lido pelo pré-processador. No entanto, para facilitar a visualização da
existência destes comandos e manutenção da função, estes comandos devem ser
colocados no início do fonte.
#DEFINE _TESC 27
#DEFINE _LESC lastkey()
If _nLastkey == _TESC
RETURN
EndIf
Esta diretiva é muito útil quando temos um valor constante várias vezes repetido
dentro do código fonte, que poderá ser alterado com freqüência no decorrer da
vida útil da função.
#INCLUDE “<ARQUIVO>”
Uso de Strings
Para que o sistema possa ser utilizado em outros países com línguas diferentes ao
invés de inserirmos diretamente os textos nos utilizamos o recurso de strings, onde
É convencionado que o nome do include seja o mesmo nome do fonte para que a
manutenção seja o mais simples possível.
Exemplo:
Relatório ⇒ PROG001.PRW
Include ⇒ PROG001.CH
MsgStop
Abre uma caixa de diálogo padronizada para o usuário referente a uma parada
crítica.
Sintaxe
MsgStop (cMens):
Parâmetros
cMens - define a mensagem apresentada no interior da janela
Exemplo
cMens := “Atenção, Curso de Introdução de ADVPL”
MsgStop(cMens)
MsgInfo
Abre uma caixa de diálogo padronizada para o usuário referente a uma
informação.
Sintaxe
MsgInfo(cMens, cTitulo):
Parâmetros
cMens - define a mensagem apresentada no interior da janela
cTitulo - define título da janela
Exemplo
cMens := “Atenção, Curso de Introdução de ADVPL”
MsgStop(cMens, “Informcação”)
MsgBox
Abre uma caixa de diálogo padronizada para informar o usuário de um Erro
decisão a ser tomada ou apenas uma informação.
Sintaxe
MsgBox(cMens,cTitulo,cTpCaixa):
Parâmetros
cMens := define a mensagem apresentada no interior da janela
cTitulo := título da janela
cTpCaixa := tipo da caixa padronizada
MsgYesNo
Abre uma caixa de diálogo padronizada para o usuário referente a uma pergunta,
a qual deverá ser informado “S”=Sim ou “N”=Não.
Sintaxe
MsgYesNo(cMens)
Parâmetros
cMens - define a mensagem apresentada no interior da janela
Retorno
.T. para sim, .F. para não.
Exemplo
Local cMens := “Confirma o Processamento da Rotina?”
lResp := MsgYesNo(cMens)
If lResp
//Processamento
Endif
Len
Retorna o tamanho da string, onde:
Sintaxe
Len(nArg1)
Parâmetros
nArg1 - Variável ou campo tipo string
Trim
Retorna uma string sem os espaços à direita, onde:
Sintaxe
Trim(cArg1) ou RTRIM(cArg1)
Parâmetros
cArg1 - Variável ou campo tipo string
LTrim
Retorna uma string sem os espaços à esquerda, onde:
Sintaxe
LTrim(cArg1)
Parâmetros
_cArg1 - Variável ou campo tipo string
AllTrim
Retorna uma string sem espaços à esquerda e à direita, onde:
Sintaxe
AllTrim(cArg1)
Parâmetros
cArg1 - Variável ou campo tipo string
Val
Retorna um valor a partir de um campo ou variável string, onde:
Sintaxe
Val(arg1)
Parâmetros
DtoC
Sintaxe
DtoC(dArg1)
Retorna uma string a partir de uma variável ou campo tipo data, onde:
Parâmetros
dArg1 - variável ou campo tipo data
Capital
Transforma as letras iniciais em Maiúsculas e as demais em Minúsculas.
Sintaxe
Capital(cTexto)
Parâmetros
cTexto - Texto a ser convertido
Exemplo
cCapital := Capital(“TEXTO MAIUSCULO”)
Day
Retorna o dia a partir de um campo ou variável tipo data, onde:
Sintaxe
Day(dArg1)
Parâmetros
dArg1 := variável ou campo tipo data
Month
Retorna o mes a partir de um campo ou variável tipo data, onde:
Sintaxe
Month(dArg1)
Parâmetros
dArg1 := variável ou campo tipo data
Year
Retorna o ano a partir de um campo ou variável tipo data, onde:
Sintaxe
Oficina AdvPl Object Página: 25
organon TI Consultoria e Treinamento
Year(dArg1)
Parâmetros
dArg1 := variável ou campo tipo data
DOW
Retorna um número equivalente ao dia da semana (1=domingo,7=sábado),
onde:
Sintaxe
DOW(dArg1)
Parâmetros
dArg1 - Variável ou campo tipo data
Str
Retorna uma string de um campo ou variável numérica, onde:
Sintaxe
Str(nArg1)
Parâmetros
nArg1 - Variável ou campo tipo numérica
StrZero
Retorna uma string de um campo ou variável numérica, com zeros significativos
ao invés de brancos, onde:
Sintaxe
StrZero(nArg1):
Parâmetros
nArg1 - Variável ou campo tipo numérica
Round
Retorna um campo numérico arredondado com (nArg2) número de casas
decimais, onde:
Sintaxe
Round(nArg1,nArg2):
Parâmetros
nArg1 - Variável ou campo tipo numérico
nArg2 - Número de casas decimais
Activate Dialog
Ativa uma janela previamente definida na função Dialog e executa os GETs, botões
e outros objetos.
Sintaxe
ACTIVATE DIALOG cVar <CENTERED> [On Init cFuncInit] [Valid
cFuncValid]
Parâmetros
cVar – Variável utilizada na função Dialog para definição da janela.
cFuncInit – Função executada automaticamente na abertura do diálogo na
tela (Opcional).
cFuncValid– Função executada para validar o fechamento da janela de
diálogo.
Deve retornar um valor lógico (.T. ou .F.) (Opcional)
@ ...TO
Desenha um box 3D.
Sintaxe
@ nLInha1,nColuna1 TO nLinha2,nColuna2 <TITLE> cTítulo
Parâmetros
nLinha1 – Número da linha superior
nColuna1 – Número da coluna superior
nLinha2 – Número da linha inferior
nColuna2 – Número da coluna inferior
cTítulo – Titulo apresentado na linha superior (opcional)
Comentários
A cláusula TITLE é opcional. Se for omitida, o box não terá título.
@... GET
Executa um Get, diferenciado pela cláusula <F3>.
Sintaxe
@ nLinha,nColuna GET cVar <PICTURE> cMáscara <VALID>
cFunção <F3> cConsulta
Parâmetros
nLinha – Número da Linha em que o Get será posicionado
nColuna – Número da Coluna em que o Get será posicionado
cVar – Variável a ser editada
cMáscara – Define a máscara de edição (opcional)
cFunção – Função que retorna valor lógico para validação da edição
(opcional)
cConsulta – Definição (SXB) da consulta <F3> associada ao conteúdo de
cVar
Comentários
Os códigos utilizados na cláusula <F3> devem ser obtidos através
do arquivo (SXB). Não é necessário utilizar o comando READ após
a definição dos Gets.
@... SAY
Executa um Say.
Sintaxe
@ nLinha,nColuna SAY cTexto
Parâmetros
nLinha – Número da Linha em que o Get será posicionado
nColuna – Número da Coluna em que o Get será posicionado
cTexto – Variável a ser editada
Comentários
Função utilizada para exibir um texto tipo label em uma janela ou caixa de
diálogo.
@...Button
Cria um botão com texto.
Sintaxe
@ nLinha,nColuna BUTTON cTexto SIZE nAltura,nLargura ACTION
cFunção Object oBtn
Parâmetros
nLinha – Número da linha superior
nColuna – Número da coluna superior
cTexto – Texto que será apresentado no botão. Deve incluir um “_” antes
da letra que utilizada como Hot Key. Ex.: ( “_Salvar”,”Edi_Tar”)
nAltura – Altura do botão
nLargura – Largura do botão
@...BmpButton
Cria um botão de bitmap padrão do Protheus.
Sintaxe
@ nLinha,nColuna BMPBUTTON TYPE nBotao ACTION cFuncao OBJECT
oBtn
Parâmetros
nLinha – Número da linha superior
nColuna – Número da coluna superior
nBotao – Número do botão padronizado
cFuncao – Função que será executada
oBtn – Objeto associado ao botão
@...CheckBox...Var
Cria uma caixa de verificação para definir entre Sim/Não ou Falso/Verdadeiro.
Sintaxe
@ nLinha,nColuna CHECKBOX cDesc VAR lSeleção Object oCbx
Parâmetros
nLinha – Número da linha superior
nColuna – Número da coluna superior
cDesc – Descrição da caixa. Ex. “Atualiza Estoque ?”
lSeleção – Variável Lógica que identifica se a caixa foi ou não selecionada
oCbx – Objeto associado ao Checkbox
Retorno
A variável <lSeleção> recebe “.T.” se for selecionada ou “.F.”, se vazia.
Comentários
Pode ser utilizada uma seqüência de CHECKBOX para determinar um
conjunto de configurações onde vários itens podem ser
marcados/desmarcados. Deve ser definida uma variável <lSeleção> para
cada CHECKBOX definida.
@...ComboBox...Itens...Size
Esta função é semelhante a LISTBOX, mas pode ser utilizada em pequenos
espaços, pois os itens só serão mostrados quando a caixa for seleciona.
Sintaxe
@ nLinha,nColuna COMBOBOX cCont ITENS aArray SIZE
nAltura,nLargura Object oCbx
Parâmetros
nLinha – Número da linha superior
nColuna – Número da coluna superior
cCont – Conteúdo caracter do item selecionado na Matriz [1]
aArray – Array, Matriz [1] com os itens para seleção
nAltura – Altura para definir o tamanho da caixa
Oficina AdvPl Object Página: 29
organon TI Consultoria e Treinamento
@...Radio
Cria uma caixa de seleção semelhante a CHECKBOX, todos os itens são
apresentados mas apenas um pode ser selecionado.
Sintaxe
@ nLinha,nColuna RADIO aArray VAR nPos Object oRdx
Parâmetros
nLinha – Número da linha superior
nColuna – Número da coluna superior
aArray – Matriz [1] com os Itens
nPos – Contém a posição na Matriz[1] do item selecionado
oRdx – Objeto associado à Radiobox()
Retorno
O item selecionado pode ser obtido por - “Matriz [n3]”
Comentários
Os itens da Matriz [1] devem ser do tipo “C” caracter. Pode ser utilizada
para definir uma característica em um conjunto. Ex.Tipo da Condição de
pagamento
• Tipo 1
• Tipo 2
• Tipo 3
@..To...MultiLine
Ativa Browse para edição de múltiplos itens padrão Protheus (GetDados)
Sintaxe
@ nLinha1,nColuna1 TO nLinha2,nColuna2 MULTILINE <<MODIFY>>
<<DELETE>> <<VALID>> cFunção <<FREEZE>> nColuna
Parâmetros
nLinha1 – Número da linha superior
Oficina AdvPl Object Página: 30
organon TI Consultoria e Treinamento
Enchoicebar
Cria barra de botões padrão na janela
Sintaxe
EnchoiceBar( oDlg, bOk, bCancel, [lMessageDel] , [aButtons] )
Parâmetros
oDlg - Janela onde a barra será criada.
bOk - Bloco executado quando clicado botão Ok.
bCancel – Bloco executado quando clicado cancelar.
lMessageDel – Indica se ao clicar no botão Ok aparecerá uma tela de
confirmação de exclusão. Valor padrão falso.
AButtons - Vetor com informações para criação de botões adicionais na
barra no formato {bitmap, bloco de código, mensagem}.
Descrição
Esta função cria uma barra com botões padrão e outros passados como parâmetro
na janela tambem passada por parâmetro. A EnchoiceBar dever ser chamada antes
do ACTIVATE da janela.
AxCadastro
Geração de modelo 1. Rotina para criação e manutenção de cadastros no padrão do
Protheus, contendo as opções padronizadas: PESQUISA, INCLUSÃO,
ALTERAÇÃO, VISUALIZAÇÃO e EXCLUSÃO.
Disponibiliza o Browse e todas as funções de cadastramento padrão.
Sintaxe
AxCadastro(cAlias,cTitulo,cDel,cOk)
Parâmetros
cAlias – Alias do arquivo. Deve obrigatoriamente ter sua estrutura definida
no SX3.
cTitulo – Título da Janela.
cDel – Função para validar a exclusão.
cOk – Função para validar a Inclusão/Alteração.
Oficina AdvPl Object Página: 31
organon TI Consultoria e Treinamento
Comentários
Deve ser utilizada para editar arquivos específicos (Família SZ?), sendo
seme-lhante aos cadastros de Clientes, Fornecedores e etc...
Exemplo
AxCadastro(“SZ1”,”Cadastro de Descontos”,”.T.",”.T.”)
MarkBrowse
Monta um browse padrão do sistema, permitindo marcar e desmacar linhas.
Sintaxe
MarkBrowse(cAlias,cCampo,cCpo,aCampos,lMarc,cMarca,cCtrlM,lBotoes,c
TopFun,cBotFun,aCoord)
Parâmetros
cAlias – Álias do arquivo
cCampo – Campo que estabelece relação com a culuna de marca
cCpo – Campo que se estiver vazio muda a cor da linha
aCampos – Array com os campos para montar o browse
lMarc – Flag para inicializar marcado ou não
cMarca – Marca obtida com a função Getmark
cCtrlM – Função para ser executada no Alt_M
lBotoes – Parâmetro obsoleto
cTopFun – Função filtro para estabelecer o primeiro registro
cBotFun – Função filtro para estabelecer o último registro
aCoord – Array com as coordenadas da MarkBrowse.
Exemplo
cMarca := GetMark()
cCadastro := “Escolher Clientes”
aRotina := { { “Pesquisar”,”AxPesqui”,0,1}, ;
{“Visualizar”,”AxVisual”,0,2}}
MarkBrow(“SA1”,”A1_OK”,”SA1->A1_OK”,,,cMarca)
MBrowse
Monta um browse padrão do sistema, conforme os parâmetros.
Sintaxe
mBrowse(nLinha1, nColuna1, nLinha2, nColuna2, cAlias, aFixe, cCpo, nPar,
cCor, n Opc)
Parâmetros
nLinha1 – Número da linha inicial
nColuna1 – Número da coluna inicial
nLinha2 – Número da linha final
nColuna2 – Número da coluna final
cAlias – Alias do arquivo
aFixe – Array contendo os campos fixos (a serem mostrados em primeiro
lugar no browse)
cCpo – Campo a ser tratado. Quando vazio, muda a cor da linha
nPar – Parâmetro obsoleto
Oficina AdvPl Object Página: 32
organon TI Consultoria e Treinamento
Modelo2
Exibe formulário para cadastro segundo o modelo 2 (como a rotina de Pedidos de
Compra).
Sintaxe
M o d e l o 2 (c T í t u l o ,a C a b e c ,a R o d a p é ,a G d ,n O p ,c L O k ,
c T O k , [aGetsGD,bF4,cIniCpos,nMax,aCordw,lDelget])
Parâmetros
cTítulo – Título da janela
aCabec – Array com os campos do cabeçalho
aRodapé – Array com os campos do rodapé
aGd – Array com as posições para edição dos itens (GETDADOS)
nOp – Modo de operação (3 ou 4 altera e inclui itens, 6 altera mas não
inclui itens, qualquer outro número só visualiza os itens)
cLOk – Função para validação da linha
cTOk – Função para validação de todos os dados (na confirmação)
aGetsGD – Array Gets editáveis (GetDados)
Default = Todos.
bF4 – Codeblock a ser atribuído a tecla F4.
Default = Nenhum.
cIniCpos – String com o nome dos campos que devem ser inicializados ao
teclar seta para baixo (GetDados).
nMAx – Limita o número de linhas (GetDados). Default = 99.
aCordw – Array com quatro elementos numéricos, correspondendo às coor-
denadas linha superior, coluna esquerda, linha interior e coluna
direita, definindo a área de tela a ser usada. Default = Área de
Dados Livre.
lDelget – Determina se as linhas podem ser deletadas ou não (GetDados)
Default = .T.
Retorna
lRet – Retorna .T. se for confirmado
Modelo3
Executa cadastro semelhante ao cadastro de Pedidos de Venda, cabeçalho variável
com itens.
Sintaxe
Modelo3(cTitulo,cAliasEnchoice,cAliasGetD,aCpoEnchoice,cLinOk,cTudOk,
nOpcE,nOpcG,cFieldOk, [lVirtual,nLinhas,aAltEnchoice])
Parâmetros
cTitulo – Título da janela
cAliasEnchoice – Álias do cabeçalho
cAliasGetd – Álias dos itens
aCpoEnchoice – Array com os campos que serão mostrados
cLinOk – Função para validar a mudança de linha nos itens.
cTudOk – Função para validar todos os itens.
nOpce – Número da opção do menu para o cabeçalho (Enchoice)
nOpcG – Número da opção do menu para o itens (GetDados)
cFieldOk – Função para validar os campos dos itens (GetDados)
lVirtual – Permite visualizar campos virtuais na enchoice. Default = .F.
nLinhas – Limita o número máximo de linhas (GetDados) Default = 99.
aAltEnchoice – Array com campos alteráveis (Enchoice) Default = Todos.
Retorna
lRet – Retorno da função modelo3. Se .T. a operação foi confirmada.
ProcRegua
Inicializa a régua padrão de processamentos pode ser utilizada no ADVPL.
Esta função deverá ser utilizada em conjunto com a função Processa(). Deve ser
informado o valor final da régua de processamento.
Sintaxe
ProcRegua(bBlock) => RptStatus(bBlock, cTítulo, cMsg)
Parâmetros
bBlock – Bloco de código que define a função a ser executada.
cTítulo – Título do diálogo de processamento.
IncProc
Incrementa régua padrão de processamento.
Sintaxe
IncProc()
Parâmetros
Nenhum
Retorno
Nenhum
Exemplo
ProcRegua(1000)
For i:= 1 to 1000
IncProc()
Next
RptStatus
Executa função de detalhe do relatório.
Sintaxe
RptStatus(bBlock) => RptStatus(bBlock, cTítulo, cMsg)
Parâmetros
bBlock – Bloco de código que define a função a ser executada.
cTítulo – Título do diálogo de processamento.
cMsg – Mensagem do diálogo de processamento.
Comentários
Pode ser utilizada com os parâmetros:
RptStatus( { | | Execute(“Nome da Função”) } )
SetRegua
Inicializa régua padrão em relatórios.
Sintaxe
SetRegua(nRegs)
Parâmetros
nRegs – Número de registros que serão processados.
Retorno
Nenhum
Exemplo
DbSelectArea(“SA1”)
SetRegua(LastRec())
While ( ! Eof() )
@ Li, 001 PSAY SA1->A1_NOME
DbSkip()
Oficina AdvPl Object Página: 35
organon TI Consultoria e Treinamento
IncRegua()
EndDo
Comentário
Ver também incRegua.
IncRegua
Incrementa régua padrão de processamento em relatórios.
Sintaxe
IncRegua()
Parâmetros
Nenhum
Retorno
Nenhum
Exemplo
DbSelectArea(“SA1”)
SetRegua(LastRec())
While ( ! Eof() )
@ nLin, 001 PSAY SA1->A1_NOME
DbSkip()
IncRegua()
EndDo
Comentário
Ver também SetRegua()
Cabec
Esta função imprime, na impressora selecionada, o cabeçalho padrão dos relató-
rios do SIGA Advanced. Devolve o número da última linha impressa para que seja
dada continuidade ao relatório.
Sintaxe
Cabec(cTítulo, cTexto1, cTexto2, cProg, cLargura, cControle)
Parâmetros
cTítulo – Título do Relatório
cTexto1 – Extenso da primeira linha do cabeçalho
cTexto2 – Extenso da segunda linha do cabeçalho
cProg – Nome do Programa
cLargura – Largura do relatório (P/ M/ G)
cControle – Caractere de controle da impressora (numérico)
Retorna
nLinha – Número da última linha impressa no cabeçalho
Exemplo
cTitulo := “Relação dos Adiantamentos”
cCabec1 := “Código Item Conta Contábil CCusto Projeto Data Valor”
cCabec2 := “----------- ------- ----------------------- ------------ ------------ -------- ------”
cPrograma := “ATRF090”
cTamanho := “P”
nCaracter := 15
cRel:=SetPrint(cAlias, cPrograma , , @cTitulo, cDesc1, cDesc2, cDesc3 , .T., aOrd )
SetDefault(aReturn, cString)
PSay
Este comando permite que você imprima o conteúdo de variáveis ou campos em
uma impressora, bem como em disco. Deverá se utilizado sempre com outros
comandos, tais como: @, linha, coluna, conteúdo a ser impresso (campo ou
variável), máscara de impressão, etc.
Sintaxe
Psay cArg
Parâmetro
cArq – Argumento a ser impresso no relatório
Exemplo
nLin := 02
cEmpresa := "ORGANON TI Campinas "
@ nLin,10 PSay cEmpresa
@ nLin, 110 PSAY SA1->A1_CGC Picture"@R 99.999.999/9999-99"
SetPrint
Esta função possibilita a alteração de determinados padrões dos relatórios. Ela
funciona em conjunto com a função SetDefault.
Sintaxe
SetPrint(cAlias, cNomeRel, cPerg, cDesc1, cDesc2, cDesc3, cDesc4, lDic,
aOrdem, lComp, cClass)
Parâmetro
cAlias - Alias do Arquivo Principal (se existir)
cNomeRel - Nome padrão do relatório
cPerg - Nome do grupo de perguntas
cDesc1 , cDesc4 - Descrição do Relatório
lDic - Habilita o Dicionário de Dados
aOrdem - Array contendo as ordens de indexação do arquivo principal.
lComp - Habilita a alteração da compressão do relatório
cClass - Classificação do Relatório por Tamanho ( “G”, “M” ou “P” )
P – 80 colunas
M – 132 colunas
G – 220 colunas
Exemplo
_cNomeRel := SetPrint(_cString, _cNomeRel, _cPerg, @_ctitulo,
_cDesc1_cDesc2, _cDesc3,.F., _aOrd,.F.,_cTamanho)
SetDefault
Esta função habilita os padrões de relatório alterados pela função SetPrint
Sintaxe
SetDefault(_aArray, _cAlias)
Parâmetros
aArray - Array aReturn, preenchido pelo SetPrint
Oficina AdvPl Object Página: 38
organon TI Consultoria e Treinamento
Sintaxe
AllUsers()
Descrição
14 E-Mail C 130
15 Número de acessos simultâneos N 4
16 Data da última alteração D 8
17 Usuário bloqueado L 1
18 Número de dígitos para o ano N 1
19 Listner de ligações L 1
20 Ramal C 4
2
1 Vetor com horários de acesso A --
2 Idioma N 1
3 Diretório C 100
4 Impressora C --
5 Acessos C 512
6 Vetor com empresas A --
7 Ponto de entrada C 10
8 Tipo de impressão N 1
9 Formato N 1
10 Ambiente N 1
11 Prioridade p/ config. do grupo L 1
12 Opção de impressão C 50
13 Acesso a outros dir de impressão L 1
3
1 Módulo+nível+menu C
AllGroups
Sintaxe
AllGroups()
Descrição
1
1 ID C 6
2 Nome C 20
3 Vetor com horários de acesso A
4 Data de validade D 8
5 Quantas vezes para expirar N 4
6 Autorizado a alterar a senha L 1
7 Idioma N 1
8 Diretório C 100
9 Impressora C
10 Acessos C 512
11 Vetor com empresas A
12 Data da última alteração D 8
13 Tipo de impressão N 1
14 Formato N 1
15 Ambiente N 1
16 Opção de impressão L 1
17 Acesso a outros Dir de impressão L 1
2
1 Modulo+nível+menu C
PswAdmin
Verifica se um usuário é Administrador.
Sintaxe
PswAdmin( cUsuario, cSenha )
Parâmetros
cUsuario – Nome do Usuário
cSenha - Senha do Usuário
Descrição
Esta função retorna um valor lógico, se for usuário administrador verdadeiro (.T.),
caso contrário falso (.F.)
PswID
Retorna o ID do usuário ou do grupo de usuário.
Sintaxe
PswID()
Descrição
PswName
Verifica senha de usuário.
Sintaxe
PswName( cSenha )
Parâmetros
cSenha – Senha do usuário.
Descrição
A função PswName() verica se a senha informada no parametro cSenha pertence
ao usuário posicionado no arquivo de senha, se pertencer retornará verdadeiro(.T.)
PswSeek
Pesquisa e posiciona o arquivo de senhas.
Sintaxe
PswSeek( cID, [lUsuario] )
Parâmetros
cID – Id do usuário
lUsuario – Opcional – Se .T. pesquisa usuários, .F. pesquisa grupo de
usuários
Descrição
A função PswSeek() pesquisa e posiciona o arquivo de senhas conforme a ordem
de indexação e o parametro lUsuario, se encontrar o usuário ou grupo de usuários
retorna verdadeiro (.T.).
PswOrder
Pesquisa e posiciona o arquivo de senhas.
Sintaxe
PswOrder( nOrdem )
Parâmetros
nOrdem – Ordem de pesquisa, onde 1 pesquisa grupo de usuários, 2
pesquisa usuários.
Descrição
A função PswOrder() seleciona a ordem de pesquisa no arquivo de senhas, onde
escolhe-se pesquisar por grupos ou usuários.
PswRet
Retorna vetor contendo informações do Usuário ou do Grupo de Usuários.
Sintaxe
PswRet()
Descrição
A função PswRet() retorna dois tipos de vetores distintos, de acordo com o
posicionamento do arquivo de senha. Se no segundo parametro da função
PswSeek() for informado .T. a PswRet() retornará um vetor com informações do
Usuários, caso contrário retornará informações do Grupo de Usuários.
Oficina AdvPl Object Página: 42
organon TI Consultoria e Treinamento
CGC
Consiste o CGC digitado, tomando como base o algoritmo nacional para
verificação do dígito de controle. Esta função procede um cálculo do dígito
verificador do número do Cadastro Geral de Contribuintes do Ministério da
Fazenda. É utilizado o dígito padrão módulo 11 para verificar se as duas últimas
posições da string passada, correspondem a dígitos verificadores válidos.
Calculando primeiro o dígito das 12 primeiras posições e agregando o dígito
encontrado ao fim da string, calcula o dígito das 13 posições, obtendo o segundo
dígito. Retorna uma expressão lógica verdadeira se as duas últimas posições do
CGC digitado coincidem com o calculado.
Sintaxe
CGC(ExpC1)
Parâmetros
ExpC1 – String de caracteres representando o número do C.G.C. sem pontos
e traços separadores. Caso este argumento não seja passado para a função,
esta considerará o GET corrente.
Retorna
ExpL1 – Expressão lógica .T. se o CGC é válido (dígito verificador confere)
ou .F. se o dígito verificador não confere.
Exemplos
Local cCGC := Space(14)
@ 10,16 GET cCGC Picture “@R 99.999.999/9999-99” Valid CGC(cCGC)
A máscara do CGC deve vir com @R, para não inserir os pontos e a barra no
CGC, o que impossibilita a validação.
Condicao
Esta função permite avaliar uma condição de pagamento, retornando um array
multidimensional com informações referentes ao valor e vencimento de cada
parcela, de acordo com a condição de pagamento.
Sintaxe
Condicao(nValTot,cCond,nVIPI,dData,nVSol)
Parametros
nValTot – Valor total a ser parcelado
cCond – Código da condição de pagamento
nVIPI – Valor do IPI, destacado para condição que obrigue o pagamento do
IPI na 1ª parcela
dData – Data inicial para considerar
Retorna
aRet – Array de retorno ( { {VALOR,VENCTO} , ... } )
Exemplo
nValTot := 2500
cCond := “002” // Tipo 1, Duas vezes
aParc := Condicao(nValTot,cCond,,dDataBase)
ConvMoeda
Converte o valor informado para a moeda selecionada.
Sintaxe
ConvMoeda(dData1,dData2,nValor,cMoeda)
Parâmetros
dData1 – Data de emissão
dData2 – Data de vencimento
nValor – Valor a ser convertido
cMoeda – Para qual moeda deverá converter
Retorna
ExpN1 – Valor convertido (devolvido pela função)
Comentários
Esta função converte o valor definido por nValor para a moeda especificada
em cMoeda na data dData.
A data dData2 não é utilizada.
O valor nValor é considerado em moeda 1.
Exemplos
nValor1 := ConvMoeda( D1_DTDIGIT, , D1_TOTAL, cMoeda )
nValor2 := ConvMoeda( D2_EMISSAO, , D2_TOTAL, cMoeda )
DataValida
Retorna uma data válida que não seja sábado, domingo ou feriado, a partir de uma
data qualquer informada. É uma função útil para a geração de vencimentos reais
para títulos, por exemplo.
Sintaxe
DataValida(dData)
Parametros
dData – Data informada para validação.
Retorna
dDtVld – Retorna a Data validada.
Exemplo
dVencRea := DataValida(dVencto)
Digito11
Cálculo de dígito verificador em módulo 11.
Sintaxe
Digito11(cCalc,cDigito)
Parâmetros
cCalc – String para calcular o dígito
cDigito – Dígito de verificação
Retorna
ExpL1 – Valor Lógico de Retorno (.T. ou .F.)
Comentários
Esta função calcula o dígito de verificação de cCalc e o compara com
cDigito, verificando a consistência.
Exemplos
Digito11(cCodigo,cDigito)
EANDigito
Calcula o dígito de controle para o código EAN usado em códigos de barras.
Sintaxe
EanDigito(cCod)
Parâmetros
cCod – Código de barras para o cálculo do dígito. É obrigatório o tamanho
de 12 dígitos.
Retorna
cEan – Retorna o código EAN de 13 dígitos, sendo que a última posição é o
dígito calculado.
Exemplo
cCod := EanDigito(PADL(AllTrim(M->B1_CODBAR),12,”0"))
cDig := Substr(cCod,12,1)
Entre
Verifica se o conteúdo do campo está entre o conteúdo de duas expressões (ExpX1
<= cCampo <= ExpX2). Se verdadeiro, retorna .T..Usado normalmente em
validações de campos digitados.
Sintaxe
Entre(ExpX1,ExpX2,cCampo)
Parâmetros
ExpX1 – Expressão a comparar >=
ExpX2 – Expressão a comparar <=
cCampo – Nome do Campo
Retorna
ExpL1 – Valor Lógico de Retorno (.T. ou .F.)
Exemplos
If Entre(“A1”,”A9",cSerie)
Extenso
Gera o extenso de um valor numérico. Esta função retorna um valor, dinheiro ou
quantidade, por extenso. Usada para a impressão de cheques, valor de duplicatas,
etc.
Sintaxe
Extenso(nValor,lQtd,nMoeda)
Parametros
nValor – Valor a ser gerado o extenso.
lQtd – Verdadeiro (.T.) indica que o valor representa uma quantidade.
Falso (.F.) indica que o valor representa dinheiro. Se não for especificado, o
default é falso (.F.).
nMoeda - Qual moeda do sistema deve ser o extenso.
Retorna
cValor – Retorna o valor por extenso.
Exemplo
nValor := SF2->F2_VALFAT
cExtenso := PADR(Extenso(nValor),200,”*”)
Formula
Interpreta uma fórmula cadastrada. Esta função interpreta uma fórmula, previa-
mente cadastrada no Arquivo SM4 através do Módulo Configurador, e retorna o
resultado com tipo de dado de acordo com a própria fórmula.
Sintaxe
Formula(cFormula)
Parâmetros
cFormula – Código da fórmula cadastrada no SM4.
Retorna
uRet – Retorno, com tipo de dado de acordo com a fórmula.
Exemplo
CTexto := Formula(“F01”)
GetArea
Salva a área corrente para um array. Essa função salva o alias corrente, a ordem e o
recno posicionado.
Sintaxe
aArray := Alias->(GetArea())
Parâmetros
Nenhum
Exemplo
aArray := GetArea()
aArray := SA1->(GetArea())
Ver também
Função RestArea( )
GetMV
Recupera o conteúdo de parâmetros originados em SX6.
Sintaxe
GetMV(cParam)
Parâmetros
cParam – Nome do parâmetro a ser pesquisado no SX6
Retorna
ExpX1 – Conteúdo do parâmetro devolvido pela função
Exemplos
cTabVista := GETMV(“MV_TABVIST”)
cColICMS := GETMV(“MV_COLICMS”)
Help
Esta função exibe a ajuda especificada para o campo e permite sua edição. Se for
um help novo, escreve-se o texto em tempo de execução.
Sintaxe
Help(cHelp,nLinha,cTítulo,cNil,cMensagem,nLinMen,nColMen)
Parâmetros
cHelp – Nome da Rotina chamadora do help (sempre branco)
nLinha – Número da linha da rotina chamadora (sempre 1)
cTítulo – Título do help
cNil – Sempre NIL
cMensagem – Mensagem adicional ao help
nLinMen – Número de linhas da Mensagem (relativa à janela)
nColMen – Número de colunas da Mensagem (relativa à janela)
Retorna
Nada
Exemplo
If Empty(cArqs)
Oficina AdvPl Object Página: 47
organon TI Consultoria e Treinamento
dbSelectArea(cAlias)
RecLock(cAlias,.F.)
dbDelete()
MSUnlock()
Else
Help(“ “,1,”NaoExclui”,,cArqs,4,1)
Endif
LetterOrNum
Verifica se determinado caracter é uma letra ou um número.
Sintaxe
LetterOrNum(cChar)
Parâmetros
cChar – Caracter para verificação.
Retorna
lAlfa – Retorna Verdadeiro (.V.) se o caracter informado for uma letra ou um
número.
Exemplo
If LetterOrNum(cCh)
//Processamento
Endif
MesExtenso
Retorna o nome do mês por extenso.
Sintaxe
MesExtenso(nMes)
Parâmetros
nMes – Número do mês (1 a 12). Se “nMes” não for informado, é assumido o
mês da data base do sistema. Esta variável também pode ser caracter (“1” ou
“2”) ou do tipo data.
Retorna
cNome – Nome do mês retornado por extenso.
Exemplo
MesExtenso(dDataBase)+” de “+StrZero(Year(dDataBase),4)
NaoVazio
Verifica se o campo não está vazio.
Sintaxe
NaoVazio(cCpo)
Parâmetros
cCpo – Campo a verificar
Retorna
ExpL1 – Valor Lógico de Retorno (.T. ou .F.)
Exemplo
@ 5,10 MsGet cCodigo Valid NaoVazio(cCodigo)
Oficina AdvPl Object Página: 48
organon TI Consultoria e Treinamento
Negativo
Verifica se é negativo.
Sintaxe
Negativo(nCpo)
Parâmetros
nCpo – Campo a verificar
Retorna
ExpL1 – Se o valor de nCpo for menor que 0, é retornado .T., caso contrário
será retornado .F..
Exemplos
If Negativo (nValTitulo)
@ 5,10 Say “Valor invalido”
Loop
EndIf
Pergunte
Esta função permite acessar e editar um grupo de perguntas do arquivo SX1.
Mostra uma tela contendo as perguntas gravadas em SX1 a serem respondidas ou
confirmadas pelo usuário.
Sintaxe
Pergunte(cGrupo, lVar)
Parâmetros
cGrupo – Nome do Grupo de perguntas.
lVar – .F. - devolve o conteúdo das variáveis, não apresentando a janela de
perguntas; .T. - permite a alteração das variáveis, apresentando a janela.
Retorna
ExpL1 – .T. se o grupo de perguntas existe.
Exemplos
pergunte(“AFR090”,.T.)
Pertence
Verifica se o campo está contido em outro.
Sintaxe
Pertence(cString,cCampo)
Parâmetros
cString – String que deve estar contida no cCampo
cCampo – Campo a verificar
Retorna
ExpL1 – Valor Lógico de Retorno (.T. ou .F.)
Exemplo
@ 09,19 MsGet cTipo Picture “@!” Valid Pertence(“CL\VD\PD”,cTipo)
PesqPict
Pesquisa, no dicionário de dados, qual a picture usada em um determinado campo,
seja para a edição em tela ou para a impressão de relatórios.
Sintaxe
PesqPict(cAlias,cCampo,nTam)
Parâmetros
cAlias – Alias do arquivo
cCampo – Nome do campo
nTam – Opcional, para campos numéricos, será usado como o tamanho do
campo para definição da picture. Se não informado, e usado o tamanho
padrão no dicionário de dados.
Retorna
cPic – Picture do campo
Exemplo
@ nLin,20 PSay “Total: “
@ nLin,27 PSay SF2->F2_VALBRUT Picture PesqPict(“SF2”,”F2_VALBRUT”)
PesqPictQt
Devolve a Picture de um campo de quantidade, de acordo com o dicionário de
dados. Esta função geralmente é utilizada quando há pouco espaço disponível para
impressão de valores em relatórios, quando o valor nEdição não é informado, ela
tem o comportamento semelhante ao da função “X3Picture”, pois busca o tamanho
do campo no dicionário de dados.
Sintaxe
PesqPictQt(cCampo,nEdição)
Parâmetros
cCampo – Nome do campo a verificar a picture
nEdição – Espaço disponível para edição
Retorna
ExpC – Picture ideal para o espaço definido por nEdição, sem a separação
dos milhares por vírgula
Exemplo
@ nLin,10 PSay SB2->B2_QATU Picture PesqPictQt (“B2_QATU”,8)
Positivo
Verifica se é positivo.
Sintaxe
Positivo(nCampo)
Parâmetros
nCampo – Campo a verificar
Retorna
ExpL1 – Valor Lógico de Retorno (.T. ou .F.)
Comentários
Se cCampo for maior ou igual ( >= ) a zero a função retorna .T.
RestArea
Restaura a área RestArea a partir do array.
Sintaxe
RestArea(aArray)
Parâmetros
aArray – Expressão Array para restauração
Exemplo
aArray:=GetArea()
RestArea(aArray)
Ver também
Função GetArea()
Tabela
Devolve o conteúdo da tabela de acordo com a chave. Esta função é usada para a
obtencao do conteúdo de uma determinada tabela, na chave especificada.
Retorna o conteudo, possibilitando inclusive a exibição de um “help” caso a tabela
não exista.
Sintaxe
Tabela(cTab,cChav,lPrint)
Parâmetros
cTab – Número da tabela a pesquisar (deve ser informado como caracter).
cChav – Chave a pesquisar na tabela informada.
lPrint – Indica se deve (.T.) ou não (.F.) exibir o help ou a chave NOTAB
se a tabela não existir.
Retorna
cRet – Conteúdo da tabela na chave especificada. Retorna nulo caso a tabela
não exista ou a chave não seja encontrada.
Variação
Retorna a variação em percentual entre dois valores.
Sintaxe
Variação(nFator1,nFator2)
Parâmetros
nFator1 – Primeiro fator comparativo
nFator2 – Segundo fator comparativo
Exemplo
Variacao(100000,50000)
Vazio
Verifica se o campo está vazio.
Sintaxe
Oficina AdvPl Object Página: 51
organon TI Consultoria e Treinamento
Vazio(cCampo)
Parâmetros
cCampo – Campo a verificar
Retorna
ExpL1 – Valor Lógico de Retorno (.T. ou .F.)
Comentários
Retorna .T. se ExpC1 estiver vazio.
Exemplo
@ 9,10 MsGet cCodigo Valid !Vazio(cCodigo)
XFilial
Retorna a filial utilizada por determinado arquivo. Esta função é utilizada para
permitir que pesquisas e consultas em arquivos trabalhem somente com os dados
da filial corrente, dependendo é claro se o arquivo está compartilhado ou não
(definição que é feita através do Módulo Configurador). É importante verificar que
esta função não tem por objetivo retornar apenas a filial corrente, mas retorná-la
caso o arquivo seja exclusivo. Se o arquivo estiver compartilhado, a função xFilial
retornará dois espaços em branco.
Sintaxe
xFilial(cAlias)
Parâmetros
cAlias – Alias do arquivo desejado. Se não for especificado, o arquivo
tratado será o da área corrente.
Retorna
cFilArq – Retorna a Filial para o arquivo desejado.
Exemplo
cFilial := xFilial(“SB1”)
Sintaxe
AbreExcl(cAlias)
Parâmetros
cAlias – Nome do Alias do Arquivo. Deve ter obrigatóriamente sua
estrutura definida no SX3.
Exemplo
IF AbreExcl(“SI2”)
Pack
ENDIF
AbreExcl( )
dbGoTop( )
Contar
Conta o número de registros de acordo com a condição determinada.
Sintaxe
Contar(cAlias, cCond)
Parâmetros
cALias – Alias do arquivo
cCond – Condição para a contagem
Exemplo
Contar(“SC1”,“C1_DATPRF < dDataBase”)
CriaTrab
Cria arquivo de trabalho temporário.
Sintaxe
CriaTrab(aArray,lDbf)
Parâmetros
aArray – Array multidimensional contendo os campos a criar {Nome, Tipo,
Tamanho, Decimal}
lDbf – Determina se o arquivo de trabalho deve ser criado ( .T.) ou não (.F. )
Retorna
ExpC1 – Nome do Arquivo gerado pela função.
Comentários
Esta função retorna o nome de um arquivo de trabalho que ainda não exista.
Caso lDbf = .T., a função criará um arquivo DBF com este nome e a estrutura
definida em aArray.
Caso lDbf = .F., a função não criará arquivo de nenhum tipo, apenas
fornecerá um nome válido.
Exemplos
//Exemplo para criar arquivo temporário simples
cArq := CriaTrab(NIL, .F.)
cIndice := “C9_AGREG+”+IndexKey()
Index on &cIndice To &cArq
DbSelectArea
Esa função permite que você selecione um arquivo .
Sintaxe
DbSelectArea(_cAlias)
Parâmetros
cAlias := Alias a ser selecionado.
Exemplo
DbSelectArea(cAlias)
Este Comando irá selecionar o arquivo que possui o alias (apelido) “SA1” – refere-
se ao arquivo de Cadastro de Clientes do sistema Advanced Protheus.
DbSetOrder
Essa função permite que você selecione um índice pré-definido no arquivo de
índices, o qual se encontra no diretório ..\Sigaadv\SINDEX.DBF; também permite
que você selecione um índice criado especificamente para esta rotina.
Sintaxe
DbSetOrder(nOrdem)
Parâmetros
nOrdem := Order do índice a ser selecionado. Respeita a ordem do alias
corrente.
Exemplo
Local cAlias := “SA1”
dbSelectArea(cAlias)
dbSetOrder(2)
DbSeek
Essa função permite localizar um registro a partir de uma chave (esta chave deve
ser igual ao índice já existente no arquivo SINDEX.DBF ou SIXNNN.DBF, onde
NNN corresponde à empresa corrente).
Sintaxe
DbSeek(_cChave)
Parâmetros
CChave := Chave a ser pesquisada respeitando o índice corrente.
Exemplo
dbSelectArea("SA1")
dbSetOrder(1)
dbSeek(xFilial("SA1")+"000001"+"01")
DbSkip
Essa função permite que você saia do registro corrente e passe para o próximo
registro abaixo dele.
Sintaxe
DbSkip()
Exemplo
dbSelectArea("SA1")
dbSetOrder(1)
While !Eof()
// Processamento da rotina
dbSelectArea("SA1")
dbSkip()
Enddo
RecLock
A função RecLock permite ao usuário travar registro para efetuar inclusão,
alteração ou exclusão de campos ou registros.
Sintaxe
RecLock(cAlias,lAppend)
Parâmetros
cAlias := Alias a ser utilizado.
lAppend := .T. abre um registro em branco, .F. altera o registro corrente.
Exemplo
RecLock("SA1", .F.)
SA1->A1_UF := "SP"
MsUnlock()
MSUnlock
Essa função é usada logo após a função RecLock(), pois tem como objetivo
destravar o registro previamente travado.
Sintaxe
MSUnlock()
Exemplo
RecLock("SA1", .T.)
SA1->A1_CODIGO := "999999"
SA1->A1_NOME := "CURSO DE ADVPL"
MsUnlock()
ExistChav
Verifica se a chave já existe em determinado Alias. Função para uso em validações
de campos-chave, para não permitir a duplicidade de registros.
Sintaxe
ExistChav(cAlias,cChave,nOrdem,cHelp)
Parametros
cAlias – Alias do arquivo no qual a consistência deve ser avaliada
ExistCpo
Verifica se determinada chave existe no Alias especificado. Função utilizada em
processamentos onde o código informado deve existir em determinado cadastro,
na sua validação.
Sintaxe
ExistCpo(cAlias,cChave,nOrdem)
Parâmetros
cAlias – Alias do arquivo para a pesquisa
cChave – Chave a ser pesquisada (opcional). Se não for informada, o conteú-
do é obtido automaticamente do GET em uso
nOrdem – Número da ordem do Índice para Pesquisa (Opcional). Se não for
informado, usa a ordem atual do Alias.
Retorna
lRet – Retorna Verdadeiro (.T.) se a chave existir no Alias especificado, caso
contrário, retorna Falso (.F.) e executa um help padrão do sistema
(“REGNOIS”). A ordem utilizada na pesquisa é a atualmente selecionada. Se
não for informado, usa a ordem atual do álias.
Exemplo
ExistCpo(“SB1”,cProd)
ExistIni
Verifica se o campo possui inicializador padrão.
Sintaxe
ExistIni(cCampo)
Parâmetros
cCampo – Nome do campo para verificação.
Retorna
lEx – Retorna Verdadeiro (.V.) se o campo possui inicializador padrão, caso
contrário, retorna falso (.F.).
Exemplo
If ExistIni(“B1_COD”)
cCod := CriaVar(“B1_COD”)
Oficina AdvPl Object Página: 56
organon TI Consultoria e Treinamento
Endif
IndRegua
Cria índice de trabalho, podendo ser condicional.
Sintaxe
IndRegua(cAlias,cArqtrab,cChave,cPar,cFiltro,cTexto)
Parâmetros
cAlias – Alias do arquivo.
cArqtrab – Nome do arquivo de trabalho retornado pela função CriaTrab
(.F.).
cChave – Expressão utilizada na chave do novo índice.
cPar – Se for igual a ‘D’, cria um indice com a chave inversa, do maior valor
para o menor.
cFiltro – Expressão utilizada para filtro.
cTexto – Texto da régua de processamento ( “Selecionando registros ...”).
Retorno
Nil
Exemplo
DbSelectArea(“SC5”)
cFiltro := “C5_OK<>’X’”
cChave := “Dtos(C5_EMISSAO)+C5_VEND1”
cIndSC51 := CriaTrab(Nil,.F.)
IndRegua(“SC5”, cIndSC51, cChave, , cFiltro, “Selecionando...”)
Posicione
Posiciona o arquivo em um determinado registro.
Sintaxe
Posicione(cAlias, nOrdem, cChave, cCampo)
Parâmetros
cAlias – Alias do arquivo
nOrdem – Ordem utilizada
cChave – Chave pesquisa
cCampo – Campo a ser retornado
Retorna
Retorna o conteúdo do campo passado com o perímetro.
Exemplo
Posicione(“SA1”,1,xFilial(“SA1”)+001,“A1_NOME”)
RetIndex
Devolve os índices padrões do SIGA.
Sintaxe
RetIndex(cAlias)
Parâmetros
cAlias – Alias do Arquivo
Retorna
Número Índices existentes no SINDEX
Oficina AdvPl Object Página: 57
organon TI Consultoria e Treinamento
Comentários
Baseado no SINDEX, abre todos os índices padrões para o arquivo em
pauta.
Exemplo
nIndex := RetIndex (“SA1”)
Tabela
Devolve o conteúdo da tabela de acordo com a chave. Esta função é usada para a
obtencao do conteúdo de uma determinada tabela, na chave especificada.
Retorna o conteudo, possibilitando inclusive a exibição de um “help” caso a tabela
não exista.
Sintaxe
Tabela(cTab,cChav,lPrint)
Parâmetros
cTab – Número da tabela a pesquisar (deve ser informado como caracter).
cChav – Chave a pesquisar na tabela informada.
lPrint – Indica se deve (.T.) ou não (.F.) exibir o help ou a chave NOTAB
se a tabela não existir.
Retorna
cRet – Conteúdo da tabela na chave especificada. Retorna nulo caso a tabela
não exista ou a chave não seja encontrada.
Exemplo
Tabela(cTabela, cChave)
TamSX3
Retorna o tamanho de um campo no SX3 (dicionário de dados).
Sintaxe
TamSx3(cCampo)
Parâmetros
cCampo – Nome do campo.
Retorna
aTam – Array com o tamanho e decimais do campo.
Índices
A utilização de índices para a pesquisa deve ser bem analisada a fim de evitar
lentidão ou processamentos redundantes nos relatórios.
Os índices ajudam a otimizar as pesquisas em estruturas com looping, por isso não
devem ser utilizados de forma errônea.
Caso a necessidade programa exija uma otimização que não é possível obter com
os índices padrões do sistema é possível criar índices temporários através da
função Indregua tornando assim os relatórios mais ágeis e bem estruturados.
SA1->(RetIndex())
fErase( cArqNtx )
Caso o programa que crie um arquivo de trabalho e não o apague no final de seu
processamento, este ficará ocupando espaço em disco no ambiente de trabalho. Isto
poderá gerar problemas futuros para o cliente. Por isto, é fundamental, que após
sua utilização o mesmo seja descartado.
Mesmo que seja óbvio a existência do registro, faça o teste pois o programa deve
prever que a base de dados não é tão confiável como deveria, e um alerta ajuda a
identificar estes casos. Em casos de relatórios, atentar-se para imprimir a
mensagem de forma consciente.
dbSelectArea("SB1")
dbSeek(xFilial("SB1"))
Ao criar uma função que irá desposicionar registros, use a função GETAREA() e
RESTAREA(), para voltar tudo à posição original. Exemplo:
DbSelectArea("SD1")
_aAreaSD1 := Getarea() // Armazena o ambiente do arquivo SD1
dbSetOrder(3)
dbSeek(xFilial("SD1") + DTOS("01/03/01"), .T.)
While !EOF() .And. SD1->D1_FILIAL == xFilial("SD1") .And.;
DTOS(D1_EMISSAO) <= DtoS(mv_par02)
Oficina AdvPl Object Página: 60
organon TI Consultoria e Treinamento
// Processamento
Dbskip()
EndDo
Restarea(_aAreaSD1) //Restaura o ambiente do arquivo SD1
Arquivos Compartilhados
Quando o arquivo esta configurado para trabalhar no modo compartilhado
(X2_MODO = ‘C’), este campo será gravado com “ “ ( espaços ).
Deste modo o registro ficara disponível para todas as Filiais.
Arquivos Exclusivos
Por exemplo :
DbSelectArea(“SA1”)
DbSeek(xFilial(“SA1”)+_cCodCli+_cLoja)
Índice do SA1 :
A1_FILIAL+A1_COD+A1_LOJA
Ou um processamento no arquivo :
Jamais use um campo filial de uma tabela para executar um dbSeek() em outra
tabela. Pois uma tabela poderá ser compartillhada (campo filial em branco),
enquanto que a outra poderá ser compartilhada (campo filial preenchido).
A variável cFilAnt contém a filial que o usuário está operando, e a variável
cEmpant contém a empresa e a filial
Chaves Primárias
Sua função é garantir unicidade. Em toda relação, por definição, tem-se uma ou
mais chaves candidatas. Dessas chaves, uma será primária e se houver mais de
uma na relação, essas outras serão definidas como chave alternada.
Chaves Estrangeiras
É um atributo cuja função é permitir relacionamento. Em uma tabela na qual o
atributo é chave externa ou estrangeira, em outra, o atributo deve ser chave
primária, e os valores dos campos são necessários.
Integridade Referencial
Todos os valores da chave estrangeira tem que ter obrigatoriamente valor
correspondente na chave primária que se relaciona; mas nem todos os valores
encontrados na chave primária, precisam ter seus correspondentes na chave
estrangeira que se relaciona. Por exemplo, na tabela de clientes, o campo A1_COD
(código do cliente), vai estar relacionado com outra tabela que indica quais são os
pedidos de venda colocados. Desta forma, nem todos os clientes precisam ter
pedidos de venda colocados; mas, necessariamente, todos os pedidos de venda
precisam de um cliente.
Como o PROTHEUS foi projetado para o ambiente SQL, onde a integridade
referencial das tabelas é definida no próprio banco de dados através de regras
internas, devemos tomar algumas precauções com esse tópico:
Oficina AdvPl Object Página: 62
organon TI Consultoria e Treinamento
Verificar a integridade dos cadastros com todas as tabelas relacionadas: não pode-
se excluir o código do cliente se existe um pedido de vendas em aberto para esse
cliente, deve-se verificar todas as tabelas relacionadas antes de atualizar a base de
dados.Além disso na inclusão de cadastros devemos utilizar as funções existchav e
existcpo para garantir que as informações de chave não sejam repetidas e que o
acesso a tabelas externas seja validado de maneira consistente.
Credito
Devolve o valor a crédito de uma determinada conta.
Sintaxe
Credito(cConta, nMês, nMoeda)
Parâmetros
cConta – Código da Conta
nMês – Mês do movimento desejado
nMoeda – Moeda desejada para obtenção do valor a crédito
Exemplo
Credito(“11103”,03,1)
Ver também
Funções Debito, Saldo e Movimento
Debito
Devolve o valor a débito de uma determinada conta.
Sintaxe
Debito(cConta, nMês, nMoeda)
Parâmetros
cConta – Código da Conta
nMês – Mês do movimento desejado
nMoeda – Moeda desejada para obtenção do valor a débito
Exemplo
Debito(“11103”,03,1)
Ver também
Funções Credito, Saldo e Movimento
MovimCC
Retorna o movimento de um centro de custo mais conta contábil (extracontábil).
Sintaxe
MovimCC(cCC, cConta, nMês, nMoeda)
Parâmetros
cCC – Código do centro de custo
cConta – Código da conta contábil
nMês – Referente ao mês
nMoeda – Moeda desejada para obtenção do valor
Exemplo
MovimCC(“3001”, “111001”,Month(Ddatabase),1)
Movimento
Devolve o movimento (débito-crédito) de uma determinada conta, ou seja, o saldo
do movimento.
Sintaxe
Movimento(cCódigo,nMês,nMoeda,dData)
Parâmetros
cCódigo – Código da conta
Oficina AdvPl Object Página: 64
organon TI Consultoria e Treinamento
Orcado
Retorna o valor orçado de uma conta.
Sintaxe
Orcado(cConta, nPeríodo,nMoeda,dData)
Parâmetros
cConta – Código da conta De
nPerídodo – Referente ao período
nMoeda – Moeda desejada para obtenção do valor
dData – Data para conversão (em formato data ou caracter), caso não
informada, será utilizada a DataBase do sistema
Exemplo
Orcado(“11102001”,1,1)
OrcadoCC
Recupera o valor orçado da Conta x Centro de Custo para utilização na planilha.
Sintaxe
OrcadoCC(cConta,cCC,nPeríodo,nMoeda,dData)
Parâmetros
cConta – Código da Conta
cCC – Código do Centro de Custo
nPeríodo – Período (default mês da database)
nMoeda – Moeda (default 1)
dData – Data para conversão se moeda de 2 a 5 - (default dDataBase)
Exemplo
OrcadoCC( “111001”,“3001”,3,2)
Periodo
Devolve o período contábil de acordo com o exercício atual.
Sintaxe
Periodo(dData,nMoeda)
Parametros
dData – Data a ser considerada. Se não for especificada, é assumida a data
base.
nMoeda – Moeda a ser considerada. Se não for especificada, é assumida a
primeira moeda.
Retorna
nPer – Período contábil retornado.
Saldo
Calcula o saldo de uma determinada conta até o período informado e na moeda
especificada.
Sintaxe
Saldo(cConta,nPer,nMoeda)
Parâmetros
cConta – Código da conta desejada.
nPer – Período contábil até o qual será feito o cálculo.
nMoeda – Moeda desejada.
Retorna
nSld – Retorna o Saldo da conta até o período desejado.
Exemplo
cConta := SA1->A1_CONTA
nSl := Saldo(cConta,Periodo(dDataBase,2),2)
cSl := Transform(nSl,”@E 9,999,999.99")
Alert(“O saldo da conta “+cConta+” na moeda 2 e’: “+cSl)
Return
SaldoCC
Calcula o saldo atual em um determinado centro de custo ou conta (extracontábil).
O arquivo SI3 deve estar posicionado para a obtenção dos valores para o cálculo.
Sintaxe
SaldoCC(cCC,cConta,nPer,nMoeda)
Parâmetros
cCC – Centro de Custo desejado
cConta – Código da conta
nPer – Período até o qual o acúmulo deve ser calculado
nMoeda – Moeda desejada
Retorna
nSld – Saldo atual retorna do.
Exemplo
nSld := SaldoCC(,,12,1)
SaldoCusto
Calcula o saldo dos centro de custos extracontábeis.
Sintaxe
SaldoCusto(cCC1,cCC2,cConta1,cConta2,nMês,nMoeda)
Parâmetros
cCC1 – Centro de Custo Inicial
cCC2 – Centro de Custo Final
cConta1 – Conta Inicial
cConta2 – Conta Final
nMês – Mês (se nula, assume o mês de referência da database)
nMoeda – Moeda (se nula, será assumido 1)
Exemplo
Oficina AdvPl Object Página: 66
organon TI Consultoria e Treinamento
SomaSaldo
Retorna o saldo atual entre um intervalo de contas.
Sintaxe
SomaSaldo(cConta1, cConta2, nPeríodo, nMoeda)
Parâmetros
cConta1 – Código da conta De
cConta2 – Código da conta Até
nPeríodo – Referente ao período
nMoeda – Moeda desejada para obtenção do valor
Exemplo
SomaSaldo(“31001”,“31010”,12,1)
SumMovimCC
Retorna o movimento de um intervalo de centro de custos extracontábeis. Poderá
ser parametrizados também um grupo de contas.
Sintaxe
SumMovimCC(cCC1,cCC2,cConta1,cConta2,nMês,nMoeda)
Parâmetros
cCC1 – do Centro de Custo
cCC2 – até Centro de Custo
cConta1 – da Conta
cConta2 – até a Conta
nMês – Mês (default mês da database)
nMoeda – Moeda (default 1)
Exemplo
SumMovimCC( “3001”,“3100“,“31001”,“31010”,12,1)
SomaContas
Retorna o saldo acumulado de um grupo de contas, de acordo com a sintaxe
apresentada. Esta função considera somente contas de classe “A” – analítica
Sintaxe
SomaContas(cLista,nMês,nMoeda)
Parâmetros
cLista – Lista de contas, cercada por aspas (“”).
O separador “:” (dois pontos) informa intervalo de contas De-Até.
O separador “ ,” (vírgula) informa separação de contas.
nMês – Mês (default mês da database)
nMoeda – Moeda (default 1)
Exemplo
SomaContas(“11101001”,3,1)
//Devolve o saldo da conta em questão no mês 3 na moeda 1.
Estrut
Função para obtenção da estrutura de um produto previamente cadastrada no SG1
através dos Módulos “SIGAEST” ou “SIGAPCP”.
Sintaxe
Estrut(cProduto)
Parâmetros
cProduto – Código do produto PAI da estrutura.
Retorna
aStru – Retorna o array com a estrutura do produto na seguinte sintaxe:
{ {Nº , Código , Comp. , Qtd. , TRT }, ... , ... }
Esta função requer que seja declarada a variável chamada “nEstru”
contendo 0, para o seu correto funcionamento.
Exemplo
Local aStru := Estrut(cPrd)
SaldoSB2
Esta função calcula o saldo atual do produto (do Arquivo SB2), descontando os
valores empenhados, reservados, etc. É necessário que o Arquivo SB2 esteja
posicionado no produto desejado.
Sintaxe
Oficina AdvPl Object Página: 68
organon TI Consultoria e Treinamento
SaldoSB2()
Retorna
nSld – Retorna o Saldo do produto calculado.
Exemplo
cSld := Transform(SaldoSb2(),”@E 9,999,999.99")
Media
Retorna a taxa média da moeda em um determinado mês/ano.
Sintaxe
Media(nMoeda,nMes,nAno):
Parâmetros
nMoeda := moeda para cálculo da taxa média
nMes := mês para cálculo da taxa média. Se não informado, é
assumido o mês da data base
nAno := ano para cálculo da taxa média. Se não informado, é
assumido o ano da data base
Exemplo
nTaxa := Media(1)
RecMoeda
Rotina para obtenção do valor da moeda desejada em determinada data.
Sintaxe
RecMoeda(dData,nMoeda)
Parâmetros
dData – Data para obtenção do valor da moeda.
nMoeda – Moeda desejada.
Retorna
Oficina AdvPl Object Página: 69
organon TI Consultoria e Treinamento
SldBco
Retorna o saldo bancário em uma data.
Sintaxe
SldBco(cBanco,cAgência,cConta,dData,nMoeda)
Parâmetros
cBanco – Código do Banco
cAgência – Agência Bancária
cConta – Conta Bancária
dData – Data do Saldo
nMoeda – Moeda do Saldo Bancário
Exemplo
SldBco(“409”,”00198”,”011122”, dDataBase,1)
SldCliente
Retorna o saldo a receber do cliente em uma determinada data.
Sintaxe
SldCliente(cCliente,dData,nMoeda,lSaldo)
Parâmetros
cCliente – Código do Cliente+Loja
dData – Data do Movimento a Receber (padrão é dDataBase)
nMoeda – Moeda
lSaldo – Se .T. considera o saldo do SE5 (padrão é .T.)
Exemplo
SldCliente(“00000101”,dDataBase)
SldFornece
Retorna o saldo a pagar do fornecedor em uma data.
Sintaxe
SldFornece(cFornece,dData,nMoeda,lSaldo)
Parâmetros
cFornece – Código do Fornecedor+Loja
dData – Data do Movimento a Pagar (padrão é dDataBase)
nMoeda – Moeda - (padrão é 1)
lSaldo – Se .T. considera o saldo do SE5 (padrão é .T.)
Exemplo
SldFornece(“00000101")
SldPagar
Retorna o saldo a pagar em uma determinada data.
Sintaxe
SldPagar(dData,nMoeda,lData)
Parâmetros
dData – Data do Movimento a Pagar ( padrão é dDataBase)
nMoeda – Moeda (padrão é 1)
lData – Se .T. Até a Data, .F. Somente Data (padrão é .T.)
Exemplo
SldPagar(dDataBase,1,.T.)
SldReceber
Retorna o saldo a receber em uma data.
Sintaxe
SldReceber(dData,nMoeda,lData)
Parâmetros
dData – Data do Movimento a Receber.
nMoeda – Moeda - default 1
lData – .T. - até a Data; .F. - somente Data (o padrão é .T.)
Exemplo
SldReceber(Data,1,.T.)
XMoeda
Rotina para conversão de valores entre moedas.
Sintaxe
xMoeda(nVMo,nMo,nMd,dData,nDec)
Parâmetros
nVMo – Valor na moeda origem.
nMo – Número da moeda origem.
nMd – Número da moeda destino.
dData – Data para conversão.
nDec – Número de decimais. Se não informado, assume-se 2 casas deci-
mais.
Retorna
nVMoeda – Retorna o Valor na moeda de destino.
Exemplo
nVal := SE1->E1_VALOR // Valor na moeda 1
nVM3 := 0 // Contera o valor na moeda 3
nVM3 := xMoeda(nVal,1,3,dDataBase)
Pontos de Entrada
Dentro dos processos operacionais dos programas é possível criar “aberturas” que
possibilitam a execução de processos distintos a partir de uma rotina do sistema.
Permitir que o sistema seja o mais abrangente possível de acordo com cada tipo de
segmento de negócio.
Ele é útil em processos que podem ser diferentes de acordo com o tipo de negócio
de cada empresa ou estratégia adotada.
Function TMKA010()
If _lTMKMCL
lRetorno := Execblock(“TMKMCI”,.F.,F.,{_aValor})
// aValor é um array que seria recebido pelo usuario em PARAMIXB
Endif
Return( _lRetorno )
Onde
_cCampo ⇒ é o campo a ser atualizado,
Conteúdo ⇒ é o conteúdo que cCampo vai receber
Validação ⇒ é a validação que cCampo vai receber.
Observação: A Validação pode ser uma função ou um valor ‘NIL’. Se for ‘NIL’, as
validações a serem utilizadas para o respectivo campo serão as existentes no SX3.
Se as validações não forem as do SX3, elas devem ser passadas numa função.
Exemplo,
Para uma inclusão simples, tomar como exemplo o MATA250.PRX. Para uma
inclusão com cabeçalho e ítem, tomar como exemplo o CONA050.PRX.
Controle de Semáforo
O controle de Semaforo permite que o sistema controle a Numeração Automática
de Documentos On Line. Temos basicamente 3 funções que gerenciam o controle
do mesmo.
GetSX8Num
Fornece um número seqüencial do controle de Semáforo. Esta função retorna o
próximo número, na seqüência e disponível, para o cadastro no Protheus e
mantém esta numeração para o usuário até o momento em que ele confirme ou
abandone a operação. O Arquivo de Semáforo é usado para evitar a duplicidade de
chaves em ambientes multiusuário. Esta função trabalha junta-mente com outras
duas, chamadas CONFIRMSX8 e ROLLBACKSX8. Verifique os exemplos para
maiores detalhes.
Sintaxe
GetSx8Num(cAlias,cCpoSx8)
Parâmetros
cAlias – Alias do Arquivo
cCpoSx8 – Nome do campo para aplicação do semáforo
Exemplo
Para que o Cadastro de Clientes, por exemplo, carregue na inclusão o
próximo número disponível automaticamente, pode-se utilizar a seguinte
sintaxe no inicializador padrão do campo “A1_COD”:
GetSx8Num(“SA1”)
Caso seja um arquivo especifico, utilize a sintaxe a seguir:
GetSx8Num(“SZ1”,”Z1_COD”)
Para uso em RdMakes, as sintaxes descritas acima também são válidas, não
devendo-se esquecer de que a função GETSX8NUM trabalha junto com as
funções CONFIRMSX8 e ROLLBACKSX8, que devem ser chamadas ao final
do processamento (procedimento que é feito automaticamente em um
inicializador padrão conforme a sintaxe explicada acima).
cCodNew := GetSx8Num(“SZ1”,”Z1_COD”)
// Processamento...
// Confirmacao
ConfirmSx8()
// ou Cancelamento
RollBackSx8()
ConfirmSX8
Confirma o número obtido pela função GETSX8NUM no semáforo como utilizado.
Verifique a função GETSX8NUM para maiores detalhes.
Sintaxe
ConfirmBackSx8()
Exemplo
Verifique os exemplos na função GETSX8NUM.
RollBackSX8
Retorna o número obtido pela função GETSX8NUM no semáforo como pendente.
Verifique a função GETSX8NUM para maiores detalhes.
Sintaxe
Oficina AdvPl Object Página: 74
organon TI Consultoria e Treinamento
RollBackSx8()
Exemplo
Verifique os exemplos na função GETSX8NUM.
Quando usar
Quando temos uma operação em Banco de Dados que necessite que várias
inclusões, alterações ou exclusões só sejam efetuadas quando todas as operações
tenham sido realizadas com sucesso, garantindo com isso que não seja atualizada
parcialmente uma tabela ou que atualize uma tabela e não atualize outra tabela
relacionada.
Como usar
Para definir uma transação, deve-se utilizar os comandos BEGIN TRANSACTION
e END TRANSACTION para definir inicio e fim de uma transação
respectivamente. Todas informações à serem gravadas no Banco devem estar
dentro de uma única transação sejam elas provenientes de uma ou várias tabelas.
Deve-ser evitar utilizar laços (WHILE, FOR) dentro de uma transação, pois a área
de LOG do banco é limitada, e se o volume de informações ultrapassarem este
limite, ocasionará o travamento do banco de dados.
Outro lugar que não deve-se ter o controle de transação refere-se a rotinas de
reprocessamentos ou recálculos, onde as informações podem ser regerados
durante este processo ou onde possamos ter um grande número de locks.
BEGIN TRANSACTION
cExpN1 :=FuncGrava()
END TRANSACTION
Caso exista uma transação dentro de uma outra a segunda será automaticamente
ignorada, fechando-se a transação principal quando da chamada do comando END
TRANSACTION.
Portabilidade
Esta coluna não possui repetição, ela é sempre preenchida com o valor máximo da
coluna R_E_C_N_O_ + 1 nas próximas inserções. Esta operação é feita pelo
TopConnect , se você utiliza outros produtos que fazem inserção na Base de Dados
do Sigaadvanced / AP5 você deve seguir as orientações do Capítulo Integrações
com outros aplicativos.
Limite de registros
Quando os registros são deletados pelo sistema, os mesmos são apenas marcados,
para exclusão física acontece em quando executamos a operação que conhecemos
com Pack de registros. Após esta operação a coluna R_E_C_N_O_ não é
renumerada. Não existe a necessidade de fazer a renumeração desta coluna, a não
ser que você esteja perto de estourar o maior número possível nesta coluna. Neste
caso você precisar extrair os dados do Banco de Dados para uma Base DBF e logo
em seguida subir a Base novamente para o Banco de Dados, automaticamente a
coluna R_E_C_N_O_ será ajustada.
Comandos do TOPCONNECT
TcQuery
Executa uma query (consulta) ao banco de dados, retornando um alias para o
resultado. Semelhante ao comando USE padrão do Clipper, porém executando a
consulta.
Sintaxe
TcQuery <cQuery> [NEW] [ALIAS <cAlias>]
Parâmetros
cQuery – Query a ser executada
NEW – Abre uma nova área de trabalho
ALIAS cAlias – Nome do alias gerado na consulta
Exemplo
cQuery := “Select * from SA1990 for A1_COD > ‘200’”
TQUERY cQuery NEW Alias OTI
TcSQLExec
Esta função executa qualquer syntaxe SQL (não somente consultas como no
comando anterior). Pode ser usada para executar UPDATE, INSERT, DELETE,
etc...
Sintaxe
TcSQLExec(cClause)
Parâmetros
cClause – Clausula a ser executada
Exemplo
cClause := “Create Procedure TSOMA (IN_V1 in number,
OUT_RET ou number) is BEGIN
OUT_RET:=IN_V1+IN_V2”+CHR(59)+”END”+CHR(59)
TCSQLEXEC(cClause)
TcSetField
Esta função serve como apoio ao comando TCQUERY, na recuperação de campos
tipo NUMERIC, DATE e LOGICAL, pois os mesmos são gravados fisicamente no
Banco de Dados como caracteres, e no caso dos numéricos como float.
Sintaxe
TCSetField(<cAlias>, <cField> ,<cType>, [<Prec.Inteira>,<Prec.Decimal>] )
Parâmetros
cAlias – Alias da query a ser ajustada
cField – Campo a ser ajustado
cType – Tipo do campo
Prec.Inteira – Parte inteira
Prec.Decimal – Parte decimal
Exemplo
TCQUERY "SELECT NOME, DATA, MARRIED, VALOR FROM
CUSTOMER" ALIAS QUERY VIA "TOPCONN"
TCSetField("QUERY","DATA","D")
TCSetField("QUERY","VALOR","N",12,2)
TcSPExec
Executa uma Stored Procedure no Banco de Dados.
Devido a uma limitação em alguns dos Bancos de Dados suportados na obtenção
dos tipos de parâmetros (se são de INPUT e/ou OUTPUT) todos as Stored
Procedures a serem executadas através do TOPConnect deverão obedecer o
seguinte padrão de nomenclatura de seus parâmetros :
Parâmetros de INPUT devem começar com IN_... Ex. IN_VALOR.
Parâmetros de OUTPUT devem começar com OUT_... Ex. OUT_CODIGO
Após a execução de uma Stored Procedure o TOPConnect retornará ao ADVPL um
array com 'n' elementos, onde n é o número de parâmetros de OUTPUT da Stored
Procedure.
Leitura Sequencial
dbSelectArea("CLIENTES")
nValor := 0
While !Eof()
If ESTADO = "SP"
nValor += SALDO
Endif
DbSkip()
EndDo
O código acima fará com que todas as linhas(registros) da tabela venham para o
Client, o que irá gerar um número de Queries no servidor igual ao número de
linhas da tabela e cada uma delas irá recuperar apenas uma linha, subtilizando a
capacidade de processamento do servidor.
Objeto
Um objeto é um membro de uma classe, tendo em si todas as características da
classe na qual foi herdado. Suas propriedades são protegidas por conceitos de
encapsulamento.
Mensagem
Uma mensagem é uma solicitação enviada a um objeto para chamar um de seus
métodos. Também podem ser acionadas por algum evento.
Método
Um método é o procedimento ou função chamado para atuar num objeto. Um
método define como uma mensagem deve ser executada.
A OOP (Programação Orientada a Objetos) permite uma abordagem mais simples
para a utilização de dados usando objetos que respondem a mensagens. Esta
abordagem demonstra uma noção de que objetos em um programa são similares a
alunos em uma sala de aula – você passa um exercício ou um trabalho para um
aluno ou à um grupo de alunos (o objeto, neste caso) solicitando que lhe seja
apresentado uma solução para um determinado problema. Supondo-se que o
trabalho seja passado ao aluno ou grupo certo, ele responderá usando sua
experiência e recursos. O método pelo qual o trabalho é executado depende do
objeto receptor (aluno). Os detalhes da resposta são transparentes ao professor
(emissor da mensagem). Todo objeto por regra possui um método
CONSTRUCTOR e um método DESTRUCTOR.
Método CONSTRUCTOR
É o responsável por ativar o objeto durante a execução de uma rotina. Esse método aloca o
objeto na memória e o torna disponível para uso. O objeto será carregado com todas suas
propriedades e particularidades. Somente após o método CONSTRUCTOR ser disparado é
que poderemos em seguida acertar suas propriedades e eventos. No ADVPL, o método
CONSTRUCTOR é chamado pela cláusula New(), como veremos nos exercícios a seguir.
Método DESTRUCTOR
Após a sua utilização, cada objeto deve ser removido da memória, para que no decorrer da
aplicação a performance não seja degradada. Para isso, utilizaremos o método
DESTRUCTOR. No ADVPL, os métodos a serem utilizados são End() ou Destroy().
Eventos
Evento nada mais é do que uma ação acontecendo em um determinado momento
no objeto. Na programação OOP, um evento pode disparar outras rotinas e
modificar o processamento. Foi criado para interagir com as ações do usuário
determinando o processamento de forma inteligente. Vamos imaginar uma tela de
entrada de dados. Podemos ter vários eventos relacionados ao usuário que a
estiver operando, como por exemplo, o clique de um mouse, o movimento do
cursor do mouse sobre algum campo, a seleção de uma determinada tecla, entre
outros. Dependendo da ação, determinamos o que será executado e haverá
interação com o usuário.
Herança
Uma outra característica da OOP é a herança, um recurso que produz um grande
efeito, que lhe permite criar subclasses. Cada subclasse recebe as características de
sua classe-mãe (da mesma forma que uma criança traz consigo características
peculiares de seus pais). Uma subclasse acrescenta novos atributos às classes
herdadas e pode também substituir qualquer atributo herdado.
Encapsulamento
Uma das principais características da OOP é o encapsulamento, pois evita que o
programador não precise acessar diretamente os campos de dados de um objeto.
Para isto é necessário criar métodos que serão os responsáveis pelo tratamento de
dados.
Encapsulamento na verdade é unir numa única estrutura, campos de dados e
códigos que agirão sobre eles (métodos). O grande benefício do encapsulamento é
que o programador trabalha voltado única e exclusivamente ao campo de dados
que deseja atingir com seu código. Outra grande vantagem a ser considerada é a
proteção do código interno, fazendo com que rotinas externas não interfiram
diretamente em seu código.
<oWnd> := TWindow():New(<nTop>,<nLeft>,<nBottom>,<nRight>,<cTitle>,
<nStyle>,<oMenu>,<oBrush>,<oIcon>,<oParent>,[<.vScroll.>],
[<.hScroll.>],<nClrFore>, <nClrBack>, <oCursor>,[Upper(<(border)>)],
!<.NoSysMenu.>,!<.NoCaption.>,!<.NoIconize.>,!<.NoMaximize.>,<.pixel.>)
CLR_BLACK CLR_GRAY
CLR_BLUE CLR_HBLUE
CLR_GREEN CLR_HGREEN
CLR_CYAN CLR_HCYAN
CLR_RED CLR_HRED
CLR_MAGENTA CLR_HMAGENTA
CLR_BROWN CLR_YELLOW
CLR_HGRAY CLR_WHITE
CLR_LIGHTGRAY
CLR_HGRAY
oCursor Não utilizado.
Border Não utilizado.
SysMenu (.T./.F.) .T. exibe botão sysmenu, .F. inibe.
Caption (.T./.F.) .T. exibe titulo da janela, .F. inibe.
Iconize Não utilizado.
Maximize (.T./.F.) .T. exibe botão maximize, .F. inibe.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da janela, .T. em
pixels, .F., modo texto (80/24).
<oWnd>:Activate( [ Upper(<(show)>) ],
<oWnd>:bLClicked [ := \{ |nRow,nCol,nKeyFlags| <uLClick> \} ],
<oWnd>:bRClicked [ := \{ |nRow,nCol,nKeyFlags| <uRClick> \} ],
<oWnd>:bMoved [ := <{uMove}> ],
<oWnd>:bResized [ := <{uResize}> ],
<oWnd>:bPainted [ := \{ | hDC, cPS | <uPaint> \} ],
<oWnd>:bKeyDown [ := \{ | nKey | <uKeyDown> \} ],
<oWnd>:bInit [ := \{ | Self | <uInit> \} ],
[<{uUp}>], [<{uDown}>], [<{uPgUp}>], [<{uPgDn}>],
[<{uLeft}>], [<{uRight}>], [<{uPgLeft}>], [<{uPgRight}>],
[<{uValid}>], [\{|nRow,nCol,aFiles|<uDropFiles>\}],
<oWnd>:bLButtonUp [ := <{uLButtonUp}>
bLClicked Bloco de código disparado quando acionado botão
esquerdo do mouse.
bRClicked Bloco de código disparado quando acionado botão direito
do mouse.
bLDblClick Bloco de código disparado quando acionado duplo clique
do mouse.
bGotFocus Bloco de código disparado quando a janela pega o foco
para si. Equivale à cláusula when.
bLostFocus Bloco de código disparado quando a janela perde o foco.
Equivale à cláusula valid.
bKeyDown Bloco de código disparado quando pressionada uma
tecla. Equivale à cláusula inkey(0).
Ex.: oWnd:bKeyDown := { | nKey,nFlags | MiFuncion (nKey) }
lFocused .T. está com o foco, .F. não está com foco.
End Método de finalização do objeto.
Destroy Método destructor do objeto.
SetFocus Força a obtenção do foco.
Refresh Executa a atualização dos controles da tela.
#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_JAN ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de um objeto de janela simples. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_JAN()
Return
WS_BORDER WS_EX_TRANSPARENT
WS_CAPTION WS_EX_TOOLWINDOW
WS_CHILD WS_EX_TOPMOST
WS_CLIPCHILDREN WS_EX_WINDOWEDGE
WS_CLIPSIBLINGS WS_HSCROLL
WS_DISABLED WS_MAXIMIZE
WS_DLGFRAME WS_MAXIMIZEBOX
WS_EX_ACCEPTFILES WS_MINIMIZE
WS_EX_CLIENTEDGE WS_MINIMIZEBOX
WS_EX_CONTEXTHELP WS_OVERLAPPED
WS_EX_DLGMODALFRAME WS_POPUP
WS_EX_LEFTSCROLLBAR WS_SYSMENU
WS_EX_MDICHILD WS_THICKFRAME
WS_EX_NOPARENTNOTIFY WS_VISIBLE
WS_EX_RIGHT WS_VSCROLL
WS_EX_RTLREADING
nClrText Não utilizado.
nClrBack Seleciona a cor de fundo da janela. Default: branca.
CLR_BLACK CLR_GRAY
CLR_BLUE CLR_HBLUE
CLR_GREEN CLR_HGREEN
CLR_CYAN CLR_HCYAN
CLR_RED CLR_HRED
CLR_MAGENTA CLR_HMAGENTA
CLR_BROWN CLR_YELLOW
CLR_HGRAY CLR_WHITE
CLR_LIGHTGRAY
CLR_HGRAY
oBrush Não utilizado.
oWnd Parent da caixa de diálogo.
Pixel (.T./.F.) Define tipo de posicionamento e métrica da janela, .T. em
pixels, .F., modo texto (80/24).
oIco Não utilizado.
oFont Não utilizado.
nHelpID Não utilizado.
nWidth Não utilizado.
nHeight Não utilizado.
<oDlg>:Activate(<oDlg>:bLClicked[:={|nRow,nCol,nFlags|<uClick>}],
<oDlg>:bMoved [ := <{uMoved}> ],
<oDlg>:bPainted [ := {|hDC,cPS|<uPaint>}],<.center.>,
[{|Self|<uValid>}],[ ! <.NonModal.> ], [{|Self|<uInit>}],
<oDlg>:bRClicked [ := {|nRow,nCol,nFlags|<uRClicked>}],
[{|Self|<uWhen>}] )
bLClicked Bloco de código disparado quando acionado botão
esquerdo do mouse.
bRClicked Bloco de código disparado quando acionado botão direito
do mouse.
bLDblClick Bloco de código disparado quando acionado duplo clique
do mouse.
bValid Bloco de código para validar a saída da janela.
bInit Bloco de código para validar a inicialização da janela.
bWhen Bloco de código para validar a inicialização da janela antes
de ser desenhada na tela.
bGotFocus Bloco de código disparado quando a janela pega o foco
para si. Equivale à cláusula when.
bLostFocus Bloco de código disparado quando a janela perde o foco.
Equivale à cláusula valid.
bKeyDown Bloco de código disparado quando pressionada uma tecla.
Equivale à cláusula inkey(0).
Ex.: oWnd:bKeyDown := { | nKey,nFlags | MiFuncion (nKey) }
lFocused .T. está com o foco, .F. não está com foco.
End Método de finalização do objeto.
Destroy Método destructor do objeto.
SetFocus Força a obtenção do foco.
Refresh Executa a atualização dos controles da tela.
#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_DLG ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de um objeto de diálogo simples. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_DLG()
oDlg:Activate(,,,,,.F.)
Return
Objetos de Controle
Botões
Botões são utilizados para dispararem eventos e rotinas dentro de uma janela.
OADVPL possui dois tipos de botões, derivados da classe TBUTTON (Botão
simples) e SBUTTON (botão estilo speed button, com bitmap).
//Exibe botões
_oBtn1 := TButton():New(130,180,"Botão 1",_oDlg,{|| MSGInfo("Teste de
botão","Teste")},30,12,,,.T.,.T.,,"Teste",,,,)
_oBtn2 := TButton():New(130,210,"Fechar",_oDlg,{|| _oDlg:End()},30,12,,,.T.,.T.,,"Fechar",,,,)
_oDlg:Activate()
Return
#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_BTN2 ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de um objeto de diálogo simples, com botões º±±
±±º ³ de bitmap. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_BTN2()
_oDlg:Activate()
Return
Rótulos de Texto
Rótulos são muito importantes para a definição de campos na tela, bem como
exibição de texto livre. A Classe responsável pela criação de rótulos é a TSAY.
Objetos de rótulo de texto podem ter seu fonte padrão alterado para outro
qualquer encontrado no sistema operacional. Para isso, deve ser criado um objeto
derivado da classe TFONT que terá as características do fonte selecionado. Após
carregar o objeto de fonte, basta declara-lo na propriedade oFont do rótulo de
texto.
<oFont> := TFont():New(<cName>,<nWidth>,<nHeight>,<.from.>,
[<.bold.>],<nEscapement>,,<nWeight>,[<.italic.>])
_oFont := TFont():New("Arial",09,12,,.T.,,,,.T.)
_oDlg:Activate()
Return
Caixas de Texto
Caixas de texto são objetos importantes para entrada de dados. Através desse
objeto pode-se editar valores de campos para serem processados.
_oDlg:Activate()
Return
CheckBox
_oDlg:Activate()
Return
ComboBox
_oDlg:Activate()
Return
ListBox
A classe TLISTBOX criará uma caixa de seleção estilo lista na janela. Seu
funcionamento consiste em armazenar em uma variável numérica ou caracter a
seleção do usuário. Os itens são armazenados em um array, que depois é passado
como propriedade do objeto.
_oDlg:Activate()
Return
Radio Button
_oDlg:Activate()
Return
Folders
Uma importante classe a ser utilizada nas aplicações é a classe Tfolder. Essa classe
nos permite criar várias instâncias de uma aplicação dividindo-as em várias pastas
diferentes. É muito útil por exemplo quando temos uma tela de entrada de dados
muito grande gerando a necessidade de subdividi-la em várias partes
diferenciando por assunto ou outra forma de divisão a critério do desenvolvedor.
_oDlg:Activate()
Return
Browse
#include "protheus.ch"
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_BRW ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Exemplo de criação de Browse. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function OBJ_BRW()
_oDlg:Activate()
Return
Enchoice
GetDados
Rodapé
A janela que traz os itens do cabeçalho é criada pela classe MSMGET e os detalhes
são montados pela classe MSGETDADOS. As informações da GetDados são
provenientes de dois arrays, aHeader e aCols. O aHeader contém informações
sobre os campos, como nome para exibição, tamanho do campo etc. O aCols possui
os dados a serem exibidos. Antes de montar a tela, deve-se criar o aCols e carrega-
lo com as informações da tabela. Um detalhe a ser considerado é que deveremos
criar o aCols com um campo extra no final, pois, ele armazenará um valor lógico
informando se o registro foi deletado ou não. Essa informação será muito útil
durante a gravação dos registros, para que registros descartados não sejam
gravados.
dbSelectArea("SZ1")
MBrowse(006, 001, 022, 075, "SZ1")
Return
Argumentos Descrição
Distância entre a MsGetDados e o extremidade superior do
nSuperior
objeto que a contém.
Distância entre a MsGetDados e o extremidade esquerda do
nEsquerda
objeto que a contém.
Distância entre a MsGetDados e o extremidade inferior do
nInferior
objeto que a contém.
Distância entre a MsGetDados e o extremidade direita do
nDireita
objeto que a contém.
Posição do elemento do vetor aRotina que a MsGetDados usará
nOpc
como referencia.
Função executada para validar o contexto da linha atual do
cLinhaOk
aCols.
Função executada para validar o contexto geral da
cTudoOk
MsGetDados (todo aCols).
Nome dos campos do tipo caracter que utilizarão incremento
cIniCpos automático. Este parâmetro deve ser no formato “+<nome do
primeiro campo>+<nome do segundo campo>+...”.
lApagar Habilita deletar linhas do aCols. Valor padrão falso.
aAlter Vetor com os campos que poderão ser alterados.
uPar1 Parâmetro reservado.
Habilita validação da primeira coluna do aCols para esta não
lVazio
poder estar vazia. Valor padrão falso.
nMax Número máximo de linhas permitidas. Valor padrão 99.
cCampoOk Função executada na validação do campo.
Função executada quando pressionada as teclas
cSuperApagar
<Ctrl>+<Delete>.
uPar2 Parâmetro reservado.
Função executada para validar a exclusão de uma linha do
cApagaOk
aCols.
oWnd Objeto no qual a MsGetDados será criada.
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ OBJ_MOD3 ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Modelo 3 OOP. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function MOD3EXEC(_cAlias, _nRecNo, _nOpc)
//Seleciona area
dbSelectArea("SZ1") //Cabeçalho
dbSetOrder(1) //Filial + Codigo
_oDlg:Activate()
BeginTran()
ATUAMOD3(_nOpc)
EndTran()
Else
RollBackSX8()
EndIf
Return
A função MOD3EXEC() cria uma caixa de diálogo e dentro dela monta o modelo3.
Na inicialização da janela, é chamada no método oDlg:bInit a função EnchoiceBar,
que será responsável pela criação dos botões de confirmação e cancelamento, além
de realizar a validação do modelo3 geral. O segundo parâmetro identifica se foi
confirmada a operação do usuário e dispara a rotina U_MOD3TUDOK(), cujo
retorno dever ser .T. ou .F. dependendo da validação. Caso .F., não deixa encerrar a
tela até que o usuário corrija os campos errados ou em branco.
Subseqüentemente é chamada a classe MSMGET, que irá trazer os dados do
arquivo de cabeçalho na tela. Antes de chamar a classe MSGETDADOS, a rotina
MONTAHEADER é executada para carregar os dados dos vetores aHeader e
aCols.
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³MONTAHEADERº Autor ³ Organon TI º Data ³ 24/07/2003 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Rotina para criar as matrizes aHeader e aCols da GetDados. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Apx / MPx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
Static Function MONTAHEADER(_nOpc)
Local _nUsado := 0
Local _cNum := ""
aHeader := {}
aCols := {}
//Monta o aHeader.
_nUsado := 0
dbSelectArea("SX3")
dbSetOrder(1)
dbSeek("SZ2")
While !EOF() .and. SX3->X3_ARQUIVO == "SZ2"
If X3USO(SX3->X3_USADO) .and.;
cNivel >= SX3->X3_NIVEL .and.;
AllTrim(X3_CAMPO) <> ("Z2_CODIGO")
AADD(aHeader, {Trim(X3TITULO()),;
SX3->X3_CAMPO ,;
SX3->X3_PICTURE ,;
SX3->X3_TAMANHO ,;
SX3->X3_DECIMAL ,;
SX3->X3_VALID ,;
SX3->X3_USADO ,;
SX3->X3_TIPO ,;
SX3->X3_ARQUIVO ,;
SX3->X3_CONTEXT })
_nUsado++
Endif
dbSkip()
EndDo
//Monta o aCols.
//Opcao Inclui.
If _nOpc == 3
For x := 1 to Len("SZ2")
_nUsado := Len(aHeader)
For y := 1 to _nUsado
aCols[1, y] := CriaVar(aHeader[y, 2], .F.)
Next y
Next x
//Monta o aCols.
Else
_nUsado := Len(aHeader)
dbSelectArea("SZ2")
dbSeek(xFilial("SZ2") + M->Z1_CODIGO)
If Found()
For y := 1 to _nUsado
Next
dbSkip()
EndDo
//Se nao encontrar nenhum reg., abre um aCols em vazio apenas para exibir.
Else
nUsado := Len(aHeader)
For y := 1 to _nUsado
Next y
EndIf
EndIf
Return
A função MONTAHEADER irá verificar qual foi a opção selecionada pelo usuário.
Caso tenha escolhido inclusão, abre um aCols com um registro em branco. Nos
demais casos irá varrer a tabela de itens e irá armazenar em sua matriz como se
fosse um filtro. Os dados poderão ser alterados dependendo da operação e
conseqüentemente o processo inverso deverá ser feito para atualizar a tabela. A
rotina responsável por essa ação é a ATUAMOD3.
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ ATUAMOD3 º Autor ³ Organon TI º Data ³ 24/07/2003 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Rotina para gravar os dados da enchoice e das getdados do º±±
±±º ³ modelo3. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Apx / MPx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
Static Function ATUAMOD3(_nOpc)
Local _cVar
Local bCampo := {|nCPO| Field(nCPO)}
RecLock("SZ1", .T.)
Else
RecLock("SZ1", .F.)
EndIf
If "FILIAL" $ Field(x)
FieldPut(x, xFilial("SZ1"))
Else
EndIf
Next x
dbDelete()
EndIf
MsUnlock()
dbSelectArea("SZ2")
dbSeek(xFilial("SZ2") + SZ1->Z1_CODIGO)
While SZ2->Z2_CODIGO == SZ1->Z1_CODIGO
RecLock("SZ2", .F.)
dbDelete()
MsUnlock()
dbSkip()
EndDo
EndIf
For y := 1 to Len(aCols)
If aCols[y][Len(aCols[y])] == .F.
RecLock("SZ2", .T.)
FieldPut(FieldPos("Z2_FILIAL"), xFilial("SZ2"))
FieldPut(FieldPos("Z2_CODIGO"), M->Z1_CODIGO)
For z := 1 to Len(aHeader)
Next z
MsUnlock()
EndIf
Next y
EndIf
Return
Por último deve ser desenvolvida a rotina de validação geral do modelo3. Nessa
rotina poderemos validar qualquer informação da janela, sempre observando o
retorno com valor lógico. Se retornar .F., a janela não encerrará até que o usuário
corrija as informações de acordo com a regra da função.
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ MOD3TUDOK º Autor ³ Organon TI º Data ³ 24/07/2003 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Validação geral do modelo 3. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Apx / MPx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function MOD3TUDOK()
Return(.T.)
Argumentos Descrição
Distancia entre a MsGetDB e o extremidade superior do objeto
nSuperior
que a contém.
Distancia entre a MsGetDB e o extremidade esquerda do objeto
nEsquerda
que a contém.
Distancia entre a MsGetDB e o extremidade inferior do objeto
nInferior
que a contém.
Distancia entre a MsGetDB e o extremidade direita do objeto
nDireita
que a contém.
Posição do elemento do vetor aRotina que a MsGetDB usará
nOpc
como referência.
Função executada para validar o contexto da linha atual do
cLinhaOk
aCols.
Função executada para validar o contexto geral da MsGetDB
cTudoOk
(todo aCols).
Nome dos campos do tipo caracter que utilizarão incremento
cIniCpos automático. Este parâmetro deve ser no formato “+<nome do
primeiro campo>+<nome do segundo campo>+...”.
lApagar Habilita a opção de deletar linhas do aCols. Valor padrão falso.
aAlter Vetor com os campos que poderão ser alterados.
nCongelar Indica qual coluna não ficara congelada na exibição.
Habilita validação da primeira coluna do aCols para esta não
lVazio
poder estar vazia. Valor padrão falso.
[ <oPrn> := ] TMSPrinter():New()
Say
Exibe um texto no relatório.
SayBitmap
Exibe um bitmap no relatório.
Box
Imprime uma caixa no relatório.
Line
Imprime uma linha no relatório.
oPrint:StartPage()
oPrint:Box(0040,0040,0660,1400)
oPrint:SayBitmap(0050,0050,"LogoGM.bmp", 0200, 0200)
oPrint:Say(0060,0280,"Teste de impressão de relatório",oFont1,100)
oPrint:Say(0160,0280,"Teste de impressão de relatório",oFont2,100)
oPrint:Say(0260,0280,"Teste de impressão de relatório",oFont3,100)
oPrint:Say(0360,0280,"Teste de impressão de relatório",oFont4,100)
oPrint:Say(0460,0280,"Teste de impressão de relatório",oFont5,100)
oPrint:Say(0560,0280,"Teste de impressão de relatório",oFont6,100)
oPrint:EndPage()
oPrint:Preview()
Return
Rotinas de Web
Envio de e-mail pelo sistema (Send Mail) através de SMTP
O ADVPL possui rotinas de envio de e-mail através de SMTP. Esse recurso pode
ser muito útil para envio de informações do sistema pela web. Basicamente o envio
de e-mails é feito por três funções básicas. Durante o envio, temos a opção de
enviar ainda arquivos anexos, com cópia e cópia oculta. Também podemos
selecionar o tipo de corpo de mensagem, HTML ou texto.
[<lResult>:=]MailSmtpOff()
Local lResult
Local cBody := '<p><font face="Arial">Teste de envio de e-mail...</font></p>'
If !lResult
MsgInfo("Não foi possível conectar-se ao servidor SMTP...","Atenção")
EndIf
//Envia o e-mail
lResult := MailSend("organon@organon-ti.com.br",{"info@organon-ti.com.br"},{""},{""},;
"Teste de envio de email",cBody,,.F.)
If !lResult
MsgInfo("Não foi possível enviar a mensagem para a conta especificada...","Atenção")
EndIf
If !lResult
MsgInfo("Erro ao tentar desconectar-se do servidor SMTP...","Atenção")
EndIf
Return
Workflow
Objetivos
Requisitos
Servidor de E-mail.
O Workflow necessita obter acesso à algum servidor de email. Este servidor pode
estar em um provedor remoto, acessado através de um proxy server ou através de
uma linha discada(totalmente não recomendável), caso queira enviar emails
para fora da sua empresa. Caso a troca de emails seja simplesmente interna,
poderá ser utilizado um Exchange Server, Lotus Domino Server ou outro servidor
de email interno. O único requisito imprescindível é que estes servidores
trabalhem com protocolos SMTP e POP3.
Conta de E-mail
O Workflow necessita que seja criada uma conta de e-mail especificamente para
ele. Isto é, não poderá ser utilizada para mais nenhum fim.
Peça para o seu provedor criar esta nova conta. Sugerimos como nome da conta
Workflow. Exemplo : workflow@seudominio.com.br
Clientes de E-mail
Parâmetros de Configuração
informada em
MV_WFMAIL.
MV_WFPOP3 Informe o endereço do servidor Pop3 (ex:
pop.microsiga.com.br).
Mail Administr Informe uma conta de email que será notificada de eventos
acontecidos no Workflow. Por exemplo, erros em tempo de
execução(código errado) serão notificados.
Desenvolvimento
Caso queira refinar seu e-mail, poderá inserir dentro dele uma página HTML,
criada por você. Isto não é imprescindível, pois você pode enviar um e-mail
contendo apenas texto. Entretanto, neste último caso, você não terá como controlar
a resposta deste, ou seja, seu processo será baseado apenas no envio de e-mail.
Note que caso você tenha conhecimentos de Java Script, você poderá
adicioná-los à sua página, para programar consistências em inputs de dados. Este
HTML não conterá nenhum dado do Apx / MPx. Será constituído somente do
layout que se deseja para o mesmo. Você poderá refiná-lo com imagens,
AVI’s, etc. Basta somente obedecer as regras citadas acima.
Caso seu HTML tenha um retorno, ele deverá ter na propriedade Action a string
‘mailto:%WFMailTo%’ e a propriedade Method deverá estar setada como POST.
Estas propriedades são do formulário.
Criando seu Ponto de Entrada
hoje são fixos no Apx/MPx. Caso seja necessário criar mais de um ponto, será
necessário contactar o setor de desenvolvimento.
Mostraremos as funções existentes para que se possa fazer uma função para um
processo de Workflow. Note que você deverá ter ótimas noções de
programação ADVPL para entender as funções abaixo.
Criação do Processo
Sintaxe: TWFProcess():New(Código do processo, Descrição do processo)
Ex: oProcess:NewTask(‘Inicio’,”\workflow\WF_450A.htm”)
Indicando um valor para um controle do HTML, que não esteja em uma tabela da
página HTML. No exemplo abaixo, EMISSAO corresponde à um objeto do HTML
cuja propriedade valor inicial seria %EMISSAO%. Sintaxe: ValByName(Nome
Objeto, valor)
Ex: oProcess:AttachFile(“\SIGAMAT\SIGACOM.MNU”)
Iniciando o Processo
Ex: oProcess:Start()
Ex: oProc:oHtml:RetByName(“Aprovacao”)
Finalizando o Processo.
Ex: oProcess:Finish()
Ativando o Workflow
Esta função inicia um Job que fica verificando se existem agendamentos a serem
executados. Compile o programa no seu RPO.
[ONSTART]
jobs=ScheduleWF
[ScheduleWF] Main=U_INITSCHED
As linhas acima indicam que sempre que o servidor do Apx / MPx for iniciado, ele
irá executar as funções contidas em cada job. Você poderá iniciar várias
funções ao mesmo tempo.
Rastreabilidade
Status: Para cada processo o usuário pode definir Status. Status nada mais é do
que um informativo sobre a situação do processo naquele momento. Opção
encontrada no Módulo Configurador - Ambiente->Workflow->Status. Você
deve cadastrar para cada Status de um Processo, um código cujo valor seja maior
que 1000. Valores abaixo deste número são usados pelo Apx / MPx.
Código
Código que identificará o agendamento.
Nome
Identificador do agendamento.
Descrição
Descrição do agendamento.
Tipo
Informe qual o tipo do agendamento:
Data Início
Informe a partir de que data o agendamento será iniciado.
Hora Início
Informe o horário inicial da execução do agendamento.
Data Final
Informe até qual data este agendamento será válido.
Hora Final
Informe o horário final da execução do agendamento.
Intervalo
Informe o intervalo entre o Horário Inicial e Final que será executado o
agendamento.
Ação
Informe a função a ser disparada, com seus parâmetros.
Environment
Informe em qual ambiente do Apx / MPx a função está.
Onde,
XX = Código da Empresa
YY = Código da Filial
Informe após a cláusula Tables os Alias das tabelas a serem abertas,
separados por vírgulas.
Construindo o HTML
Para este exemplo, faremos um HTML muito simples. O mesmo foi feito no
FrontPage Express. Abaixo segue o código do HTML(Grave-o com o nome de
Curso.HTM, em um diretório abaixo do RootPath chamado Workflow.) :
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Favor atualizar o preco deste produto</title>
</head>
<body>
<p>Data: %DATA%</p>
<table border="2">
<tr>
<td width="100">Codigo</td>
<td width="200">Descricao</td>
<td width="120">Preco de venda</td>
</tr>
<tr>
<td>%TB.CODIGO%</td>
<td><input type="text" size="20" name="%TB.DESCRICAO%" value="%TB.DESCRICAO%"></td>
<td><input type="text" size="16" name="%TB.PRECO%" value="%TB.PRECO%"></td>
</tr>
</table>
<p><input type="submit" name="B1" value="Enviar"></p>
</form>
</body>
Repare que no código acima existe o trecho mailto:%WFMailTo%, que teve que ser
incluído na mão.
Neste exemplo, a tabela somente terá os dados de um só produto, mas poderia ter
mais. O código da página HTML permaneceria o mesmo.
Cadastrando Processos e Status.
Para podermos fazer uma rastreabilidade dos processos doWorkflow, deve- mos
cadastrar o processo e os Status deste processo.
No mesmo módulo, cadastre dois Status para este processo : 10001, colocando a
descrição de ‘Email Enviado’ e o 10002, colocando a descrição de ‘Email
Respondido’.
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³ MT010INC ºAutor ³ Organon TI Consultoria º Data ³ 13/05/04 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDesc. ³ Ponto de entrada chamado na confirmação do cadastro de produ- º±±
±±º ³ tos. Usado para disparar a rotina de atualização de precos. º±±
±±º ³ via workflow.
º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ APx º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
User Function MT010INC()
U_OTICADPRWF(0)
Return
If oProcess == Nil
Private oProcess := TWFProcess():New("CADPRO", "Cadastro de Produtos")
EndIf
If _nOpcao == 0
OTISTARTWF(oProcess)
ElseIf _nOpcao == 1
OTIRETWF(oProcess)
ElseIf _nOpcao == 2
OTITOUTWF(oProcess)
EndIf
oProcess:Free()
Return
RastreiaWF(oProcess:fProcessID+'.'+oProcess:fTaskID,oProcess:fProcCode,'10002')
Return
oHTML:ValByName("DATA", DDATABASE)
dbSelectArea("SB1")
AADD((oHTML:ValbyName("TB.CODIGO")), SB1->B1_COD)
AADD((oHTML:ValbyName("TB.DESCRICAO")), SB1->B1_DESC)
AADD((oHTML:ValbyName("TB.PRECO")), Transform(SB1->B1_PRV1,'@E 99,999.99'))
oProcess:cTo := "usuario@workflow.com"
oProcess:UserSiga := "000000"
RastreiaWF(oProcess:fProcessID+'.'+oProcess:fTaskID,oProcess:fProcCode,'10001')
RecLock("SB1")
SB1->B1_WFID := oProcess:fProcessID
MSUnlock()
//Inicia o processo
oProcess:Start()
Return(.T.)
Conout("Time out...")
Return
Return .T.
Após criada esta função no repositório, vamos fazer com que ela seja iniciada
sempre que o servidor do Apx / MPx for iniciado. Para isto, basta
alterarmos o AP6Srv.Ini / MPxSrv.ini, incluindo as seguintes linhas:
[ONSTART]
jobs=ScheduleWF
[ScheduleWF] Main=U_INITSCHED
Estas linhas fazem com que se execute as funções contidas em cada job. Nos
passos acima simplesmente criamos a função de agendamento e a colocamos
para ser iniciada automaticamente no server. Agora, devemos agendar a
função do Workflow que faz a verificação da caixa de entrada da conta criada para
ele. Esta função ao encontrar um email de um processo respondido, executa a
função de retorno do mesmo.