Jump to content
Fivewin Brasil

Luiz Fernando

Membros
  • Posts

    3,368
  • Joined

  • Last visited

  • Days Won

    40

Reputation Activity

  1. Like
    Luiz Fernando reacted to emotta 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
    Luiz Fernando reacted to emotta 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
    Luiz Fernando reacted to alex2002 in Comparar Estrutura tabela MYSQL   
    Bom dia Luiz.

    Este código meu faz exatamente o que vc precisa. Eu rodo a verificação de tabelas todas as vezes que muda uma versão. Sendo assim, nunca mais precisei me preocupar com estrutura de banco de clientes. E quando mudo alguma coisa, basta eu colocar no array que define a estrutura da tabela. Só isso.

     
    cTabela := cBanco+'.ase_log'  // Tabela de logs de documentos assinados eletrônicamente
    aCampos := {}
    //                Campo             Tipo            NULL?  Default  Comentário (isso vira um dicionário de dados depois)
    aadd( aCampos, { 'CCO_CONTA',       'CHAR(9)',      '',    '',      'Código da Conta Corrente' } )
    aadd( aCampos, { 'ASE_NDOC',        'CHAR(10)',     '',    '',      'Número do Contrato' } )
    aadd( aCampos, { 'ASE_PARCEIRO',    'INT(1)',       '',    '0',     'Código do parceiro: 1-ClickSign' } )
    aadd( aCampos, { 'ASE_ARQUIVO',     'VARCHAR(50)',  '',    '',      'Nome do arquivo' } )
    aadd( aCampos, { 'ASE_TOKEN',       'MEDIUMBLOB',   '',    '',      'Token do arquivo devolvido pelo parceiro de assinatura eletrônica' } )
    VerificaTabela( cTabela, aCampos )
    ////////////////////////////DADOS DA FUNCAO////////////////////////////////////////////
    // NOME       : VerificaTabela                                                       //
    // SINTESE    : Verificar a estrutura da tabela e atualiza                           //
    // PARAMETROS : <1> cTabela   = Nome da Tabela                                       //
    //              <2> aCampos   = Estrutura dos campos                                 //
    //              [3] cChave Primária  (Default SQL_ROWID)                             //
    //              [4] lAutoIncrement  (Default .t. )                                   //
    // RETORNO    : lExecutou                                                            //
    ///////////////////////////////////////////////////////////////////////////////////////
    function VerificaTabela( cTabela, aCampos, cChavePrimaria, lAutoIncrement )
    local aSql
    local cCmdSql
    local cNomeA, cTipoA, cDefaultA, cComentA, cNullA
    local cNomeB, cTipoB, cDefaultB, cComentB, cNullB
    local nEncontrado
    local i
    local lRetorno := .t.
    local lSetExact := set(_SET_EXACT, .t.)
    default cChavePrimaria := 'SQL_ROWID'
    defaulT lAutoIncrement := .t.
    if !Table( cTabela )
        CriaTabela( aCampos, cTabela, cChavePrimaria, lAutoIncrement )
        
        // Verificando se criou
        if !Table( cTabela )
           lRetorno := .f.
        endif
        set(_SET_EXACT, lSetExact )
        return lRetorno
    endif
    aEstrutura := SqlArray('show full columns from '+cTabela )
    for i = 1 to len( aCampos )
       cCampoA   := rtrim( aCampos[i,1] ) 
       cTIpoA    := strtran( aCampos[i,2], ' ', '') 
       cNullA    := aCampos[i,3]
       cDefaultA := aCampos[i,4]
       cCommentA := aCampos[i,5]
       
       if len( aCampos ) >= 6 .and. aCampos[i,6] 
          cDefaultX := aCampos[i,4]
       else
          cDefaultX := '"'+aCampos[i,4]+'"'
       endif
          

       nEncontrado := ascan( aEstrutura, {| x | lower( cCampoA ) == lower( x[1] ) } )
       if nEncontrado <> 0
          cCampoB    := rtrim( alltrim(aEstrutura[nEncontrado,1]) )
          cTipoB     := strtran( alltrim(aEstrutura[nEncontrado,2]), "'", '"' )
          cNullB     := alltrim(aEstrutura[nEncontrado,4])
          if lower(cNullB)  = 'yes'
              cNullB  := ''
          endif
          cDefaultB  := alltrim(aEstrutura[nEncontrado,6])
          cCommentB  := alltrim(aEstrutura[nEncontrado,9])
          
          // Verificando se houve mudança na estrutura
          if lower(cCampoA) <> lower(cCampoB) .or. lower(cTipoA) <> lower(cTipoB) .or. lower(cNullA) <> lower(cNullB) .or. lower(cDefaultA) <> lower(cDefaultB) .or. lower(cCommentA) <> lower(cCommentB)
             // Verificando se o campo é númerico e se realmente mudou
             
             if lower(cCampoA) = lower(cCampoB) .and. lower(cTipoA) = lower(cTipoB) .and. lower(cNullA) = lower(cNullB) .and. lower(cCommentA) = lower(cCommentB) .and. ( len( sonumeros( cDefaultA ) ) <> 0 .or. len( sonumeros( cDefaultB ) ) <> 0 )
                // Verificando o valor default
                    if strzero( val( cDefaultA ), 30, 10 ) = strzero( val( cDefaultB ), 30, 10 ) 
                   loop
                endif
                endif
                
             if lower(cCampoA) = lower(cCampoB) .and. lower(cTipoA) = lower(cTipoB) .and. lower(cCommentA) = lower(cCommentB) .and. lower(cNullA) <> lower(cNullB)
                // Verificando condição do NULL
                if empty(cNullA) .and. lower(cNullB) = 'no'
                   loop
                endif
             endif
             // Fim
                 
        //         ? cTabela, 'campo', lower(cCampoA), lower(cCampoB), 'tipo', lower(cTipoA), lower(cTipoB), 'null', lower(cNullA), lower(cNullB), 'default', lower(cDefaultA) , lower(cDefaultB), 'comment', lower(cCommentA), lower(cCommentB)
             if upper(cCampoA) = cChavePrimaria .and. lAutoIncrement
                cCmdSql := 'ALTER TABLE '+cTabela+' DROP '+cCampoA
                if !SqlExecute( cCmdSql )
                   lRetorno := .f.
                endif
          
                  cCmdSql := 'ALTER TABLE '+cTabela+' '
                    cCmdSql += 'ADD '+cCampoA+' '+cTipoA+' '
                    cCmdSql += if(cNullA = 'NO','NOT NULL','')+' '
                    cCmdSql += if(!empty(cDefaultX) .and. cDefaultX <> '""','DEFAULT '+cDefaultX,'')+' '
                    cCmdSql += if(!empty(cCommentA),'COMMENT "'+cCommentA+'"','')+' '
                    if upper(cCampoA) = cChavePrimaria            
                       cCmdSql += 'PRIMARY KEY '+if( lAutoIncrement, 'AUTO_INCREMENT','')+' '
                  endif
                   cCmdSql += if( i > 1, 'AFTER '+aCampos[i-1,1],'FIRST') 
             else
                 cCmdSql := 'ALTER TABLE '+cTabela+' '
                    cCmdSql += 'MODIFY COLUMN '+cCampoA+' '+cTipoA+' '
                    cCmdSql += if(cNullA = 'NO','NOT NULL','')+' '
                    cCmdSql += if(!empty(cDefaultX) .and. cDefaultX <> '""' ,'DEFAULT '+cDefaultX,'')+' '
                    cCmdSql += if(!empty(cCommentA),'COMMENT "'+cCommentA+'"','')+' '
                    if upper(cCampoA) = cChavePrimaria            
                       cCmdSql += 'PRIMARY KEY '+if( lAutoIncrement, 'AUTO_INCREMENT','') 
                 endif
                endif
     
              if !SqlExecute( cCmdSql )
                 lRetorno := .f.
              endif
            endif
       else   
          cCmdSql := 'ALTER TABLE '+cTabela+' '
            cCmdSql += 'ADD '+cCampoA+' '+cTipoA+' '
            cCmdSql += if(cNullA = 'NO','NOT NULL','')+' '
            cCmdSql += if(!empty(cDefaultX) .and. cDefaultX <> '""','DEFAULT '+cDefaultX,'')+' '
            cCmdSql += if(!empty(cCommentA),'COMMENT "'+cCommentA+'"','')+' '
            if upper(cCampoA) = cChavePrimaria            
               cCmdSql += 'PRIMARY KEY '+if( lAutoIncrement, 'AUTO_INCREMENT','')+' '
          endif
           cCmdSql += if( i > 1, 'AFTER '+aCampos[i-1,1],'FIRST') 
          if !SqlExecute( cCmdSql )
             lRetorno := .f.
          endif
       endif
    next
    // Limpando campos que não existem na estrutura e que estão na tabela
    for i = 1 to len( aEstrutura )
       cCampoA   := aEstrutura[i,1]  
       if upper(cCampoA) = 'SQL_ROWID' .or. upper(cCampoA) = 'SQL_DELETED'
          loop
       endif
        nEncontrado := ascan( aCampos, {| x | lower( cCampoA ) == lower( x[1] ) } )
       if nEncontrado = 0
          cCmdSql := 'ALTER TABLE '+cTabela+' DROP '+cCampoA
          if !SqlExecute( cCmdSql )
             lRetorno := .f.
          endif
       endif
    next
    //    
    SysRefresh()
    set(_SET_EXACT, lSetExact )
                     
    return lRetorno
     
  4. Like
    Luiz Fernando reacted to vailtom in DICA: Exemplo de como fazer HTTP PUT usando cURL   
    Olá,
    Recentemente integramos a API de loja virtual da Tray com nosso software e alguns aspectos foram bem nebulosos, por isto quero dividir com vocês uma dica super útil para casos como este, onde é necessário realizar um HTTP PUT usando lib cUrl.
    Segue o exemplo de código que demonstra o trecho mais importante: 
    FUNCTION Tray_UpdateEstoque( sku_id, nEstoque, access_token ) LOCAL cEndPoint := 'https://666.commercesuite.com.br/web_api/products/'+alltrim(str(sku_id))+'?access_token='+access_token LOCAL cData := '{"Product": {"stock": '+ALLTRIM(STR(nEstoque))+'}}' LOCAL curl LOCAL nRet LOCAL Buff LOCAL Resp IF !empty( curl := curl_easy_init() ) curl_easy_setopt( curl, HB_CURLOPT_HTTPHEADER, {"Content-Type:application/json"} ) curl_easy_setopt( curl, HB_CURLOPT_CUSTOMREQUEST, 'PUT') curl_easy_setopt( curl, HB_CURLOPT_URL, cEndPoint ) curl_easy_setopt( curl, HB_CURLOPT_POSTFIELDS, cData ) curl_easy_setopt( curl, HB_CURLOPT_FOLLOWLOCATION, 1) curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_SETUP ) curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYPEER, 0 ) curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYHOST, 0 ) nRet := curl_easy_perform( curl ) Buff := curl_easy_dl_buff_get( curl ) curl_easy_cleanup( curl ) IF (nRet == HB_CURLE_OK) hb_jsonDecode( Buff, @Resp ) ENDIF ELSE RETURN .F. ENDIF IF !HB_ISHASH(Resp) ? Buff // Exibe na tela a mensagem de erro obtida RETURN .F. ENDIF * Retorno em caso de sucesso (status code 200 ou 201) nRet := Resp['code'] RETURN (nRet == 200 .OR. nRet == 201) Em nosso caso utilizamos o compilador Harbour, mas, isto deve servir como base para você caso use outros compiladores.
    Espero ter ajudado.
  5. Like
    Luiz Fernando reacted to Wellington Vieira in NFC-e para MG   
    Valeu!!

    Em MG, o que se alterou em relação a NFC-e das demais UF's foram apenas algumas URL'S que foi a partir do dia 06/03/2023

    A URL de consulta a NFCe via QRCode e a URL de consulta por chave (Portal) foram alteradas em homologação e produção.
    A partir de 06/03/2023 só aceitaremos as url's abaixo:
     
    PRODUÇÃO
    Nova url de consulta via QRCode: 
    https://portalsped.fazenda.mg.gov.br/portalnfce/sistema/qrcode.xhtml

    Nova url de consulta via Portal:
    https://portalsped.fazenda.mg.gov.br/portalnfce
     
    HOMOLOGAÇÃO
    Nova url de consulta via Portal:
    https://hportalsped.fazenda.mg.gov.br/portalnfce
    Nova url de consulta via QRCode: 
    https://portalsped.fazenda.mg.gov.br/portalnfce/sistema/qrcode.xhtml
     
    Importante lembrar que as novas urls deverão ser utilizadas tanto no processo de consulta quanto de autorização.
    Caso sejam utilizadas as url's antigas o emitente poderá receber as rejeições: "878: Endereço do site da UF da Consulta por chave de acesso diverge do previsto" ou "395: Endereço do site da UF da Consulta via QR-Code diverge do previsto".
     
    Abraço.
     
  6. Like
    Luiz Fernando reacted to Wellington Vieira in NFC-e para MG   
    Boa tarde,

    Você pode usar a DLL da UNIMAKE ( É free - gratuita )

    Acesse.
    https://wiki.unimake.com.br/index.php/Manuais:Unimake.DFe

    https://github.com/Unimake/DFe
    Neste na pasta EXEMPLOS - tem todos os exemples em xharbour.

    No youtube, tem todas as LIVE ensinando como programar com a DLL no xharbour, consequentemente em fivewin + xharbour
    https://www.youtube.com/results?search_query=dll+unimake+xharbour
    É só procurar as LIVE, são muitas..

    Para baixar a DLL
    https://www.unimake.com.br/downloads

    TEM TAMBÉM OS FONTES DO SR. JOSE QUINTAS ( CLASSE) em fivewin + xharbour
    TOTALMENTE FUNCIONAL ( basta baixar zipado, todas os fontes estão lá, inclusive com exemplos)
    https://github.com/JoseQuintas/sefazclass
     

    Abraço.
  7. Like
    Luiz Fernando reacted to marcioe in NFC-e para MG   
    Eu uso a unimake, não me arrependo em nada
  8. Like
    Luiz Fernando reacted to giovanyvecchi in SENHA Acesso Sistema   
    Eu que tenho sistemas para cartórios a responsabilidade dos usuários é bem complicada.
    Tenho 4 métodos para gerenciar senhas
    1-O usuário loga com a senha no sistema e tudo fica registrado no seu login. Porem se ele deixar o programa aberto outro pode fazer qualquer coisa em nome dele.
    2-Todos os procedimentos de lançamentos, inclusões, alterações etc pede a senha novamente. Isto serve para os computadores onde varios usuarios acessam.
    3-Todos os procedimentos nescessitam que passe o cartão RFid registrado para cada usuário.
    4-Logon e reconhecimento do serial de um pendrive pessoal do usuario. O programa funcionara somente se o PenDrive estiver conectado no micro. (Veja em \Samples protect.prg)
     
    Na minha opnião o melhor método é o cartão RFid quando varias pessoas acessam o mesmo micro.
  9. Like
    Luiz Fernando reacted to kapiaba in SENHA Acesso Sistema   
    Mira que simples:
     
    http://forums.fivetechsupport.com/viewtopic.php?f=6&t=42429&sid=4e043eeb6afc332310628e35560d3d7a
     
    Se for a senha MASTER... Pimba!
     
    Regards, saludos.
  10. Like
    Luiz Fernando reacted to rochinha in qtd de semanas no mês   
    Amiguinhos,
    Conheço um método bem complexo mas deve funcionar:
    dData := CTOD("30/10/12")? "Esta data esta na semana: ", WEEK( dData ) O Padrão ISO 8601 define que uma semana começa no Domingo, portanto se o dia 1 do mês da consulta cair num sábado este mês possui 6 semanas. Em qualquer outro dia da semana define que o mês tem 5 semanas.
    Então você podeusar a função BOM( StringDate ) Begining Of Month ou a função CDOW( CTOD( StringDate ) ) == "Saturday" poderá obter bom resultado.
  11. Like
    Luiz Fernando reacted to kapiaba in qtd de semanas no mês   
    Dear friend, look this:

    // http://forums.fivetechsupport.com/viewtopic.php?f=6&t=38029    DayOfWeek := STRTRAN( cdow( Date() ), "á", "a"    DayOfWeek := STRTRAN( OemToAnsi( cdow(fe ) ), "á", "a" ) //** "Days in month..:", DaysInMonth( dDate ) //** "Day of year....:", DoY( dDate ) //** "Begin of month.:", BoM( dDate ) //** "End of month...:", EoM( dDate ) //** "Week of month..:", WoM( dDate ) //** "Week of year...:", WoY( dDate ) //** "Begin of year..:", BoY( dDate ) //** "End of year....:", EoY( dDate ) FUNCTION Fecha( dFecha )    LOCAL cLeyenda, aDias, aMeses    DEFAULT dFecha := Date()    aDias := { "Domingo, ", "Lunes, ", "Martes, ", "Miercoles, ", "Jueves, ", "Viernes, ", "Sabado, " }    aMeses := { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" }    cLeyenda := aDias[ DoW( dFecha ) ] + Str( Day( dFecha ), 2 ) + " de " + aMeses[ Month( dFecha ) ] + ;       " de " + Str( Year( dFecha ), 4 ) RETURN cLeyenda FUNCTION FechaLet()    LOCAL cMes := { 'Enero     ', 'Febrero   ', 'Marzo     ', 'Abril     ', ;                    'Mayo      ', 'Junio     ', 'Julio     ', 'Agosto    ', ;                    'Septiembre', 'Octubre   ', 'Noviembre ', 'Diciembre ' }    LOCAL cDia     := { 'Domingo', 'Lunes', 'Martes', 'Miércoles', ;                        'Jueves', 'Viernes', 'Sábado' }    LOCAL FechaLet := cDia[ DoW(Date( ) ) ] + ', '       + ;                      Str( Day( Date( ) ) ) + ' de '     + ;                      AllTrim( cMes[ Month(Date( ) ) ] ) + ;           IF( Year( Date() ) > 2000, ' del ', ' de ' )  + ;               Str( Year( Date( ) ) ) RETURN FechaLet FUNCTION Dias( dDate ) RETURN cDow( dDate ) + ", " + str( day( dDate ) ) + " de " + cMonth( dDate ) + " del " + str( year( dDate ) )
    Regards, saludos.
  12. Like
    Luiz Fernando reacted to Ladinilson in qtd de semanas no mês   
    FUNCTION pSema(Dia,Tipo,Acento) **--------------------------------------** ** Retornar o dia da semana * ** Sintaxe : pSema(arg1,arg,arg3) ** Arg1 = Data/Variavel ** Arg2 = 1=dia simples, 0=dia completo (segunda.segunda-feira) ** Arg3 = 1 remover acentos ** Exemplo : @ 10,10 SAY pSema(date(),1,1) ** Retorno : Terca-Feira **--------------------------------------** a=DOW(dia) dia="" DO CASE CASE a = 1 dia="Domingo" CASE a = 2 dia=IF(Tipo==1,"Segunda","Segunda-Feira") CASE a = 3 dia=IF(Tipo==1,"Terça","Terça-Feira") CASE a = 4 dia=IF(Tipo==1,"Quarta","Quarta-Feira") CASE a = 5 dia=IF(Tipo==1,"Quinta","Quinta-Feira") CASE a = 6 dia=IF(Tipo==1,"Sexta","Sexta-Feira") CASE a = 7 dia="Sabado" ENDCASE IF(Acento==1) dia:=TiraAcento(dia) ENDIF RETURN(dia) Tente por aqui, faça um loop de 1 a 31 para ver as sextas do mês.
    Abraços
  13. Like
    Luiz Fernando reacted to emotta 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
    Luiz Fernando reacted to kapiaba in Fonte e Cor no Cabeçalho do xBrowse   
    http://forums.fivetechsupport.com/viewtopic.php?f=3&t=39772&p=237203&hilit=color+en+header+xbrowse&sid=eadcb552505be4b58e93fb6bd4047e75#p237203
     
    http://forums.fivetechsupport.com/viewtopic.php?f=3&t=32593&p=197620&hilit=color+en+header+xbrowse&sid=eadcb552505be4b58e93fb6bd4047e75#p197620
     
    Regards, saludos.
  15. Like
    Luiz Fernando reacted to alex2002 in Uso do Aplicativo pelo navegador   
    Olá pessoal,

    Sempre tem gente perguntando como colocar o aplicativo pra rodar no navegador. Pois bem, estávamos estudando uma solução mais barata para os nossos clientes ao utilizar o Terminal Server (não tem nada a ver com aplicativo por navegador), e nos deparamos com a ferramenta TSPLUS. Além de ter os clients infinitamente mais barato que o Terminal Server da Micro$oft, ele tem também a opção de acessar e rodar o ERP pelo navegador. Montamos dois servidores através do Hyper V e disponibilizamos para rodar em dois clientes diferentes. Estamos simplesmente fascinados com o resultado, até os clientes estão preferido utilizar ao invés de usar o TS da Micro$oft.

    Fica a dica aí, ferramente extremamente eficiente e creio que vai resolver o problema de muita gente. A configuração é extremamente simples e você coloca a saída da forma que quiser, se quiser colocar a área de trabalho é possível, se quiser colocar apenas um app é possível, enfim são muitas possibilidades e muito simples de configurar. Além de ter as ferramentas de defesas que tbm são muito bacana.

    Fica a dica.

    Um abraço,

    Alexandre Pereira
  16. Like
    Luiz Fernando reacted to rochinha in API consulta CNPJ FREE   
    Amiguinhos,
    Versão 2:
     
  17. Like
    Luiz Fernando reacted to emotta 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 
     
     
     
     
     
  18. Thanks
    Luiz Fernando got a reaction from aferra in API consulta CNPJ FREE   
    Para quem interessar, é gratuito com uma limitação de até 3 consultas por minuto
    https://www.cnpj.ws/docs/api-publica/consultando-cnpj
    Obs: esse diferente dos demais free como a consulta direto da receita federal, é que aqui tem a inscrição estudual
  19. Like
    Luiz Fernando reacted to rochinha in Mysql Localweb   
    Amiguinhos,
    Luiz Fernando, a SQLLib não gerencia o database, ela apenas é a ponte CRUD para manutenção dos dados. O que causa o problema é a critica embutida no motor remoto que dependendo da sua comfiguração irá ou não permitir o aceite ou não de um dado em formato diferenciado ou nulo.
    A configuração dos campos no momento da criação da tabela também tem influencia nestas criticas. O motor verifica a estrutura e analisa tais configurações e decide a partir delas se a manutenção acontecerá no registro ou não.
  20. Like
    Luiz Fernando reacted to informax in Kapiaba   
    Grande Amigo que sempre ajudou a todos, quando possível, e me ajudou DEMAIS e estou postando esse pequeno texto em Orgulho e Retribuição por um Excelente Profissional, Muito Humano e Consciente. VALEW e Vai Corinthians. DEUS TE ABENÇOE Assim como a Todos NÓS !!!
  21. Like
    Luiz Fernando got a reaction from JUDSON ROSA in mudar cor de fundo e letra no say de folder?   
    Ola de uma olhada no codigo abaixo...

    ACTIVATE DIALOG oDlg centered ;
    ON PAINT( GradientFill( hDC, 0, 0, oDlg:nHeight, oDlg:nWidth, ;
    { { 0.0, nRGB( 255, 233, 162 ), nRGB( 255, 215, 84 ) }, ;
    { 0.0, nRGB( 255, 233, 162 ), nRGB( 255, 215, 84 ) } }, .T. ), ;
    SetFoldGrad( oFld ) )
    static function setfoldGrad( oFolder )
    local n, oDlg
    for n = 1 to len(oFolder:aDialogs)
    oDlg = oFolder:aDialogs[n]
    oDlg:bPainted = { | hDC | GradientFill( hDC, 0, 0, oDlg:nHeight, ;
    oDlg:nWidth, { { 0.0, LIGHTCYAN, DARKCYAN } } , .T. ) }
    next
    return nil

    id=code>id=code>Abraços
    Luiz Fernando

    msn: empresoft@globo.com
    skype:empresoft
    empresoft@globo.com
    FWH 9.12,XHARBOUR 1.2,ADS 9.0
    FWH1104,XHARBOUR 1.2 Rev.6406, MYSQL c\ SQLLIB FREE
  22. Like
    Luiz Fernando reacted to emotta 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    
  23. Like
    Luiz Fernando reacted to kapiaba in Fastreport co MySQL   
    Boa tarde, nunca vi nada sobre isto, veja aqui, se tem alguma coisa a respeito:
     
    https://github.com/FastReports/FastReport
     
    Feliz ano novo. abs.
  24. Like
    Luiz Fernando reacted to emotta 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.
     
     
  25. Like
    Luiz Fernando reacted to emotta in Sistema nas Nuvens   
    aqui tem como configurar subindo qualquer arquivo para o S3 pelo prompt do windows
     
×
×
  • Create New...