Nesse vídeo demonstraremos a utilização da classe FWMarkBrowse, que serve para abrir uma tela com um browse de navegação de registros com a possibilidade de marcar, para um processamento das informações.
Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:
//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"
/*/{Protheus.doc} User Function zExe229
Exemplo de tela com marcação de dados
@author Atilio
@since 20/02/2023
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com e https://tdn.totvs.com/display/public/framework/FWMarkBrowse
/*/
User Function zExe229()
Local aArea := FWGetArea()
Local aPergs := {}
Local xPar0 := Space(15)
Local xPar1 := Space(15)
//Adicionando os parametros do ParamBox
aAdd(aPergs, {1, "Produto De", xPar0, "", ".T.", "SB1", ".T.", 80, .F.})
aAdd(aPergs, {1, "Produto Até", xPar1, "", ".T.", "SB1", ".T.", 80, .T.})
//Se a pergunta for confirma, chama a tela
If ParamBox(aPergs, "Informe os parametros")
fMontaTela()
EndIf
FWRestArea(aArea)
Return
/*/{Protheus.doc} fMontaTela
Monta a tela com a marcação de dados
@author Atilio
@since 20/02/2023
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function fMontaTela()
Local aArea := GetArea()
Local aCampos := {}
Local oTempTable := Nil
Local aColunas := {}
Local cFontPad := 'Tahoma'
Local oFontGrid := TFont():New(cFontPad,,-14)
//Janela e componentes
Private oDlgMark
Private oPanGrid
Private oMarkBrowse
Private cAliasTmp := GetNextAlias()
Private aRotina := MenuDef()
//Tamanho da janela
Private aTamanho := MsAdvSize()
Private nJanLarg := aTamanho[5]
Private nJanAltu := aTamanho[6]
//Adiciona as colunas que serão criadas na temporária
aAdd(aCampos, { 'OK', 'C', 2, 0}) //Flag para marcação
aAdd(aCampos, { 'B1_COD', 'C', 15, 0}) //Produto
aAdd(aCampos, { 'B1_TIPO', 'C', 2, 0}) //Tipo
aAdd(aCampos, { 'B1_UM', 'C', 2, 0}) //Unid. Med.
aAdd(aCampos, { 'B1_DESC', 'C', 50, 0}) //Descrição
//Cria a tabela temporária
oTempTable:= FWTemporaryTable():New(cAliasTmp)
oTempTable:SetFields( aCampos )
oTempTable:Create()
//Popula a tabela temporária
Processa({|| fPopula()}, 'Processando...')
//Adiciona as colunas que serão exibidas no FWMarkBrowse
aColunas := fCriaCols()
//Criando a janela
DEFINE MSDIALOG oDlgMark TITLE 'Tela para Marcação de dados - Autumn Code Maker' FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
//Dados
oPanGrid := tPanel():New(001, 001, '', oDlgMark, , , , RGB(000,000,000), RGB(254,254,254), (nJanLarg/2)-1, (nJanAltu/2 - 1))
oMarkBrowse := FWMarkBrowse():New()
oMarkBrowse:SetAlias(cAliasTmp)
oMarkBrowse:SetDescription('Produtos')
oMarkBrowse:DisableFilter()
oMarkBrowse:DisableConfig()
oMarkBrowse:DisableSeek()
oMarkBrowse:DisableSaveConfig()
oMarkBrowse:SetFontBrowse(oFontGrid)
oMarkBrowse:SetFieldMark('OK')
oMarkBrowse:SetTemporary(.T.)
oMarkBrowse:SetColumns(aColunas)
//oMarkBrowse:AllMark()
oMarkBrowse:SetOwner(oPanGrid)
oMarkBrowse:Activate()
ACTIVATE MsDialog oDlgMark CENTERED
//Deleta a temporária e desativa a tela de marcação
oTempTable:Delete()
oMarkBrowse:DeActivate()
RestArea(aArea)
Return
/*/{Protheus.doc} MenuDef
Botões usados no Browse
@author Atilio
@since 20/02/2023
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function MenuDef()
Local aRotina := {}
//Criação das opções
ADD OPTION aRotina TITLE 'Continuar' ACTION 'u_zExe229O' OPERATION 2 ACCESS 0
Return aRotina
/*/{Protheus.doc} fPopula
Executa a query SQL e popula essa informação na tabela temporária usada no browse
@author Atilio
@since 20/02/2023
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function fPopula()
Local cQryDados := ''
Local nTotal := 0
Local nAtual := 0
//Monta a consulta
cQryDados += "SELECT B1_COD, B1_TIPO, B1_UM, B1_DESC " + CRLF
cQryDados += "FROM SB1990 SB1 " + CRLF
cQryDados += "WHERE B1_FILIAL = '' AND B1_COD >= '" + MV_PAR01 + "' AND B1_COD <= '" + MV_PAR02 + "' AND SB1.D_E_L_E_T_ = ' ' " + CRLF
cQryDados += "ORDER BY B1_COD" + CRLF
PLSQuery(cQryDados, 'QRYDADTMP')
//Definindo o tamanho da régua
DbSelectArea('QRYDADTMP')
Count to nTotal
ProcRegua(nTotal)
QRYDADTMP->(DbGoTop())
//Enquanto houver registros, adiciona na temporária
While ! QRYDADTMP->(EoF())
nAtual++
IncProc('Analisando registro ' + cValToChar(nAtual) + ' de ' + cValToChar(nTotal) + '...')
RecLock(cAliasTmp, .T.)
(cAliasTmp)->OK := Space(2)
(cAliasTmp)->B1_COD := QRYDADTMP->B1_COD
(cAliasTmp)->B1_TIPO := QRYDADTMP->B1_TIPO
(cAliasTmp)->B1_UM := QRYDADTMP->B1_UM
(cAliasTmp)->B1_DESC := QRYDADTMP->B1_DESC
(cAliasTmp)->(MsUnlock())
QRYDADTMP->(DbSkip())
EndDo
QRYDADTMP->(DbCloseArea())
(cAliasTmp)->(DbGoTop())
Return
/*/{Protheus.doc} fCriaCols
Função que gera as colunas usadas no browse (similar ao antigo aHeader)
@author Atilio
@since 20/02/2023
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function fCriaCols()
Local nAtual := 0
Local aColunas := {}
Local aEstrut := {}
Local oColumn
//Adicionando campos que serão mostrados na tela
//[1] - Campo da Temporaria
//[2] - Titulo
//[3] - Tipo
//[4] - Tamanho
//[5] - Decimais
//[6] - Máscara
aAdd(aEstrut, { 'B1_COD', 'Produto', 'C', 15, 0, ''})
aAdd(aEstrut, { 'B1_TIPO', 'Tipo', 'C', 2, 0, ''})
aAdd(aEstrut, { 'B1_UM', 'Unid. Med.', 'C', 2, 0, ''})
aAdd(aEstrut, { 'B1_DESC', 'Descrição', 'C', 50, 0, ''})
//Percorrendo todos os campos da estrutura
For nAtual := 1 To Len(aEstrut)
//Cria a coluna
oColumn := FWBrwColumn():New()
oColumn:SetData(&('{|| ' + cAliasTmp + '->' + aEstrut[nAtual][1] +'}'))
oColumn:SetTitle(aEstrut[nAtual][2])
oColumn:SetType(aEstrut[nAtual][3])
oColumn:SetSize(aEstrut[nAtual][4])
oColumn:SetDecimal(aEstrut[nAtual][5])
oColumn:SetPicture(aEstrut[nAtual][6])
//Adiciona a coluna
aAdd(aColunas, oColumn)
Next
Return aColunas
/*/{Protheus.doc} User Function zExe229O
Função acionada pelo botão continuar da rotina
@author Atilio
@since 20/02/2023
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
User Function zExe229O()
Processa({|| fProcessa()}, 'Processando...')
Return
/*/{Protheus.doc} fProcessa
Função que percorre os registros da tela
@author Atilio
@since 20/02/2023
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/
Static Function fProcessa()
Local aArea := FWGetArea()
Local cMarca := oMarkBrowse:Mark()
Local nAtual := 0
Local nTotal := 0
Local nTotMarc := 0
//Define o tamanho da régua
DbSelectArea(cAliasTmp)
(cAliasTmp)->(DbGoTop())
Count To nTotal
ProcRegua(nTotal)
//Percorrendo os registros
(cAliasTmp)->(DbGoTop())
While ! (cAliasTmp)->(EoF())
nAtual++
IncProc('Analisando registro ' + cValToChar(nAtual) + ' de ' + cValToChar(nTotal) + '...')
//Caso esteja marcado
If oMarkBrowse:IsMark(cMarca)
nTotMarc++
/*
//Aqui dentro você pode fazer o seu processamento
Alert((cAliasTmp)->B1_COD)
*/
EndIf
(cAliasTmp)->(DbSkip())
EndDo
//Mostra a mensagem de término e caso queria fechar a dialog, basta usar o método End()
FWAlertInfo('Dos [' + cValToChar(nTotal) + '] registros, foram processados [' + cValToChar(nTotMarc) + '] registros', 'Atenção')
//oDlgMark:End()
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Boa Tarde Daniel tudo bem, espero que esteja tudo bem com voce,
Estou usando este seu exemplo e o pessoal aqui esta me solicitando incluir uma coluna de legenda, esta coluna se ativada toda vez que um registro for marcado ele mostra uma bolinha vermelha caso contrario verde, tem como fazer isso.
Desde já Obrigado.
Bom dia Wanderson, tudo joia graças a Deus e você?
Acho que teria sim, a lógica seria algo mais ou menos assim:
a. Crie um campo a mais na temporária, algo como XXSTATUS
b. Use o método AddLegend e coloque algo como XXSTATUS igual a 1 será verde e se for igual a 2 será vermelho
c. Use o método SetAfterMark, e dentro dele você atualiza o XXSTATUS para 1 ou 2 dependendo se esta marcado ou não
Tenha uma ótima e abençoada quinta feira.
Um grande abraço.