Jump to content
Fivewin Brasil

emotta

Membros
  • Posts

    1,609
  • Joined

  • Last visited

  • Days Won

    88

Reputation Activity

  1. Like
    emotta got a reaction from Luiz Fernando in Aposentadoria... Parar ou Não Parar ?   
    sensacional Luiz, passei por grande parte das situações que vc passou, as que não são iguais foram muito parecidas.
    Eu conheci o Fivewin na Microsiga, por uma situação especifica eu tinha que simular uma situação que não funcionava em ADVPL mas para que o pessoal responsável pela linguagem fizesse a correção eu precisava simular a mesma situação em clipper/fivewin. Eles me forneceram os disquetes de instalação do clipper 5.3 e do fivewin e eu simulei o problema e eles então corrigiram a linguagem. Era coisa boba, mas foi necessário isso. Foi no ano 2000 que isso aconteceu.
    Pesquisei mais sobre o assunto e cai na news do fivewin, basicamente vc usava o forum direto no outlook, lá conheci o Gilmer, Clemerson, Vagner e outros que agora não recordo os nomes. Essa foi a inspiração para que eu começasse a reescrever um software de ponto que eu fiz em clipper em 1998 para uma empresa, fiz como bico. Apenas pra passar o tempo comecei a reescrever a aplicação "for windows" que era como se falava na época e em 2002 quando pedi a conta da Microsiga e voltei para o interior foi esse novo software eu comecei a buscar clientes e montar um negócio. Aproveitei o tempo livre que ainda não tinha clientes e portei de clipper pra xHarbour.
    Depois disso em 2006 comprei o xHarbour com SQLRDD e portei a aplicação para funcionar também em SQL, foi um grande avanço pra gente na época. Foi neste ano também que abandonei o Edit e comecei a editar os fontes no xDevStudio (obrigado Vailton). Segui assim até 2020 quando mudei para o VSCODE.
    Bons tempos, boas lembranças mas o ponto que temos que observar é que de tempos em tempos precisamos rever as tecnologias que usavamos. Muitos começaram no DBASE e mudaram para clipper, depois passaram a usar fivewin, depois xHarbour, depois SQL, enfim, as coisas mudam e em alguns momentos as mudanças são maiores e exigem um pouco mais de esforço e sacrificio.
    Muito grato a todos aqui e sigo frequentando e ajudando como posso, e sendo ajudado tb, mesmo já não compilando uma aplicação fivewin a 3 anos, porem muito agradecido pelo que já me proporcionou.
     
     
  2. Like
    emotta got a reaction from Luiz Fernando in Aposentadoria... Parar ou Não Parar ?   
    Perfeito Luiz, é exatamente disso que estou falando. Passei por está mesmo situação a alguns anos atrás, foi dolorido voltar a ser um iniciante e estudar tudo novamente, mas a experiência torna a curva de aprendizado bem mais rápida.
    Termos como git, vscode, docker e outras coisas relacionadas eram desconhecidas por mim, estudei, aprendi e tento aqui animar outros a fazer o mesmo e ter essa virada profissional que tanto foi benéfica pra mim.
    Parabéns Luiz por seguir esse caminho e vamos em frente 
     
    Abraços 
     
  3. Like
    emotta got a reaction from Rogerio Figueira in Aposentadoria... Parar ou Não Parar ?   
    Que legal hein Rogério, inveja no bom sentido ! Mas parabéns pela forma como conseguiu isso pra vc, muito bom !
     
     
  4. Thanks
    emotta got a reaction from Jmsilva in Problemas com hash   
    htmp := Hash()
    htmp["001","A"] = 4
    htmp["003","A"] = 21
    htmp["004","A"] = 14
    htmp["002"] = hClone(htmp["003"])
    htmp["003"] = hClone(htmp["004"])
    // se precisar deletar a 004 considere a linha abaixo
    hDel(htmp, '004')
     
     
    * Sinceramente estou achando um pouco estranho essa sua necessidade, eu uso Hash a anos e nunca precisei fazer algo assim, acredito que você esteja usando Hash com o pensamento voltado a array.
  5. Like
    emotta got a reaction from rochinha in CAMPO NOME ACEITAR NO MÁXIMO 2 NUMEROS   
    Marcio, esse tipo de situação se resolve com expressão regular.
    Infelizmente não vou conseguir te ajudar muito pois esse é um assunto que não domino, nas poucas vezes que precisei eu estudei o assunto, resolvi e como uso muito pouco acabo esquecendo como funciona de fato. Já usei pra validar email (por exemplo) e algumas outras coisas pontuais.
    Se quiser estudar o assunto pesquise sobre a função HB_RegExAll, ou pesquise sobre expressão regular, esse é um conceito que existe em todas as linguagens que programação.
     
    Veja tb o link abaixo no wikipedia explicando o que é:
    Expressão regular – Wikipédia, a enciclopédia livre (wikipedia.org)
     
  6. Like
    emotta reacted to infosys2 in SQLRDD   
    O Marcos gambeta adicionou ao seu repositório do hb++, e  dá pra ser compilado com o harbour 3.2 e 3.4, assim como também já removeu a dependência do bison pra compilar o mesmo, e disse que pretende remover a dependência de usar o xhb.hbp na compilação, o que seria ideal também.
    Está caminhando, em breve acredito que vai estar no repositório do harbour na pasta contrib.
     
    Baixe os fontes já corrigidos para  harbour  aqui neste link:

    https://github.com/marcosgambeta/sqlrddpp/tree/main
  7. Like
    emotta got a reaction from kapiaba in SQLRDD   
    show de bola, mas é estranho pois o sqlrdd precisa do BISON pra gerar o parse de comandos sql.
    vc conseguiu conectar no banco de dados e executar os comandos, por exemplo: :exec ou :execute ?
     
  8. Thanks
    emotta reacted to infosys2 in SQLRDD   
    Baxei aqui na minha maquia e compilei apenas o sqlrdd.
    so ficou  6   arquivos que nao conseguir compilar por que nao conseguir encontrar  alguns include  existentes neste arquivos
     sqlact.c        
     sqlex1ora.c     
     sqlex2ora.c     
     sqlex3ora.c     
     sqllex.c        
     sqlora.c        
     
    Depois de compilado conseguir fazer o seguinte teste  com xharbour1.2.3  bcc7 :
    RddSetDefault( "SQLRDD" ) SET DELETED ON IF SR_ExistTable( "clientes" ) USE clientes NEW alias temp VIA "SQLRDD" BROWSE() endif dbcloseall()  
  9. Like
    emotta got a reaction from macs in FUNCAO CRC_16_MCRF4XX(STRING DE CARACTERES HEXA)   
    Foi relatado problema ao compilar o código C usando xharbour open source. Eu corrigi para tornar compatível tanto no comercial (o que eu uso) como no open source. 
    Basta pegar o código atualizado e fazer o teste.
  10. Like
    emotta got a reaction from lucimauromelo in Atualizar Versao do Sistema   
    segue a funcao CompFile que retorna se os arquivos são iguais ou diferentes
     
    Function Teste() Local cFile1 := "arq1.txt" Local cFile2 := "arq2.txt" Local cFile3 := "arq3.txt" Local cCont1 := "testando texto para arquivo 1" Local cCont2 := "testando texto para arquivo 1" Local cCont3 := "testando texto para arquivo 3"   MemoWrit(cFile1, cCont1) MemoWrit(cFile2, cCont2) MemoWrit(cFile3, cCont3)   If CompFile(cFile1, cFile2)   ? cFile1 + " é igual a " + cFile2 Else   ? cFile1 + " é diferente de " + cFile2 EndIf   If CompFile(cFile1, cFile3)   ? cFile1 + " é igual a " + cFile3 Else   ? cFile1 + " é diferente de " + cFile3 EndIf   ? "fim" return   Static Function CompFile(cFile1, cFile2) Local cHash1 := HB_MD5File( cFile1 ) Local cHash2 := HB_MD5File( cFile2 )   Return cHash1 == cHash2
  11. Haha
    emotta got a reaction from rochinha in Compilar 64 bits   
    fala ai rochinha, a analogia foi boa hahahaha
     
  12. Like
    emotta got a reaction from evertonlb in JSON   
    Isso é um hash e dps transformado em JSON
    esse codigo abaixo:
    aResultado := hb_JSonEncode( { "codigo"=>cCodigo, "nome"=>cNome, "sexo"=>cSexo }, .T. ) é o mesmo que fazer isso:
    hDados := Hash()   hDados[ "codigo"] := cCodigo hDados[ "nome"] := cNome hDados[ "sexo"] := cSexo   aResultado := hb_JSonEncode( hDados,  .T. )  
    em aResultado é uma string do tipo json
    {     "codigo": "00001",     "nome": "Marcio Augusto",     "sexo": "M" }  
  13. Like
    emotta got a reaction from Luiz Fernando in CEP - Resolvido   
    Ariston, muito legal, mas ler XML quando tem a possibilidade de ler JSON é furada, deixa o código mais complexo... Veja como fica mais simples ler o Json
     
    Static function ConsultaCep() Local cCep := "13380003" Local cLink := "https://viacep.com.br/ws/" + cCep + "/json" Local hCep := Hash()   cJson_Cep := Emt_GetHtml(cLink) cJson_Cep := SemAcento(cJson_Cep)   hb_jsondecode(cJson_Cep,@hCep)   Try     ? hCep['bairro']     ? hCep['logradouro']     ? hCep['localidade']     ? hCep['uf'] Catch     ? 'erro ao buscar cep' End   Return   Static Function Emt_GetHtml(cLink) Local oOle Local cHtml := ""   Try     oOle := CreateObject( "Microsoft.XMLHTTP" )     oOle:Open( "GET", cLink, .f. )     oOle:Send()     cHtml := oOle:ResponseBody     oOle := nil Catch End   Return cHtml
  14. Like
    emotta got a reaction from vailtom in PIX - QR CODE   
    Exemplo funcional gerando QRCODE para PIX.
    Usei o fonte que o João postou neste mesmo tópico, um exemplo antigo que postei para gerar qrcode e uma função para gerar o CRC exigido no PIX que não existe em xHarbour
    façam os devidos testes e a responsabilidade de uso é de cada um (MIT License)
    Segue tudo no GITHUB em um repositório publico
    https://github.com/eduardomotta-emottasistemas/pix_qrcode.git
     
  15. Like
    emotta got a reaction from Luiz Fernando in Copiar tabela de um servidor pra outro servidor   
    Eu resolveria da seguinte maneira:
     
    - crie um bucket no aws S3 
    - na matriz tenha uma opção para enviar o cadastro para web. Essa opção gera um arquivo texto no formato json com todos os campos do seu cadastro de produtos.
    - nas filiais basta vc ler o arquivo que estará disponível na web no bucket S3
     
    Aqui nesse vídeo tem tudo que vc precisa pra aprender a subir arquivo no seu bucket S3.
     
     
    Obs: se este seu cliente, que é uma rede de lanchonetes, precisar de uma solução de ponto eletrônico me procure. 
    Abraços e boa sorte 
     
     
     
     
     
  16. Like
    emotta got a reaction from Theotokos in PIX - QR CODE   
    Eu fiz uma limpeza nós fontes antes de conmitar no github e pode ser isso 
    Amanhã vou voltar o fonte na versão antes dessa limpeza e commito novamente e te aviso e vc baixa.
  17. Like
    emotta got a reaction from Luiz Fernando in Conversao p/ Dolar   
    Function u_Teste() Local cLink := "https://economia.awesomeapi.com.br/json/daily/USD-BRL/?start_date=20180901&end_date=20180930" cResult := Emt_GetHtml(cLink)   MsgStop(cResult) Return   Static Function Emt_GetHtml(cLink) Local oOle Local cHtml := ""   Try     oOle := CreateObject( "Microsoft.XMLHTTP" )     oOle:Open( "GET", cLink, .f. )     oOle:Send()     cHtml := oOle:ResponseBody     oOle := nil Catch End   Return cHtml    
  18. Like
    emotta got a reaction from Luiz Fernando in Desenvolvimento de sistemas Web   
    É importante entender o conceito da WEB onde não se guarda o estado da aplicação, ou seja, em cada request se faz a validação do usuário, prepara o ambiente e executa a operação.
    Em aplicação desktop nós criamos uma tela de login e uma vez o usuário logado ele vai usando o sistema e vamos guardando o estado de tudo que ele vai fazendo, ou seja, ele se logou e e selecionou os dados da empresa 0001, fez um filtro no browse e acessou o cadastro do cliente e alterou o endereço... é como se tudo fosse sendo colocado em uma pilha de operações.
    Em WEB o conceito é completamente diferente, não se guarda o estado da sessão, na verdade até é possivel mas ai o seu sistema vai consumir muito recurso do servidor e ficará muito caro. A idéia da web é que cada request seja independente de um request anterior, fazendo dessa forma o servidor vai aguentar muito mais usuários simultâneos.
    Então aproveitar código até se consegue mas mesmo assim boa parte dele será alterado, isso se partir pra confiar no mod_harbour que ainda é muito recente e até hoje não vi nenhuma aplicação dele em produção, com certeza existe mas eu não vi. Eu resolvi não esperar e escolhi Ruby on Rails no backend e no front o React.js e tenho algumas rotinas escritas em xharbour processando em background algumas regras de negócio e relatorios gerando pdf.
    Estou com mais de 3mil usuários utilizando o sistema e com máquinas não muito potentes segurando tudo no Azure e por enquanto esta tranquilo.
    Infelizmente tive que deixar o fivewin mas confesso que é muito bom não ter mais cliente ligando para o suporte relatando problemas que não conseguem acessar pq falta alguma dll (que o estagiário ou o antivirus apagou) ou pq está dando algum conflito com aplicativo do banco instalado na maquina. O bom das aplicações WEB é que estes problemas não existem porem surgem outros que temos que aprender a lidar.
     
     
  19. Like
    emotta got a reaction from aferra in Programa para listar portas abertas na maquina   
    Procurei, não encontrei, então fiz um. Se for util pra alguem divirta-se
     
    #xcommand DEFAULT <v1> := <x1> [, <vn> TO <xn> ] => ;                                 IF <v1> == NIL ; <v1> := <x1> ; END ;                                 [; IF <vn> == NIL ; <vn> := <xn> ; END ]   Function PortScan(cServerIPAddress, cPort1, cPort2) LOCAL pSocket Local nI Local nPort Local nPort1 Local nPort2 Default cServerIPAddress := "127.0.0.1" Default cPort1 := "3000" Default cPort2 := AllTrim(Str(Val(cPort1) + 10, 6))   nPort1 := Val(cPort1) nPort2 := Val(cPort2)   INetInit()   ? "Inicando scan em "+cServerIPAddress+" de "+cPort1+" ate "+cPort2 ?   nPort := nPort1 While nPort <= nPort2     pSocket := INetConnect( cServerIPAddress, nPort )       IF INetErrorCode( pSocket ) <> 0         ? "Falha: Porta = ", nPort     Else         ? "SUCESSO: Porta = ", nPort         INetClose( pSocket )         ENDIF     If Inkey() # 0         exit     EndIf     nPort++ EndDo   INetCleanUp() Return
  20. Like
    emotta got a reaction from Luiz Fernando in Sistema nas Nuvens   
    aqui tem como configurar subindo qualquer arquivo para o S3 pelo prompt do windows
     
  21. Like
    emotta got a reaction from Luiz Fernando in Sistema nas Nuvens   
    Vejam esse video que tem uma explicação de todo processo, mas o exemplo que o cara usou é em DELPHI. Mas da pra pegar exatamente a idéia
     
  22. Like
    emotta got a reaction from Luiz Fernando in Sistema nas Nuvens   
    Usando assim acredito que não afeta a performance mas isso pode gerar efeitos colaterais desagradáveis, por exemplo, se vc tiver o SQL SERVER EXPRESS que tem o limite de 10gb pode acontecer de preencher esse limite rapidamente.
    Também gera um problema ao fazer backup, você terá o backup grande sendo que 90% dele é devido aos arquivos em campo blob.
    Outro detalhe importante é que se o arquivo não for texto você deve guardar ele como HEXA ou em BASE64 e com isso você terá um arquivo de 1mb sendo gravado no SQL em quase 2mb (quase o dobro).
    Enfim, você estará usando o SQL como um repositório de arquivos. O SQL não foi feito pra isso.
    O correto e mais seguro é usar como repositório de arquivo algo que foi feito pra ser repositório de arquivo. 
    Eu citei no post anterior minha experiência desagradável fazendo desta maneira onde um backup do meu banco de dados gerava vários gigas de tamanho e depois que transferi os arquivos para o S3 o backup do banco de dados caiu para pouco mais de 100mb (considerando o backup compactado)
    Se você faz desta maneira pra guardar arquivos sugiro a rever isso, o S3 é infinitamente melhor. Estude sobre isso e tire suas próprias conclusões, só estou expondo aqui a experiência que tive neste assunto.
     
     
     
     
  23. Thanks
    emotta got a reaction from Jmsilva in Salvar e Recuperar Array em String   
    Que legal essas funções, eu não as conhecia. Obrigado por compartilhar
  24. Like
    emotta got a reaction from Theotokos in Salvar e Recuperar Array em String   
    Pega ai essa bem simplificada e eficaz.
    A funcao u_Teste é um exemplo de uso
     
    ArrayToString transforma o array em string (na verdade um json)
    StringToArray lê o json salvo em arraytostring e devolve o array pronto
     
    Function u_Teste() Local aDados := {} Local nI   For nI := 1 to 10     aadd(aDados, nI) Next   cSave_Array := ArrayToString(aDados)   aNew_Array := StringToArray(cSave_Array)   MsgStop(Sr_ShowVector(aNew_Array))   Return

      Static Function ArrayToString(aDados) Local hDados := Hash()   hDados["ARRAY"] := aDados   Return hb_jsonEncode(hDados,.t.)   Static Function StringToArray(cDados) Local hDados := Hash() Local aDados := {}   try     hb_jsondecode(cDados, @hDados)     aDados := hDados["ARRAY"] catch end   Return aDados
  25. Like
    emotta got a reaction from Jmsilva in Salvar e Recuperar Array em String   
    Pega ai essa bem simplificada e eficaz.
    A funcao u_Teste é um exemplo de uso
     
    ArrayToString transforma o array em string (na verdade um json)
    StringToArray lê o json salvo em arraytostring e devolve o array pronto
     
    Function u_Teste() Local aDados := {} Local nI   For nI := 1 to 10     aadd(aDados, nI) Next   cSave_Array := ArrayToString(aDados)   aNew_Array := StringToArray(cSave_Array)   MsgStop(Sr_ShowVector(aNew_Array))   Return

      Static Function ArrayToString(aDados) Local hDados := Hash()   hDados["ARRAY"] := aDados   Return hb_jsonEncode(hDados,.t.)   Static Function StringToArray(cDados) Local hDados := Hash() Local aDados := {}   try     hb_jsondecode(cDados, @hDados)     aDados := hDados["ARRAY"] catch end   Return aDados
×
×
  • Create New...