Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: Social :: Rifa Festival da Arte Capoeira Projeto Eu Sou Ninja

Angariar fundos para cobrir os custos logísticos do "Festival da Arte Capoeira" e apoiar o projeto Eu Sou Ninja em sua missão de promover a integração social e cultural na comunidade de Jacaraípe. Com a criação da rifa, buscamos envolver a comunidade de forma ativa no financiamento do evento, permitindo que todos contribuam para o sucesso do festival e para a continuidade das atividades do projeto. Prêmio: Copia da minha biblioteca pessoal de AdvPL/TLpp ..etc Participe da Rifa Eu já contribui. Só falta você! ```cmd Pasta de C:\GitHub\naldodj-tlpp 13/04/2024 19:17 . 19/03/2024 13:49 .. 05/01/2024 12:22 2.742 .gitattributes 14/11/2023 16:02 83 .gitignore 02/12/2023 20:08 .vscode 05/01/2024 12:05 bin 13/04/2024 19:18 4.121 ChangeLog.txt 27/12/2023 02:05 include 14/11/2023 16:02 27.030 LICENSE.txt 14/11/2023 16:02 0 makepatch.lst 14/11/2

BlackTDN :: DNA.TECH x TOTVS Framework (Rinha de Framework) :: FWFileReader():FullRed() x dna.tech.fileTools():FullContentBinaryFile() x dna.tech.cTools():ReadMemo()

#DNA.TECH x TOTVS Framework (Rinha de Framework)

***Nem Sempre utilizar um recurso do Framework irá garantir a melhor performance.***
Hoje iremos comparar a Classe FWFileReader():FullRed() do Framework da TOTVS com Funções/métodos criados por este que vos escreve.

A vítima da vez é:

FWFileReader:FullRed()

Vamos comparar FWFileReader():FullRead() x dna.tech.fileTools():FullContentBinaryFile() x dna.tech.cTools():ReadMemo(cFile)
O Código que usaremos para comparação está transcrito abaixo. 
```xBase

#pragma @__COMPSTR__@

