Abrir documentos do Banco de Conhecimento via código fonte

No artigo de hoje, vamos demonstrar em como abrir um arquivo do banco de conhecimento via código fonte em AdvPL ou TLPP.

Para quem utiliza o recurso de fazer upload de arquivos no Protheus, através da rotina de Banco de Conhecimento, pode ser que já se deparou com a necessidade de posicionar na ACB e abrir o arquivo manualmente, sem precisar abrir a tela do banco de conhecimento (função MsDocument).

Para isso, existem duas funções no Protheus que fazem essa tratativa, dependendo de como está parametrizado o MV_MODEDOC, que são as seguintes funções:

  • MpDocView, que abre o arquivo quando o upload é feito na file system
  • MpBinView, que abre o arquivo quando o upload é feito no banco de dados

Pensando no cenário acima, montamos uma função genérica, que recebe o código do documento, verifica como que está parametrizado o upload pelo parâmetro MV_MODEDOC, e já aciona a função respectiva.

Segue abaixo o código fonte:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} zAbreDoc
Função que realiza a abertura de um arquivo do banco de conhecimento
@type user function
@author Atilio
@since 24/02/2025
@version version
@see https://tdn.totvs.com/display/public/framework/MpBinView+-+Banco+de+Conhecimento e https://tdn.totvs.com/display/public/framework/MpDocView+-+Banco+de+Conhecimento
@example
    u_zAbreDoc("0000000002")
/*/

User Function zAbreDoc(cCodObj)
    Local aArea       := FWGetArea()
    Local cModeDoc    := GetMV("MV_MODEDOC") // 1 = File System; 2 = DataBase
    Default cCodObj   := ""

    //Se veio código de objeto
    If ! Empty(cCodObj)

        DbSelectArea("ACB")
        ACB->(DbSetOrder(1)) // ACB_FILIAL + ACB_CODOBJ

        //Se conseguir posicionar
        If ACB->(MsSeek(FWxFilial("ACB") + cCodObj))

            //Se for sistema de arquivos
            If cModeDoc == "1"
                MpDocView(ACB->ACB_OBJETO)

            //Se for banco de dados
            ElseIf cModeDoc == "2"
                MpBinView(ACB->ACB_OBJETO, ACB->ACB_BIND)
            EndIf
        EndIf
    EndIf

    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.

Deixe uma resposta

Terminal de Informação