Extrair o nome somente de fontes customizados do RPO

Boa noite!

Fiz uma função pra gerar um .txt com todos os fontes que contém User Functions no RPO a partir do array abaixo:


aFunc := GetFuncArray('U_*', aType, aFile, aLine, aDate,aTime)

Avaliando esse .txt notei que existem vários fontes no RPO que não são de customizações do cliente, ou seja, são de propriedade da TOTVS (RDMakes, etc..)

Existe a possibilidade de estar extraindo do RPO seja via GetFuncArray, via outra função ou até mesmo via inspetor de objetos do RPO Custom, somente as informações de User Functions customizadas?

Boa noite!

Leonardo, os fontes customizados alimentam uma tabela chamada XX7. Talvez possa te ajudar fazer um select nela.

Somente pontos de entrada e funções de menu são salvas no catálogo de personalização, logo demais funções de usuários como validações de campos, inicializadores, gatilhos etc não constaram nessa tabela: Catálogo de Personalizações (CFGA030 - SIGACFG) - Frameworksp - TDN

Obrigado pela dica Raphael, mas o caso é como o Daniel comentou, preciso pegar todas customizações inclusive de validações, gatilhos e etc…

Leonardo,

Hoje a função GetFuncArray não possui o parâmetro de RPO, logo ela vai trazer toda user function que ela encontrar.

Você pode usar a função GetFuncArray junto com a GetSrcArray para saber se o fonte encontrado está no RPO padrão ou no RPO Custom.

O código vai ficar mais extenso e mais complexo, veja um exemplo:


//-------------------------------------------------------------------
/*/{Protheus.doc} getRpoCustomFunctions
Geração de CSV com as funções de usuário presentes no RPO Custom

@author Daniel Mendes
@since 24/05/2022
@version 1.0
/*/
//-------------------------------------------------------------------
user function getRpoCustomFunctions()
local aFunc1 as array
local aType1 as array
local aFile1 as array
local aLine1 as array
local aDate1 as array
local aTime1 as array
local aFunc2 as array
local aType2 as array
local aFile2 as array
local aLine2 as array
local aDate2 as array
local aTime2 as array
local nHandler as numeric
local aSrc as array
local nI as numeric
local cCRLF as character

aType1 := {}
aFile1 := {}
aLine1 := {}
aDate1 := {}
aTime1 := {}

aFunc1 := GetFuncArray('U_*', @aType1, @aFile1, @aLine1, @aDate1, @aTime1)

aFunc2 := {}
aType2 := {}
aFile2 := {}
aLine2 := {}
aDate2 := {}
aTime2 := {}

for nI := 1 to Len(aFunc1)
    aSrc := GetSrcArray(aFile1[nI], 3)

    if !Empty(aSrc)
        aSize(aSrc, 0)
        aAdd(aFunc2, aFunc1[nI])
        aAdd(aType2, aType1[nI])
        aAdd(aFile2, aFile1[nI])
        aAdd(aLine2, aLine1[nI])
        aAdd(aDate2, aDate1[nI])
        aAdd(aTime2, aTime1[nI])
    endif
next

aSize(aFunc1, 0)
aSize(aType1, 0)
aSize(aFile1, 0)
aSize(aLine1, 0)
aSize(aDate1, 0)
aSize(aTime1, 0)

nHandler := FCreate("custom-user-functions.csv")

if nHandler >= 0
    cCRLF := Chr(13) + Chr(10)
    FWrite(nHandler, "Função;Fonte;Tipo;Linha;Data;Hora" + cCRLF)

    for nI := 1 to Len(aFunc2)
        FWrite(nHandler, aFunc2[nI] + ";" + aFile2[nI] + ";" + aType2[nI] + ";" + aLine2[nI] + ";" + DtoC(aDate2[nI]) + ";" + aTime2[nI] + cCRLF)
    next

    FClose(nHandler)
else
    MsgStop("Erro na criação do arquivo:" + cValToChar(FError()))
endif

aSize(aFunc2, 0)
aSize(aType2, 0)
aSize(aFile2, 0)
aSize(aLine2, 0)
aSize(aDate2, 0)
aSize(aTime2, 0)

return

Veja que primeiro encontro as user functions e depois valido se o fonte esta no RPO custom com a GetSrcArray, enviado o segundo parâmetro.

Obs.: Esse código só funcionará corretamente em binário Hárpia ou superior.

Atenção: Esse código só listará as funções de usuário, conforme sua pergunta, mas também é possível que o RPO Custom possua classes, métodos estáticos etc, os quais não existe uma identificação simples como U_ como prefixo.


Documentações:

https://tdn.totvs.com/display/tec/GetSrcArray

https://tdn.totvs.com/display/tec/GetFuncArray

Acho que para o que ele perguntou só a função GetSrcArray já retorna todos os fontes compilados no RPO custom, o que já deve resolver.

Obrigado Daniel, vou tentar com essa sua dica!

Para ambientes anteriores ao Harpia que possuem um rpo só, uma saída interessante é executar a sua função com um RPO padrão, exportar o resultado para uma tabela excel e então executar a sua função com o RPO customizado e também exportar o resultado para o excel.

Aí é só fazer uma comparação das duas tabelas, tudo que só existir na segunda tabela serão os personalizados do ambiente.

Aqui como fazer esse tipo de comparação no excel:

https://pt.wikihow.com/Comparar-Dados-no-Excel

É uma saída também Josué! Não havia pensado nisso… obrigado! Porém o caso do cliente é binário Harpia, vou fazer umas experimentações com essa dica!