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.