A programação para coletores de dados VT100 refere-se ao desenvolvimento de software para dispositivos que utilizam o protocolo de terminal VT100, amplamente usado em sistemas de automação e coleta de dados, especialmente em ambientes corporativos que utilizam o ERP TOTVS Protheus.
Introdução
No universo do desenvolvimento ADVPL para TOTVS Protheus, a programação VT100 representa uma ferramenta essencial para criação de interfaces e automação de processos em ambientes de terminal. Este guia definitivo mergulhará profundamente no mundo das funções VT100, oferecendo aos programadores uma compreensão abrangente e prática desta tecnologia fundamental.
O que é VT100?
VT100 é um padrão de terminal desenvolvido originalmente pela Digital Equipment Corporation (DEC) que se tornou um modelo de referência para comunicação e interface em sistemas de terminais. No contexto do Protheus, as funções VT100 permitem a criação de interfaces de usuário em ambientes de texto, especialmente para dispositivos móveis e coletores de dados.
Histórico de Desenvolvimento
A implementação das funções VT100 no Protheus tem uma história interessante. Segundo informações do documento original, Alexandro Valário desempenhou um papel crucial no desenvolvimento dessas bibliotecas. Na época, a Microsiga (atual TOTVS) buscava soluções para equipamentos de mobilidade que atendessem suas necessidades específicas.
Fundamentos Técnicos
Conceitos Básicos de VT100
VT100 opera em um ambiente de texto puro, onde cada caractere na tela é representado por uma posição específica. As coordenadas são definidas por linhas (vertical) e colunas (horizontal), começando do canto superior esquerdo (0,0).
Bibliotecas e Funções Disponíveis
As principais bibliotecas para programação VT100 no Protheus estão contidas no arquivo apvt100.ch. Este header file deve ser incluído em todos os programas que utilizam funções VT100:
#INCLUDE "APVT100.CH"
Modelos de Terminal
Existem três principais modelos de terminal suportados:
Funções Principais VT100: Referência Definitiva
Índice de Funções VT100
- VTSay
- VTGet
- VTRead
- VTInkey()
- VTLastKey()
- VTAlert()
- VTYesNo()
- VTAchoice()
- VTAbrowse()
- VTDBBrowse()
- VTClear()
- VTSave()
- VTRestore()
- VTMaxRow()
- VTMaxCol()
- VTSetSize()
- VTBeep()
- VTReverso()
- VTKeyBoard()
- VTModelo()
- VTClearBuffer()
Boas Práticas
Casos de Uso Avançados
1. VTSay - Exibição de Dados
Objetivo:
Exibe dados em coordenadas específicas da tela.
Sintaxe:
@ <nLinha>, <nColuna> VTSAY <Expressão> [PICTURE <Mascara>]
| Parâmetros | Descrição |
| nLinha | Número da linha (0 a VTMAXROW()) |
| nColuna | Número da coluna (0 a VTMAXCOL()) |
| Expressão | Conteúdo a ser exibido |
| Mascara | Formatação opcional |
nQtd := 15.45
@ 1, 0 VTSAY "Quantidade: " + Transform(nQtd, "@E 999.99")
2. VTGet - Entrada de Dados
Objetivo:
Permite a entrada interativa de dados pelo usuário.
Sintaxe:
@ <nLinha>, <nColuna> VTGET <variavel> [PICTURE <Mascara>] [VALID <Validacao>] [F3 <Consulta>]
| Parâmetros | Descrição |
| nLinha | Número da linha (0 a VTMAXROW()) |
| nColuna | Número da coluna (0 a VTMAXCOL()) |
| variavel | Variável que receberá o valor |
| Mascara | Formatação opcional |
| Validacao | Expressão de validação |
| Consulta | Código da consulta padrão (F3) |
cCodigo := Space(6)
@ 0, 0 VTSAY "Código: "
@ 0, 8 VTGET cCodigo PICTURE "@!" VALID !Empty(cCodigo)
3. VTRead - Ativação de Gets
Objetivo:
Ativa a edição em tela usando objetos VTGet.
Sintaxe:
VTREAD
cNome := Space(30)
cCPF := Space(11)
@ 1, 1 VTSAY "Nome:" VTGET cNome
@ 2, 1 VTSAY "CPF: " VTGET cCPF PICTURE "@R 999.999.999-99"
VTREAD
Caso de uso: Essencial para processar múltiplos campos de entrada em uma única tela.
4. VTInkey() - Captura de Teclas
Objetivo:
Extrai um caractere do buffer de teclado.
Sintaxe:
nTecla := VTInkey([nSegundos])
| Parâmetros | Descrição |
| nSegundos | Tempo de espera (opcional) |
While .T.
nTecla := VTInkey(1)
If nTecla == 27 // ESC
Exit
EndIf
EndDo
5. VTLastKey() - Última Tecla Pressionada
Objetivo:
Retorna o código da última tecla pressionada.
Sintaxe:
nUltimaTecla := VTLastKey()
If VTLastKey() == 27 // ESC
VTAlert("Operação cancelada")
Return
EndIf
6. VTAlert() - Mensagens de Alerta
Objetivo:
Exibe mensagens rápidas para o usuário.
Sintaxe:
VTAlert(<cMensagem>, [<cTitulo>], [<lCentralizado>], [nTempo], [nBeep])
| Parâmetros | Descrição |
| cMensagem | Texto da mensagem |
| cTitulo | Título do alerta (opcional) |
| lCentralizado | Se verdadeiro, centraliza a mensagem |
| nTempo | Tempo de exibição em milissegundos |
| nBeep | Número de beeps |
VTAlert("Produto não cadastrado", "Aviso", .T., 2000, 1)
Caso de uso: Ideal para feedback rápido ao usuário em operações de validação ou confirmação.
7. VTYesNo() - Confirmação de Ações
Objetivo:
Solicita confirmação do usuário.
Sintaxe:
lConfirmacao := VTYesNo(<cMensagem>, [<cTitulo>], [<lCentralizado>])
| Parâmetros | Descrição |
| cMensagem | Texto da mensagem |
| cTitulo | Título do alerta (opcional) |
| lCentralizado | Se verdadeiro, centraliza a mensagem |
If VTYesNo("Confirma a exclusão?", "Atenção", .T.)
// Procede com a exclusão
Else
VTAlert("Operação cancelada")
EndIf
Caso de uso: Essencial para operações críticas que requerem confirmação do usuário.
8. VTAchoice() - Criação de Menus
Objetivo:
Permite criar menus interativos.
Sintaxe:
nOpcao := VTACHOICE(<nTopo>, <nEsquerda>, <nBase>, <nDireita>, <aOpcoes>, [<aSelecao>], [<cFuncaoUsuario>],[<nItemInicial>], [lNaoBranco], [<lMsg>], [<nLinhaJanela>],[<lScroll>])
| Parâmetros | Descrição |
| nTopo, nEsquerda | Coordenadas do canto superior esquerdo da janela |
| nBase, nDireita | Coordenadas do canto inferior direito da janela |
| aOpcoes | Array com as opções do menu |
| aSelecao | Array de itens selecionáveis (opcional) |
| cFuncaoUsuario | Função de controle personalizada. É o nome de uma função definida pelo usuário que é executada quando uma tecla não reconhecível for pressionada. O nome da função é especificado como uma expressão caractere sem parênteses ou argumentos. Note que o comportamento de VTACHOICE() é afetado pela presença deste argumento. |
| nItemInicial | posição ocupada no vetor de <aOpcoes> pelo item que aparecer em destaque quando o menu for exibido pela primeira vez. Caso você especifique um item de menu que não esteja disponível, ou caso você não use argumento algum, o item que aparecer em destaque será o primeiro item selecionável do vetor. |
| lNaoBranco | Se for verdadeiro, as opções do menu serão montadas conforme o tamanho da opção desconsiderando os espaços em branco à direita e esquerda. Caso seja negativa ou omitida, a opção do menu será montada conforme a dimensão da tela do VTACHOICE definida em <nEsquerda> e <nDireita>. |
| lMsg | Conteúdo tem que ser NIL, parâmetro reservado para implementação futura. |
| nLinhaJanela | É o número da linha da janela na qual o item de menu inicial aparecerá. |
aOpcoes := {"Incluir", "Alterar", "Excluir", "Visualizar"}
// Monta a tela
@0,0 VTSAY "Opcoes:"
// Monta a lista de opcoes
While nMenu < 0
nMenu := VTAChoice( 2, 0, VTMaxRow(), VTMaxCol(), aOpcoes, , "ACDV311VLD", nMenu )
End
Caso de uso: Perfeito para criação de menus principais ou submenus em aplicações.
Modos de VTACHOICE():
- 0 = Inativo;
- 1 = Tentativa de passar início da lista;
- 2 = Tentativa de passar final da lista;
- 3 = Normal;
- 4 = Itens não selecionados.
9. VTAbrowse() - Browse de Arrays
Objetivo:
Cria um browse baseado em um array.
Sintaxe:
nPos := VTAbrowse(<nTopo>, <nEsquerda>, <nBase>, <nDireita>, <aCabecalho>, <aItens>, <aTamanhos>, [<cFuncaoUsuario>])
| Parâmetros | Descrição |
| nTopo, nEsquerda | Coordenadas do canto superior esquerdo da janela |
| nBase, nDireita | Coordenadas do canto inferior direito da janela |
| aCabecalho | Array que contém os títulos das colunas |
| aItens | Array que contém os dados a serem mostrados |
| aTamanhos | Array que contém o tamanho de cada coluna |
| cFuncaoUsuario | Nome de uma função definida pelo usuário que é executada quando uma tecla não reconhecível for pressionada. O nome da função é especificado como uma expressão caractere sem parênteses ou argumentos. Note que o comportamento de VTABROWSE() é afetado pela presença deste argumento. |
aCab := {"Código", "Descrição", "Valor"}
aItens := {{"001", "Produto A", 100.00}, {"002", "Produto B", 150.00}}
aTam := {10, 20, 10}
nPos := VTAbrowse(0, 0, 10, 40, aCab, aItens, aTam)
Caso de uso: Ideal para exibição de listas de dados em formato tabular.
Modos de VTABROWSE():
- 0 = Inativo;
- 1 = Tentativa de passar início da lista;
- 2 = Tentativa de passar final da lista;
- 3 = Normal;
- 4 = Itens não selecionados.
Valores de Retorno da Função de Controle de VTABROWSE():
- 0 = Aborta seleção;
- 1 = Executa seleção;
- 2 = Continua VTABROWSE();
- 3 = Vai para o próximo item cuja primeira letra for a tecla pressionada.
10. VTDBBrowse() - Browse de Banco de Dados
Objetivo:
Cria um browse baseado em uma tabela do banco de dados.
Sintaxe:
nRecno := VTDBBrowse(<nTopo>, <nEsquerda>, <nBase>, <nDireita>, <cAlias>, <aCampos>, <aTamanhos>, [<cFuncaoUsuario>], [<cTop>], [<cBottom>])
| Parâmetros | Descrição |
| nTopo, nEsquerda | Coordenadas do canto superior esquerdo da janela |
| nBase, nDireita | Coordenadas do canto inferior direito da janela |
| cAlias | Alias da tabela |
| aCampos | Array com os campos a serem exibidos |
| aTamanhos | Array com larguras das colunas |
| cFuncaoUsuario | Nome de uma função definida pelo usuário que é executada quando uma tecla não reconhecível for pressionada. O nome da função é especificado como uma expressão caractere sem parênteses ou argumentos. Note que o comportamento de VTDBBROWSE () é afetado pela presença deste argumento |
| cTop | String com a condição de validação de top |
| cBottom | String com a condição de validação de Bottom |
aCampos := {"B1_COD", "B1_DESC", "B1_PRV1"}
aTamanhos := {15, 30, 10}
nRecno := VTDBBrowse(0, 0, 10, 60, "SB1", aCampos, aTamanhos)
Caso de uso: Essencial para navegação e seleção de registros em tabelas do Protheus.
Retorno:
Modos de VTDBBROWSE():
- 0 = Inativo;
- 1 = Tentativa de passar início da lista;
- 2 = Tentativa de passar final da lista;
- 3 = Normal;
- 4 = Itens não selecionados.
Valores de Retorno da Função de Controle de VTDBBROWSE():
- 0 = Aborta seleção;
- 1 = Executa seleção;
- 2 = Continua VTDBBROWSE();
- 3 = Vai para o próximo item cuja primeira letra for a tecla pressionada.
11. VTClear() - Limpeza de Tela
Objetivo:
Limpa a tela do terminal.
Sintaxe:
VtClear()
VTClear()
@ 0, 0 VTSAY "Nova Tela"
Caso de uso: Utilizado para limpar a tela antes de apresentar novas informações.
12. VTSave() - Salvamento de Tela
Objetivo:
Permite salvar o conteúdo da tela para restaurar posteriormente
Sintaxe:
aTela := VTSave(<nTopo>, <nEsquerda>, <nBase>,<nDireita>)
| Parâmetros | Descrição |
| nTopo, nEsquerda | Coordenadas do canto superior esquerdo da janela |
| nBase, nDireita | Coordenadas do canto inferior direito da janela |
aTela := VTSave(0, 0, 5, 20)
Caso de uso: Útil para criar janelas temporárias ou preservar partes da tela durante operações.
13. VTRestore() - Restauração de Tela
Objetivo:
Permite restaurar o conteúdo da tela salvo por VTSave()
Sintaxe:
VTRestore(<nTopo>, <nEsquerda>, <nBase>,<nDireita>, aTela)
| Parâmetros | Descrição |
| nTopo, nEsquerda | Coordenadas do canto superior esquerdo da janela |
| nBase, nDireita | Coordenadas do canto inferior direito da janela |
| aTela | Possui o conteúdo da tela a ser exibida |
aTela := VTSave(0, 0, 5, 20)
// Realiza operações na tela
VTRestore(0, 0, 5, 20, aTela)
Caso de uso: Útil para criar janelas temporárias ou preservar partes da tela durante operações.
14. VTMaxRow() e VTMaxCol() - Dimensões da Tela
Objetivo:
Retornam as dimensões máximas da tela.
Sintaxe:
nMaxLinha := VTMaxRow()
nMaxColuna := VTMaxCol()
@ VTMaxRow(), 0 VTSAY "Rodapé da Tela"
Caso de uso: Essencial para criar layouts adaptáveis a diferentes tamanhos de tela.
15. VTSetSize() - Dimensões da Tela
Objetivo:
Seta o limite da área de trabalho.
Sintaxe:
VTSETSIZE(<nLin>, <nCol>)
| Parâmetros | Descrição |
| nLin, nCol | São as coordenadas máximas de linha e coluna. |
VTSetSize(8, 20)
Caso de uso: Essencial para criar layouts adaptáveis a diferentes tamanhos de tela.
16. VTBeep() - Emissão de Som
Objetivo:
Emite um beep sonoro.
Sintaxe:
VTBeep([nQuantidade])
| Parâmetros | Descrição |
| nQuantidade | Especifica a quantidade de beep que será emitido. Caso <nQtde> seja omitido, VTBEEP() emitirá um beep. |
VTBeep(3) // Emite 3 beeps
Caso de uso: Útil para alertas sonoros em situações críticas ou para chamar atenção do usuário.
17. VTReverso() - Modo Reverso
Objetivo:
Ativa ou desativa o modo reverso da tela.
Sintaxe:
VTReverso([lAtiva])
| Parâmetros | Descrição |
| lAtiva | Se verdadeiro ativa, falso desativa o modo de tela. Caso <lRev> seja omitido, VTReverso() retorna o modo atual. |
VTReverso(.T.)
@ 1, 1 VTSAY "Texto em Reverso"
VTReverso(.F.)
Caso de uso: Utilizado para destacar informações importantes na tela.
18. VTKeyBoard() - Simulação de Teclado
Objetivo:
Coloca uma string no buffer de teclado.
Sintaxe:
VTKeyBoard(<cString>)
| Parâmetros | Descrição |
| cString | Conjunto de caracteres a ser colocado no buffer de teclado. |
VTKeyBoard( Chr(13) ) // Simula pressionar ENTER
Caso de uso: Útil para automação de testes ou preenchimento automático de campos.
19. VTClearBuffer() - Limpa o buffer de teclado
Objetivo:
Limpa o buffer de teclado.
Sintaxe:
VTClearBuffer()
VTCLEARBUFFER()
Caso de uso: Útil para descartar teclas que tenham ficado no buffer.
Boas Práticas
Dicas de Otimização
- Uso eficiente de VTClear(): Sempre use VTClear() antes de criar novas telas para evitar sobreposição de informações.
advpl
VTClear() @ 0, 0 VTSAY "Nova Tela Limpa" - Definição da Área de Trabalho: Utilize VTSetSize() para definir a área de trabalho adequada ao dispositivo.
advpl
VTSetSize(8, 40) // 8 linhas, 40 colunas - Tratamento de Teclas de Saída: Sempre trate teclas de saída com VTLastKey() para permitir que o usuário cancele operações.
advpl
If VTLastKey() == 27 // ESC Return EndIf - Uso de Variáveis Locais: Prefira variáveis locais para melhor performance e gestão de memória.
advpl
Local cNome := Space(30) Local nIdade := 0 - Validações Eficientes: Implemente validações concisas e eficientes em VTGets.
advpl
@ 1, 1 VTGET cCPF PICTURE "@R 999.999.999-99" VALID CGC(cCPF)
Padrões de Desenvolvimento
- Nomenclatura Consistente: Use prefixos para identificar tipos de variáveis (c para caractere, n para numérico, etc.).
- Comentários Descritivos: Adicione comentários explicativos, especialmente em lógicas complexas.
- Modularização: Divida funcionalidades complexas em funções menores e reutilizáveis.
- Tratamento de Erros: Implemente tratamento de erros robusto usando VTAlert() para feedback ao usuário.
- Documentação de Funções: Documente o propósito, parâmetros e retorno de cada função criada.
Armadilhas Comuns a Evitar
- Não Tratar Teclas de Navegação: Sempre considere teclas como ESC e ENTER.
- Esquecer de Limpar Buffer de Teclado: Use VTClearBuffer() antes de operações críticas.
- Ignorar Diferentes Modelos de Terminal: Sempre verifique o modelo com VTModelo() e adapte a interface
- Sobrecarga de Informações: Evite exibir muitas informações em uma única tela.
- Falta de Feedback: Sempre forneça feedback visual ou sonoro para ações do usuário.
Casos de Uso Avançados
Exemplo Completo de Aplicação
#INCLUDE "TOTVS.CH"
#INCLUDE "APVT100.CH"
/*/{Protheus.doc} VTDEMO1
Programa de exemplo de uso das funcoes de VT100 para microterminal
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@version 1.0
/*/
User Function VTDEMO1()
Local nPos := 1
Local cOpcao := Space(1)
Local cCodigo := Space(6)
Local dData := CToD("")
Local cSenha := Space(6)
Local nValor := 0
Local aOpcoes := {}
Local aItens := {}
Local aCab := {}
Local aSize := {}
Local aFields := {}
Local aHeader := {}
VTSetSize(2, 20)
While .T.
VTClear()
InitializeVariables(@cCodigo, @dData, @nValor, @cSenha)
VTClearBuffer()
If !SelectTerminalType(@cOpcao)
Exit
EndIf
DisplayDemoInfo()
If !InputUserData(@cCodigo, @dData, @nValor, @cSenha)
Loop
EndIf
If !ShowMenuOptions(@aOpcoes, @nPos)
Loop
EndIf
ShowBrowserExample(@aItens, @aCab, @aSize, @nPos)
ShowDBBrowserExample(@aFields, @aSize, @aHeader)
If FinishDemo()
Exit
EndIf
VTClearBuffer()
EndDo
Return .T.
/*/{Protheus.doc} InitializeVariables
Inicializa as variáveis do programa
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@param cCodigo, character, código a ser inicializado
@param dData, date, data a ser inicializada
@param nValor, numeric, valor a ser inicializado
@param cSenha, character, senha a ser inicializada
/*/
Static Function InitializeVariables(cCodigo, dData, nValor, cSenha)
cCodigo := Space(6)
dData := CToD("")
nValor := 0
cSenha := Space(6)
Return
/*/{Protheus.doc} SelectTerminalType
Seleciona o tipo de terminal
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@param cOpcao, character, opção selecionada
@return logical, verdadeiro se selecionou uma opção válida
/*/
Static Function SelectTerminalType(cOpcao)
Local lRet := .T.
While .T.
cOpcao := "1"
VTClear()
@ 0,0 VTSAY "1.RF 2.MT44 3.MT16"
@ 1,0 VTSAY "Selecione: " VTGET cOpcao PICT "9"
VTRead
If VTLastKey() == 27
lRet := .F.
Exit
EndIf
Do Case
Case cOpcao == "1"
VTSetSize(8,20)
Exit
Case cOpcao == "2"
VTSetSize(2,40)
Exit
Case cOpcao == "3"
VTSetSize(2,20)
Exit
Otherwise
VTClear()
@ 0,0 VTSay "Opcao invalida"
VTInkey(1000)
EndCase
EndDo
Return lRet
/*/{Protheus.doc} DisplayDemoInfo
Exibe informações do demo
@type function
@author DO THINK - ERIKE
@since 10/11/2023
/*/
Static Function DisplayDemoInfo()
@ 00,00 VTSay PadC("Demo de VT100", If(VTModelo()=="MT16" .or. VTModelo()=="RF",19,39))
@ 01,00 VTSay "Modelo:" + VTModelo()
If VTLastKey() == 27
Return
EndIf
VTInkey(0)
VTClear()
Return
/*/{Protheus.doc} InputUserData
Coleta dados do usuário
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@param cCodigo, character, código a ser coletado
@param dData, date, data a ser coletada
@param nValor, numeric, valor a ser coletado
@param cSenha, character, senha a ser coletada
@return logical, verdadeiro se todos os dados foram coletados com sucesso
/*/
Static Function InputUserData(cCodigo, dData, nValor, cSenha)
Local lRet := .T.
@ 00,00 VTSay "Codigo: "
@ 00,08 VTGet cCodigo PICT "@!" VALID ValidCod(cCodigo) WHEN WhenCod()
VTRead
If VTLastKey() == 27
lRet := .F.
Return lRet
EndIf
@ 01,00 VTSay "Data: "
@ 01,07 VTGet dData PICT "99/99/99" VALID ValidData(dData) WHEN WhenData()
VTRead
If VTLastKey() == 27
lRet := .F.
Return lRet
EndIf
VTClear()
VTClearBuffer()
@ 00,00 VTSay "Valor: "
@ 00,07 VTGet nValor PICT "@E 999.99" WHEN WhenValor()
VTRead
If VTLastKey() == 27
lRet := .F.
Return lRet
EndIf
@ 01,00 VTSay "Senha: "
@ 01,07 VTGet cSenha PASSWORD VALID (VTAlert(cSenha, "Senha Digitada", .T., 1500), .T.) WHEN WhenSenha()
VTRead
If VTLastKey() == 27
lRet := .F.
Return lRet
EndIf
Return lRet
/*/{Protheus.doc} ShowMenuOptions
Exibe opções de menu
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@param aOpcoes, array, opções do menu
@param nPos, numeric, posição selecionada
@return logical, verdadeiro se uma opção foi selecionada
/*/
Static Function ShowMenuOptions(aOpcoes, nPos)
Local lRet := .T.
VTClear()
VTAlert("Entrando no Achoice...","[-]", .T., 1500)
VTClear()
VTClearBuffer()
aOpcoes := {"Opcao 1", "Opcao 2", "Opcao 3", "Opcao 4", "Opcao 5"}
nPos := VTaChoice(0, 0, VTMaxRow(), VTMaxCol(), aOpcoes, , "U_VldAchVT", nPos)
If VTLastKey() == 27
lRet := .F.
EndIf
Return lRet
/*/{Protheus.doc} ShowBrowserExample
Exibe exemplo de browser
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@param aItens, array, itens do browser
@param aCab, array, cabeçalho do browser
@param aSize, array, tamanhos das colunas
@param nPos, numeric, posição selecionada
/*/
Static Function ShowBrowserExample(aItens, aCab, aSize, nPos)
VTAlert("Entrando no aBrowser... aguarde...", "[-]", .T., 1500)
aItens := {{"1010 ",10, "DESCRICAO1","UN "},;
{"2010 ",20,"DESCRICAO2","CX "},;
{"2020 ",30,"DESCRICAO3","CX "},;
{"2010 ",40,"DESCRICAO4","CX "},;
{"2020 ",50,"DESCRICAO5","CX "},;
{"3010 ",60,"DESCRICAO6","CX "},;
{"3020 ",70,"DESCRICAO7","CX "},;
{"3030 ",80,"DESCRICAO7","CX "},;
{"3040 ",90,"DESCRICAO7","CX "},;
{"2010 ",100,"DESCRICAO4","CX "},;
{"2010 ",110,"DESCRICAO4","CX "},;
{"2020 ",120,"DESCRICAO5","CX "},;
{"3010 ",130,"DESCRICAO6","CX "},;
{"3020 ",140,"DESCRICAO7","CX "},;
{"3030 ",150,"DESCRICAO7","CX "},;
{"3050 ",160,"DESCRICAO7","CX "}}
aCab := {"Codigo","Cod","Descricao","UM"}
aSize := {10,4,20,10}
nPos := 1
nPos := VTaBrowse(,,,,aCab,aItens,aSize,,nPos)
Return
/*/{Protheus.doc} ShowDBBrowserExample
Exibe exemplo de DBBrowser
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@param aFields, array, campos do DBBrowser
@param aSize, array, tamanhos das colunas
@param aHeader, array, cabeçalho do DBBrowser
/*/
Static Function ShowDBBrowserExample(aFields, aSize, aHeader)
VTAlert("Entrando no DBBrowser... aguarde...", "[-]", .T., 2000)
aFields := {"B1_COD", "B1_DESC", "B1_UM", "B1_PICM"}
aSize := {16, 20, 10, 15}
aHeader := {"COD", "DESCRICAO", "UM", "% ICM"}
SB1->( dbSeek(xFilial()) )
VTDBBrowse(,,,, "SB1", aHeader, aFields, aSize)
Return
/*/{Protheus.doc} FinishDemo
Verifica se o usuário deseja finalizar o demo
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@return logical, verdadeiro se o usuário deseja finalizar
/*/
Static Function FinishDemo()
Local lRet := .F.
VTClearBuffer()
If VTYesNo("Deseja finalizar?", "Pergunta")
lRet := .T.
EndIf
If VTLastKey() == 27
lRet := .F.
EndIf
Return lRet
/*/{Protheus.doc} ValidCod
Valida o código inserido
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@param cCodigo, character, código a ser validado
@return logical, sempre retorna verdadeiro
/*/
Static Function ValidCod(cCodigo)
Local aTela := VTSave(0, 0, VTMaxRow(), VTMaxCol())
VTAlert("Total de bytes:" + AllTrim( Str(Len(AllTrim(cCodigo))) ), "Validando:", .T., 2000)
VTClear()
VTRestore(0, 0, VTMaxRow(), VTMaxCol(), aTela)
Return .T.
/*/{Protheus.doc} WhenCod
Função executada antes da entrada do código
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@return logical, sempre retorna verdadeiro
/*/
Static Function WhenCod()
Local aTela := VTSave(0, 0, VTMaxRow(), VTMaxCol())
VTAlert("Exemplo de Get" + Chr(13) + Chr(10) + "com Caracter", "[-]ATENCAO", .T., 2000)
VTClear()
VTRestore(0, 0, VTMaxRow(), VTMaxCol(), aTela)
Return .T.
/*/{Protheus.doc} WhenData
Função executada antes da entrada da data
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@return logical, sempre retorna verdadeiro
/*/
Static Function WhenData()
Local aTela := VTSave(0, 0, VTMaxRow(), VTMaxCol())
VTAlert("Exemplo de Get" + Chr(13) + Chr(10) + "com Data", "[-]ATENCAO", .T., 2000)
VTClear()
VTRestore(0, 0, VTMaxRow(), VTMaxCol(), aTela)
Return .T.
/*/{Protheus.doc} WhenValor
Função executada antes da entrada do valor
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@return logical, sempre retorna verdadeiro
/*/
Static Function WhenValor()
Local aTela := VTSave(0, 0, VTMaxRow(), VTMaxCol())
VTAlert("Exemplo de Get" + Chr(13) + Chr(10) + "com Numerico", "[-]ATENCAO", .T., 2000)
VTClear()
VTRestore(0, 0, VTMaxRow(), VTMaxCol(), aTela)
Return .T.
/*/{Protheus.doc} WhenSenha
Função executada antes da entrada da senha
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@return logical, sempre retorna verdadeiro
/*/
Static Function WhenSenha()
Local aTela := VTSave(0, 0, VTMaxRow(), VTMaxCol())
VTAlert("Exemplo de Get" + Chr(13) + Chr(10) + "com Senha", "[-]ATENCAO", .T., 2000)
VTClear()
VTRestore(0, 0, VTMaxRow(), VTMaxCol(), aTela)
Return .T.
/*/{Protheus.doc} ValidData
Valida a data inserida
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@param dData, date, data a ser validada
@return logical, verdadeiro se a data for válida
/*/
Static Function ValidData(dData)
Local lRet := .T.
If Empty(dData)
lRet := .F.
VTAlert("Data Invalida", "Atencao", .T., 2000)
EndIf
Return lRet
/*/{Protheus.doc} VldAchVT
Função de validação para VTAChoice
@type function
@author DO THINK - ERIKE
@since 10/11/2023
@param modo, numeric, modo de operação
@param nElem, numeric, elemento atual
@param nElemW, numeric, elemento em foco
@return numeric, código de retorno para VTAChoice
/*/
User Function VldAchVT(modo, nElem, nElemW)
Local nRet := 2
If modo == 1
VTAlert("Inicio do Achoice", "-", .T., 1000)
ElseIf modo == 2
VTAlert("Fim do Achoice", "-", .T., 1000)
Else
If VTLastKey() == 27
VTAlert("Saindo do Achoice", "-", .T., 1000)
VTBeep(1)
nRet := 0
ElseIf VTLastKey() == 13
VTAlert("Tecla pressionada", "-", .T., 1000)
VTBeep(1)
nRet := 1
EndIf
EndIf
Return nRet
Conclusão: Dominando VT100 em ADVPL com a DO THINK
Ao longo deste guia abrangente, exploramos o universo da programação VT100 em ADVPL, uma habilidade essencial para desenvolvedores que trabalham com o TOTVS Protheus. Como especialistas em VT100 na consultoria Protheus DO THINK, entendemos a importância crucial dessas técnicas para o desenvolvimento de soluções eficientes e robustas.
Recapitulando os pontos-chave:
- Versatilidade em Coletores de Dados e Microterminais: As funções VT100 oferecem um conjunto poderoso de ferramentas para criar interfaces eficientes em diversos modelos de coletores de dados e microterminais. Esta versatilidade permite que desenvolvedores criem soluções adaptáveis a diferentes ambientes operacionais, desde armazéns e linhas de produção até operações de campo. Na fábrica de software da DO THINK, aproveitamos essa flexibilidade para desenvolver aplicações personalizadas que atendem às necessidades específicas de cada cliente, garantindo eficiência e precisão na coleta de dados em qualquer cenário.
- Eficiência na Coleta de Dados: A implementação precisa dessas funções resulta em aplicações ágeis e responsivas, cruciais para operações de coleta de dados em tempo real, inventário e logística - áreas onde a DO THINK possui extensa experiência e expertise.
- Integração Perfeita com Protheus: A integração das soluções VT100 com o ecossistema Protheus permite estender as funcionalidades do ERP para dispositivos móveis de coleta, um aspecto que nossa fábrica de software prioriza em cada projeto de automação.
- Boas Práticas para Soluções Móveis: Adotar código limpo e seguir as melhores práticas não só melhora a qualidade do software para coletores de dados, mas também facilita a manutenção e atualização - princípios fundamentais na fábrica de software da DO THINK.
Para saber mais sobre como podemos ajudar sua empresa a maximizar o potencial do Protheus com soluções VT100 personalizadas para coletores de dados e microterminais, entre em contato para uma consultoria especializada em soluções de mobilidade e coleta de dados.
