__________Educação Corporativa
Tecnologia e Programação
ADVPL II Advanced O.O.
Junho/2012
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Conteúdo
Programando Para Banco de Dados ...................................................................3
Diferenças e Similaridades entre DBF e SQL .......................................................3
Comandos e Funções para TopConnect .......................................................... 4
TCLINK ................................................................................................... 4
TCUNLINK ............................................................................................... 4
TCSETCONN ............................................................................................ 5
TCSETDUMMY .......................................................................................... 5
TCSRVTYPE ............................................................................................. 6
TCGETDB ................................................................................................ 6
TCDELFILE .............................................................................................. 7
TCGENQRY .............................................................................................. 7
TCSETFIELD ............................................................................................ 7
RETSQLNAME .......................................................................................... 8
SQLORDER .............................................................................................. 8
TCREFRESH ............................................................................................. 8
MSPARSE ................................................................................................ 9
MSPARSEFULL ........................................................................................ 10
TCSQLEXEC ............................................................................................10
TCSQLERROR ......................................................................................... 11
TCSPEXIST ............................................................................................. 11
TCSPEXEC .............................................................................................. 11
Protheus Embedded SQL............................................................................. 12
Programação Orientada a Objetos................................................................... 14
Conceitos Básicos ...................................................................................... 14
Includes ...................................................................................................... 16
Equivalência .............................................................................................. 16
Criando um include customizado ............................................................... 17
Criação de Janelas Padrão OOP ...................................................................... 18
tWindow ................................................................................................... 18
MSDialog .................................................................................................. 20
TFONT ...................................................................................................... 21
TSAY ........................................................................................................ 22
TGET ........................................................................................................ 23
TBUTTON .................................................................................................. 24
Objetos de Controle ...................................................................................... 26
tCONTROL ................................................................................................ 26
tCHECKBOX .............................................................................................. 26
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 1
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
tComboBox ............................................................................................... 28
RADIO ...................................................................................................... 31
tFOLDER ................................................................................................... 32
Editores de Tela ......................................................................................... 34
Montando Janelas ......................................................................................... 35
ListBox ..................................................................................................... 35
ListBox simples - lista de apenas uma coluna no formato de um vetor, a qual
não necessita da especificação de um cabeçalho. ........................................ 35
ListBox MULTIPLOS - lista com diversas colunas que necessita de um cabeçalho
no formato de um aHeader (array de cabeçalho). ....................................... 37
DBTree ..................................................................................................... 38
Enchoice ................................................................................................... 41
MSGetDados ............................................................................................. 43
MSNewGetDados .......................................................................................45
MSSelect .................................................................................................. 47
MSGetdb................................................................................................... 50
Relatórios Gráficos ........................................................................................ 53
TMSPrinter ................................................................................................ 53
TReport .................................................................................................... 55
DEFINE REPORT ...................................................................................... 57
DEFINE SECTION .................................................................................... 57
DEFINE CELL ..........................................................................................57
Pacote Office ................................................................................................ 60
Integração Excel ........................................................................................ 60
DLGTOEXCEL() ....................................................................................... 60
Usando APOLEClient() ............................................................................. 62
Projeto Final ................................................................................................ 64
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 2
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Programando Para Banco de Dados
Podemos utilizar querys no Protheus quando acessamos bancos de dados via
TopConnect.
A utilização de querys melhoram consideravelmente a velocidade das consultas aos
dados e reduzem a sobrecarga no servidor de aplicação, TopConnect e Banco de
Dados.
Normalmente uma query é utilizada em substituição a um Loop (While) na base de
dados de programação convencional. Querys mais complexas utilizando joins poder
ser construídas com a mesma função de vários loops.
Diferenças e Similaridades entre DBF e SQL
A princípio não existem diferenças na programação para a versão SQL, já que pelo
próprio fato de ser uma linguagem interpretada, o sistema é quem se encarrega de
executar os comandos e funções adequadamente no ambiente em que trabalha.
Mas é importante manter algumas informações em mente ao programar para o
ambiente SQL.
Deve-se lembrar que estamos trabalhando com um banco de dados relacional, que
se utiliza de tabelas ao invés de arquivos, e onde o sistema não tem acesso aos
dados de forma nativa e sim através do TopConnect. Essa forma de acesso adiciona
ao sistema algumas das características e vantagens oferecidas pelo SGBD em uso
(por exemplo, o Oracle, MSSQL Server ou o DB2) como por exemplo segurança e
integridade referencial, e as imensas facilidades da linguagem SQL, mas por outro
lado tem-se também as implicações da conversão dos comandos no padrão xBase
para a perfeita compreensão no ambiente SQL.
Imagine a montagem de uma expressão de filtro para um índice condicional. Tome
a seguinte expressão como exemplo: "DTOS(E1_VENCTO) >= DTOS(mv_par01)".
Em um ambiente padrão xBase, como o NTX ou o ADS, pode-se utilizar variáveis
sem qualquer problema em uma expressão de filtro pois a mesma será avaliada
registro a registro durante a montagem do índice. Mas no ambiente SQL, o filtro
nada mais é do que uma tabela temporária, onde estão selecionados apenas os
registros conforme a condição indicada. A seleção de dados em tabelas pelo SQL é
mais rápida, mas em compensação o SGBD não tem como reconhecer a variável
informada na expressão. Ela existe apenas no sistema ou, mais especificamente, no
seu programa.
Por isso, deve-se substituir a expressão anteriormente exemplificada pela seguinte
(que também funcionaria perfeitamente em um ambiente xBase):
"DTOS(E1_VENCTO) >= ‘"+DTOS(mv_par01)+"’". Esta expressão é melhor que
anterior simplesmente porque não se utilizada variável e sim do conteúdo da
mesma, o que pode ser compreendido em qualquer ambiente. Toda essas
explicações são válidas, da mesma maneira, a filtros criados através do comando
SET FILTER.
Ainda existem outros detalhes a se considerar quando se trabalha com índices em
um ambiente SQL. É que na verdade não existem índices condicionais nesse
ambiente. O filtro é criado independente do índice. Então, você pode criar um
INDREGUA com um filtro e mudar a ordem, mas o filtro permanecerá ativo, em
qualquer ordem. Do mesmo modo, não se pode manter, dois índices, com filtros
diferentes, pois um filtro sobrescreveria o outro.
Outro ponto de atenção deve ser a função xBase chamada DBSETINDEX. Podem
ocorrer alguns erros ao tentar-se utilizar essa função para abrir um índice de
trabalho criado. Por esses motivos e pelo fato de tornar o processamento mais
lento deve-se evitar ao máximo o uso de índices de trabalho no ambiente SQL.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 3
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Da mesma maneira que a funcão DBSETINDEX, os comandos COPY TO e APPEND
FROM também devem ter uma atenção especial. No ambiente SQL esses comandos
são executados entre uma tabela e um arquivo DBF (e vice-versa) ou entre dois
arquivos DBF. Por exemplo, o comando COPY TO pode ser usado para copiar os
dados da tabela ativa para um DBF local e o comando APPEND FROM pode ser
usado para importar os dados de um arquivo local para a tabela ativa. Os dois
podem ser usados entre dois arquivos, mas nunca pode-se usar, por exemplo, o
comando APPEND FROM para importar os dados de uma tabela para outra.
Comandos e Funções para TopConnect
TCLINK - Cria uma nova conexão com um banco de dados SGDB através do
DBAccess. Retorna um identificador numérico igual ou maior que zero para a
conexão em caso de sucesso. Em caso de falha, será retornado um número
negativo, indicando uma ocorrência de falha na conexão.
Sintaxe:
TCLINK ( <cConexao>, <cServerAddr>, [nPort] )
Argumento Obrigat. Tipo Descrição
Indica a string de conexão do TOTVS DBAccess, composta
cConexao Sim C por um identificador do tipo da conexão e o nome do
alias/environment da conexão, configurada do DBAccess.
Indica o nome ou endereço IP do servidor onde está o
cServerAddr Sim C
DBAccess, onde a conexão deve ser realizada.
Indica o número da porta TCP que o BAccess está
nPort Não N configurado aguardando por novas conexões. Padrão é
7890.
Exemplo:
nConexao := TcLink("MSSQL/BaseTeste","LocalHost",7890)
If nConexao < 0
UserException("Erro "+CVALTOCHAR(nConexao)+" ao conectar com MSSQL/BaseTeste")
Else
MsgInfo("Conexão com MSSQL/BaseTeste efetuada com sucesso "+CVALTOCHAR(nConexao))
Endif
TCUNLINK - Encerra a conexão especificada com o TOTVS DBAccess. Retorna .T.
se a conexão for encerrada com sucesso, caso contrário returna.F.
Geralmente, as falhas de execução ocorrem quando tentamos encerrar uma
conexão informando um handler inexistente ou já fechada anteriormente.
Sintaxe:
TCUNLINK ( [ nHandler ] )
Argumento Obrigat. Tipo Descrição
Indica o número da conexão que será finalizada. Caso esse
nHandler Não N parâmetro não seja especificado, a conexão ativa/atual será
finalizada.
Exemplo:
nConexao := TcLink("MSSQL/BaseTeste","LocalHost",7890)
...
...
If TCUnlink(nConexao)
MsgInfo(“Conexão encerrada com sucesso”)
Endif
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 4
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
TCSETCONN - Permitir alternar entre conexões ativas em um programa AdvPL ao
DBAccess. Retorna .T. se a conexão corrente for trocada com sucesso. Se a
conexão informada não existir ou já estiver sido fechada, a conexão atual é
mantida e a função retorna .F.
Sintaxe:
TCSETCONN ( nHndConn )
Argumento Obrigat. Tipo Descrição
Indica o número da conexão que deve ser tornar a corrente.
nHndConn Sim N
Este número foi retornado pela função TCLink().
USER FUNCTION FCONECTA()
// Recupera Handler da conexão atual com o DBAccess
// Esta conexão foi feita pelo Framework do AdvPL, usando TCLink()
nAtual := AdvConnection()
// Criando nova conexao
nNew := TcLink("MSSQL/BaseTeste","LOCALHOST",7890)
If nNew < 0
UserException("Erro "+CVALTOCHAR(nNew)+" ao conectar com MSSQL/BaseTeste")
Else
MsgInfo("Conexão com MSSQL/BaseTeste EFETUADA com sucesso "+CVALTOCHAR(nConexao))
Endif
// Volta para conexao salva na variavel nAtual
lRet:=TCSETCONN(nAtual)
If TCUnlink(nNew)
MsgInfo("Conexão MSSQL/BaseTeste ENCERRADA com sucesso")
Endif
Return
TCSETDUMMY - Altera o status do modo 'dummy'. Neste modo o DBAccess realiza
apenas a abertura dos arquivos, sem executar nenhuma função de posicionamento.
Essa função, é utilizada para realizar a abertura mais rápida dos arquivos.
Retorna .T. se operação realizada com sucesso, caso contrário retorna.F.
Qualquer função de posicionamento ou informação de registro só funcionará após a chamada
da função TCSetDummy (.F.).
Sintaxe:
TCSetDummy ( <lValor> )
Argumento Obrigat. Tipo Descrição
Indica se, verdadeiro (.T.), liga o modo "dummy"; caso
lValor Sim L
contrário, falso (.F.).
Exemplo:
TCSetDummy(.t.)
SX2->(DBGOTOP())
WHILE SX2->(!EOF())
DBSELECTAREA( SX2->X2_CHAVE )
DBCLOSEAREA()
SX2->(DBSKIP())
ENDDO
TCSetDummy(.F.)
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 5
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
TCSRVTYPE - Retorna uma string que identifica o tipo da plataforma da conexão
ativa/atual do DBAccess. Caso não haja conexão ativa, será retornada uma string
em branco.
Sintaxe:
TCSRVTYPE()
Exemplo:
If TcSrvType() <> "AS/400"
cQuery := "SELECT AC2.R_E_C_N_O_ AC2RECNO "
cQuery += "FROM "+RetSqlName("AC2")+" AC2 "
cQuery += "WHERE AC2.AC2_FILIAL='"+xFilial("AC2")+"' AND "
cQuery += "AC2.AC2_PROVEN='"+M->AC1_PROVEN+"' AND "
cQuery += "AC2.D_E_L_E_T_<>'*' "
cQuery += "ORDER BY "+SqlOrder(AC2->(IndexKey()))
cQuery := ChangeQuery(cQuery)
dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),"FT010GRV",.T.,.T.)
dbSelectArea("FT010GRV")
While ( !Eof() )
aadd(aRegistro,AC2RECNO)
dbSelectArea("FT010GRV")
dbSkip()
EndDo
dbSelectArea("FT010GRV")
dbCloseArea()
dbSelectArea("AC2")
Endif
TCGETDB - Recupera o tipo do banco de dados relacional em uso, pela conexão
atual com o DBAccess. Retorna uma string contendo um identificador.
Banco de Dados String retornada
Microsoft SQL Server MSSQL
Oracle ORACLE
IBM DB2 ( UDB ) DB2
IBM DB2 ( AS400 / iSeries ) (**) DB2/400
IBM Informix INFORMIX
Sybase SYBASE
PostgreSQL POSTGRES
Generic ODBC Connection ODBC
MySQL MYSQL
Sintaxe:
TCGETDB()
Exemplo:
cDB := TcGetDB()
If Empty(cDB)
MsgStop("Não há conexão ativa.")
Else
MsgInfo("Conectado com "+cDB)
Endif
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 6
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
TCDELFILE - Apaga um arquivo de um banco de dados.
Sintaxe:
TCDELFILE ( cTabela )
Argumento Obrigat. Tipo Descrição
cTabela Sim C Nome da tabela que deve ser apagada.
Exemplo:
If TcDelFile("SA1990")
MSGINFO(“Tabela excluída com sucesso”)
Else
MSGINFO(“Não foi possível excluir a tabela”)
Endif
TCGENQRY - Define a execução de uma Query, a próxima chamada à DBUseArea
será a abertura de uma Query e não de tabela.
Sintaxe:
TCGENQRY ([ xPar1, xPar2, ], cQuery)
Argumento Obrigat. Tipo Descrição
xPar1, xPar2 Não Qualquer Parâmetros apenas para compatibilização. Não tem função.
cQuery Sim C Contém a expressão da query que se deseja executar.
Exemplo:
cQuery := 'SELECT A1_COD, A1_NOME, A1_MUN FROM SA1990'
dbUseArea(.T., 'TOPCONN', TCGenQry(,,cQuery), 'TRB', .F., .T.)
DbSelectArea(“TRB”)
TCSETFIELD - Define formato de campos tipo “numéricos” e “data” de acordo com
o dicionário.
Sintaxe:
TCSETFIELD (cAlias cCampo, cTipo, nTam, nDec)
Argumento Obrigat. Tipo Descrição
cAlias Sim C Alias para aplicação o formato
cCampo Sim C Nome do campo a formatar
cTipo Sim C Tipo do campo
nTam Sim N Tamanho
nDec Sim N Decimal
Exemplo:
cQuery := 'SELECT E2_NUM, E2_VALOR, E2_EMISSAO FROM SE2990'
dbUseArea(.T., 'TOPCONN', TCGenQry(,,cQuery), 'TRB', .F., .T.)
TCSetField( "TRB", "E2_VALOR” , "N", 17, 2 )
TCSetField( “TRB", "E2_EMISSAO”, "D", 8, 0 )
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 7
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
RETSQLNAME - Retorna o nome da tabela de acordo com a empresa posicionada.
Sintaxe:
RETSQLNAME (cAlias)
Argumento Obrigat. Tipo Descrição
CAlias Sim C Alias desejado
Exemplo:
cQuery := " SELECT * FROM " + RetSqlName("SA1") + " WHERE A1_EST=’SP’ ")
// Conteúdo da variável cQuery: SELECT * FROM SA1990 WHERE A1_EST=’SP’
SQLORDER - Retorna a instrução do indice corrente.
Sintaxe:
SQLORDER (cAlias)
Argumento Obrigat. Tipo Descrição
Instrução com a chave, se numérico, busca a expressão
cAlias Sim N ou C da ordem informada, se caracter utiliza a própria
expressão informada.
Exemplo 1
cQry1 := "SELECT * FROM "+RetSqlName("SA1")+" WHERE D_E_L_E_T_ = '' "
cQry1 += "ORDER BY "+SqlOrder("A1_FILIAL+A1_NOME")
// A query acima resultara nessa expressao:
// SELECT * FROM SA1990 WHERE D_E_L_E_T_ = '' ORDER BY A1_FILIAL,A1_NOME
Exemplo 2
SA1->(DbSetOrder(1)) // Chave: A1_FILIAL+A1_COD+A1_LOJA
cQry2 := "SELECT * FROM "+RETSQLNAME("SA1")+CRLF
cQry2 += " WHERE A1_FILIAL='"+XFILIAL("SA1")+"' AND "+CRLF
cQry2 += " D_E_L_E_T_='' "+CRLF
cQry2 += " ORDER BY "+SqlOrder(SA1->(IndexKey()))
dbUseArea(.T.,"TOPCONN", TcGenQry(,,cQry2), "TRBSQL", .T., .F.)
// A query acima resultara nessa expressao:
// SELECT * FROM SA1990
// WHERE A1_FILIAL=' ' AND
// D_E_L_E_T_=''
// ORDER BY A1_FILIAL,A1_COD,A1_LOJA
TCREFRESH - Faz refresh em uma tabela, através de uma leitura forçada da tabela
no banco de dados. Utilizada após o DELETE e o INSERT.
Sintaxe:
TCREFRESH ( cTabela )
Argumento Obrigat. Tipo Descrição
cTabela Sim Caracter Indica nome da tabela que deve ser feito refresh.
Exemplo:
TCSqlExec(“DELETE SA1990 WHERE R_E_C_N_O_ > 50000” )
TCRefresh(cTabela)
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 8
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
MSPARSE - Analisa e converte uma string SQL (Structured Query Language),
escrita em MSSQL (Microsoft Structured Query Language), para um dos bancos de
dados relacionais homologados. Retorna a string SQL convertida para o banco em
questão, ou retorna uma string vazia caso exista algum erro ou impossibilidade na
conversão da procedure.
Sintaxe:
MSParse ( < cSQL>, < cBD>, [ lIsQuery] )
Argumento Obrigat. Tipo Descrição
Indica a string SQL, escrita em MSSQL, que será
cSQL Sim C
convertida.
Indica o nome do banco de dados para o qual será
cBD Sim C
convertida string SQL - Structured Query Language.
Verdadeiro (.T.) irá uma query simples (Exemplo: Select);
lIsQuery Não L
caso contrário, falso (.F.), procedures.
cQry := "SELECT C5_NUM, A1_COD, A1_NOME "
cQry += " FROM SC5990 SC5 "
cQry += " INNER JOIN SA1990 SA1 ON A1_COD=C5_CLIENTE "
cQry += " WHERE SA1.D_E_L_E_T_='' AND SC5.D_E_L_E_T_='' "
cQry += " ORDER BY C5_NUM "
cResultado := MSPARSE(cQry,"INFORMIX")
Resulltado da conversão:
//SELECT
/ C5_NUM , A1_COD , A1_NOME
// FROM SC5990 SC5 inner join SA1990 SA1 ON A1_COD = C5_CLIENTE
// WHERE SA1.D_E_L_E_T_ = '' and SC5.D_E_L_E_T_ = ''
// ORDER BY C5_NUM ;
MSPARSEERROR - Retorna a última mensagem de erro encontrado ao executar a
função MSParse()
Sintaxe:
MSPARSEERROR()
// Exemplo (Veja o comando AND deixado de proposito no final da query, causará erro de espressao)
cQry := "SELECT * FROM SA1990 WHERE A1_EST='SP' AND" // Propositalmente errado
cNovo := MSPARSE(cQry,"INFORMIX")
cERRO:= MSPARSEERROR()
IF !EMPTY( cERRO )
ALERT(“Erro na query “+CRLF+cERRO )
ENDIF
// Conteúdo da variável cERRO: “Parser Error - *** Parse error: Token 'GO', Line 1, Offset 44”
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 9
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
MSPARSEFULL - Analisa uma string SQL (Structured Query Language), escrita em
MSSQL (Microsoft Structured Query Language), e converte para a sintaxe de um
dos bancos de dados relacionais homologados. Retorna “1” caso realize a conversão
corretamente ou “0” caso contrário.
Sintaxe:
MSParseFull ( <cSQL>, < cBD>, < @cErro>, < @cSaida>, [ lbIsQuery] )
Argumento Obrigat. Tipo Descrição
Indica a string SQL, escrita em MSSQL, que será
cSQL Sim C
convertida.
Indica o nome do banco de dados para o qual será
cBD Sim C
convertida string SQL - Structured Query Language.
Indica a mensagem de erro, retornada pela função
cErro Sim C
MSParseError(). Caso vazio, nenhum erro foi retornado.
Indica a string SQL convertida. Caso tenha ocorrido erro, o
cSaida Sim C retorno será apenas até onde foi realizada a conversão para
auxiliar na localização do erro no SQL original.
Indica se, verdadeiro (.T.), é uma query simples (Exemplo:
lbIsQuery Não L
Select); caso contrário, falso (.F.), procedures.
cQry := "SELECT * FROM "+RETSQLNAME("SA1")+CRLF
cQry += " WHERE A1_FILIAL='"+XFILIAL("SA1")+"' AND "+CRLF
cQry += " D_E_L_E_T_='' "+CRLF
cQry += " ORDER BY "+SqlOrder(SA1->(IndexKey()))
cErro := "" // Contera descricao de erro, caso ocorra
cNovo := "" // Contera a query convertida caso nao ocorra erro
cRet := MSParseFull(cQry,"INFORMIX",@cErro,@cNovo)
IF cRET="0"
ALERT("Erro na query "+CRLF+cERRO )
ENDIF
TCSQLEXEC - Executa um comando em SQL. Retorna o status da execução, se
menor que 0 indica que a sentença não foi executada com sucesso.
Sintaxe:
TCSQLEXEC (cComando)
Argumento Obrigat. Tipo Descrição
cComando Sim Caracter Instrução em SQL.
Exemplo:
cQUERY:= "DELETE " + RetSqlName("SZ2") + " WHERE D_E_L_E_T_ = '*'"
nRET:=TCSQLEXEC(cQUERY)
IF nRET < 0
ALERT(“Erro na execucao da query”+CRLF+cQUERY)
ENDIF
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 10
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
TCSQLERROR - Recupera uma string contendo a última ocorrência de erro de
execução de statement e/ou operação, registrado na conexão atual.
Retorna uma string contendo a última mensagem e/ou ocorrênca de erro da
conexão atual registrada após o último statement executado.
Caso o último statement executado não apresente erro, ou ainda o processo atual
não possua nenhuma conexão ativa, a função retornará uma string vazia ("").
Sintaxe:
TCSQLERROR()
Exemplo:
nRet = TCSQLEXEC("INSERT INTO MYTABLE(NAME) VALUES('JOHN DOE')")
If nRet == 0
MsgInfo('Inserção executada')
Else
MsgStop('Falha de Inserção ('+str(nRet,4)+') : '+TcSqlError())
EndIf
TCSPEXIST - Verifica se uma Stored Procedure existe.
Sintaxe:
TCSPEXIST( cStoredProc )
Argumento Obrigat. Tipo Descrição
CStoredProc Sim C Nome da Stored Procedure.
Exemplo:
if TCSPExist("SP000001")
cStr := "DROP PROCEDURE "+ "SP000001 "
TCSqlExec(cStr)
endif
TCSPEXEC - Executa Executa uma Stored Procedure, no banco de dados, com
número variável de parâmetros. Retorna um array contendo os valores de retorno
da SP
Sintaxe:
TCSPEXEC ( cSProc [, xParam1,...,xParamN])--> [array]
Argumento Obrigat. Tipo Descrição
cSProc Sim C Nome da Stored Procedure.
xParamX Não Qualquer Parâmetro(s) da Stored Procedure
// Exemplo
aResult := TCSPEXEC("TESTE", 100)
IF empty(aResult[1])
MsgInfo('Erro na execução da Stored Procedure : '+TcSqlError())
Else
MsgInfo("Retorno String : "+aResult[1])
MsgInfo("Retorno Numerico : "+str(aResult[2]))
MsgInfo("Procedure Executada")
Endif
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 11
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Exercícios SQL
1 - Fazer um programa utilizando “funções de bancos de dados” que imprima os
seguintes campos:
Campos: No. Pedido, Nome do Cliente, Codigo do Produto, Descrição do Produto,
Data de Emissao do Pedido.
Tabelas de Apoio: SC5, SC6, SA1, SB1
2 - Fazer um programa utilizando “funções de bancos de dados” que imprima os
seguintes campos:
Parametros:
Cliente Inicial (SA1)
Cliente Final (SA1)
Ordena por: Cliente/Produto
Analitico / Sintético
Campos: Nome do Cliente, Numero da Nota, Data de Emissao, Código do Produto,
Descrição do Produto, Quantidade, Valor Unitário, Total
Tabelas de Apoio: SD2, SF2, SA1, SB1
Protheus Embedded SQL
O objetivo do Embedded SQL é facilitar a escrita e a leitura de consultas ao banco
de dados. Para isso, foi definida uma sintaxe para que se possa escrever a consulta
diretamente no código AdvPL, sem ter que montar códigos complexos que
dificultam a leitura do comando, porém sua utilização está disponível apenas para
build 7.00.050721p ou superior.
Instrução Descrição
BeginSQL Alias Inicia o Embedded SQL
EndSQL Finaliza a instrução
%xxx% Instrução literal a ser substituída
Especifica tipo de conversão para campos dos tipos data,
Column
numérico ou lógico utilizado em substuição do TCSetField
%exp.% Utilizado para especificar variáveis, expressões e funções.
indica que a consulta não deve passar pela função
%NoParcer%
“ChangeQuery”
%Table:<cAlias>% Indica a tabela a ser utilizada, substitui a função “RetSqlName”
%NotDel% Substitui a expressão D_E_L_E_T_ = ‘ ‘
Define a ordem a utilizar no ORDER BY, substitui a função
%Order:<alias>%
SqlOrder(<Alias>->(IndexKey()))
%Order:<cAlias>, <nIndice>% Define a ordem a utilizar no ORDER BY, substitui a função
SqlOrder(<Alias>->(Indexorder(nIndice)))
%Order:<cAlias>, <nNick>% Define a ordem a utilizar no ORDER BY, substitui a função
SqlOrder(<Alias>->(DBNickIndexKey(cNick)))
GetLastQuery() Retorna um vetor com cinco elementos, com as seguintes
informações da ultima query executada:
[1] - Alias usado para abrir o cursor
[2] - Query executada
[3] - Vetor de campos com critérios de conversão especificados
[4] - Caso .T. não foi utilizada QueryChange na string original
[5] - Tempo em segundos utilizado para a abertura do cursor
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 12
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Limitações:
• A utilização de funções dentro do Código Embedded não é permitida, caso
necessite execute a função antes de iniciar o embedded pois a instrução só
recebe variáveis resolvidas;
• Não é possível debugar.
Exemplo utilizando a forma usual:
cADQry := “SELECT C6_NUM, C6_PRODUTO, C6_QTDVEN, C6_PRCVEN , C6_ENTREG” + CRLF
cADQry += “FROM “ + RetSqlName(“SC6”) + ” C6 “+CRLF
cADQry += “WHERE C6_FILIAL = ‘” + xFilial(“SC6”) + “’ AND D_E_L_E_T_ = ‘ ‘ “+CRLF
cADQry += “ORDER BY “+RetSqlOrder(“SC6”) +CRLF
dbUseArea( .T., “TOPCONN”, TcGenQry(,,cQuery),”TRB”, .T., .T. )
TcSetField(“TRB”, ”C6_QTDVEN”, “N”, 17, 5 )
TcSetField(“TRB”, ”C6_PRCVEN”, “N”, 17, 5 )
TcSetField(“TRB”, ”C6_ENTREG”, “D”, 17, 5 )
Utilizando Embedded SQL:
BeginSQL Alias “TRB”
Column C6_QTDVEN as numeric(17,2)
Column C6_PRCVEN as numeric(17,2)
Column C6_ENTREG as date
%NoParser%
SELECT C6_NUM, C6_PRODUTO, C6_QTDVEN, C6_PRCVEN, C6_ENTREG
FROM %Table:SC6% C6
WHERE C6_FILIAL = %xFilial:SC6% AND %NotDel%
ORDER BY %Order:SC6%
EndSQL
Exercícios Embedded
Fazer um programa utilizando “Embedded SQL” que imprima os seguintes campos:
Campos:
No. Pedido, Nome do Cliente, Codigo do Produto, Descrição do Produto, Data de
Emissao do Pedido.
Tabelas de Apoio: SC5, SC6, SA1, SB1
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 13
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Programação Orientada a Objetos
A análise e projeto orientados a objetos têm como meta identificar o melhor
conjunto de objetos para descrever um sistema de software. O funcionamento
deste sistema se dá através do relacionamento e troca de mensagens entre estes
objetos.
Na programação orientada a objetos, implementa-se um conjunto de classes que
definem os objetos presentes no sistema de software. Cada classe determina o
comportamento (definidos nos métodos) e estados possíveis (atributos) de seus
objetos, assim como o relacionamento com outros objetos.
Programas que utilizam conceitos OO, ao invés de definir funções independentes
que são utilizadas em conjunto, dividem conceitualmente o “problema” em partes
independentes (objetos), que podem conter atributos que os descrevem, e que
implementam o comportamento do sistema através de funções definidas nestes
objetos (métodos). Objetos (e seus métodos) fazem referência a outros objetos e
métodos; o termo “envio de mensagens” é utilizado para descrever a comunicação
que ocorre entre os métodos dos diferentes objetos.
Na prática, um programa orientado a objetos pode ser descrito como um conjunto
de classes pré-definidas ou definidas pelo usuário que possuem atributos e
métodos, e que são instanciadas em objetos, durante a execução do programa.
Conceitos Básicos
Classe representa um conjunto de objetos com diversas características. Uma
classe define o comportamento dos objetos, através de métodos, e quais estados
ele é capaz de manter, através de atributos.
Exemplo de classe: Empresa.
Objeto é uma instância de uma classe. Um objeto é capaz de armazenar estados
através de seus atributos e reagir a mensagens enviadas a ele, assim como se
relacionar e enviar mensagens a outros objetos.
Exemplo de objetos da classe Empresa: Microsiga, ADVPL, Biale.
Atributos são os dados ou informações do objeto, basicamente a estrutura de
dados que vai representar a classe.
Exemplos:
Funcionário: nome, endereço,telefone
Cursos: nome, Tempo, preço
Alunos: Nome, endereco, telefone
Métodos definem as habilidades de cada objeto.
Biale é uma instância da classe Empresa(objeto), que tem habilidade para dar
suporte, implementada através do método SuporteCliente(). A ação só ocorre
quando o método é invocado através do objeto, no caso Biale. Dentro do programa,
a utilização de um método deve afetar apenas um objeto em particular; Todas as
empresas podem dar suporte ao cliente, mas você quer que apenas a Biale de o
suporte. Normalmente, uma classe possui diversos métodos, que no caso da classe
empresa poderiam ser treina(), atendetelefone() .
Mensagem é uma chamada a um objeto para invocar um de seus métodos,
ativando um comportamento descrito por sua classe. Também pode ser direcionada
diretamente a uma classe.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 14
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Herança é o mecanismo pelo qual uma classe (sub-classe) pode estender outra
classe (super-classe), aproveitando seus comportamentos (métodos) e estados
possíveis (atributos). Há Herança múltipla quando uma sub-classe possui mais de
uma super-classe. Essa relação é normalmente chamada de relação "é um".
Um exemplo de herança: pode-se observar as classes 'aluno' e 'professor', onde
ambas possuem atributos como nome, endereço e telefone. Nesse caso pode-se
criar uma nova classe chamada por exemplo, 'pessoa', que contenha as
semelhanças entre as duas classes, fazendo com que aluno e professor herdem as
características de pessoa, desta maneira pode-se dizer que aluno e professor são
subclasses de pessoa.
Encapsulamento consiste na separação de aspectos internos e externos de um
objeto. Este mecanismo é utilizado para impedir o acesso direto aos atributos de
um objeto, disponibilizando externamente apenas os métodos que alteram estes
estados. Exemplo: você não precisa conhecer os detalhes dos circuitos de um
telefone para utilizá-lo. A carcaça do telefone encapsula esses detalhes, provendo a
você uma interface mais amigável (os botões, o monofone e os sinais de tom).
Exemplo Ilustrativo de Classe
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 15
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Includes
Equivalência
A utilização dos includes nos permitem a utilização dos objetos a partir de
equivalências, veja parte do arquivo “[Link]” a seguir:
#xcommand DEFINE MSDIALOG <oDlg> ;
[ <resource: NAME, RESNAME, RESOURCE> <cResName> ] ;
[ TITLE <cTitle> ] ;
[ FROM <nTop>, <nLeft> TO <nBottom>, <nRight> ] ;
[ <lib: LIBRARY, DLL> <hResources> ] ;
[ <vbx: VBX> ] ;
[ STYLE <nStyle> ] ;
[ <color: COLOR, COLORS> <nClrText> [,<nClrBack> ] ] ;
[ BRUSH <oBrush> ] ;
[ <of: WINDOW, DIALOG, OF> <oWnd> ] ;
[ <pixel: PIXEL> ] ;
[ ICON <oIco> ] ;
[ FONT <oFont> ] ;
[ <status: STATUS> ] ;
=> ; //Equivalencia
<oDlg> = MsDialog():New(<nTop>, <nLeft>, <nBottom>, <nRight>, <cTitle>,
<cResName>, <hResources>, <.vbx.>, <nStyle>, <nClrText>, <nClrBack>,
<oBrush>, <oWnd>, <.pixel.>, <oIco>, <oFont> , <.status.> )
Exemplo utiizando forma equivalente a Classe MSDialog:
#INCLUDE "[Link]"
USER FUNCTION fDIALOG()
PRIVATE oDLG
DEFINE MSDIALOG oDLG TITLE "Exemplo MSDialog" FROM 250,180 TO 350,500 PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
RETURN
Agora o mesmo exemplo sem a equivalência:
#INCLUDE "[Link]"
USER FUNCTION fDIALOG ()
PRIVATE oDLG
PRIVATE oDlg := MSDialog():New(250,180,350,500,"Exemplo MSDialog",,,,,,,,,.T.)
oDlg:Activate(,,,.T.,,,)
RETURN
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 16
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Criando um include customizado
Exemplo de arquivo include customizado:
[Link]
#DEFINE STR0001 "Tela para teste de include customizado"
#IFDEF SPANISH
#define STR0002 "Codigo del cliente"
#define STR0003 "Nombre del cliente"
#ELSE
#IFDEF ENGLISH
#define STR0002 "Code of the client"
#define STR0003 "Customer Name"
#ELSE
#define STR0002 "Codigo do cliente"
#define STR0003 "Nome do cliente"
#ENDIF
#ENDIF
Exemplo de fonte utilizando include customizado:
[Link]
#INCLUDE "[Link]"
#INCLUDE "[Link]"
USER FUNCTION fDIALOG()
PRIVATE oCOD, oNOME, oDLG
DEFINE MSDIALOG oDLG TITLE STR0001 FROM 250,180 TO 350,500 PIXEL
@ 010,010 SAY oCOD PROMPT STR0002 SIZE 100, 20 PIXEL OF oDLG
@ 030,010 SAY oNOME PROMPT STR0003 SIZE 100, 20 PIXEL OF oDLG
ACTIVATE MSDIALOG oDlg CENTERED
RETURN
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 17
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Criação de Janelas Padrão OOP
tWindow
Classe de janela principal de programa, deverá existir apenas uma instância deste
objeto na execução do programa.
Propriedades
bInit Bloco de código. Executado quando a janela está sendo exibida.
lEscClose Lógico. Se .T. habilita o <ESC> para cancelar a execução da janela.
oCtlFocus Objeto. Objeto contido na janela que está com foco de entrada de dados
Método New - construtor da janela.
Sintaxe:
TWINDOW():New( [anTop], [anLeft],[anBottom], [anRight], [acTitle], [nPar6],
[oPar7] ,[oPar8],[oPar9], [aoParent], [lPar11], [lPar12], [anClrFore], [anClrBack],
[oPar15], [cPar16], [lPar17], [lPar18], [lPar19], [lPar20],[alPixel] )
Argumento Obrigatório Tipo Descrição
1 AnTop Não N Coordenada vertical superior em pixels ou caracteres.
2 AnLeft Não N Coordenada horizontal esquerda em pixels ou caracteres.
3 AnBottom Não N Coordenada vertical inferior em pixels ou caracteres.
4 AnRight Não N Coordenada horizontal inferior em pixels ou caracteres.
5 acTitle Não C Título da janela.
6 nPar6 Reservado.
7 oPar7 Reservado.
8 oPar8 Reservado.
9 oPar9 Reservado.
10 AoParent Não O Janela mãe da janela corrente.
11 lPar11 Reservado.
12 lPar12 Reservado.
13 anClrFore Não N Cor de fundo da janela.
14 anClrText Não N Cor do texto da janela.
15 oPar15 Reservado.
16 cPar16 Reservado.
17 lPar17 Reservado.
18 lPar18 Reservado.
19 lPar19 Reservado.
20 lPar20 Reservado.
Se .T. (padrão) considera coordenadas passadas em pixels, se
21 AlPixel Não L
.F. considera caracteres.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 18
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Método Activate - Ativa (exibe) a janela. Chamar esse método apenas uma vez.
Sintaxe:
Activate([acShow], [bPar2], [bPar3], [bPar4], [bPar5], [bPar6], [ abInit ], [bPar8],
[bPar9], [bPar10], bPar11],[bPar12] ,[bPar13], [bPar14], [bPar15], [abValid],
[bPar17], [bPar18] )
Argumento Obrigatório Tipo Descrição
“ICONIZED” para janela iconizada ou “MAXIMIZED” para janela
1 AcShow Não C
maximizada.
2 bPar2 Reservado.
3 bPar3 Reservado.
4 bPar4 Reservado.
5 bPar5 Reservado.
6 bPar6 Reservado.
7 AbInit Sim B Executado quando janela está sendo exibida.
8 bPar8 Reservado.
9 bPar9 Reservado.
10 bPar10 Reservado.
11 bPar11 Reservado.
12 bPar12 Reservado.
13 bPar13 Reservado.
14 bPar14 Reservado.
15 bPar15 Reservado.
Bloco de código. Executado quando a janela for solicitada de
16 AbValid Sim B fechar. Deverá retornar .T. se o conteúdo da janela for válido, ou
.F. se não. Se o bloco retornar .F. a janela não fechará.
17 bPar17 Reservado.
18 bPar18 Reservado.
Método End – Solicita fechamento da janela.
Sintaxe:
end()
Retorno - Lógico. .T. se encerrou a janela e .F. se não.
Método Center – Centraliza a janela.
Sintaxe:
Center()
Exemplo:
#INCLUDE "[Link]"
USER FUNCTION fWINDOW()
PRIVATE abInit := {|| alert("Iniciando")}
oWindow:= tWindow():New( 10, 10, 200, 200, "Meu programa",,,,,,,,CLR_BLACK,CLR_WHITE,,,,,,,.T.)
oWindow:Activate(,,,,,,abInit)
RETURN
Utilizando equivalencia:
#INCLUDE "[Link]"
USER FUNCTION fWINDOW ()
PRIVATE abInit := {|| alert("Iniciando")}
DEFINE WINDOW oWindow FROM 10, 10 TO 200,200 PIXEL TITLE "Meu programa" COLOR
CLR_BLACK,CLR_WHITE
ACTIVATE WINDOW oWindow ON INIT abInit
RETURN
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 19
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
MSDialog
MSDialog deve ser utilizada como padrão de janela para entrada de dados.
MSDialog é um tipo de janela diálogo modal, isto é, não permite que outra janela
ativa receba dados enquanto esta estiver ativa.
Método New - Método construtor da classe.
Sintaxe:
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [cPar6], [nPar7],
[lPar8], [nStyle],[anClrText], [anClrBack], [oBrush], [aoWnd], [alPixel], [oIco],
[oFont])
Argumento Obrigatório Tipo Descrição
1 anTop Não N Coordenada vertical superior em pixels ou caracteres.
2 anLeft Não N Coordenada horizontal esquerda em pixels ou caracteres.
3 anBotom Não N Coordenada vertical inferior em pixels ou caracteres.
4 anRight Não N Coordenada horizontal direita em pixels ou caracteres.
5 acCaption Não C Título da janela.
6 cPar6..cPar9 Reservado.
7 nStyle Não N Estilo da Janela
8 anClrText Não N Cor do texto.
9 anClrBack Não N Cor de fundo.
10 oBrush Não Obj Nome do objeto com a classe Brush
Não Obj Janela mãe da janela a ser criada, padrão é a janela
11 aoWnd
principal do programa.
Não Lóg Se .T. considera as coordenadas passadas em pixels, se .F.
12 alPixel
considera caracteres.
13 oIco Não Obj Objeto do Icone
14 oFont Não Obj Objeto da fonte da janela, se nulo, Arial 10
Exemplo utilizando forma equivalente a Classe MSDialog:
#INCLUDE "[Link]"
USER FUNCTION fDIALOG()
PRIVATE oDLG
DEFINE MSDIALOG oDLG TITLE "Exemplo MSDialog" FROM 250,180 TO 350,500 PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
RETURN
Agora o mesmo exemplo sem a equivalência:
#INCLUDE "[Link]"
USER FUNCTION fDIALOG ()
PRIVATE oDLG
PRIVATE oDlg := MSDialog():New(250,180,350,500,"Exemplo MSDialog",,,,,,,,,.T.)
oDlg:Activate(,,,.T.,,,)
RETURN
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 20
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
TFONT
Classe que encapsula fonte de edição.
Método New - Método construtor da classe.
Sintaxe:
New([acName], [nPar2], [anHeight], [lPar4], [alBold], [nPar6],; [lPar7],[nPar8],
[alItalic], [alUnderline])
Argumento Obrigat. Tipo Descrição
1 acName Não C Nome da fonte, o padrão é “Arial”.
2 nPar2 Reservado.
3 anHeight Não N Tamanho da fonte. O padrão é -11.
4 lPar4 Reservado.
5 AlBold Não Log Se .T. o estilo da fonte será negrito.
6 nPar6 Reservado.
7 lPar7 Reservado.
8 nPar8 Reservado.
9 alItalic Não Log Se .T. o estilo da fonte será itálico.
10 alUnderline Não Log Se .T. o estilo da fonte será sublinhado.
Exemplo:
#include “[Link]”
User Function fFONT ()
Local oDlg, oSay
Local oFont:= TFont():New(“Courier New”,,-14,.T.)
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE “Minha tela com Fonte Courier New” PIXEL
// apresenta o tSay com a fonte Courier New //
oSay:= tSay():New(10,10,{||”para exibir”},oDlg,,oFont,,,,.T.,CLR_WHITE,CLR_RED,100,20)
ACTIVATE MSDIALOG oDlg CENTERED
Return
Exemplo utiizando forma equivalente a Classe TFont:
#include "[Link]"
User Function fFONT ()
Local oDlg, oSay, oFont
DEFINE FONT oFont Name "Courier New" SIZE 0,-14 BOLD
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE "Minha tela Courier New" PIXEL
@ 010,010 SAY "para exibir" SIZE 100,20 FONT oFont COLOR CLR_RED PIXEL of ODlg
ACTIVATE MSDIALOG oDlg CENTERED
Return
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 21
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
TSAY
Classe de objetos visuais que exibe o conteúdo de texto estático sobre uma janela
ou controle previamente definidos.
Propriedades:
Lógico. Se .T. quebra o texto em várias linhas de maneira a enquadrar o conteúdo
lWordWrap
na área determinada para o controle, sendo o padrão .F.
Lógico. Se .T. a cor de fundo do controle é ignorada assumindo o conteúdo ou cor
lTransparent
do controle ou janela ao fundo, sendo o padrão .T.
Método New - Método construtor da classe.
Sintaxe:
New([anRow], [anCol], [abText], [aoWnd], [acPicture], [aoFont],[lPar7], [lPar8],
[lPar9], [alPixels], [anClrText], [anClrBack],[anWidth], [anHeight])
Argumento Obrigat. Tipo Descrição
1 anRow Sim N
Coordenada vertical em pixels ou caracteres.
2 anCol Sim N
Coordenada horizontal em pixels ou caracteres.
3 abText Sim B Quando executado deve retornar uma cadeia de caracteres a ser
exibida.
4 aoWnd Sim O
Janela ou diálogo onde o controle será criado.
5 acPicture Não C
Picture de formatação do conteúdo a ser exibido.
6 aoFont Não O Objeto tipo tFont para configuração do tipo de fonte que será
utilizado para exibir o conteúdo.
7 lPar7 Não L Reservado.
8 lPar8 Não L Reservado.
9 lPar9 Não L Reservado.
10 Não L Se .T. considera coordenadas passadas em pixels se .F., padrão,
alPixels
considera as coordenadas passadas em caracteres.
11 anClrText Não N Cor do conteúdo do controle.
12 anClrBack Não N Cor do fundo do controle.
13 anWidth Não N Largura do controle em pixels.
14 anHeight Não N Altura do controle em pixels.
Exemplo:
#include “[Link]”
User Function fSAY()
Local oDlg, oSay
Local oFont:= TFont():New(“Courier New”,,-14,.T.)
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE “Minha tela com Fonte Courier New” PIXEL
// apresenta o tSay com a fonte Courier New //
oSay:= tSay():New(10,10,{||”para exibir”},oDlg,,oFont,,,,.T.,CLR_WHITE,CLR_RED,100,20)
ACTIVATE MSDIALOG oDlg CENTERED
Return
Exemplo utiizando forma equivalente a Classe TSay
#include "[Link]"
User Function fSAY ()
Local oDlg, oSay, oFont
DEFINE FONT oFont Name "Courier New" SIZE 0,-14 BOLD
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE "Minha tela Courier New" PIXEL
@ 010,010 SAY "para exibir" SIZE 100,20 FONT oFont COLOR CLR_RED PIXEL of ODlg
ACTIVATE MSDIALOG oDlg CENTERED
Return
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 22
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
TGET
Classe de objetos visuais do tipo controle tGet, a qual cria um controle que
armazena ou altera o conteúdo de uma variável através de digitação. O conteúdo
da variável só é modificado quando o controle perde o foco de edição para outro
controle.
Propriedades:
Lógico. Se .T. o controle se comporta como entrada de dados de senha, exibindo
lPassword
asteriscos ‘*’ para esconder o conteúdo digitado.
Picture Caractere. Máscara de formatação do conteúdo a ser exibido.
Método New - Método construtor da classe.
Sintaxe:
New([anRow], [anCol], [abSetGet], [aoWnd], [anWidth],[anHeight], [acPict],
[abValid], [anClrFore], [anClrBack], [aoFont],[lPar12], [oPar13], [alPixel],
[cPar15], [lPar16], [abWhen], [lPar18],[lPar19], [abChange], [alReadOnly],
[alPassword], [cPar23],[acReadVar])
Argumento Obrigat. Tipo Descrição
1 AnRow Sim N Coordenada vertical em pixels ou caracteres.
2 AnCol Sim N Coordenada horizontal em pixels ou caracteres.
3 Bloco de código no formato {|u| if( Pcount( )>0, <var>:= u,
AbSetGet Sim B <var> ) } que o controle utiliza para atualizar a variável <var>.
<var> deve ser tipo caracter, numérico ou data.
4 AoWnd Sim O Janela ou controle onde o controle será criado.
5 anWidth Não N Largura do controle em pixels.
6 anHeight Não N Altura do controle em pixels.
7 acPict Não C Máscara de formatação do conteúdo a ser exibido.
8 Bloco de código, opcional. Executado quando o conteúdo do
abValid Não B controle deve ser validado, deve retornar .T. se o conteúdo for
válido e .F. quando o conteúdo for inválido.
9 anClrFore Não N Cor de fundo do controle.
10 anClrBack Não N Cor do texto do controle.
11 Objeto tipo tFont utilizado para definir as características da
aoFont Não O
fonte utilizada para exibir o conteúdo do Controle
12 lPar12 Não L Reservado
13 oPar13 Não O Reservado.
14 alPixel Se .T. as coordenadas informadas são em pixels, se .F. são em
Não L
caracteres.
15 cPar15 Não C Reservado.
16 lPar16 Não L Reservado.
17 Executado quando mudança de foco de entrada de dados está
sendo efetuada na janela onde o controle foi criado. O bloco
abWhen Não B
deve retornar .T. se o controle deve permanecer habilitado ou
.F. se não.
18 lPar18 Não L Reservado.
19 lPar19 Não L Reservado.
20 Executado quando o controle modifica o valor da variável
abChange Não B
associada.
21 alReadOnly Não L Se .T. o controle não poderá ser editado.
22 Se .T. o controle exibirá asteriscos “*” no lugar dos caracteres
alPassword Não L
exibidos pelo controle para simular entrada de senha.
23 cPar23 Não C Reservado.
24 Caractere, opcional. Nome da variável que o controle deverá
acReadVar Não C manipular, deverá ser a mesma variável informada no
parâmetro abSetGet, e será o retorno da função ReadVar( ).
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 23
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Exemplo:
#include '[Link]'
User Function fGET()
Local oDlg, oButton, nGet1:=0
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Meu Get'
oGet1:= TGet():New(10,10,, oDlg,100,20,'@E 999,999.99',;
{|o|nGet1>1000.00},,,,,,.T.,,,,,,,,,,'nGet1')
ACTIVATE MSDIALOG oDlg CENTERED
Return
Exemplo utiizando forma equivalente a Classe TGet:
#include '[Link]'
User Function fGET ()
Local oDlg, oButton, nGet1:=0
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Meu Get'
@10,10 Get oGet1 Var nGet1 Picture "@E 999,999.99" ;
Size 100,20 Pixel Valid nGet1>1000.0 Of oDlg
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( 'O valor é '+Transform(nGet1,'@E 999,999.99') )
Return
TBUTTON
Classe de objetos visuais do tipo botão, o qual permite a utilização.
Propriedades:
lProcessing Lógico. Se .T. indica o botão está efetuando uma ação.
bAction Bloco de código. Executado quando o botão é pressionado.
Método New - Método construtor da classe.
Sintaxe:
New([anRow], [anCol], [acCaption], [aoWnd], [abAction],[anWidth],; [anHeight],
[nPar8], [aoFont], [lPar10],[alPixel],[lPar12],[cPar13], [lPar14], [abWhen],
[bPar16], [lPar17])
Argumento Obrigat. Tipo Descrição
1 AnRow Sim N Coordenada vertical em pixels ou caracteres.
2 AnCol Sim N Coordenada horizontal em pixels ou caracteres.
3 acCaption Sim B Titulo do botão.
4 aoWnd Sim O Janela ou controle onde o botão deverá ser criado.
5 abAction Não N Bloco que deverá ser acionado quando o botão for pressionado.
6 anWidth Não N Largura do botão em pixels.
7 anHeight Não C Altura do botão em pixels.
8 nPar8 Não B Reservado.
9 Objeto tipo tFont com propriedades da
aoFont Não N
fonte utilizada para o título do botão.
10 lPar10 Não N Reservado.
11 Lógico, opcional. Se .T. considera as coordenadas passadas
alPixel Não O
em pixels, se .F. (padrão) considera em caracteres.
12 lPar12 Não L Reservado.
13 cPar13 Não O Reservado.
14 lPar14 Não L Reservado.
15 Executado quando mudança de foco de entrada de dados está sendo
abWhen Não C efetuada na janela onde o controle foi criado. O bloco deve retornar
.T. se o controle deve permanecer habilitado ou .F. se não.
16 bPar16 Não L Reservado.
17 lPar17 Não B Reservado.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 24
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Exemplo:
#include '[Link]'
User Function fBUTTON()
Local oDlg, oButton
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Exemplo Botao'
oButton:=tButton():New(30,10,'fechar',oDlg,{||oDlg:End()},100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
Return
Exemplo utiizando forma equivalente a Classe TButton:
#include '[Link]'
User Function fBUTTON()
Local oDlg, oButton
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Exemplo Botao'
@ 030,010 Button "fechar" Size 100,020 PIXEL OF oDlg action (odlg:end())
ACTIVATE MSDIALOG oDlg CENTERED
Return
Exercício O.O.
Fazer uma janela de diálogo como segue:
Obedecer cores, fontes e formatos
Fontes Utilizadas
Arial 14 Azul Negrito
Verdana 14 Vermelha Negrito
Tahoma 18 Amarela
Script 24 Rosa/Pink
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 25
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Objetos de Controle
tCONTROL
Classe abstrata mãe de todos os controles editáveis. tControl é a classe comum
entre todos os componentes visuais editáveis.
Propriedades:
Lógico. Se .T. indica que o conteúdo da variável associada ao controle foi
lModified
modificado.
Lógico. Se .T. o conteúdo da variável associada ao controle permanecerá apenas
lReadOnly
para leitura.
hParent Numérico. Handle (identificador) do objeto sobre o qual o controle foi criado.
Bloco de código. Executado quando o estado ou conteúdo do controle é modificado
bChange
pela ação sobre o controle.
Métodos SetFocus – Força mudança do foco de entrada de dados para o controle.
Sintaxe:
Setfocus()
tCHECKBOX
Classe de objetos visuais do tipo controle - CheckBox.
Método New - Método construtor da classe
Sintaxe:
New([nRow], [nCol], [cCaption], [bSetGet], [oDlg], [nWidth], [nHeight],
[aHelpIds], [bLClicked], [oFont], [bValid], [nClrText], [nClrPane], [lDesign],
[lPixel], [cMsg], [lUpdate], [bWhen])
Argumento Obrigat. Tipo Descrição
1 nRow Não N Coordenada vertical
2 nCol Não N Coordenada horizontal
3 cCaption Sim C Texto descritivo
4 bSetGet Não B Responsável pela setagem de valor
5 oDlg Não O Nome do objeto da janela a que pertence, ou seja, onde será criado
6 nWidth Não N Largura do objeto
7 nHeight Não N Altura do objeto
8 aHelpIds Não A Array com Help do objeto
9 bLClicked Não B Executado ao clique do mouse.
10 oFont Não O Fonte
11 Executado quando o conteúdo do controle deve ser validado, deve
bValid Não B retornar .T. se o conteúdo for válido e .F. quando o conteúdo for
inválido.
12 nClrText Não N Cor do texto da janela
13 nClrPane Não N Cor de fundo da janela
14 lDesign Não L Não utilizado
15 Se .T. as coordenadas informadas são em pixels, se .F. são em
lPixel Não L
caracteres.
16 cMsg Não C Mensagem ao posicionar o mouse sobre o objeto
17 lUpdate Não L Não utilizado
18 Executado quando mudança de foco de entrada de dados está
bWhen Não B sendo efetuada na janela onde o controle foi criado. O bloco deve
retornar .T. se o controle deve permanecer habilitado ou .F. se não.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 26
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Exemplo:
#include '[Link]'
User function fCHECK()
PRIVATE lCheck1 := .T.
PRIVATE lCheck2 := .F.
PRIVATE lCheck3 := .F.
PRIVATE lCheck4 := .F.
DEFINE MSDIALOG oDlg FROM 0,0 TO 270,400 PIXEL TITLE 'Exemplo da TCheckBox'
//Usando forma nativa da linguagem
oCheck1 := TCheckBox():New(01,01,'CheckBox 001',,oDlg,100,210,,,,,,,,.T.,,,)
oCheck2 := TCheckBox():New(11,01,'CheckBox 002',,oDlg,100,210,,,,,,,,.T.,,,)
//Usando forma equivalente
@21,01 CheckBox oCheck4 Var lCheck3 Prompt 'CheckBox 003' Size 100,210 Pixel Of oDlg
@31,01 CheckBox oCheck5 Var lCheck4 Prompt 'CheckBox 004' Size 100,210 Pixel Of oDlg
// Configuracao blocos codiso - seta Eventos do primeiro Check
oCheck1:bSetGet := {|| lCheck1 } // 1
oCheck1:bLClicked := {|| lCheck1:=!lCheck1 } // 2
oCheck1:bWhen := {|| .T. } // 3
oCheck1:bValid := {|| .T. } // 4
// Configuracao blocos codiso - seta Eventos do segundo Check
oCheck2:bSetGet := {|| lCheck2 } // 1
oCheck2:bLClicked := {|| lCheck2:=!lCheck2 } // 2
oCheck2:bWhen := {|| .T. } // 3
oCheck2:bValid := {|| .T. } // 4
// 1 Variável que sera alterado pelo objeto
// 2 No click altera (inverte) o conteudo da variavel informada
// 3 Se .T. habilita o item do objeto checkbox
// 4 Se bloco de codigo retornar .T. permite alteracao do item do objeto
@ 50,10 BUTTON oFECHAR PROMPT "&Fechar" ;
SIZE 30,15 ;
PIXEL ;
ACTION (MOSTRA(), ODLG:END()) ;
OF ODLG
ACTIVATE MSDIALOG oDlg CENTERED
Return
STATIC FUNCTION MOSTRA()
LOCAL cRESULT := ""
IF lCheck1 = .T.
cRESULT += "Check 1 - clicado"+CRLF
ENDIF
IF lCheck2 = .T.
cRESULT += "Check 2 - clicado"+CRLF
ENDIF
IF lCheck3 = .T.
cRESULT += "Check 3 - clicado"+CRLF
ENDIF
IF lCheck4 = .T.
cRESULT += "Check 4 - clicado"+CRLF
ENDIF
MSGINFO(cRESULT)
RETURN
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 27
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
tComboBox
Classe de objetos visuais a qual cria uma entrada de dados com múltipla escolha
com item definido em uma lista vertical, acionada por F4 ou pelo botão esquerdo
localizado na parte direita do controle. A variável associada ao controle terá o valor
de um dos itens selecionados ou no caso de uma lista indexada, o valor de seu
índice.
Propriedades:
Array. Lista de itens, caracteres, a serem exibidos. Pode ter os seguintes formatos:
aItems a) Seqüencial, exemplo: {“item1”,”item2”,...,”itemN”} ;
b) Indexada, exemplo: {“a=item1”,”b=item2”, ..., “n=itemN”}.
nAt Numérico. Posição do item selecionado.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 28
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Método New - Método construtor da classe
Sintaxe:
New([anRow], [anCol], [abSetGet], [anItems], [anWidth], [anHeight], [aoWnd],
[nPar8], [abChange], [abValid], [anClrText], [anClrBack], [alPixel], [aoFont],
[cPar15], [lPar16], [abWhen], [lPar18], [aPar19], [bPar20], [cPar21], [acReadVar])
Argument
Obrigat. Tipo Descrição
o
1 anRow Não N Coordenada vertical em pixels ou caracteres.
2 anCol Não N Coordenada horizontal em pixels ou caracteres.
3 Bloco de código no formato {|u| if( Pcount( )>0, <var>:= u, <var> ) } que
o controle utiliza para atualizar a variável <var>. <var> deve ser tipo
abSetGet Não B caracter. Se a lista for seqüencial, o controle atualizará <var> com o
conteúdo do item selecionado, se a lista for indexada, <var> será atualizada
com o valor do índice do item selecionado.
4 Lista de items, caracteres, a serem exibidos. Pode ter os seguintes
formatos:
anItems Não N
a) Seqüencial, exemplo: {“item1”,”item2”,...,”itemN”} ou
b) Indexada, exemplo: {“a=item1”,”b=item2”, ..., “n=itemN”}.
5 anWidth Não N Largura do controle em pixels.
6 anHeight Não N Altura do controle em pixels.
7 aoWnd Não O Janela ou controle onde o controle será criado.
8 nPar8 Não N Reservado.
9 abChange Não B Executado quando o controle modifica o item selecionado.
10 Executado quando o conteúdo do controle deve ser validado, deve retornar
abValid Não B
.T. se o conteúdo for válido e .F. quando o conteúdo for inválido.
11 anClrBack Não N Cor de fundo do controle.
12 anClrText Não N Cor do texto do controle.
13 alPixel Não L Se .T. as coordenadas informadas são em pixels, se .F. são em caracteres.
14 Não Objeto tipo tFont utilizado para definir as características da fonte utilizada
aoFont O
para exibir o conteúdo do controle.
15 cPar15 Não C Reservado.
16 lPar16 Não L Reservado.
17 Não Executado quando mudança de foco de entrada de dados está sendo
abWhen B efetuada na janela onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se não.
18 lPar18 Não L Reservado.
19 aPar19 Não A Reservado.
20 bPar20 Não B Reservado.
21 cPar21 Não C Reservado.
22 Não Nome da variável que o controle deverá manipular, deverá ser a mesma
acReadVa
C variável informada no parâmetro abSetGet, e será o retorno da função
r
ReadVar( ).
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 29
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Exemplo:
#INCLUDE "[Link]"
USER FUNCTION fCOMBO()
PRIVATE oDLG,oCOMBO
// Itens que serao apresentados no combobos
PRIVATE aITENS1 := {"ITEM 1","ITEM 2","ITEM 3"}
PRIVATE aITENS2 := {"1=PRIMEIRO","2=SEGUNDO","3=TERCEIRO"}
// Variaveis que terao seus conteudos alterados nos objetos combobox
PRIVATE cCOMBO1 := ""
PRIVATE cCOMBO2 := ""
DEFINE MSDIALOG oDlg TITLE "Exemplo usando COMBOBOX" FROM 200,380 TO 430,700 PIXEL
// Construcao utilizando forma nativa da linguagem
oCOMBO1 := tComboBox():new(010,010,{|U| IF(PCOUNT() > 0,;
cCOMBO1:=U,cCOMBO1)},aITENS1,040,020,oDLG,,;
{|| ALERT("ALTEREI "+cCombo1)},,,,.T.,,,,{|| .T.},,,,,cCOMBO1)
// Construcao utilizando forma equivalente
@ 040,010 COMBOBOX oCOMBO2;
VAR cCOMBO2;
ITEMS aITENS2;
SIZE 040,020;
ON CHANGE ALERT(cCOMBO2);
WHEN .T.;
PIXEL;
OF oDLG
@ 090,010 BUTTON "Fechar" SIZE 070,010 PIXEL OF oDLG ACTION ( oDLG:END() )
ACTIVATE MSDIALOG oDlg CENTERED
RETURN
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 30
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
RADIO
Define o componente visual Radio, também conhecido como RadioMenu, o qual é
seleção de uma opção ou de múltiplas opções através de uma marca para os itens
exibidos de uma lista. Difere do componente CheckBox, pois cada elemento de
check é sempre único, e o Radio pode conter um ou mais elementos.
Sintaxe:
@ nLinha,nColuna RADIO oRadio VAR nRadio 3D SIZE nLargura,nAltura <ITEMS
PROMPT>, cItem1,cItem2,...,cItemX OF oObjetoRef UNIDADE ON CHANGE CHANGE
ON CLICK CLICK
Argumento Obrigat. Tipo Descrição
1 Posição do objeto Radio em função da janela em que ele
nLinha,nColuna Sim N
será definido.
2 oRadio Sim O Objeto do tipo Radio que será criado.
3 nRadio Sim N Item do objeto Radio que está selecionado.
4 Item opcional que define se o RadioButton terá aspecto
3D Não
simples ou 3D.
5 nLargura,nAltura Sim N Dimensões do objeto Radio.
6 Utilizar um dos dois identificadores para definir quais os
<ITEMS PROMPT> Não A
textos que serão vinculados a cada RadioButton.
7 cItem1,...,cItemX Sim C Texto que será vinculado a cada RadioButton.
8 oObjetoRef Sim O Objeto dialog no qual o componente será definido.
9 UNIDADE Não L Unidade de medida das dimensões: PIXEL
10 Função ou lista de expressões que será executada na
CHANGE Não B
mudança de um item de um RadioButton para outro.
11 Função ou lista de expressões que será executada na
CLICK Não B
seleção de um item RadioButton.
Exemplo:
#INCLUDE "[Link]"
USER FUNCTION fRADIO()
PRIVATE oDLG
PRIVATE oRADIO
PRIVATE aRADIO := {}
PRIVATE nRADIO := 0
AADD(aRADIO,"ITEM 1")
AADD(aRADIO,"ITEM 2")
AADD(aRADIO,"ITEM 3")
DEFINE MSDIALOG oDlg TITLE "Exemplo usando tRADIO" ;
FROM 200,380 TO 430,700 PIXEL
@ 005, 010 RADIO oRADIO ;
VAR nRADIO ;
ITEMS aRADIO[1],aRADIO[2],aRADIO[3] ;
SIZE 70,10 ;
PIXEL ;
OF oDLG
@ 070,010 BUTTON "Fechar" SIZE 050,015 PIXEL OF oDLG ;
ACTION ( MSGINFO("Item selecionado "+CVALTOCHAR(nRADIO)), oDLG:END() )
ACTIVATE MSDIALOG oDlg VALID .T. CENTERED
RETURN
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 31
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
tFOLDER
Permite criar um objeto com a finalidade de exibição de bastas.
Sintaxe:
TFolder(): New ( [ nTop], [ nLeft], [ aPrompts], [ aDialogs], [ oWnd], [ nOption], [
nClrFore], [ nClrBack], [ lPixel], [ uParam10], [ nWidth], [ nHeight], [ cMsg], [
uParam14] )
Argumento Obrigat. Tipo Descrição
1 nTop Sim N Indica a coordenada vertical em pixels ou caracteres.
2 nLeft Sim N Indica a coordenada horizontal em pixels ou caracteres.
3 aPrompts Sim V Indica o título das pastas.
4 aDialogs Não V Indica o nome do diálogo.
5 oWnd Sim O Indica a janela ou controle visual onde o objeto será criado.
6 nOption Não N Indica a pasta selecionada.
7 nClrFore Não N Indica a cor de frente da pasta.
8 nClrBack Não N Indica a cor de fundo da pasta.
9 lPixel L Indica se considera as coordenadas passadas em pixels (.T.) ou
Não
caracteres (.F.).
10 uParam10 Não L Compatibilidade.
11 nWidth Não N Indica a largura em pixels do objeto.
12 nHeight Sim N Indica a altura em pixels do objeto.
13 cMsg C Indica a mensagem, do tipo dica de contexto (tooltip/hint), que
Sim será apresentada ao posicionar o ponteiro do mouse sobre o
objeto.
14 uParam14 Não L Compatibilidade.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 32
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Exemplo:
#INCLUDE "[Link]"
USER FUNCTION fFOLDER()
PRIVATE oGRUPO // Objeto que ira controlar o grupo de checkbox
PRIVATE oDLG // Objeto utilizado para montagem da janela
PRIVATE oFOLDER // Objeto utilizado para montagem da janela
PRIVATE oRADIO // Objeto utilizado para configuracao de fontes
PRIVATE aRADIO := {}
PRIVATE nRADIO := 0
AADD(aRADIO,"TESTE 1")
AADD(aRADIO,"TESTE 2")
AADD(aRADIO,"TESTE 3")
PRIVATE aTFolder := {"&Pasta 1","&Pasta 2","&Pasta 3"}
DEFINE MSDIALOG oDlg TITLE "Exemplo usando tRADIO e FOLDER" ;
FROM 200,380 TO 530,930 PIXEL
oFolder := TFolder():New( 5,6,aTFolder,,oDlg,,,,.T.,,250,104 )
// Usando forma equivalente
// @ 005, 005 FOLDER oFOLDER ;
// OF oDLG PROMPT "&Pasta 1","&Pasta 2","&Pasta 3" ;
// PIXEL SIZE 250,100
@ 005, 010 RADIO oRADIO ; // Objeto RADIO que ira
VAR nRADIO ; // aparecer na primeira
ITEMS aRADIO[1],aRADIO[2],aRADIO[3] ; // guia
SIZE 70,10 ;
PIXEL ;
OF oFOLDER:aDIALOGS[1]
@ 010,010 SAY "TESTE"; // Texto que ira aparecer
SIZE 100,20; // na seguinda guia
COLOR CLR_RED;
PIXEL;
OF oFOLDER:aDIALOGS[2]
@ 010,010 SAY "TESTE 2"; // Texto que ira aparecer
SIZE 100,20; // na terceira guia
COLOR CLR_RED;
PIXEL;
OF oFOLDER:aDIALOGS[3]
@ 130,010 BUTTON "OK" ;
SIZE 070,020;
PIXEL;
OF oDLG ;
ACTION ( oDLG:END() )
ACTIVATE MSDIALOG oDlg CENTERED
RETURN
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 33
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Editores de Tela
Existem diversos editores visuais de tela que geram o código em ADPVL
GAIA – Desenvolvido pela Microsiga
MKW - Nativo do Clipper
Designer - Desenvolvido por Analista de Mercado.
Exercicio - Usando Editor de Tela
Faça uma tela conforme a seguir utilizando um dos editores de tela disponíveis.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 34
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Premissas:
Usuário deve trazer o nome do usuário logado.
Criar a tabela de motivos no SX5 – Tabela Z9.
Criar uma arquivo com os seguintes campos: SZ0
Filial C 2 / Motivo C 2 / Observação M 10 / Usuario C 15
Na combo do motivo deve trazer os itens da tabela Z9.
O botão “sim” deve ser habilitado somente se a observação estiver preenchida e o
motivo for diferente de nenhum,
Quando o botão “sim” for clicado as informações da tela deverão ser gravadas na
tabela SZ0.
Montando Janelas
ListBox
A sintaxe clássica da linguagem ADVPL permite que o componente visual ListBox
implemente dois tipos distintos de objetos (simples e multiplos).
ListBox simples - lista de apenas uma coluna no formato de um vetor, a qual não
necessita da especificação de um cabeçalho.
Sintaxe:
@ nLin,nCol LISTBOX oListbox VAR nLista ITEMS aLista SIZE nLarg,nAlt OF oDlg
PIXEL ON CHANGE CHANGE
Atributos:
nLin,nCol Posição do objeto ListBox em função da janela em que ele será definido.
oListBox Objeto ListBox que será criado.
nLista Variável numérica que guarda o item selecionado no ListBox.
aLista Array simples com os itens da lista.
nLarg,nAlt Dimensões do objeto ListBox.
oObjetoRef Objeto dialog no qual o componente será definido.
PIXEL Se informado, as dimensões serão em pixel.
CHANGE Lista de expressões que será executada na seleção de um item do ListBox.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 35
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Exemplo:
#INCLUDE "[Link]"
USER FUNCTION fLIST1()
LOCAL oLISTBOX // Objeto que ira controlar o listbox
PRIVATE nLISTA := 1 // Variavel que contera o numero da linha selecionada
PRIVATE aLISTA := {} // Array que contera os itens do nosso listobox
DBSELECTAREA("SB1")
DBSEEK(XFILIAL("SB1"))
WHILE .NOT. EOF() .AND. B1_FILIAL==XFILIAL("SB1")
AADD(aLISTA,B1_DESC)
DBSKIP()
ENDDO
DEFINE MSDIALOG oDLG TITLE "Minha tela usando LISTBOX" FROM 210,210 TO 468,520 PIXEL
@ 05,05 LISTBOX oLISTBOX; // Criacao do objeto
VAR nLISTA; // Informa a variavel que contera o num do item selecionado
ITEMS aLISTA; // Array com a lista
PIXEL; // Define medidas em pixel
SIZE 145,100; // largura e altura
OF ODLG // A qual objeto (pai) nosso listbox pertence
@ 110,045 BUTTON "OK" ;
SIZE 070,020;
PIXEL;
OF oDLG ;
ACTION ( MSGINFO("Voce selecionou o item "+CVALTOCHAR(nLISTA)) ,
oDLG:END() )
ACTIVATE MSDIALOG ODLG CENTERED
RETURN
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 36
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
ListBox MULTIPLOS - lista com diversas colunas que necessita de um cabeçalho
no formato de um aHeader (array de cabeçalho).
Sintaxe:
@ nLin,nCol LISTBOX oListbox VAR nLista FIELDS HEADER “Header1” … “HeaderX”;
SIZE nLarg,nAlt OF oDlg PIXEL ON CHANGE CHANGE
Atributos:
nLin,nCol Posição do objeto ListBox em função da janela em que ele será definido.
oListBox Objeto ListBox que será criado.
nLista Variável numérica que guarda o item selecionado no ListBox.
“Header1”,...,”HeaderX” Strings identificando os títulos das colunas do Grid.
nLarg,nAlt Dimensões do objeto ListBox.
oObjetoRef Objeto dialog no qual o componente será definido.
PIXEL Se informado, as dimensões serão em pixel.
Lista de expressões que será executada na seleção de um item do
CHANGE
ListBox.
Atributo do objeto ListBox que vincula cada linha,coluna do array, com
bLine
cada cabeçalho do grid.
Métodos:
Método o objeto ListBox que define qual o array contém os dados que serão
SetArray()
exibidos no grid.
Exemplo utilizando múltiplas colunas: (figura 1)
USER FUNCTION fLIST2()
Local oList
Private nLista := 0
Private aLista := {{"Linha 1 a", "Linha 1 b"},{"Linha2 a", "Linha 2 b"}}
DEFINE MSDIALOG _oDlg TITLE "ListBox" FROM 210,210 TO 330,420 PIXEL
@ 05,05 LISTBOX oList ;
FIELDS HEADER "Coluna 1" ,"Coluna 2" ;
PIXEL ;
SIZE 100,50 ;
OF _oDlg
oList:SetArray( aLista )
oList:bLine := {|| {aLista[oList:nAt,1],aLista[oList:nAt,2]}}
ACTIVATE MSDIALOG _oDlg CENTERED
Return
Exemplo utilizando múltiplas colunas mesclado com coluna especial checkbox: (figura 2)
USER FUNCTION fLIST3()
Local OLIST
Local oOk := LoadBitmap( GetResources(), "LBOK" )
Local oNo := LoadBitmap( GetResources(), "LBNO" )
Private nLista := 0
Private aLista := {{.f.,"Linha 1 a", "Linha 1 b"},{.f., "Linha2 a", "Linha 2 b"}}
DEFINE MSDIALOG _oDlg TITLE "ListBox" FROM 210,210 TO 390,480 PIXEL
// Cria Componentes Padroes do Sistema
@ 05,05 LISTBOX oList ;
FIELDS HEADER "", "Coluna 1" ,"Coluna 2" ;
PIXEL ;
SIZE 125,85 ;
OF _oDlg ;
ON dblClick(aLista[oList:nAt,1] := !aLista[oList:nAt,1],oList:Refresh())
oList:SetArray( aLista )
oList:bLine := {|| {Iif(aLista[oList:nAt,1],oOk,oNo),;
aLista[oList:nAt,2],;
aLista[oList:nAt,3]}}
ACTIVATE MSDIALOG _oDlg CENTERED
Return
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 37
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Figura 1 Figura 2
Exercício ListBox
Fazer um programa que monte uma “COMBOBOX” de todas as tabelas onde
x5_tabela = ‘00’.
Na escolha de cada tabela deve montar um listbox com o todas as chaves e a
descrição da tabela escolhida, o listbox deve ser dinâmico.
Fazer uma tela muito parecida com o listbox do exercício anterior.
Criar combo com código e nome do cliente
Montar a listbox de acordo com o cliente escolhido pelo usuário na combo,
contendo todos os títulos do cliente.
• Prefixo
• Numero
• Parcela
• Tipo
• Emissão
• Vencto
• Valor
• Saldo
DBTree
Classe Advpl que permite a criação de um objeto visual do tipo Tree.
Métodos principais:
Contrutor da Classe DbTree.
New
Retorna uma nova instância do Objeto da Classe DbTree.
Através do método AddTree, é possível acrescentar um 'nó' na árvore atual.
AddTree Uma vez acrescentado o nó, as próximas inclusões de itens na árvore serão realizadas
neste nó, até que o mesmo seja fechado através do método EndTree.
Através dele, podemos acrescentar itens na árvore atual ou último nó acrescentado
AddTreeItem
em aberto.
Deve ser utilizado após todos os elementos e itens serem acrescentados a um nó da
EndTree
árvore, aberto com o método AddTree().
Sintaxe:
DbTree():New ( [ nTop ] , [ nLeft ] , [ nBottom ] , [ nRight ] , [oWnd] ,[bchange],
[bRClick] , [lCargo] , [ lDisable ] )
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 38
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Argumento Obrigat. Tipo Descrição
1 nTop Sim N Coordenada vertical superior do Objeto.
2 nLeft Não N Coordenada horizontal esquerda do Objeto.
3 nBottom Não N Coordenada vertical inferior do Objeto.
4 nRight Não N Coordenada horizontal direita do Objeto.
5 oWnd Não O Janela pai do Objeto Tree
6 Code-Block contendo a ação a ser executada na mudança de foco
bchange Não B
entre os elementos da árvore.
7 Code-Block a ser executado quando pressionado o botão direito do
bRClick Não B
Mouse sobre um elemento da árvore.
8 Se .T., indica que os elementos do Tree utilizarão a propriedade
lCargo Não L CARGO, capaz de armazenar uma string identificadora, fornecida
na montagem para cada elemento e item da árvore.
9 Se .T., cria o objeto do Tree desabilitado, não permitindo foco e
lDisable Não L
navegação no mesmo qneuando ele não seja habilitado.
Exemplo
#INCLUDE "[Link]"
USER FUNCTION fDBTREE()
Local cBmp1 := "PMSEDT3"
Local cBmp2 := "PMSDOC"
// Outras imagens que podem ser utilizadas, dentre outras.
// PMSEDT1
// PMSEDT2
// PMSEDT3
// PMSEDT4
// PMSINFO
Private oDlg
Private oDBTree
DEFINE MSDIALOG oDlg TITLE "DBTREE" FROM 0,0 TO 240,500 PIXEL
// A cada mudanca de foco, ira disparar esse bloco de codigo
bChange := {|| teste1(oDBTree:GetCargo())}
// Bloco de codigo executado quando se clica botao direito do mouse
bRclick := {|| teste2(oDBTree:GetCargo())}
// Criando o objeto DbTree
// .T. - Indica que ira utilizar a PROPRIEDADE CARGO, essa armazena uma string
// para cada elemento da arvora
// .F. - Se .T. cria o objeto desabilitado
oDBTree := dbTree():New( 10 , 10 , 95 , 240 , oDlg , bChange , bRclick , .T. , .F.)
// Método AddTree - adicao de novo grupo de itens na arvore
// Método AddTreeItem - adicao de items pertencentes ao grupo acima
oDBTree:AddTree("Pentium 4"+Space(24),,cBmp1,cBmp1, , ,"1.0")
// Titulo do grupo
// Resevado
// Imagem (resouce) usado quando grupo estiver aberto
// Imagem (resouce) usado quando grupo estiver fechado
// Patch imagem usado quando grupo estiver aberto > (usado qdo nao usa resouce)
// Patch imagem usado quando grupo estiver fechado > (usado qdo nao usa resouce)
// String usada para identificar o grupo atual (CARGO)
oDBTree:AddTreeItem("Gabinete",cBmp2,,"1.1")
oDBTree:AddTreeItem("Monitor" ,cBmp2,,"1.2")
oDBTree:AddTreeItem("Teclado" ,cBmp2,,"1.3")
oDBTree:AddTreeItem("Mouse",cBmp2,,"1.4")
oDBTree:AddTreeItem("Som",cBmp2,,"1.5")
// Descricao do items
// Imagem (resouce) usado no item
// Patch imagem usado no item (qdo nao usa resource)
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 39
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
// String usada para identificar o item atual (CARGO)
oDBTree:AddTree("Placa Mãe",.T.,cBmp1,cBmp1,,,"2.0")
oDBTree:AddTreeItem("Processador",cBmp2,,"2.1")
oDBTree:AddTreeItem("Memória" ,cBmp2,,"2.2")
oDBTree:AddTreeItem("Vídeo",cBmp2,,"2.3")
oDBTree:AddTreeItem("Fonte",cBmp2,,"2.4")
oDBTree:EndTree()
oDBTree:AddTreeItem("Fonte",cBmp2,,"TESTE")
oDBTree:EndTree()
oDBTree:AddTree("Pentiun 5",.T.,cBmp1,cBmp1,,,"3.0")
oDBTree:AddTreeItem("Processador",cBmp2,,"3.1")
oDBTree:AddTreeItem("Memória" ,cBmp2,,"3.2")
oDBTree:AddTreeItem("Vídeo",cBmp2,,"3.3")
oDBTree:AddTreeItem("Fonte",cBmp2,,"3.4")
oDBTree:EndTree()
@ 100,210 BUTTON oFECHAR ;
PROMPT "&Fechar" ;
SIZE 30,15 ;
PIXEL ;
ACTION (oDlg:End()) ;
OF ODLG
ACTIVATE MSDIALOG oDlg CENTER
Return
STATIC FUNCTION TESTE1(cCARGO)
MSGINFO("Foco alterado"+cCargo)
Return
STATIC FUNCTION TESTE2(cCARGO)
MSGINFO("Botao direito"+cCargo)
Return
Resultado:
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 40
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Enchoice
Classe Advpl que permite a criação de um objeto visual de tela de captura de
informações compostas por múltiplos campos digitáveis acompanhados de seus
respectivos textos explicativos.
Sintaxe:
Enchoice( cAlias, nReg, nOpc, aCRA, cLetra, cTexto, aAcho, aPos, aCpos, nModelo,;
nColMens, cMensagem, cTudoOk, oWnd, lF3, lMemoria, lColumn, caTela, lNoFolder,
lProperty)
Argumento Obrigat. Tipo Descrição
1 cAlias Sim C Tabela cadastrada no Dicionário de Tabelas (SX2) que será editada
2 nReg Sim N Parâmetro não utilizado
3 Número da linha do aRotina que definirá o tipo de edição (Inclusão,
nOpc Sim N
Alteração, Exclusão, Visualização)
4 aCRA Não A Parâmetro não utilizado
5 cLetra Não C Parâmetro não utilizado
6 cTexto Não C Parâmetro não utilizado
7 Vetor com nome dos campos que serão exibidos. Os campos de
aAcho Não A usuário sempre serão exibidos se não existir no parâmetro um
elemento com a expressão "NOUSER"
8 Vetor com coordenadas para criação da enchoice no formato
aPos Não A
{<top>, <left>, <bottom>, <right>}
9 aCpos Não A Vetor com nome dos campos que poderão ser editados
10 nModelo Não N Se for diferente de 1 desabilita execução de gatilhos estrangeiros
11 nColMens Não N Parâmetro não utilizado
12 cMensagem Não C Parâmetro não utilizado
13 cTudoOk Não C Expressão para validação da Enchoice
14 oWnd Sim O Objeto (janela, painel, etc.) onde a enchoice será criada.
15 Indica se a enchoice esta sendo criada em uma consulta F3 para
lF3 Não L
utilizar variáveis de memória
16 Indica se a enchoice utilizará variáveis de memória ou os campos
lMemoria Não L
da tabela na edição
17 lColumn Não L Indica se a apresentação dos campos será em forma de coluna
18 Nome da variável tipo "private" que a enchoice utilizará no lugar da
caTela Não C
propriedade aTela
19 lNoFolder Não L Indica se a enchoice não irá utilizar as Pastas de Cadastro (SXA)
20 Indica se a enchoice não utilizará as variáveis aTela e aGets,
lProperty Não L
somente suas propriedades com os mesmos nomes
Exemplo
User Function fENCHOICE()
Private cCadastro := " Cadastro de Clientes"
Private aRotina := {{"Pesquisar" , "axPesqui" , 0, 1},;
{"Visualizar" , "U_ModEnc" , 0, 2}}
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
User Function ModEnc(cAlias,nReg,nOpc)
Local aCpoEnch := {}
Local aAlter := {}
Local cAliasE := cAlias
Local aAlterEnch := {}
Local aPos := {000,000,400,600}
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 41
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Local nModelo := 3
Local lF3 := .F.
Local lMemoria := .T.
Local lColumn := .F.
Local caTela := ""
Local lNoFolder := .F.
Local lProperty := .F.
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "A1_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.;
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
DEFINE MSDIALOG oDlg TITLE cCadastro FROM 000,000 TO 400,600 PIXEL
RegToMemory("SA1", If(nOpc==3,.T.,.F.))
Enchoice(cAliasE, nReg, nOpc, , , , aCpoEnch, aPos, aAlterEnch, nModelo, ,;
,, oDlg, lF3, lMemoria, lColumn, caTela, lNoFolder, lProperty)
ACTIVATE MSDIALOG oDlg CENTERED
Return
Resultado:
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 42
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
MSGetDados
Classe de objetos visuais que permite a criação de um grid digitável com uma ou
mais colunas, baseado em um array.
Sintaxe:
MsGetDados():New( nTop, nLeft, nBottom, nRight, nOpc, cLinhaOk, cTudoOk,
cIniCpos, lDelete, aAlter, uPar1, lEmpty, nMax, cFieldOk, cSuperDel, uPar2, cDelOk,
oWnd)
Argumento Obrigat. Tipo Descrição
1 nTop Distancia entre a MsGetDados e o extremidade superior do
Sim N
objeto que a contém.
2 nLeft Distancia entre a MsGetDados e o extremidade esquerda do
Sim N
objeto que a contém.
3 nBottom Distancia entre a MsGetDados e o extremidade inferior do
Sim N
objeto que a contém.
4 nRight Distancia entre a MsGetDados e o extremidade direita do objeto
Sim N
que a contém.
5 nOpc Posição do elemento do vetor aRotina que a MsGetDados usará
Sim N
como referencia.
6 cLinhaOk Função executada para validar o contexto da linha atual do
Não C
aCols.
7 cTudoOk Função executada para validar o contexto geral da MsGetDados
Não C
(todo aCols).
8 cIniCpos Nome dos campos do tipo caracter que utilizarão incremento
Não C automático. Este parâmetro deve ser no formato “+<nome do
primeiro campo>+<nome do segundo campo>+...”.
9 lDelete Não L Habilita excluir linhas do aCols. Valor padrão falso.
10 aAlter Não A Vetor com os campos que poderão ser alterados.
11 uPar1 Não Parâmetro reservado.
12 lEmpty Habilita validação da primeira coluna do aCols para esta não
Não L
poder estar vazia. Valor padrão falso.
13 nMax Não N Número máximo de linhas permitidas. Valor padrão 99.
14 cFieldOk Não C Função executada na validação do campo.
15 cSuperDel Função executada quando pressionada as teclas
Não C
<Ctrl>+<Delete>.
16 uPar2 Não Parâmetro reservado.
17 cDelOk Função executada para validar a exclusão de uma linha do
Não C
aCols.
18 oWnd Não O Objeto no qual a MsGetDados será criada.
Variáveis private:
aRotina Vetor com as rotinas que serão executadas na MBrowse e que definira o tipo
de operação que esta sendo executada (inclusão, alteração, exclusão,
visualização, pesquisa, ...) no formato:
{cTitulo, cRotina, nOpção, nAcesso}, aonde:
nOpção segue o padrão do ERP Protheus para:
Pesquisar,Visualizar,Incluir,Alterar,Excluir
aHeader Vetor com informações das colunas no formato:
{cTitulo, cCampo, cPicture, nTamanho, nDecimais,;
cValidação, cReservado, cTipo, xReservado1, xReservado2}
A tabela temporária utilizada pela MsGetDB deverá ser criada com base no
aHeader mais um último campo tipo lógico que determina se a linha foi
excluída.
lRefresh Variável tipo lógica para uso reservado.
Variáveis públicas:
N Indica qual a linha posicionada do aCols.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 43
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Funções de validação:
cLinhaOk Função de validação na mudança das linhas da grid. Não pode ser definida
como Static Function.
cTudoOk Função de validação da confirmação da operação com o grid. Não pode ser
definida como Static Function.
Métodos adicionais:
ForceRefresh() Atualiza a MsGetDados com a tabela e posiciona na primeira linha.
Hide() Oculta a MsGetDados.
Show() Mostra a MsGetDados.
Exemplo
User Function GTDA01()
Local nI
Local oDlg
Local oGetDados
Local nUsado := 0
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
Private aRotina := {{"Pesquisar", "AxPesqui", 0, 1},;
{"Visualizar", "AxVisual" , 0, 2},;
{"Incluir" , "AxInclui" , 0, 3},;
{"Alterar" , "AxAltera" , 0, 4},;
{"Excluir" , "AxDeleta", 0, 5}}
SX3->(DbSetOrder(1))
SX3->(DbSeek("SA1"))
While SX3->(!Eof()) .and. SX3->X3_ARQUIVO == "SA1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
AAdd (aHeader, {Trim(SX3->X3_TITULO) ,; // titulo
SX3->X3_CAMPO ,; // nome do campo
SX3->X3_PICTURE ,; // mascara do campo
SX3->X3_TAMANHO ,; // tamanho
SX3->X3_DECIMAL ,; // decimais
SX3->X3_VALID ,; // validacao
SX3->X3_USADO ,; // USADO
SX3->X3_TIPO ,; // TIPO DO CAMPO
SX3->X3_ARQUIVO ,; // ALIAS
SX3->X3_CONTEXT}) // Virtual ou Real
EndIf
SX3->(DbSkip())
End
AADD(aCols,Array(nUsado+1))
For nI := 1 To nUsado
aCols[1][nI] := CriaVar(aHeader[nI][2])
Next
aCols[1][nUsado+1] := .F.
oDlg := MSDIALOG():New(000,000,300,400, "MsGetDados -SA1",,,,,,,,,.T.)
oGetDados := MsGetDados():New(05,05,145,195,4,,,,.T.,{"A1_NOME"},,.F.,200,,,,,oDlg)
oDlg:lCentered := .T.
oDlg:Activate()
Return
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 44
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
MSNewGetDados
Classe de objetos visuais que permite a criação de um grid digitável com uma ou
mais colunas, baseado em um array com a diferença que esta classe permite várias
instâncias de GetDados pois não requer aHeader e aCols do tipo private.
Sintaxe:
MsNewGetDados():New(nSuperior, nEsquerda ,nInferior, nDireita, nOpc, cLinOk,;
cTudoOk, cIniCpos, aAlterGDa, nFreeze, nMax, cFieldOk, cSuperDel, cDelOk, oDLG,
aHeader, aCols)
Argumento Obrigat. Tipo Descrição
1 Distancia entre a MsNewGetDados e o extremidade superior do objeto
nSuperior Sim N
que a contem
2 Distancia entre a MsNewGetDados e o extremidade esquerda do objeto
nEsquerda Sim N
que a contem
3 Distancia entre a MsNewGetDados e o extremidade inferior do objeto
nInferior Sim N
que a contem
4 Distancia entre a MsNewGetDados e o extremidade direita do objeto
nDireita Sim N
que a contem
5 nOpc Sim N Operação em execução: 2- Visualizar, 3- Incluir, 4- Alterar, 5- Excluir
6 cLinOk Não C Função executada para validar o contexto da linha atual do aCols
7 Função executada para validar o contexto geral da MsNewGetDados
cTudoOk Não C
(todo aCols)
8 Nome dos campos do tipo caracter que utilizarão incremento
cIniCpos Não C
automático.
9 aAlterGDa Não A Campos alteráveis da GetDados
10 Campos estáticos na GetDados, partindo sempre da posição inicial da
getdados aonde:
nFreeze Não N
Primeiro campo congelado
Primeiro e segundo campos congelados...
11 nMax Não N Número máximo de linhas permitidas. Valor padrão 99
12 cFieldOk Não C Função executada na validação do campo
13 cSuperDel Não C Função executada quando pressionada as teclas <Ctrl>+<Delete>
14 cDelOk Não C Função executada para validar a exclusão de uma linha do aCols
15 oDLG Sim O Objeto no qual a MsNewGetDados será criada
16 aHeader Sim A Array a ser tratado internamente na MsNewGetDados como aHeader
17 aCols Sim C Array a ser tratado internamente na MsNewGetDados como aCols
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 45
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
#INCLUDE "[Link]"
#INCLUDE "[Link]" // Usado pelo "prepare environment" em modo equivalente
USER FUNCTION fNEWGET()
Private cCadastro:="Contatos"
Private aRotina:= {{ "Pesquisar", "AxPesqui" ,0,1},;
{"Visualizar", "u_CTGERAL",0,2} }
mBrowse(6,1,22,75,"SA1")
Return
User Function CTGERAL(cAlias, nReg, nOpc)
Private cOpc
SetPrvt("oDlg","oFlf1","oGetHor","oBrw2")
//Variaveis que definem Acao do Formulario"
Private VISUAL:=.F.
Private INCLUI:=.F.
Private ALTERA:=.F.
Private DELETA:=.F.
Private oFolder1
Private aFolder1 :={"CLIENTES"}
//Private das NewGetDados
Private noGetZ7 :=0
Private aHeaderZ7:={}
Private aColsCP :={}
Private aColsZ7 :={}
aButs:={}
aHeaderZ7:= aClone(ApBuildHeader(cAlias))
ADHeadRec(cAlias, aHeaderZ7)
acolsZ7(nReg,nOpc)
DEFINE MSDIALOG oDlg TITLE "Teste do MsNewgetdados" FROM 150,150 TO 565,925 PIXEL
oGetHor:=MsNewGetDados():New(13,03,193,388,cOpc, "AllwaysTrue",;
"AlwaysTrue",,,000,999,,,,oDlg, aHeaderZ7,aColsZ7)
ACTIVATE MSDIALOG oDlg CENTERED
Return(.T.)
Static Function acolsZ7(nReg,nOpc)
Local nPosAli:= Ascan(aHeaderZ7, {|x| Alltrim(x[2]) == "A1_ALI_WT"})
Local nPosRec:= Ascan(aHeaderZ7, {|x| Alltrim(x[2]) == "A1_REC_WT"})
Local nI:=0
acolsZ7:={}
DbSelectArea("SA1")
SA1->(DbSetOrder(1))
SA1->(dbgoto(nReg))
aAdd(acolsZ7,Array(Len(aHeaderZ7)+1))
For nI:=1 To Len(aHeaderZ7)
If aHeaderZ7[nI][10] <> 'V'
aColsZ7[Len(acolsZ7)][nI]:=SA1->&(aHeaderZ7[nI][2])
Elseif !aHEaderZ7[ni][2] $ "A1_ALI_WT|A1_REC_WT" // :=Criavar)aHeaderZ7[ni][2]
acolsZ7[LEN(aColsZ7)][nI]:=Criavar(aHeaderZ7[nI][2])
Endif
Next
aColsZ7[LEN(aColsZ7),nPosAli]:=&("SA1->(Alias())")
aColsZ7[LEN(aColsZ7),nPosRec]= nReg // Indica se a linha esta Deletada
aColsZ7[LEN(aColsZ7)][Len(aHeaderZ7)+1]:=.F. // Indica se a linha esta Deletada
Return
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 46
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Resultado:
MSSelect
Classe que cria um objeto browse (ou grid), com a primeira coluna sendo do tipo
marcação.
Propriedades:
oWnd Objeto pai da MsSelect (MSDIALOG, MSWINDOW, MSPANEL)
oBrowse Objeto browse (ou grid) da MsSelect, herdado da classe TCBROWSE
Sintaxe:
MsSelect():NEW ( < cAlias > , [ cCampo ] , [ cCpo ] , [ aCampos ] , [ lInv ] ,;
[ cMar ] , [ aCord ] ,[ cTopFun ] , [ cBotFun ] ,[ oWnd ] , [ reserved ] , [ aColors ] )
Argumento Obrigat. Tipo Descrição
1 cAlias Sim C Tabela que será utilizada pela MsSelect
2 cCampo Sim C Campo que será utilizado na coluna de marcação
3 Campo da tabela informada pelo parametro cAlias ou função que será
cCpo Sim C executada na apresentação da coluna que indica se a linha da MsSelect
esta habilitada ou não
4 Vetor com informações dos campos para criação das colunas da MsSelect.
Se não for informado, a MsSelect irá criar as colunas baseado no
Dicionário de Campos (SX3) da tabela informada no parametro cAlias.
Formato:
aCampos Sim A 1 - campo ou bloco de código com conteúdo que será apresentado na
coluna pela MsSelect
2 - não utilizado
3 - cabeçalho
4 - máscara de apresentação (picture)
5 lInv Não L Indica se MsSelect irá utilizar marcação invertida
6 Marca que será utilizada pela MsSelect para controle do campo informado
cMar Sim C pelo parametro cCampo. Para utilizar o parametro cMar, utilize a função
GetMark para retornar a próxima marca.
7 Coordenadas para criação da MsSelect.
Formato:
1 - Linha inicial
aCord Não A
2 - Coluna inicial
3 - Linha final
4 - Coluna final
8 Função que retornará o conteúdo inicial que a MsSelect utilizará para
apresentar a primeira linha da tabela, como um range, junto com o
parametro cBotFun.
cTopFun Não C
O conteúdo retornado será utilizado para fazer o posicionamento da tabela
informada pelo parametro cAlias, baseado na chave de índice posicionada
para a mesma.
9 Função que retornará o conteúdo final que a MsSelect utilizará para
apresentar a última linha da tabela, como um range, junto com o
parametro cTopFun.
cBotFun Não C
O conteúdo retornado será utilizado para o posicionamento final da tabela
informada pelo parametro cAlias, baseado na chave de índice posicionada
para a mesma
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 47
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
10 oWnd Não O Objeto pai da MsSelect (MSDIALOG, MSWINDOW, MSPANEL, etc.)
11 reserved Não Parametro reservado
12 Vetor com regras para a apresentação da coluna de legenda.
Formato:
1 - Expressão ADVPL com retorno lógico que indica se a cor será utilizada
pela coluna
2 - cor da coluna:
BR_AMARELO
BR_AZUL
aColors Não A BR_BRANCO
BR_CINZA
BR_LARANJA
BR_MARROM
BR_PINK
BR_PRETO
BR_VERDE
BR_VERMELHO
#INCLUDE "[Link]"
USER FUNCTION fMSSELEC()
Local _stru :={}
Local aCpoBro :={}
Local oDlgLocal
Private aCores := {}
Private lInverte := .F.
Private cMark := GetMark()
Private oMark
//Cria um arquivo de Apoio
AADD(_stru,{"OK" ,"C" ,2 ,0 })
AADD(_stru,{"COD" ,"C" ,6 ,0 })
AADD(_stru,{"LOJA" ,"C" ,2 ,0 })
AADD(_stru,{"NOME" ,"C" ,40 ,0 })
AADD(_stru,{"MCOMPRA","N" ,17 ,2 })
AADD(_stru,{"END" ,"C" ,40 ,0 })
AADD(_stru,{"STATUS" ,"C" ,2 ,0 })
cArq:=Criatrab(_stru,.T.)
DBUSEAREA(.t.,,carq,"TTRB")
//Alimenta o arquivo de apoio com os registros do cadastro de clientes (SA1)
DbSelectArea("SA1")
DbGotop()
While SA1->(!Eof())
DbSelectArea("TTRB")
RecLock("TTRB",.T.)
TTRB->COD := SA1->A1_COD
TTRB->LOJA := SA1->A1_LOJA
TTRB->NOME := SA1->A1_NOME
TTRB->MCOMPRA := SA1->A1_MCOMPRA
TTRB->END := SA1->A1_END
TTRB->STATUS := "0" //Verde
MsunLock()
SA1->(DbSkip())
Enddo
//Define as cores dos itens de legenda.
aCores := {}
aAdd(aCores,{"Marked('OK')" ,"BR_VERDE" })
aAdd(aCores,{"!Marked('OK')","BR_AMARELO" })
//Define quais colunas (campos da TTRB) serao exibidas na MsSelect
aCpoBro := {{ "OK" ,, "Mark" ,"@!" },;
{ "COD" ,, "Codigo" ,"@!" },;
{ "LOJA" ,, "Loja" ,"@!" },;
{ "NOME" ,, "Nome" ,"@X" },;
{ "MCOMPRA" ,, "Maior Compra" ,"@E 999,999,999.99"},;
{ "End" ,, "Endereco" ,"@!"}}
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 48
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
//Cria uma Dialog
DEFINE MSDIALOG oDlg TITLE "MarkBrowse c/Refresh" From 9,0 To 315,800 PIXEL
DbSelectArea("TTRB")
DbGotop()
//Cria a MsSelect
oMark := MsSelect():New("TTRB","OK","",aCpoBro,@lInverte,@cMark,;
{17,1,150,400},,,,,aCores)
oMark:bMark := {| | Disp()}
ACTIVATE MSDIALOG oDlg CENTERED ON INIT EnchoiceBar(oDlg,{|| CONTAR(),oDlg:End()},{||
oDlg:End()})
//Fecha a Area e elimina os arquivos de apoio criados em disco.
TTRB->(DbCloseArea())
Iif(File(cArq + GetDBExtension()),FErase(cArq + GetDBExtension()) ,Nil)
Return
//Funcao executada ao Marcar/Desmarcar um registro.
Static Function Disp()
RecLock("TTRB",.F.)
If Marked("OK")
TTRB->OK := cMark
Else
TTRB->OK := ""
Endif
MSUNLOCK()
oMark:oBrowse:Refresh()
Return()
STATIC FUNCTION CONTAR()
LOCAL nReg := RECNO()
LOCAL nMARK := 0
DBGOTOP()
WHILE !EOF()
IF Marked("OK")
nMARK++
ENDIF
DBSKIP()
ENDDO
DBGOTO(nREG)
MSGINFO("Registros marcados "+CVALTOCHAR(nMARK))
RETURN
Resultado:
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 49
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
MSGetdb
Classe de objetos visuais que permite a criação de um grid digitável com uma ou
mais colunas, baseado em uma tabela temporária.
Sintaxe:
MsGetDB():New(nTop, nLeft, nBottom, nRight, nOpc, cLinhaOk, cTudoOk,
cIniCpos, lDelete, aAlter, nFreeze, lEmpty, uPar1, cTRB, cFieldOk, lCondicional,
lAppend, oWnd, lDisparos, uPar2, cDelOk, cSuperDel)
Argumento Obrigat. Tipo Descrição
1 nTop Sim N Distancia entre a MsGetDB e o extremidade superior do objeto que a contém.
2 Distancia entre a MsGetDB e o extremidade esquerda do objeto que a
nLeft Sim N
contém.
3 nBottom Sim N Distancia entre a MsGetDB e o extremidade inferior do objeto que a contém.
4 nRight
Sim N Distancia entre a MsGetDB e o extremidade direita do objeto que a contém.
5 nOpc Sim N Posição do elemento do vetor aRotina que a MsGetDB usará como referência.
6 cLinhaOk Sim C Função executada para validar o contexto da linha atual do aCols.
7 cTudoOk Sim C Função executada para validar o contexto geral da MsGetDB (todo aCols).
8 Nome dos campos do tipo caracter que utilizarão incremento automático. Este
cIniCpos Sim C parâmetro deve ser no formato “+<nome do primeiro campo>+<nome do
segundo campo>+...”.
9 lDelete Sim L Habilita a opção de excluir linhas do aCols. Valor padrão falso.
10 aAlter Sim A Vetor com os campos que poderão ser alterados.
11 nFreeze Sim N Indica qual coluna não ficara congelada na exibição.
12 Habilita validação da primeira coluna do aCols para esta não poder estar
lEmpty Sim L
vazia. Valor padrão falso.
13 uPar1 Sim Parâmetro reservado.
14 cFieldOk Sim C Função executada na validação do campo.
15 cTRB Sim C Alias da tabela temporária.
16 lCondicional Sim L Reservado
17 Indica se a MsGetDB ira criar uma linha em branco automaticamente quando
lAppend Sim L
for inclusão.
18 cDelOk Sim C Função executada para validar a exclusão de uma linha do aCols.
19 Indica se será utilizado o Dicionário de Dados para consulta padrão,
lDisparos Sim L
inicialização padrão e gatilhos.
20 uPar2 Sim Parâmetro reservado.
21 cSuperDel Sim C Função executada quando pressionada as teclas <Ctrl>+<Delete>.
22 oWnd Sim O Objeto no qual a MsGetDB será criada.
Variáveis private:
aRotina Vetor com as rotinas que serão executadas na MBrowse e que definira o tipo de
operação que esta sendo executada (inclusão, alteração, exclusão, visualização,
pesquisa, ...) no formato:
{cTitulo, cRotina, nOpção, nAcesso}, aonde:
nOpção segue o padrão do ERP Protheus para:
Pesquisar,Visualizar,Incluir,Alterar,Excluir
aHeader Vetor com informações das colunas no formato:
{cTitulo, cCampo, cPicture, nTamanho, nDecimais,;
cValidação, cReservado, cTipo, xReservado1, xReservado2}
A tabela temporária utilizada pela MsGetDB deverá ser criada com base no aHeader mais
um último campo tipo lógico que determina se a linha foi excluída.
lRefresh Variável tipo lógica para uso reservado.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 50
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Variáveis públicas:
nBrLin Indica qual a linha posicionada do aCols.
Funções de validação:
cLinhaOk Função de validação na mudança das linhas da grid. Não pode ser definida
como Static Function.
cTudoOk Função de validação da confirmação da operação com o grid. Não pode ser
definida como Static Function.
Métodos adicionais:
ForceRefresh() Atualiza a MsGetDados com a tabela e posiciona na primeira linha.
Exemplo
#INCLUDE "[Link]"
USER FUNCTION fMSGETDB()
Private cCadastro := "Cadastro de . . ."
Private aRotina := { {"Pesquisar" ,"AxPesqui",0,1} ,;
{"Visualizar" ,"u_mgetdb",0,2} ,;
{"Incluir" ,"u_mgetdb",0,3} ,;
{"Alterar" ,"u_mgetdb",0,4} ,;
{"Excluir" ,"u_mgetdb",0,5} }
Private cString := "SB1"
dbSelectArea(cString)
dbSetOrder(1)
mBrowse( 6,1,22,75,cString)
return
USER FUNCTION mgetdb(calias,nrec,nopc)
Local x,odlg,ogetdb
Local aStruct := {}
Local nUsado := 0
private aHeader := {}
private aAltera := {}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SB1")
While !Eof() .and. SX3->X3_ARQUIVO == "SB1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
Aadd(aHeader,{Trim(X3Titulo()),;
SX3->X3_CAMPO,;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;
SX3->X3_TIPO,;
"",;
"" })
Aadd(aAltera,SX3->X3_CAMPO)
Aadd(aStruct,{SX3->X3_CAMPO,;
SX3->X3_TIPO,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL})
EndIf
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 51
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
DbSkip()
End
Aadd(aStruct,{"FLAG","L",1,0})
cCriaTrab := CriaTrab(aStruct,.T.)
DbUseArea(.T.,__LocalDriver,cCriaTrab,,.T.,.F.)
DEFINE MSDIALOG oDlg TITLE "Documentação - MsGetDb" FROM 00,00 TO 300,400 PIXEL
oGetDB := MsGetDB():New(05, 05, 145, 195, 3, "U_LINHAOK",;
"U_TUDOOK", "+A1_COD", .T., aAltera, 1, .F., , cCriaTrab, ;
"U_FIELDOK", , .T., oDlg, .T., ,"U_DELOK", "U_SUPERDEL")
ACTIVATE MSDIALOG oDlg CENTERED
DbSelectArea(cCriaTrab)
DbCloseArea()
return
User Function LINHAOK()
ApMsgStop("LINHAOK")
Return .T.
User Function TUDOOK()
ApMsgStop("LINHAOK")
Return .T.
User Function DELOK()
ApMsgStop("DELOK")
Return .T.
User Function SUPERDEL()
ApMsgStop("SUPERDEL")
Return .T.
User Function FIELDOK()
ApMsgStop("FIELDOK")
Return .T.
Resultado:
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 52
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Relatórios Gráficos
TMSPrinter
Cria um novo relatório.
Métodos:
New Método construtor da classe.
SetPortrait Define orientação de página do relatório como retrato
SetLandscape Define a orientação de página do relatório como paisagem
StartPage Inicializa uma nova página de impressão
EndPage Finaliza um página de impressão
End Encerra o objeto
Imprime texto nas coordenadas informadas pelos parametros, utilizando as
Say
especificações do objeto TFont, cor da fonte e cor de fundo
SayBitmap Imprime uma imagem nas coordenadas informadas pelos parametros
Desenha uma linha baseado nas coordenadas informadas pelos parametros,
Line
utilizando as especificações do objeto TPen.
Desenha uma caixa baseado nas coordenadas informadas pelos parametros,
Box
utilizando as especificações do objeto TPen.
FillRect Preenche um retangulo na impressão utilizando as especificações do objeto TBrush.
Preview Apresenta preview do relatório.
Setup Mostra tela de Configuração de impressao
Print Imprime o que já estiver instanciado
Desenha uma linha simples iniciando na linha atual de impressão com a largura da
ThinLine
página
Desenha uma linha com altura maior que a do método ThinLine, iniciando na linha
FatLine
atual de impressão com a largura da página
Exemplo
# INCLUDE "[Link]"
USER FUNCTION relgra()
PRIVATE cData := dtoc(Date())
PRIVATE cTime := time()
PRIVATE cTitulo := "Impressão - Relatório de produtos"
PRIVATE nPag := 0
PRIVATE oPrn, oArial07, oArial09B ,oArial14B
DEFINE FONT oArial10 NAME "Arial" SIZE 0,10 OF oPrn
DEFINE FONT oArial10B NAME "Arial" SIZE 0,10 OF oPrn BOLD
DEFINE FONT oArial12B NAME "Arial" SIZE 0,12 OF oPrn BOLD
DEFINE FONT oArial20B NAME "Arial" SIZE 0,16 OF oPrn BOLD
oPrn := TMSPrinter():New(cTitulo)
oPrn:SetPortrait()
meucabec()
itens()
oPrn:EndPage()
oPrn:End()
oPrn:Preview()
oPrn:End()
Return
STATIC FUNCTION itens()
Local nCont := 0
Local nLin := 300
Local cTipo := " "
BeginSQL Alias "TRB"
%NoParser%
Select B1_COD, B1_DESC, B1_UM, B1_TIPO from %Table:SB1% B1
ORDER BY B1_TIPO,B1_UM
EndSQL
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 53
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
TRB->(dbGoTop())//COLOCA-SE O APELIDO ANTES DE QQ COMANDO DE BANCO DE DADOS POR
PRECAUCAO
ctipo := TRB->B1_UM
While TRB->(!EOF())// TRB->(<COMANDO>)
If nLin > 2000
oPrn:EndPage()
meucabec()
nLin := 300 Endif
oPrn:Say(nLin,0020,TRB->B1_COD,oArial10)
oPrn:Say(nLin,0250,TRB->B1_DESC,oArial10)
oPrn:Say(nLin,1040,TRB->B1_UM,oArial10)
oPrn:Say(nLin,1240,TRB->B1_TIPO,oArial10)
nCont := nCont + 1
nLin := nLin + 50
TRB->(dbSkip()) // Avanca o ponteiro do registro no arquivo
if cTipo <> TRB->B1_UM
nLin := nLin + 50
oPrn:Say(nLin,0020,"Total por Unidade : "+cTipo + " - ";
+cValtochar(nCont),oArial10B,,CLR_RED)
nCont := 0
cTipo := TRB->B1_UM
nLin := nLin + 150
Endif
Enddo
TRB->(dbCloseArea())
Return
Static function meucabec()
nPag++
oPrn:StartPage()
oPrn:SayBitmap(nLinIni1,nColIni1,"[Link]",nLinFim1,nColFim1)
oPrn:Say(0020,0600,"RELATÓRIO DO CADASTRO DE PRODUTO",oArial20B)
oPrn:Say(0100,1040,"DATA:",oArial12B)
oPrn:Say(0100,1240,cData,oArial12B)
oPrn:Say(0100,1500,"HORA:",oArial12B)
oPrn:Say(0100,1700,cTime,oArial12B)
oPrn:Say(0100,1900,"PAGINA:",oArial12B)
oPrn:Say(0100,2100,cvaltochar(nPag),oArial12B)
oPrn:Line(0150,0000,0150,3000)
oPrn:Say(0200,0020,"[Link]",oArial10b)
oPrn:Say(0200,0250,"Produto",oArial10b)
oPrn:Say(0200,1040,"Unidade",oArial10b)
oPrn:Say(0200,1240,"Tipo",oArial10b)
oPrn:Line(0250,0000,0250,3000)
Return
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 54
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Exercício TMSPrinter
Incluir um relatorio de Clientes, relacionando todo o seu faturamento e seus titulos
a receber, a cada quebra deverá ter uma separação com uma linha (usem o
método line() )
Logo a esquerda
Data
Hora
Pagina
Cabecalho em negrito e separado por linhas(line())
Quebrar por Cliente
totalizar, Valor Total da Nota, Valor do ICMS, Valor do IPI
Detalhamento da quebra (Negrito e em Azul)
TReport
Classe de impressão que substitui as funções SetPrint, SetDefault, RptStatus e
Cabec. Ela permite que o usuário personalize as informações que serão
apresentadas no relatório, alterando fonte (tipo, tamanho, etc), cor, tipo de linhas,
cabeçalho, rodapé, etc.
Estrutura do componente TReport:
O relatório (TReport) contém 1 ou mais seções (TRSection);
Uma seção (TRSection) pode conter 1 ou mais seções;
A seção (TRSection) contém células pré-definidas e células selecionadas pelo
usuário;
A seção (TRSection) também contém as quebras (TRBreak) para impressão de
totalizadores (TRFunction);
Os totalizadores são incluídos pela seção que automaticamente inclui no relatório
(TReport).
Pré-Requisitos
Para utilizar o TReport, verifique se o seu repositório está com o Release 4 do
Protheus-8, ou versão superior.
A função TRepInUse() verifica se a lib do TReport está liberada no repositório em
uso. O retorno é uma variável lógica.
Exemplo
#include "[Link]"
User Function MyReport()
Local oReport
If TRepInUse() //verifica se a opção relatórios personalizáveis está disponível
Pergunte("MTR025",.F.)
oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return
Verifique também o parâmetro MV_TReport. Para utilizar os relatórios
personalizáveis, o parâmetro MV_TREPORT (tipo numérico) deve ser alterado no
ambiente Configurador, conforme uma das opções que seguem:
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 55
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
1 = utiliza relatório no formato tradicional (antigo);
2 = utiliza relatório personalizável;
3 = pergunta qual relatório será utilizado: tradicional (antigo) ou personalizável.
Personalização
É possível configurar-se as colunas do lay-out do relatório, bem como os
acumuladores, cabeçalhos e linhas.
Estão disponíveis para personalização também a fonte, tamanho, cores, e etc.
Editando o layout do relatório
O primeiro passo é entender a nova estrutura dos relatórios desenvolvidos com a
ferramenta TReport.
O Relatório possui Seções e Células. É chamada de Seção, cada um dos grupos de
informações, e de Célula, cada um dos campos que serão impressos.
Nova estrutura do relatório TReport:
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 56
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
O relatório mais simples que se consegue emitir em TReport, é uma listagem.
Definindo a Função ReportDef()
A função ReportDef() é responsável pela construção do lay-out do relatório
(oReport). É ela quem define as colunas, os campos e as informações que serão
impressas.
Os comandos que fará essa construção são:
DEFINE REPORT
DEFINE SECTION
DEFINE CELL
DEFINE REPORT
A função DEFINE REPORT é responsável pela criação do objeto Report, ou seja, o
relatório. Internamente, o DEFINE REPORT irá executar o método TReport():New().
Estrutura do componente TReport:
O relatório (TReport) contém 1 ou mais seções (TRSection);
Uma seção (TRSection) pode conter 1 ou mais seções;
A seção (TRSection) contém células pré-definidas e células selecionadas pelo
usuário;
A seção (TRSection) também contém as quebras (TRBreak) para impressão de
totalizadores (TRFunction);
Os totalizadores são incluídos pela seção que automaticamente inclui no relatório
(TReport).
DEFINE SECTION
Ainda no ReportDef(), são definidas as seções (oSection) do relatório.
As seções do relatório representam os diferentes grupos de informações exibidos.
Há a seção principal e as específicas.
Internamente, o DEFINE SECTION irá executar o método TRSection():New().
A classe TRSection pode ser entendida como um layout do relatório, por conter
células, quebras e totalizadores que darão um formato para sua impressão.
Com a classe TRSection é possível definir uma query, filtro ou índice com filtro
(IndRegua) que será utilizada por ela para processamento do relatório, através do
método Print e utilizando as células de posicionamento (TRPosition).
DEFINE CELL
Para cada seção, devem ser definidas as células. Célula é cada informação que
deverá ser impressa. Pode ser um campo do cadastro, ou um resultado de uma
operação. É uma Célula de impressão de uma seção (TRSection) de um relatório
que utiliza a classe TReport
Internamente, o DEFINE CELL irá executar o método TRCell():New ().
Métodos:
New Método construtor da classe TReport.
SetTitle Define o título do componente.
Define os parametros que serão utilizados pelo usuário para configurar o
SetParam
relatorio.
Preview Apresenta preview do relatório.
Define o bloco de código que será executado quando o usuário confirmar a
SetAction
impressão
Inicia impressão do relatório executando o parametro bAction informado nos
métodos New, SetAction ou PrintDialog.
Print
Esse método é executado pelo método PrintDialog quando o usuário confirma a
impressão do relatório.
Apresenta a tela de impressão para o usuário configurar o relatório.
O método PrintDialog executa o método Print quando o usuário confirma a
PrintDialog
impressão, executando o bloco de código informado pelo parametro bAction nos
métodos New ou SetAction.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 57
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Cancel Retorna se o usuário cancelou a impressão do relatório.
SetMeter Define o total da regua da tela de processamento do relatório.
IncMeter Incrementa a régua da tela de processamento do relatório
SetDescription Define a descrição do componente.
Retorna o nome da classe do componente.
Exemplo:
ClassName
oReport := TReport():New('MATR010')
MsgStop(oReport:ClassName()) //Apresenta na tela 'TREPORT'
ReportName Retorna o nome do relatório (exemplo: MATR010)
Title Retorna o título do componente
Description Descrição do componente
TotalText Retorna o texto que será impresso antes da impressão dos totalizadores
GetParam Retorna a pergunta/bloco de código utilizada como parametro do relatório.
Retorna bloco de código que será executado pelos métodos Print e PrintDialog
GetAction
quando usuário confirmar impressão.
FooterAtEnd Retorna se será impressore rodapé no final da impressão
TotalInLine Retorna se a impressão dos totalizadores será em linha
Retorna a altura da página baseado no tamanho da folha (A4, Carta,
PageHeight
etc) informado pelo usuário
Retorna a largura da página baseado no tamanho da folha (A4, Carta,
PageWidth
etc) informado pelo usuário
Row Retorna a linha posicionada na impressão
Col Retorna a coluna posicionada na impressão
Page Retorna o número da página atual na impressão
GetOrientation Retorna a orientação de página (Retrato ou Paisagem) selecionada pelo usuário.
Retorna se relatório esta em processo de impressão.
Printing O status de impressão é definido pelos métodos Init (que indica o início da
impressão) e o método Finish (que indica a finalização).
Incializa impressão.
Não é necessário executar o método Init se for utilizar o método Print ou
PrintDialog, já que estes fazem o controle de inicialização e finalização da
Init impressão.
Caso não esteja utilizando os método citados acima, sempre execute o método
Init no inídio do relatório para verificar as configurações informadas pelo usuário
e inicializar corretamente a primeira página do relatório.
Finaliza impressão inicializada pelo método Init.
Não é necessário executar o método Finish se for utilizar o método Print ou
PrintDialog, já que estes fazem o controle de inicialização e finalização da
impressão.
Finish
Caso não esteja utilizando os método citados acima, sempre execute o método
Finish no final do relatório para impressão dos totalizadores que estão habilitados
para o final do relatório, para fechar as querys e/ou indíces temporários criados
pelas seções e para outros tratamentos internos do componente.
PrintText Imprime o texto nas coordenadas informadas pelos parametros
EndPage Finaliza um página de impressão
Incrementa a linha de impressão baseado no parametro ou no valor definido pelo
IncRow
usuário para a altura das linhas do relatório.
SkipLine Salta uma linha baseado na altura da linha informada pelo usuário
SetTotalText Define o texto que será impresso antes da impressão dos totalizadores
SetTotalInLine Define se os totalizadores serão impressos em linha ou coluna
SetPortrait Define orientação de página do relatório como retrato
SetLandscape Define a orientação de página do relatório como paisagem
SetPreview Define se será apresentado o preview o relatório no final da impressão
Retorna objeto da classe TRFunction (totalizadores) baseado no parametro
GetFunction
informado.
Section Retorna objeto da classe TRSection (seção) baseado no parametro informado.
Imprime texto nas coordenadas informadas pelos parametros, utilizando as
Say
especificações do objeto TFont, cor da fonte e cor de fundo
SayBitmap Imprime uma imagem nas coordenadas informadas pelos parametros
Desenha uma linha baseado nas coordenadas informadas pelos parametros,
Line
utilizando as especificações do objeto TPen.
Desenha uma caixa baseado nas coordenadas informadas pelos parametros,
Box
utilizando as especificações do objeto TPen.
Preenche um retangulo na impressão utilizando as especificações do objeto
FillRect
TBrush.
Desenha uma linha simples iniciando na linha atual de impressão com a largura
ThinLine
da página
Desenha uma linha com altura maior que a do método ThinLine, iniciando na
FatLine
linha atual de impressão com a largura da página
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 58
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Exemplo
#include "[Link]"
User Function TREP01()
Local oReport
If TRepInUse()
Pergunte("MTR530",.F.)
oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return
Static Function ReportDef()
Local oReport
Local oSection
Local oBreak
oReport := TReport():New("TESTE TREPORT","Relatorio de Visitas","MTR530",{|oReport|;
PrintReport(oReport)},"Relatorio de visitas de vendedores nos clientes")
oSection := TRSection():New(oReport,"Clientes",{"SA1","SA3"})
TRCell():New(oSection,"A1_VEND","SA1")
TRCell():New(oSection,"A3_NOME","SA3")
TRCell():New(oSection,"A1_COD","SA1","Cliente")
TRCell():New(oSection,"A1_LOJA","SA1")
TRCell():New(oSection,"A1_NOME","SA1")
TRCell():New(oSection,"A1_ULTVIS","SA1")
TRCell():New(oSection,"A1_TEMVIS","SA1")
TRCell():New(oSection,"A1_CONTATO","SA1")
TRCell():New(oSection,"A1_TEL","SA1")
oBreak := TRBreak():New(oSection,oSection:Cell("A1_VEND"),"Sub Total Vendedores")
TRFunction():New(oSection:Cell("A1_COD"),NIL,"COUNT",oBreak)
TRFunction():New(oSection:Cell("A1_TEMVIS"),NIL,"SUM",oBreak)
Return oReport
Static Function PrintReport(oReport)
Local oSection := oReport:Section(1)
Local cPart
Local cFiltro := ""
MakeSqlExpr("MTR530")
oSection:BeginQuery()
If ( mv_par03 == 1 )
cPart := "%AND (" + Dtos(dDataBase) + " - A1_ULTVIS) > A1_TEMVIS%"
Else
cPart := "%%"
EndIf
BeginSql alias "QRYSA1"
SELECT A1_COD,A1_LOJA,A1_NOME,A1_VEND,
A1_ULTVIS,A1_TEMVIS,A1_TEL,A1_CONTATO,A3_NOME
FROM %table:SA1% SA1,%table:SA3% SA3
WHERE A1_VEND = A3_COD AND A1_FILIAL = %xfilial:SA1% AND
A1_TEMVIS > 0 AND SA1.%notDel% %exp:cPart%
ORDER BY A1_VEND
EndSql
oSection:EndQuery(mv_par04)
oSection:Print()
Return
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 59
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Pacote Office
Integração Excel
A funcionalidade básica de exportação de informações para o Microsoft Excel utiliza a função
DlgToExcel(), a qual permite que as informações em formatos de array sejam geradas em uma
planilha.
DLGTOEXCEL()
Realiza a exportação das informações do ambiente Protheus em formato de arrays
para uma planilha do Microsoft Excel.
Sintaxe:
DlgToExcel( aArray)
aArray := Array multidimensional com 4 elementos, sendo eles:
Argumento Obrigat. Tipo Descrição
Define o que se quer inserir no Excel.
CABEÇALHO – Insere a parte superior no Excel
cOrigem Sim C
GETDADOS – Insere diversos itens
ARRAY – Insere um array qualquer
cTitulo Sim C Titulo do Relatorio
Array contendo os nomes dos campos que serão exibidos na
aDadosCab Sim A planilha., se cOrigem for GETDADOS, deve ser um array com
a estrutura do aHeader.
Array contendo as informações dos campos, de acordo com a
aDadosItens Sim A ordem do
array de cabeçalho.
Exemplo
User Function TExcel()
Local aHeader := {}
Local aCols := {}
Local cNum := "000006"
If !ApOleClient("MSExcel")
MsgAlert("Microsoft Excel não instalado!")
Return
EndIf
dbSelectArea("SX3")
dbSetOrder(1)
dbSeek("SC6")
While SX3->X3_Arquivo == "SC6" .And. !SX3->(EOF())
If X3Uso(SX3->X3_Usado) .And.;
cNivel >= SX3->X3_Nivel .And.;
Trim(SX3->X3_Campo) $ "C6_ITEM/C6_PRODUTO/C6_DESCRI/C6_QTDVEN/C6_VALOR"
AAdd(aHeader, {Trim(SX3->X3_Titulo),;
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})
EndIf
Continua…
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 60
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Continuação…
SX3->(dbSkip())
End
dbSelectArea("SC6")
dbSetOrder(1)
If !dbSeek(xFilial("SC6") + cNum)
MsgAlert("Pedido nao encontrado!")
Return
EndIf
While Trim(SC6->C6_Num) == cNum .And. !SC6->(Eof())
AAdd(aCols, {SC6->C6_ITEM, SC6->C6_PRODUTO, SC6->C6_DESCRI,;
SC6->C6_QTDVEN, SC6->C6_VALOR, .F.})
SC6->(dbSkip())
End
dbSelectArea("SC5")
dbSetOrder(1)
If !dbSeek(xFilial("SC5") + cNum)
MsgAlert("Pedido nao encontrado!")
Return
EndIf
Acab := {"Numero","Cliente","Emissao"}
aItem := {SC5->C5_Num,SC5->C5_Cliente,SC5->C5_Emissao}
DlgToExcel({ {"CABECALHO", "Pedido Vendas", aCab, },;
{"GETDADOS", "Itens do Pedido", aHeader, aCols} })
Return
Continua…
Continuação…
User Function TExcel2()
Local aCabec := {}
Local aDados := {}
If !ApOleClient("MSExcel")
MsgAlert("Microsoft Excel não instalado!")
Return
EndIf
aCabec := {"Codigo", "Nome", "Endereco"}
dbSelectArea("SA1")
dbGoTop()
While !SA1->(Eof())
AAdd(aDados, {SA1->A1_Cod, SA1->A1_Nome, SA1->A1_End})
SA1->(dbSkip())
End
DlgToExcel({ {"ARRAY", "Exportacao para o Excel", aCabec, aDados} })
Return
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 61
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Usando APOLEClient()
Podemos usar a Classe MSExcel para criar integração com Excel.
ApOleClient Verifica se consegue fazer integração
New Cria o Objeto de Integração com Excel
Destroy Destroi o objeto
WorkBooks:Open Abre uma planilha pronta
SetVisible Habilita visibilidade
Exemplo com Arquivo DBF
User function fExcDBF()
If !ApOleClient("MSExcel")
MsgAlert("Microsoft Excel não instalado!")
Return
EndIf
cArq := "SA1990"
cPath := GetSrvProfString("ROOTPATH", "C:\MP8") + "\DATA\"
oExcel := MSExcel():New()
oExcel:WorkBooks:Open(cPath + cArq + ".DBF")
Return
Exemplo Arquivo CSV
User Function TExcCSV()
Local oExcel, cArq, nArq, cPath
If !ApOleClient("MSExcel")
MsgAlert("Microsoft Excel não instalado!")
Return
EndIf
cArq := CriaTrab(Nil, .F.)
cPath := GetSrvProfString("ROOTPATH", "C:\") + "\DIRDOC\"
nArq := FCreate(cPath + cArq + ".CSV")
If nArq == -1
MsgAlert("Nao conseguiu criar o arquivo!")
Return
EndIf
FWrite(nArq, "Codigo;Nome;Endereco" + Chr(13) + Chr(10))
dbSelectArea("SA1")
dbGoTop()
While !SA1->(Eof())
FWrite(nArq, SA1->A1_Cod + ";" + SA1->A1_Nome + ";" + SA1->A1_End + Chr(13) + Chr(10))
SA1->(dbSkip())
End
FClose(nArq)
oExcel := MSExcel():New()
oExcel:WorkBooks:Open(cPath + cArq + ".CSV")
FErase(cPath + cArq + ".CSV")
Return
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 62
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Exercício Excel
Fazer uma consulta usando instrução em SQL e com o resultado da consulta gerar
integração com o Excel.
Campos: Num. Pedido , Nome Cliente, Estado, Condicao Pgto
Tabelas de Apoio: SC5 e SA1
Perguntar ao usuario se ele prefere resultado em DBF ou CSV.
Integração com Word
OLE_CreateLink() – Cria um objeto de integração com Word
Para criar integração com Word é necessário criar um documento modelo (.DOT) no
Word.
Para tornar o documento dinâmico é necessário incluir variáveis nesse modelo:
Clique no ícone “Inserir um Campo”
escolha a opção DocVariable
insira o nome da variável
Salve o documento como Modelo do Word.
Métodos:
OLE_CreateLink Conecta ao word
OLE_NewFile Escolhe o modelo, deve estar visível na maquina do cliente
OLE_SetDocumentVar Montagem das variaveis que serão lidas no Modelo DOT
OLE_ExecuteMacro Executa Macro no word
OLE_UpdateFields Atualizando as variaveis do documento do Word
OLE_PrintFile Imprime no word
OLE_CloseFile Fecha o arquivo no word
OLE_CloseLink Fecha o link no wo
Exemplo
#INCLUDE "[Link]"
USER FUNCTION fCli()
oWord:=OLE_CreateLink()
SA1->(dbGotop())
While SA1->(!EOF())
OLE_NewFile(oWord, "c:\[Link]")
OLE_SetDocumentVar(oWord,"A1_NOME", SA1->A1_NOME)
OLE_SetDocumentVar(oWord,"A1_MUN", SA1->A1_MUN)
OLE_SetDocumentVar(oWord,"A1_COD", SA1->A1_COD)
OLE_UpdateFields(oWord)
SA1->(dbSkip())
Enddo
If msgyesno("Fecha?")
OLE_CloseFile(oWord)
OLE_CloseLink(oWord)
Endif
Return
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 63
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Projeto Final
Criar um modulo especifico: (utilizar ponto de entrada ESPNOME)
Criar um menu com os seguintes itens:
Cadastro de clientes (MATA030)
Usar ponto de entrada para incluir um item no arotina (MA030ROT) para
importação de dados a partir de um arquivo texto.
O layout deverá ser definido por você e especificado na documentação a ser
entregue no final do projeto.
Usar cgetfile para escolher o arquivo na importação
Usar execauto para incluir o cliente.
Cadastro de Fornecedores (MATA020)
Apenas Incluir no Menu
Cadastro de Produtos(MATA010)
Apenas Incluir no Menu
Amarracao Cliente x Produto (CRIAR UM PROGRAMA NOVO)
Tabelas Envolvidas
Cadastro de Clientes (SA1)
Amarracao Produtos x Clientes (SA7)
Browse (Cadastro de Clientes)
Itens do aRotina
Pesquisa Padrão (AXPESQUI)
Visualizar (modelo 3)
Cabeçalho: Cliente (Visual)
Itens: Produtos (Visual)
Incluir (modelo 3)
Cabeçalho: Cliente (Visual)
Itens: Produtos (Inclusão)
Validações:
Não permitir incluir o mesmo produto para o mesmo cliente.
Alterar (modelo 3)
Cabeçalho: Cliente (Visual)
Itens: Produtos (Alteracao)
Validações:
Não permitir alteração caso não exista nenhum item amarrado para o cliente
selecionado.
Excluir (modelo 3)
Cabeçalho: Cliente (Visual)
Itens: Produtos (Visual)
Excluir apenas os itens ( SA7)
Validações:
Não deixar caso não exista nenhum item amarrado para o cliente selecionado.
Imprimir (TMSPrint)
Imprimir com o logotipo da empresa, nome do logotipo deve constar em um
parâmetro no SX6.
Imprimir amarração do cliente posicionado no browse.
Definir e documentar o layout.
Controle de Prestação de Contas (CRIAR UM PROGRAMA NOVO)
Criar um cadastro de Pessoas, usar axcadastro()
Campos: Filial, código, nome, email, telefone, Centro de Custos
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 64
Advpl II - Advanced O.O
Programação e Tecnologia - Versão 6.0 – 06/2012 – Todos Direitos Reservados © 2012
Criar um cadastro de movimentos.
Campos: Filial, código, nome(virtual), tipo de movimento (Adiantamento/Prestação
de contas), Historico, valor, data, natureza, nome do anexo(habilitar somente
quando for Prestação de contas).
Criar uma tela com msdialog.
Preencher Say conforme dicionário de dados. (similar ao objeto enchoice)
Usar criavar para a inicialização dos Gets.
Se movimento for Adiantamento, emitir um recibo em TMSPrint com o nome da
pessoa, valor, histórico, data e espaço para a assinatura.
Se movimento for Prestação de contas, habilitar o botão de anexo, utilize a função
cGetfile, para a pessoa escolher um arquivo com o anexo daquela prestação de
contas.
Usar a função cpyt2s para copiar esse anexo para dentro do servidor em uma pasta
definida em um parâmetro no SX6.
Botao para confirmar
Botao para cancelar
Titulos a Pagar (FINA050)
Usar ponto de entrada (FA050INC ) para enviar um email ao incluir um titulo com
valor maior que o definido em parâmetro no SX6, para o email definido também em
parâmetro no SX6.
Titulos a Receber (FINA040)
Usar ponto de entrada (FA040GRV ) para perguntar se a pessoa quer emitir um
boleto ao final da inclusão, caso o usuário escolha sim, Imprimir um boleto em
TMSPrint.
Relação de Clientes x Produtos (CRIAR UM PROGRAMA NOVO)
Utilize SetPrint
Parametros:
Cliente Inicial com Consulta Padrão (CLI)
Cliente Final com Consulta Padrão (CLI)
Produto Inicial com Consulta Padrão(SB1)
Produto Final com Consulta Padrão (SB1)
Extrato de Prestação de Contas (CRIAR UM PROGRAMA NOVO)
Utilize SetPrint
Parametros
Codigo Inicial (criar a consulta padrão)
Codigo Final
Centro de Custo Inicial (CTT)
Centro de Custo Final (CTT)
Data Inicial
Data Final
Totaliza por: código / centro de custo
Criar uma função para efetuar a composição do saldo anterior de acordo com a
data inicial.
Relatorio deve ser bem parecido com o extrato bancário.
Obs. Sugerir gatilhos, campos virtuais se acharem necessário.
Para entrega enviar do rootpath *.dbf, *.fpt, *.xnu, *.pss, MDF Etc...
Enviar o projeto e os fontes,
Enviar os arquivos de inicialização. (*.ini) da pasta BIN.
Enviar toda documentação suporte, com nomes de menus, programas utilizados,
layouts necessários, usuários e senha criados, nomes de projetos, etc.
ADVPL Consultoria e Treinamento|Programação e Tecnologia-ADVPL II - Todos os Direitos Reservados ©2012 65