Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

BlackTDN :: Harbour :: Entendendo o Uso de Hash

   1: Function main()
   2:  
   3:    LOCAL hPessoa  := hb_hash()
   4:    LOCAL hPessoas := hb_hash()
   5:    LOCAL nPessoa  := 0 
   6:    LOCAL nPessoas := 1000
   7:  
   8:    SET CENTURY ON
   9:    SET DATE TO BRITISH 
  10:    SET DATE FORMAT "mm/dd/yyyy"
  11:  
  12:    hPessoa["PESSOA"] := hb_hash()
  13:    hb_HSetCaseMatch( hPessoa["PESSOA"] , .F. )
  14:  
  15:    hPessoa["PESSOA"]["NOME"]        := "BlackTDN"
  16:    hPessoa["PESSOA"]["NASCIMENTO"]  := Ctod("01/01/2012")
  17:    hPessoa["PESSOA"]["SEXO"]        := "M"
  18:    hPessoa["PESSOA"]["PAIS"]        := "Brasil"
  19:    hPessoa["PESSOA"]["ENDEREÇO"]    := "http://blacktdn.com.br"
  20:    hPessoa["PESSOA"]["CEP"]         := "00000-000"
  21:  
  22:    ? 'hPessoa["PESSOA"]["NOME"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "NOME" ) ))
  23:    ? 'hPessoa["PESSOA"]["NOME"] :' + hb_hGet( hPessoa["PESSOA"] , "NOME" )
  24:    ? hb_OsNewLine()
  25:    
  26:    ? 'hPessoa["PESSOA"]["NASCIMENTO"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "NASCIMENTO" ) ))
  27:    ? 'hPessoa["PESSOA"]["NASCIMENTO"] :' + dtoc( hb_hGet( hPessoa["PESSOA"] , "NASCIMENTO" ) )
  28:    ? hb_OsNewLine()
  29:  
  30:    ? 'hPessoa["PESSOA"]["SEXO"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "SEXO" )))
  31:    ? 'hPessoa["PESSOA"]["SEXO"] :' + hb_hGet( hPessoa["PESSOA"] , "SEXO" )
  32:    ? hb_OsNewLine()
  33:    
  34:    ? 'hPessoa["PESSOA"]["PAIS"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "PAIS" )))
  35:    ? 'hPessoa["PESSOA"]["PAIS"] :' + hb_hGet( hPessoa["PESSOA"] , "PAIS" )
  36:    ? hb_OsNewLine()
  37:    
  38:    ? hb_AnsiToOem('hPessoa["PESSOA"]["ENDEREÇO"] :') + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "ENDEREÇO" ) ))
  39:    ? hb_AnsiToOem('hPessoa["PESSOA"]["ENDEREÇO"] :') + hb_hGet( hPessoa["PESSOA"] , "ENDEREÇO" )
  40:    ? hb_OsNewLine()
  41:    
  42:    ? 'hPessoa["PESSOA"]["CEP"] :' + LTrim(str( hb_hPos( hPessoa["PESSOA"] , "CEP" ) ))
  43:    ? 'hPessoa["PESSOA"]["CEP"] :' + hb_hGet( hPessoa["PESSOA"] , "CEP" )
  44:    ? hb_OsNewLine()
  45:    
  46:    For nPessoa := 1 To nPessoas
  47:       hPessoas[nPessoa]                         := hb_hClone(hPessoa)
  48:       hPessoas[nPessoa]["PESSOA"]["NOME"]       += ' ' + StrZero(nPessoa,4)
  49:       IF ( ( nPessoa % 2 ) == 0 )
  50:          hPessoas[nPessoa]["PESSOA"]["NASCIMENTO"] := YearSum( hPessoas[nPessoa]["PESSOA"]["NASCIMENTO"] , nPessoa )
  51:       Else
  52:          hPessoas[nPessoa]["PESSOA"]["NASCIMENTO"] := YearSub( hPessoas[nPessoa]["PESSOA"]["NASCIMENTO"] , nPessoa )
  53:       EndIF
  54:    Next nPessoa
  55:    
  56:    FOR EACH hPessoa in hPessoas
  57:    
  58:       ? 'hPessoa["PESSOA"]["NOME"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "NOME" ) ))
  59:       ? 'hPessoa["PESSOA"]["NOME"] :' + hb_hGet( hPessoa["PESSOA"] , "NOME" )
  60:       ? hb_OsNewLine()
  61:       
  62:       ? 'hPessoa["PESSOA"]["NASCIMENTO"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "NASCIMENTO" ) ))
  63:       ? 'hPessoa["PESSOA"]["NASCIMENTO"] :' + dtoc( hb_hGet( hPessoa["PESSOA"] , "NASCIMENTO" ) )
  64:       ? hb_OsNewLine()
  65:  
  66:       ? 'hPessoa["PESSOA"]["SEXO"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "SEXO" )))
  67:       ? 'hPessoa["PESSOA"]["SEXO"] :' + hb_hGet( hPessoa["PESSOA"] , "SEXO" )
  68:       ? hb_OsNewLine()
  69:       
  70:       ? 'hPessoa["PESSOA"]["PAIS"] :' + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "PAIS" )))
  71:       ? 'hPessoa["PESSOA"]["PAIS"] :' + hb_hGet( hPessoa["PESSOA"] , "PAIS" )
  72:       ? hb_OsNewLine()
  73:       
  74:       ? hb_AnsiToOem('hPessoa["PESSOA"]["ENDEREÇO"] :') + LTrim(str(hb_hPos( hPessoa["PESSOA"] , "ENDEREÇO" ) ))
  75:       ? hb_AnsiToOem('hPessoa["PESSOA"]["ENDEREÇO"] :') + hb_hGet( hPessoa["PESSOA"] , "ENDEREÇO" )
  76:       ? hb_OsNewLine()
  77:       
  78:       ? 'hPessoa["PESSOA"]["CEP"] :' + LTrim(str( hb_hPos( hPessoa["PESSOA"] , "CEP" ) ))
  79:       ? 'hPessoa["PESSOA"]["CEP"] :' + hb_hGet( hPessoa["PESSOA"] , "CEP" )
  80:       ? hb_OsNewLine()
  81:  
  82:    NEXT EACH \\hPessoa
  83:    
  84:    inkey(0)
  85:  
  86: Return( .T. )
  87:  
  88: Function Day2Str( uData )
  89:    Local cType := ValType( uData )
  90: IF ( cType == "D" )
  91:    Return( StrZero( Day( uData ) , 2 ) )
  92: ElseIF ( cType == "N" )
  93:    Return( StrZero( uData , 2 ) )
  94: ElseIF ( cType == "C" )
  95:    Return( StrZero( Val( uData ) , 2 ) )
  96: EndIF
  97:  
  98: Function Month2Str( uData )
  99:    Local cType := ValType( uData )
 100: IF ( cType == "D" )
 101:    Return( StrZero( Month( uData ) , 2 ) )
 102: ElseIF ( cType == "N" )
 103:    Return( StrZero( uData , 2 ) )
 104: ElseIF ( cType == "C" )
 105:    Return( StrZero( Val( uData ) , 2 ) )
 106: EndIF
 107:  
 108: Function Year2Str( uData )
 109:    Local cType := ValType( uData )
 110: IF ( cType == "D" )
 111:    Return( StrZero( Year( uData ) , 4 ) )
 112: ElseIF ( cType == "N" )
 113:    Return( StrZero( uData , 4 ) )
 114: ElseIF ( cType == "C" )
 115:    Return( StrZero( Val( uData ) , 4 ) )
 116: EndIF
 117:  
 118: Function Last_Day( dDate )
 119:  
 120:    Local nMonth
 121:    Local nYear
 122:  
 123:    IF ( ValType( dDate ) == "C" )
 124:       dDate := CToD( dDate )   
 125:    EndIF
 126:  
 127:    nMonth := ( Month( dDate ) + 1 )
 128:    nYear  := Year( dDate )
 129:    IF ( nMonth > 12 )
 130:       nMonth := 1
 131:       ++nYear
 132:    EndIF
 133:  
 134:    dDate := CToD( "01/" + Month2Str( nMonth ) + "/" + Year2Str( nYear ) )
 135:    dDate -= 1
 136:  
 137: Return( Day( dDate ) )
 138:  
 139: Function YearSum( dDate , nYear )
 140:  
 141:    Local nMonthAux := Month( dDate )
 142:    Local nDayAux   := Day( dDate )
 143:    Local nYearAux  := Year( dDate )
 144:  
 145:    nYearAux += nYear
 146:    dDate := Ctod( Day2Str( nDayAux ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 147:    IF Empty( dDate )
 148:       dDate   := Ctod( Day2Str( 1 ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 149:       nDayAux := Last_Day( dDate )
 150:       dDate   := Ctod( Day2Str( nDayAux ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 151:    EndIF
 152:  
 153: Return( dDate )
 154:  
 155: Function YearSub( dDate , nYear )
 156:  
 157:    Local nMonthAux := Month( dDate )
 158:    Local nDayAux   := Day( dDate )
 159:    Local nYearAux  := Year( dDate )
 160:  
 161:    nYearAux -= nYear
 162:    dDate := Ctod( Day2Str( nDayAux ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 163:    IF Empty( dDate )
 164:       dDate   := Ctod( Day2Str( 1 ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 165:       nDayAux := Last_Day( dDate )
 166:       dDate   := Ctod( Day2Str( nDayAux ) + "/" + Month2Str( nMonthAux ) + "/" + Year2Str( nYearAux ) )
 167:    EndIF
 168:  
 169: Return( dDate )


Para testar, baixe a última versão do Harbour Nightly binary: exe 7z (win), obtenha o exemplo acima a partir de totvs-advpl-naldodj\harbour\samples\main.prg e compile


image


e execute, verás a saida diretamente no “console”


image


Funções de Manipulação de Hash:  xHarbour e sua equivalência no Harbour



   1: #xtranslate HASH([<x,...>])             => hb_HASH(<x>)
   2: #xtranslate HHASKEY([<x,...>])          => hb_HHASKEY(<x>)
   3: #xtranslate HGETPOS([<x,...>])          => hb_HPOS(<x>)
   4: #xtranslate HGET([<x,...>])             => hb_HGET(<x>)
   5: #xtranslate HSET([<x,...>])             => hb_HSET(<x>)
   6: #xtranslate HDEL([<x,...>])             => hb_HDEL(<x>)
   7: #xtranslate HGETKEYAT([<x,...>])        => hb_HKEYAT(<x>)
   8: #xtranslate HGETVALUEAT([<x,...>])      => hb_HVALUEAT(<x>)
   9: #xtranslate HSETVALUEAT([<x,...>])      => hb_HVALUEAT(<x>)
  10: #xtranslate HGETPAIRAT([<x,...>])       => hb_HPAIRAT(<x>)
  11: #xtranslate HDELAT([<x,...>])           => hb_HDELAT(<x>)
  12: #xtranslate HGETKEYS([<x,...>])         => hb_HKEYS(<x>)
  13: #xtranslate HGETVALUES([<x,...>])       => hb_HVALUES(<x>)
  14: #xtranslate HFILL([<x,...>])            => hb_HFILL(<x>)
  15: #xtranslate HCLONE([<x,...>])           => hb_HCLONE(<x>)
  16: #xtranslate HCOPY([<x,...>])            => hb_HCOPY(<x>)
  17: #xtranslate HMERGE([<x,...>])           => hb_HMERGE(<x>)
  18: #xtranslate HEVAL([<x,...>])            => hb_HEVAL(<x>)
  19: #xtranslate HSCAN([<x,...>])            => hb_HSCAN(<x>)
  20: #xtranslate HSETCASEMATCH([<x,...>])    => hb_HSETCASEMATCH(<x>)
  21: #xtranslate HGETCASEMATCH([<x,...>])    => hb_HCASEMATCH(<x>)
  22: #xtranslate HSETAUTOADD([<x,...>])      => hb_HSETAUTOADD(<x>)
  23: #xtranslate HGETAUTOADD([<x,...>])      => hb_HAUTOADD(<x>)
  24: #xtranslate HALLOCATE([<x,...>])        => hb_HALLOCATE(<x>)
  25: #xtranslate HDEFAULT([<x,...>])         => hb_HDEFAULT(<x>)

[]s
иαldσ dj

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ã