Sabe aquele arquivo do IXBLOG gerado que é necessário validar? Imagina ter uma função que transforme em Excel, e deixe mais fácil a leitura.
Foi pensando nisso, que foi criado a função zLog2Excel, usando os dados de um arquivo IXBLOG. Ao gerar um arquivo de LOG notamos que existem inúmeras informações, como abaixo por exemplo.
Porém, para deixarmos melhor a visualização e até mesmo identificar onde que há gargalos no tempo, é transformado em excel.
Abaixo o fonte desenvolvido.
//Bibliotecas #Include "Protheus.ch" /*/{Protheus.doc} zLog2Excel Função que converte um arquivo gerado com IXBLOG em uma planilha para análise @author Atilio @since 29/08/2018 @version 1.0 @param cArquivo, characters, Caminho do arquivo a ser analisado @type function @sample u_zLog2Excel("C:\spool\administrador_461090.txt") /*/ User Function zLog2Excel(cArquivo) Local aArea := GetArea() Default cArquivo := "" //Se tiver conteúdo e o arquivo existir, chama o processamento If ! Empty(cArquivo) .And. File(cArquivo) Processa({|| fProcessa(cArquivo)}, "Processando") EndIf RestArea(aArea) Return /*---------------------------------------------------------------------* | Func: fProcessa | | Desc: Função que processa o arquivo e gera um arquivo do Excel | *---------------------------------------------------------------------*/ Static Function fProcessa(cArquivo) Local aArea := GetArea() Local oFile Local aLinhas := {} Local nAtual := 0 Local cLinAtu := "" Local aExport := {} Local nPosSeq := 1 //Sequencia Local nPosDe := 2 //From Local nPosExe := 3 //ExecBlock Local nPosIn := 4 //Time In Local nPosOut := 5 //Time Out Local nPosDif := 6 //Diferença de Tempo Local oFWMsExcel Local oExcel Local cArqExport := GetTempPath()+'zLog2Excel_'+dToS(Date())+'_'+StrTran(Time(), ':', '-')+'.xml' Local cWorkSheet := "Log" Local cTable := "" //Definindo o arquivo a ser lido oFile := FWFileReader():New(cArquivo) //Se o arquivo pode ser aberto If (oFile:Open()) //Se não for fim do arquivo If ! (oFile:EoF()) //Definindo o tamanho da régua aLinhas := oFile:GetAllLines() ProcRegua(Len(aLinhas)) //Método GoTop não funciona, deve fechar e abrir novamente o arquivo oFile:Close() oFile := FWFileReader():New(cArquivo) oFile:Open() //Enquanto houver linhas a serem lidas While (oFile:HasLine()) //Incrementando a régua nAtual++ IncProc("Analisando linha " + cValToChar(nAtual) + " de " + cValToChar(Len(aLinhas)) + "...") //Buscando o texto da linha atual cLinAtu := oFile:GetLine() //Se o trecho contém IXBLOG TYPE, é uma nova linha If Upper("IXBLOG Type") $ Upper(cLinAtu) aAdd(aExport, {; 0,; //Sequencia "",; //From "",; //ExecBlock "",; //Time In "",; //Time Out ""; //Diferença de Tempo }) //Define o tamanho da linha aExport[Len(aExport)][nPosSeq] := Len(aExport) //Atualiza tempo de entrada ElseIf Upper("Time In") $ Upper(cLinAtu) aExport[Len(aExport)][nPosIn] := Alltrim(SubStr(cLinAtu, At(':', cLinAtu) + 1, Len(cLinAtu))) //Atualiza tempo de saída ElseIf Upper("Time Out") $ Upper(cLinAtu) aExport[Len(aExport)][nPosOut] := Alltrim(SubStr(cLinAtu, At(':', cLinAtu) + 1, Len(cLinAtu))) //Atualiza a função chamadora ElseIf Upper("ExecBlock") $ Upper(cLinAtu) aExport[Len(aExport)][nPosExe] := Alltrim(SubStr(cLinAtu, At(':', cLinAtu) + 1, Len(cLinAtu))) //Atualiza a origem ElseIf Upper("From") $ Upper(cLinAtu) aExport[Len(aExport)][nPosDe] := Alltrim(SubStr(cLinAtu, At(':', cLinAtu) + 1, Len(cLinAtu))) EndIf EndDo //Se tiver dados a serem gerados If Len(aExport) > 0 //Agora percorre os dados, e atualiza a diferença de tempo ProcRegua(Len(aExport)) For nAtual := 1 To Len(aExport) IncProc("Atualizando totais - " + cValToChar(nAtual) + " de " + cValToChar(Len(aLinhas)) + "...") aExport[nAtual][nPosDif] := ElapTime(aExport[nAtual][nPosIn], aExport[nAtual][nPosOut]) Next ProcRegua(0) IncProc("Gerando o arquivo...") //Cria a planilha do excel oFWMsExcel := FWMSExcel():New() oFWMsExcel:AddworkSheet(cWorkSheet) oFWMsExcel:AddTable(cWorkSheet, cTable) //Adiciona as colunas oFWMsExcel:AddColumn(cWorkSheet, cTable, "Sequência", 1, 1) oFWMsExcel:AddColumn(cWorkSheet, cTable, "Origem (From)", 1, 1) oFWMsExcel:AddColumn(cWorkSheet, cTable, "Função (ExecBlock)", 1, 1) oFWMsExcel:AddColumn(cWorkSheet, cTable, "Tempo Inicial", 1, 1) oFWMsExcel:AddColumn(cWorkSheet, cTable, "Tempo Final", 1, 1) oFWMsExcel:AddColumn(cWorkSheet, cTable, "Diferença de Tempo", 1, 1) //Adiciona todas as linhas no arquivo For nAtual := 1 To Len(aExport) oFWMsExcel:AddRow(cWorkSheet, cTable, aExport[nAtual]) Next //Ativando o arquivo e gerando o xml oFWMsExcel:Activate() oFWMsExcel:GetXMLFile(cArqExport) //Abrindo o excel e abrindo o arquivo xml oExcel := MsExcel():New() oExcel:WorkBooks:Open(cArqExport) oExcel:SetVisible(.T.) oExcel:Destroy() EndIf EndIf //Fecha o arquivo e finaliza o processamento oFile:Close() EndIf RestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.