cEOL:=chr(13)+chr(10)
cFile:=cGetFile("*.*|*.*","*.*",1,"C:\",.F.,16,.F.,.F.)

cTimeIni:=Time()

cHashFWFileReader:=""
lFWFileReader:=.T.

MsAguarde(;
    {||;
         if(lFWFileReader,oFWFileReader:=FWFileReader():New(cFile),nil);
        ,if(lFWFileReader,oFWFileReader:Open(),nil);
        ,cContentFWFileReader:=if(lFWFileReader,oFWFileReader:FullRead(),"DEU RUIM");
        ,if(lFWFileReader,oFWFileReader:Close(),nil);
        ,if(lFWFileReader,FreeObj(@oFWFileReader),nil);
        ,cHashFWFileReader:=if(lFWFileReader,SHA256(cContentFWFileReader,2),"DEU RUIM");
        ,cContentFWFileReader:="";
    };
    ,"Aguarde","oFWFileReader:FullRead";
)

nTimeFWFileReader:=if(lFWFileReader,dna.tech.timeCalc():TimeToSecs(ElapTime(cTimeIni,Time())),9999999999999999)
cTimeFWFileReader:=cValToChar(nTimeFWFileReader)

EEcView(;
    "cHashFWFileReader: "+;
    cHashFWFileReader+cEOL+;
    "Elapsed: "+cTimeFWFileReader+"s";
)

cTimeIni:=Time()

cHashFullContentBinaryFile:=""

MsAguarde(;
    {||;
         cFullContentBinaryFile:=dna.tech.fileTools():FullContentBinaryFile(cFile);
        ,cHashFullContentBinaryFile:=SHA256(cFullContentBinaryFile,2);
        ,cFullContentBinaryFile:="";
    };
    ,"Aguarde","dna.tech.fileTools():FullContentBinaryFile";
)

nTimeFullContentBinaryFile:=dna.tech.timeCalc():TimeToSecs(ElapTime(cTimeIni,Time()))
cTimeFullContentBinaryFile:=cValToChar(nTimeFullContentBinaryFile)

EEcView(;
    "cHashFullContentBinaryFile: "+;
    cEOL+;
    cHashFullContentBinaryFile+cEOL+;
    "Elapsed: "+cTimeFullContentBinaryFile+"s";
)

cTimeIni:=Time()

cHashReadMemo:=""

MsAguarde(;
    {||;
         cContentReadMemo:=dna.tech.cTools():ReadMemo(cFile);
        ,cHashReadMemo:=SHA256(cContentReadMemo,2);
        ,cContentReadMemo:="";
    };
    ,"Aguarde","dna.tech.cTools():ReadMemo";
)

nTimeReadMemo:=dna.tech.timeCalc():TimeToSecs(ElapTime(cTimeIni,Time()))
cTimeReadMemo:=cValToChar(nTimeReadMemo)

EEcView(;
    "cHashReadMemo: "+;
    cEOL+;
    cHashReadMemo+;
    cEOL+;
    "Elapsed: "+cTimeReadMemo+"s";
)

EEcView(;
    "cHashFWFileReader: ( Epapsed:"+cTimeFWFileReader+"s)"+;
    cEOL+;
    cHashFWFileReader+;
    cEOL+;
    cEOL+;
    "cHashFullContentBinaryFile: (Epapsed:"+cTimeFullContentBinaryFile+"s)"+;
    cEOL+;
    cHashFullContentBinaryFile+;
    cEOL+;
    cEOL+;
    "cHashFWFileReader==cHashFullContentBinaryFile: "+cValToChar(cHashFWFileReader==cHashFullContentBinaryFile)+;
    cEOL+;
    cEOL+;
    "cHashFWFileReader: (Epapsed:"+cTimeFWFileReader+"s)"+;
    cEOL+;
    cHashFWFileReader+;
    cEOL+;
    cEOL+;
    "cHashReadMemo: (Epapsed:"+cTimeReadMemo+"s)"+;
    cEOL+;
    cHashReadMemo+;
    cEOL+;
    cEOL+;
    "cHashFWFileReader==cHashFWFileReader: "+cValToChar(cHashFWFileReader==cHashReadMemo);
)


```
Vou utilizar, para isso, meu Editor Pessoal de Códigos......
***Neste caso tivemos um empate entre: oFWFileReader:FullRead(), e dna.tech.fileTools():FullContentBinaryFile dna.tech.cTools():ReadMemo()
cHashFWFileReader: ( Epapsed:1s)
a299a8b475f351109445a0414f371e6aa9f77882afb5ee14b1cbbb1be0830036
cHashFullContentBinaryFile: (Epapsed:1s)
a299a8b475f351109445a0414f371e6aa9f77882afb5ee14b1cbbb1be0830036
cHashFWFileReader==cHashFullContentBinaryFile: .T.
cHashReadMemo: (Epapsed:1s)
a299a8b475f351109445a0414f371e6aa9f77882afb5ee14b1cbbb1be0830036
cHashFWFileReader==cHashFWFileReader: .T.
Vamos complicar um pouco...





***Neste caso dna.tech.fileTools():FullContentBinaryFile ganhou em disparada, ficando dna.tech.cTools():ReadMemo() em segundo lugar e, na rabeira: oFWFileReader:FullRead()
cHashFWFileReader: ( Epapsed:132s)
593056342f2b0398bf9bd2b9ed5b48819f1ca2f560ac92a45fbbb931b3d0bf18
cHashFullContentBinaryFile: (Epapsed:8s)
593056342f2b0398bf9bd2b9ed5b48819f1ca2f560ac92a45fbbb931b3d0bf18
cHashFWFileReader==cHashFullContentBinaryFile: .T.
cHashReadMemo: (Epapsed:13s)
593056342f2b0398bf9bd2b9ed5b48819f1ca2f560ac92a45fbbb931b3d0bf18
cHashFWFileReader==cHashFWFileReader: .T.
Hum.... mas acredito que dê para complicar um pouco +. Boravê!








***Neste caso dna.tech.fileTools():FullContentBinaryFile ganhou em disparada, ficando dna.tech.cTools():ReadMemo() em segundo lugar e, na rabeira: oFWFileReader:FullRead()
cHashFWFileReader: ( Epapsed:427s)
16c809929e5e944c6d6bd051c0ed2b37fdda4eee8776dd4978de587f164b9730
cHashFullContentBinaryFile: (Epapsed:28s)
16c809929e5e944c6d6bd051c0ed2b37fdda4eee8776dd4978de587f164b9730
cHashFWFileReader==cHashFullContentBinaryFile: .T.
cHashReadMemo: (Epapsed:38s)
16c809929e5e944c6d6bd051c0ed2b37fdda4eee8776dd4978de587f164b9730
cHashFWFileReader==cHashFWFileReader: .T.
Hum.... Será que tem o mesmo comportamento com arquivos binários? Bora testar.






cHashFWFileReader: ( Epapsed:108s)
0f4bf8506a2560c568b9815124dfc43a11c561ed611829df841ec7aba8302359

cHashFullContentBinaryFile: (Epapsed:9s)
0f4bf8506a2560c568b9815124dfc43a11c561ed611829df841ec7aba8302359

cHashFWFileReader==cHashFullContentBinaryFile: .T.

cHashReadMemo: (Epapsed:10s)
0f4bf8506a2560c568b9815124dfc43a11c561ed611829df841ec7aba8302359

cHashFWFileReader==cHashFWFileReader: .T.

Conclusão:



    Usar funções do Framework é sempre uma boa prática. Mas, como pudemos ver, nem sempre elas se comportam da maneira que esperamos. Então uma boa solução caseira resolve o problema. Recursos a linguagem tem, basta saber-mos utilizá-los. Fica a Dica.

P.S.: No próxima publicação vou utilizar recursos de dna.tech.fileTools para ajudar a tornar FWFileReader():FullRed() mais performática.

Em Breve:

FWFileReader():FullRed()  irá receber uma ajudazinha de dna.tech.fileTools():Splitfile() e dna.tech.fileTools():SplitTXTfile() para se tornar mais performática.
Quer saber os recursos disponíveis em dna.tech.fileTools. Veja...
```xBase /* __ _ _ _ _ / _|(_)| | ___ | |_ ___ ___ | | ___ | |_ | || | / _ \| __| / _ \ / _ \ | |/ __| | _|| || || __/| |_ | (_) || (_) || |\__ \ |_| |_||_| \___| \__| \___/ \___/ |_||___/ */ #include "totvs.ch" #include "fileio.ch" #include "parmtype.ch" #include "tlpp-core.th" namespace dna.tech using namespace dna.tech class fileTools static method FileReader(cRDDName as character) as object /** * Retrieves the full content of a text file by concatenating the contents of all split files. * * @param cSourceFile The path of the source text file to retrieve the content from. * @return A character string containing the full content of the text file. * @class fileTools * @method FullContentTextFile */ static method FullContentTextFile(cSourceFile) as character static method FullContentBinaryFile(cSourceFile) as character /** * Splits a file into smaller chunks based on the specified target size. * * @param cSourceFile The path of the source file to be split. * @param cTargetPath The destination path where the split files will be saved. * @param nTargetSize The target size of each split file. * @param nTargetSizeType The type of target size: * 1 - bytes, * 2 - kilobytes, * 3 - megabytes. * @param bProgress A code block to evaluate progress. Receives two parameters: * - nSplit: Current split file number. * - nUnits: Total number of split files. * @param lUseUUID A logical value indicating whether to use UUID for naming split files. * @return An array containing the paths of the split files. */ static method Splitfile(cSourceFile as character,cTargetPath as character,nTargetSize as numeric,nTargetSizeType as numeric,bProgress as codeblock,lUseUUID as logical) as array /** * Splits a text file into smaller chunks based on the specified target size. * * @param cSourceFile The path of the source text file to be split. * @param cTargetPath The destination path where the split text files will be saved. * @param nTargetSize The target size of each split file. * @param nTargetSizeType The type of target size: * 1 - bytes, * 2 - kilobytes, * 3 - megabytes. * @param cCRLF The line ending characters used in the text file (e.g., "\r\n"). * @param bProgress A code block to evaluate progress. Receives two parameters: * - nSplit: Current split file number. * - nUnits: Total number of split files. * @param bGetLine A code block to extract lines from the source file. Receives five parameters: * - cBufferWrite: The buffer containing the current chunk of text. * - nLine: The current line number. * - nFilesize: Total size of the source file. * - nBufferSize: Size of the buffer. * - nBytesRead: Total bytes read so far. * @param bSetFilter A code block to filter lines from being written to the split file. Receives the same parameters as bGetLine. * @param lSetFilter A logical value indicating whether to apply the filter defined in bSetFilter. * @param lUseUUID A logical value indicating whether to use UUID for naming split files. * @return An array containing the paths of the split text files. */ static method SplitTXTfile(cSourceFile as character,cTargetPath as character,nTargetSize as numeric,nTargetSizeType as numeric,cCRLF as character,bProgress as codeblock,bGetLine as codeblock,bSetFilter as codeblock,lUseUUID as logical) as array /** * Transfers zipped data from a source directory to a target directory. * * @param cSourceDirectory The path of the source directory containing the data to be transferred. * @param cTargetDirectory The path of the target directory where the zipped data will be transferred. * @param bNotSendData A code block to determine whether to skip sending specific directories. Receives one parameter: * - cLowerDirectory: The lowercased path of the directory being evaluated. * @param cErrorMsg A character variable to store error messages if any. * @param cPassWord The password used for zipping and unzipping files. * @return A logical value indicating the success of the data transfer operation. */ static method SendDataToServerWithZip(cDirectoryClient as character,cDirectoryServer as character,bNotSendData as codeblock,cErrorMsg as character,cPassWord as character) as logical /** * Transfers zipped data from a source directory to a target directory. * * @param cSourceDirectory The path of the source directory containing the data to be transferred. * @param cTargetDirectory The path of the target directory where the zipped data will be transferred. * @param bNotSendData A code block to determine whether to skip sending specific directories. Receives one parameter: * - cLowerDirectory: The lowercased path of the directory being evaluated. * @param cErrorMsg A character variable to store error messages if any. * @param cPassWord The password used for zipping and unzipping files. * @return A logical value indicating the success of the data transfer operation. */ static method GetDataFromServerWithZip(cDirectoryServer as character,cDirectoryClient as character,bNotSendData as codeblock,cErrorMsg as character,cPassWord as character) as logical static method BrowseFiles(cTitle as character,cDirectory as character,cMask as character,nTypeOrder as numeric,bLDblClick as codeblock,bCustomHeaderClick as codeblock) as variant end class ```








Comentários

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã