Criando pesquisa em uma FWMarkBrowse | Ti Responde 046

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. Marcelo disse:

    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:

      //Posiciona no fim do alias e do browse
      (cAliasForn)->(DbGoBottom())
      oGetForn:GoBottom(.T.)
      oGetForn:Refresh()
      
      //Em seguida, já posiciona no começo do alias e do browse
      (cAliasForn)->(DbGoTop())
      oGetForn:GoTop(.T.)
      oGetForn:Refresh()
      

      Abraços.

  2. Marcelo disse:

    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

Deixe uma resposta

Terminal de Informação