No vídeo de hoje iremos demonstrar em como criar o recurso de pesquisar dentro da uma tela com FWMarkBrowse.
A dúvida de hoje foi feita por alguns alunos no nosso grupo do WhatsApp, onde perguntaram se seria possível habilitar o recurso de pesquisar registros em uma tela com FWMarkBrowse.
Então montamos um exemplo demonstrando como utilizar os métodos como o SetSeek.
E abaixo o código fonte desenvolvido para exemplificar:
//Bibliotecas #Include "Totvs.ch" #Include "FWMVCDef.ch" /*/{Protheus.doc} User Function zVid0046 Teste MarkBrowse @author Daniel Atilio @since 20/07/2022 @version 1.0 @type function @obs Codigo gerado automaticamente pelo Autumn Code Maker @see http://autumncodemaker.com /*/ User Function zVid0046() Local aArea := FWGetArea() Local aPergs := {} Local xPar0 := Space(6) Local xPar1 := Space(6) //Adicionando os parametros do ParamBox aAdd(aPergs, {1, "Pedido De", xPar0, "", ".T.", "SC7", ".T.", 80, .F.}) aAdd(aPergs, {1, "Pedido Até", xPar1, "", ".T.", "SC7", ".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 Daniel Atilio @since 20/07/2022 @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, { 'C7_FILIAL', 'C', 2, 0}) //Filial aAdd(aCampos, { 'C7_NUM', 'C', 6, 0}) //Pedido aAdd(aCampos, { 'C7_FORNECE', 'C', 6, 0}) //Fornecedor aAdd(aCampos, { 'C7_PRODUTO', 'C', 15, 0}) //Produto aAdd(aCampos, { 'C7_EMISSAO', 'D', 8, 0}) //Data Emissão //Cria a tabela temporária oTempTable:= FWTemporaryTable():New(cAliasTmp) oTempTable:SetFields( aCampos ) oTempTable:AddIndex("1", {"C7_FILIAL","C7_NUM"} ) oTempTable:Create() //Popula a tabela temporária Processa({|| fPopula()}, 'Processando...') //Adiciona as colunas que serão exibidas no FWMarkBrowse aColunas := fCriaCols() aSeek := {} cCampoAux := "C7_NUM" aAdd(aSeek,{GetSX3Cache(cCampoAux, "X3_TITULO"), {{"", GetSX3Cache(cCampoAux, "X3_TIPO"), GetSX3Cache(cCampoAux, "X3_TAMANHO"), GetSX3Cache(cCampoAux, "X3_DECIMAL"), AllTrim(GetSX3Cache(cCampoAux, "X3_TITULO")), AllTrim(GetSX3Cache(cCampoAux, "X3_PICTURE"))}} } ) //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:SetDescription("Pedidos de Compra") //Titulo da Janela oMarkBrowse:SetAlias(cAliasTmp) oMarkBrowse:oBrowse:SetDBFFilter(.T.) oMarkBrowse:oBrowse:SetUseFilter(.F.) //Habilita a utilização do filtro no Browse oMarkBrowse:oBrowse:SetFixedBrowse(.T.) oMarkBrowse:SetWalkThru(.F.) //Habilita a utilização da funcionalidade Walk-Thru no Browse oMarkBrowse:SetAmbiente(.T.) //Habilita a utilização da funcionalidade Ambiente no Browse oMarkBrowse:SetTemporary(.T.) //Indica que o Browse utiliza tabela temporária oMarkBrowse:oBrowse:SetSeek(.T.,aSeek) //Habilita a utilização da pesquisa de registros no Browse oMarkBrowse:oBrowse:SetFilterDefault("") //Indica o filtro padrão do Browse oMarkBrowse:SetFieldMark('OK') oMarkBrowse:SetFontBrowse(oFontGrid) oMarkBrowse:SetOwner(oPanGrid) oMarkBrowse:SetColumns(aColunas) 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 Daniel Atilio @since 20/07/2022 @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_zVid46Ok' 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 Daniel Atilio @since 20/07/2022 @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 C7_FILIAL, C7_NUM, C7_FORNECE, C7_PRODUTO, C7_EMISSAO " + CRLF cQryDados += "FROM SC7990 SC7 " + CRLF cQryDados += "WHERE C7_NUM >= '" + MV_PAR01 + "' AND C7_NUM <= '" + MV_PAR02 + "' AND SC7.D_E_L_E_T_ = ' '" + 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)->C7_FILIAL := QRYDADTMP->C7_FILIAL (cAliasTmp)->C7_NUM := QRYDADTMP->C7_NUM (cAliasTmp)->C7_FORNECE := QRYDADTMP->C7_FORNECE (cAliasTmp)->C7_PRODUTO := QRYDADTMP->C7_PRODUTO (cAliasTmp)->C7_EMISSAO := QRYDADTMP->C7_EMISSAO (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 Daniel Atilio @since 20/07/2022 @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, { 'C7_FILIAL', 'Filial', 'C', 2, 0, ''}) aAdd(aEstrut, { 'C7_NUM', 'Pedido', 'C', 6, 0, ''}) aAdd(aEstrut, { 'C7_FORNECE', 'Fornecedor', 'C', 6, 0, ''}) aAdd(aEstrut, { 'C7_PRODUTO', 'Produto', 'C', 15, 0, ''}) aAdd(aEstrut, { 'C7_EMISSAO', 'Data Emissão', 'D', 8, 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 zVid46Ok Função acionada pelo botão continuar da rotina @author Daniel Atilio @since 20/07/2022 @version 1.0 @type function @obs Codigo gerado automaticamente pelo Autumn Code Maker @see http://autumncodemaker.com /*/ User Function zVid46Ok() Processa({|| fProcessa()}, 'Processando...') Return /*/{Protheus.doc} fProcessa Função que percorre os registros da tela @author Daniel Atilio @since 20/07/2022 @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)->C7_FILIAL) */ 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.
Bom dia Daniel,
Exemplo muito bom, mas estou com problema.
Criei a tela para buscar dados a partir de um campo na grid, mas quando retorna os dados não consigo atualizar na tela da grid essas informações. Tem alguma ideia de como posso fazer isso?
Bom dia Marcelo, tudo joia?
Depende se você esta usando algum DbSetFilter, ou se simplesmente esta apagando (DbDelete) os dados da temporária e readicionando com RecLock.
Quando acontece algo nesse sentido o que eu faço, é reposicionar a grid no fim e no começo (que é similar a pressionar -End- e depois -Home- do teclado), conforme trecho abaixo:
Abraços.
Boa tarde Daniel,
Utilizei o que informastes mas não atualizou a grid. Segue o meu fonte para você olhar e ver o que pode ser.
#Include ‘Protheus.ch’
User Function SJTelaDes()
Local nI := 0
Local aGrpUsu := UsrRetGrp() //Pega os grupos do usuario
Local cCodOp := Space(11)
Local cCodPro := Space(20)
Local cDesPro := “”
Local cCodDoc := Space(09)
Local oMenu
Local oTMenuIte1
Local oTMenuIte2
Local oTButton
//Objetos e componentes gerais
Private oTimer
Private oDlgPrinc
Private oFwLayer
Private oPanGrid1
Private oPanGrid2
Private oTempTable
Private cMascara := “@E 999,999,999,999,999.99”
//Cabeçalho
Private oSayOP, oGetOP
Private oBtnSair
Private oBtnCopy
Private oBtnGrav
Private oBtnCons
//Tamanho da janela
Private aSize := MsAdvSize(.F.)
Private nJanLarg := aSize[5]
Private nJanAltu := aSize[6]
//Fontes
Private cFontUti := “Tahoma”
Private oFontBtn := TFont():New(cFontUti, , -14)
Private oFontSay := TFont():New(cFontUti, , -12)
//Grid
Private aCampos := {}
Private aColGrid1 := {} //Colunas da Grid 1
Private aColGrid2 := {} //Colunas da Grid 2
Private oMarkBrowse
//Cria tabela temporaria
SFCriaTab()
//Busca as colunas do browse
SFCriaCols()
//Cria a janela
DEFINE MSDIALOG oDlgPrinc TITLE “Desmontagem Produtos” FROM 0,0 TO nJanAltu,nJanLarg PIXEL
//Criando a camada
oFwLayer := FwLayer():New()
oFwLayer:Init(oDlgPrinc,.F.)
//Adicionando 3 linhas, a de título, a superior e a do calendário
oFWLayer:addLine(“TITULO”,015,.T.)
oFWLayer:addLine(“CORPO” ,085,.T.)
//Adicionando as colunas das linhas
oFWLayer:addCollumn(“HEADERTEXT”,070,.T.,”TITULO”)
oFWLayer:addCollumn(“BLANKBTN” ,030,.T.,”TITULO”)
oFWLayer:addCollumn(“BLANKANTES” ,001,.T.,”CORPO”)
oFWLayer:addCollumn(“COLGRID1″ ,049,.T.,”CORPO”) //Coluna da grid 1
oFWLayer:addCollumn(“COLGRID2″ ,049,.T.,”CORPO”) //Coluna da grid 2
oFWLayer:addCollumn(“BLANKDEPOIS”,001,.T.,”CORPO”)
//Criando os paineis
oPanHeader := oFWLayer:GetColPanel(“HEADERTEXT”,”TITULO”)
oPanSair := oFWLayer:GetColPanel(“BLANKBTN” ,”TITULO”)
oPanGrid1 := oFWLayer:GetColPanel(“COLGRID1″ ,”CORPO”)
oPanGrid2 := oFWLayer:GetColPanel(“COLGRID2″ ,”CORPO”)
//Cabeçalho
cDesPro := Alltrim(Posicione(“SB1”,1,xFilial(“SB1″)+cCodPro,”B1_DESC”))
oSayOP := TSay():New(006,003,{|| “Ordem Produção:”},oPanHeader,””,oFontSay,,,,.T.,,,200,30,,,,,,.F.,,)
oGetOP := TGet():New(004,052,{|u| IIF(PCount() > 0,cCodOp := u,cCodOp)},,80,10,,,,,oFontSay,,,.T.)
oSayDoc := TSay():New(006,150,{|| “Documento:”},oPanHeader,””,oFontSay,,,,.T.,,,200,30,,,,,,.F.,,)
oGetDoc := TGet():New(004,189,{|u| IIF(PCount() > 0,cCodDoc := u,cCodDoc)},,80,10,,,,,oFontSay,,,.T.)
oSayPro := TSay():New(020,003,{|| “Produto:”},oPanHeader,””,oFontSay,,,,.T.,,,200,30,,,,,,.F.,,)
oGetPro := TGet():New(018,052,{|u| IIF(PCount() > 0,cCodPro := u,cCodPro)},,80,10,,,,,oFontSay,,,.T.)
oSayDoc := TSay():New(020,150,{|| “Descrição:”},oPanHeader,””,oFontSay,,,,.T.,,,200,30,,,,,,.F.,,)
oGetDoc := TGet():New(018,189,{|u| IIF(PCount() > 0,cDesPro := u,cDesPro)},,350,10,,,,,oFontSay,,,.T.)
//Cria Menu
oMenu := TMenu():New(003,040,050,012,.T.)
oTMenuIte1 := TMenuItem():New(oDlgPrinc,”Consultar”,,,,{|| SFConsult(cCodOp)},,,,,,,,,.T.)
oTMenuIte2 := TMenuItem():New(oDlgPrinc,”Copiar” ,,,,{|| SFCopy()} ,,,,,,,,,.T.)
oMenu:Add(oTMenuIte1)
oMenu:Add(oTMenuIte2)
//Criando os botões
//oBtnCons := TButton():New(003,000,”Consultar”,oPanSair,{|| SFCopy()},050,012,,oFontBtn,,.T.,,,,,,)
//oBtnCopy := TButton():New(003,040,”Copiar” ,oPanSair,{|| SFCopy()},050,012,,oFontBtn,,.T.,,,,,,)
oTButton := TButton():New(003,040,”Outras Ações”,oPanSair,{||} ,050,012,,oFontBtn,,.T.,,,,,,)
oBtnGrav := TButton():New(003,095,”Confirmar” ,oPanSair,{|| SFGrava()},050,012,,oFontBtn,,.T.,,,,,,)
oBtnSair := TButton():New(003,150,”Fechar” ,oPanSair,{|| oDlgPrinc:End()},050,012,,oFontBtn,,.T.,,,,,,)
// Define botão no Menu
oTButton:SetPopupMenu(oMenu)
//Cria a grid 1
oMarkBrowse := FWMarkBrowse():New()
oMarkBrowse:SetAlias(“TRB1”)
oMarkBrowse:DisableFilter()
oMarkBrowse:DisableConfig()
oMarkBrowse:DisableReport()
oMarkBrowse:DisableSeek()
oMarkBrowse:DisableSaveConfig()
oMarkBrowse:SetFontBrowse(oFontSay)
oMarkBrowse:SetFieldMark(‘OK’)
oMarkBrowse:SetTemporary(.T.)
oMarkBrowse:SetColumns(aColGrid1)
oMarkBrowse:SetOwner(oPanGrid1)
oMarkBrowse:Activate()
oMarkBrowse:Refresh(.T.)
//Cria a grid 2
oMarkBrowse := FWMarkBrowse():New()
oMarkBrowse:SetAlias(“TRB2”)
oMarkBrowse:DisableFilter()
oMarkBrowse:DisableConfig()
oMarkBrowse:DisableReport()
oMarkBrowse:DisableSeek()
oMarkBrowse:DisableSaveConfig()
oMarkBrowse:SetFontBrowse(oFontSay)
oMarkBrowse:SetFieldMark(‘OK’)
oMarkBrowse:SetTemporary(.T.)
oMarkBrowse:SetColumns(aColGrid2)
oMarkBrowse:SetOwner(oPanGrid2)
oMarkBrowse:Activate()
Activate MsDialog oDlgPrinc Centered
oTempTable:Delete()
Return
/**************************************************************************/
/*** Descrição: Rotina para criar tabela temporária ***/
/**************************************************************************/
Static Function SFCriaTab()
//Adiciona as colunas que serão criadas na temporária
aAdd(aCampos,{“OK” ,”C”,2 ,0})
aAdd(aCampos,{“CODPRO” ,”C”,30,0})
aAdd(aCampos,{“DESPRO” ,”C”,50,0})
aAdd(aCampos,{“QUANT” ,”N”,18,2})
aAdd(aCampos,{“ARMAZEM” ,”C”,2 ,0})
//Cria a tabela temporária
oTempTable:= FWTemporaryTable():New(“TRB1”)
oTempTable:SetFields(aCampos)
oTempTable:Create()
oTempTable:= FWTemporaryTable():New(“TRB2”)
oTempTable:SetFields(aCampos)
oTempTable:Create()
Return
/**************************************************************************/
/*** Descrição: Rotina para adicionar os campos no Browse da Grid ***/
/**************************************************************************/
Static Function SFCriaCols()
Local nAtual := 0
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,{“CODPRO” ,”Produto” ,”C”,30,0,””})
aAdd(aEstrut,{“DESPRO” ,”Desc.Prod.”,”C”,50,0,””})
aAdd(aEstrut,{“QUANT” ,”Quantidade”,”N”,18,2,cMascara})
aAdd(aEstrut,{“ARMAZEM”,”Armazem” ,”C”,2 ,0,””})
//Percorrendo todos os campos da estrutura
For nAtual := 1 To Len(aEstrut)
//Cria a coluna
oColumn := FWBrwColumn():New()
oColumn:SetData(&(“{|| TRB1->” + 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(aColGrid1,oColumn)
oColumn := FWBrwColumn():New()
oColumn:SetData(&(“{|| TRB2->” + 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])
aAdd(aColGrid2,oColumn)
Next
Return
/**************************************************************************/
/*** Descrição: Rotina para carregar as informações da OP antiga ***/
/**************************************************************************/
Static Function SFConsult(cCodOp)
Local cQuery := “”
cQuery := “SELECT D3_COD, B1_DESC, D3_QUANT, D3_LOCAL ”
cQuery += “FROM “+ RetSqlName(“SD3″) +” SD3 ”
cQuery += “JOIN “+ RetSqlName(“SB1″) +” SB1 ON B1_FILIAL = ‘”+ xFilial(“SB1″) +”‘ AND SB1.B1_COD = SD3.D3_COD ”
cQuery += ” AND SB1.B1_MSBLQL = ‘2’ AND SB1.D_E_L_E_T_ = ” ”
cQuery += “WHERE SD3.D3_FILIAL = ‘”+ xFilial(“SD3″) +”‘ ”
cQuery += “AND SD3.D3_OP = ‘”+ cCodOp +”‘ ”
cQuery += “AND SD3.D3_TM ‘010’ AND SD3.D_E_L_E_T_ = ” ”
cQuery := ChangeQuery(cQuery)
dbUseArea(.T.,”TOPCONN”,TcGenQry(,,cQuery),”QRY”,.T.,.T.)
While QRY->(!EoF())
RecLock(“TRB1”, .T.)
TRB1->OK := “”
TRB1->CODPRO := QRY->D3_COD
TRB1->DESPRO := QRY->B1_DESC
TRB1->QUANT := QRY->D3_QUANT
TRB1->ARMAZEM := QRY->D3_LOCAL
TRB1->(MsUnlock())
QRY->(DbSkip())
EndDo
QRY->(dbCloseArea())
//Posiciona no fim do alias e do browse
TRB1->(DbGoBottom())
oMarkBrowse:GoBottom(.T.)
oMarkBrowse:Refresh()
//Em seguida, já posiciona no começo do alias e do browse
TRB1->(DbGoTop())
oMarkBrowse:GoTop(.T.)
oMarkBrowse:Refresh()
Return
/**************************************************************************/
/*** Descrição: Rotina para copiar os dados da OP antiga para a Nova OP ***/
/**************************************************************************/
Static Function SFCopy()
MsgStop(“Copiar dados!”)
/* 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
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
/**************************************************************************/
/*** Descrição: Rotina para criar a nova OP de acordo com os empenhos ***/
/**************************************************************************/
Static Function SFGrava()
MsgStop(“Gravar dados!”)
Return
Boa tarde Marcelo, tudo bem?
Vixe que estranho, era com os comandos do GoBottom e GoTop funcionarem.
Em todo o caso, poste então no nosso grupo do WhatsApp, ai lá tanto nossa equipe quanto outras pessoas poderão dar atenção a sua dúvida.
Veja como fazer para entrar no grupo: https://terminaldeinformacao.com/grupo-no-whatsapp/
Um forte abraço.