Jump to content
Fivewin Brasil

jfaguiar

Membros
  • Posts

    1,287
  • Joined

  • Last visited

  • Days Won

    21

Posts posted by jfaguiar

  1.  

    Aguiar,
    eu utilizo o tDolphin, achei muito simples e fácil a utilização.
     

    
    #include "fileio.ch"
    
    function abrebase()
    
       LOCAL   nPort,nFlags
       
       Local host, usuario, senha, DbName
       LOCAL oErr
       
       nFlags    := "0"    
       nPort     := "3306"    
    
    
    if ! pconfsql(@host, @usuario, @senha, @DbName, "web")  //função que carrega os dados de um arquivo criptografado 
    
        MsgStop("Impossível recuperar dados de acesso ao Servidor.","Atenção:")
         return .f.
    end
      TRY
          CONNECT oServer HOST alltrim(host) ;
                          USER alltrim(usuario) ;
                          PASSWORD alltrim(senha) ;
                          PORT nPort ;
                          FLAGS nFlags;
                          DATABASE alltrim(DBName)
                                    
       CATCH oErr
          
        MsgInfo( oErr:Description )
    
         RETURN NIL
       END
       
          IF ! oServer:lError
             msginfo(  "Host: " + oServer:cHost +CRLF+;
             "Database: " +oServer:cDBName +CRLF+;
              oServer:GetServerInfo() +CRLF+;
              oServer:GetClientInfo()  ,"Connection OK")
             
         END
    oServer:Execute( "SET SESSION wait_timeout = 86400;" )
    
    
    return nil
    

    Veja os exemplos de insert, update e select nos demos do tdolphin, crie um banco básico para testes e verás que é mais fácil lidar com o mysql do que com os dbfs.

     

    Olá Rogério.

    Obrigado pela dica.

    Consegui montar o projeto e compilar seu exemplo, mas ao executar, dar a seguinte mensagem:

    Client does not support authentication protocol requested by server. Consider upgrading MySQL Client.

    Vlw

  2. Boa tarde amigos.

    Então, o que preciso inicialmente é um exemplo em Fivewin 19.03 para abrir um banco de dados MySQL sem o uso de rdd.

    Exemplo tenho um banco de dados Mysql com as seguintes proproedades:

    IP: 127.0.0.1

    Hostname: Localhost

    Port: 3306

    Username: root

    Password:  01112012

    Banco: SchemaTest01

     

    Obrigado

  3. Boa tarde amigos.

    Alguém tem algum exemplo de INSERT, UPDATE, DELETE e SELECT em MySql?

    Pretendo iniciar a exportação dos meus DBFs para o meu banco.

    Os comandos do MySql eu já os conheço razoavelmente e os executo no meu banco via Workbench 8.0, porém, tenho muitas dúvidas para executá-los em Fivewin.

     

    Obridado

     

  4. Olá pessoal.

    Aqui no meu teste tá dando o seguinte erro:

    Error description: Error BASE/1003  Variável  não existe: UREGPATH..

    Qual o conteúdo que devo carregar nessa variável?

     

    Obrigado

     

  5. Bom dia amigos.

    Sempre trabalhei com a Daruma na parte de impressão de cupons fiscais e SAT,devido a grande praticidade que a dll oferece. Porém, ela anda ruim das pernas e não se encontra mais a impressora no mercado.

    Alguém pode me sugerir uma outra marca que forneça a dll para facilitar os trabalhos de envio para Sefaz e impressão?

    Estou tentando contato com a Epson, mas tá dificil

    Obrigado

     

  6. Bom dia caríssimos.

    Costumo utilizar essa classe para enviar e-mail pelo outlook e gostaria de saber se ela possui o método cópia oculta.

    Para maior clareza, segue a minha function:

    Obrigado

     

    function Mmail(cTo,cSentBy,cEmailHeader,cEmailNotes,cANEXO1,cToCco) 
    oOutLook := TOleAuto():New("Outlook.Application")
    oMailItem := oOutLook:Invoke("CreateItem", 0)
    oMailitem:to:=cTo
    oMailitem:CC:= cSentBy
    oMailItem:Subject := cEmailHeader
    oMailItem:Body := cEmailNotes
    if ! empty(cANEXO1)
       IF VALTYPE(cANEXO1) == "C"
          oMailItem:Attachments:Add(cANEXO1)
       ELSEIF VALTYPE(cANEXO1) == "A"
          FOR _i := 1 TO LEN(cANEXO1)
              oMailItem:Attachments:Add(  cANEXO1[_i]  )
          NEXT
       ENDIF
    endif
    oMailItem:display(.T.)
    RETURN(nil)

     

  7. Boa tarde amigos.

    Em primeiro lugar quero agradecer a todos que contribuíram

    Consegui colocar o meu boleto em produção no Itaú e agora vou mandar o do Bradesco.

    Consegui alterar a classe e adicionei o endereço e o cnpj do beneficiário. Se alguém tiver interesse eu posto. 

  8.  

    CONTRIB PGSQL -> Dentro das contribs do xharbour

    1º - Compilar a contrib usando o seu xharbour e bcc( borland) instalado, conforme os bat's contidos na pasta xharbour.
         ou na própria pasta da contrib.
         É necessário compilar para gerar um LIB, de acordo com o seu xharbour e bcc(borland), instalados...
         O nome da lib a ser gerada é o nome de : libhbpg.lib

         OBS. CASO A LIB QUE VEM COM A CONTRIB, já esteja no formato do xharbour e bcc(borland) que esteja usando, não
         será necessário compilar, para gerar a lib...

    2º - No postgresql vem uma lib que é a libpq.lib , mas esta vem para o  microsoft visual C , então tem que criar 
         uma nova lib  para o formato borland (instalado):  implib -a libpq.lib libpq.dll
         implib.exe -> pertence ao seu bcc(borland) instalado..

    OBS. A 1º e 2º você fará somente em seu computador, para compilar os seus executáveis, nos clientes a instalação do
         postgresql é normal..

    3º - Na execução de seu software caso ele pedir Dll's, batas ir na pasta onde foi instalada o postgresql e copiar as dll's
         para a pasta onde fica o seu executável e mante-las lá inclusive em seus clientes.

    OBS. Copiará as dll's caso o executável exigir as dll's, e mante-las para compilações futuras. E levar estas dll's junto
         com o seu executável aos clientes.. ( Isto dependerá do path da sua máquina e dos cliente), o mais fácil e já ter as
         dll's junto com o seu executável.

    4º - No seu bat de compilação acrescentar as duas lib's criadas: libhbpg.lib, libpq.lib

    INSTALANDO O POSTGRESQL.

         - Sempre verificar na sua máquina ou máquinas dos clientes, qual postgresql 32 ou 64 bits, e instalar o correto,
           podendo ser 9.2, 9.3 ou 10 etc.. ( postgresql)

           OBS. EU ESTOU UTILIZANDO.. OS
           postgresql-9.2.4-1-windows 32/64 Bits ou postgresql-10.4-1-windows 32/64 Bits, mas já testei versões superiores
           e anteriores começadas com o 8.2 e funcionam normalmente.

         - No firewal do windows defender ( ir em Configurações Avançadas) - Regras de Entrada - Nova regra
           Escolher porta - tcp - ( A porta é a 5432) e permir a conexão usando esta porta.
           
           OBS. Eu faço isso, porque se for utilizar o postgresql em rede ou no futuro eu não tenha que alterar essas confi
           gurações, independente se for em uma máquina ou em várias.

         - Em ferramentas administrativas - serviços - Logon secudário -> colocar o tipo de inicialização automático e iniciar.
           Aplicar -> OK

         - instalar o postgresql.. ( Na instalação ele pedirá uma senha que será a senha de acesso ao postgresql).
           (guardar a mesma)

         - Geralmente é instalado em Arquivos de programas-> postgresql -> ai vem as versões em pastas 9.2, 9.3 etc..

         - MAQUINA LOCAL
         - Após instalado o postgresql, ele sempre instalará na porta 5432 e a máquina local será sempre
           localhost ou 127.0.0.1, depois da instalação.


         - EM REDE.
         - Caso seja em rede, na máquina que será o servidor tem que ter ip,dns e gateway na máquina
           da, pois se deixar pelo ip gerado pelo modem de acesso a internet, este poderá mudar de tempos em tempos
           caso não seja ip fixo.

         - No postgresql, na pasta bin tem um executavel chamado de PGADMIN, acessar o mesmo e ir em File(Arquivo)->
           Open pg_hba.conf que esta em Arquivos de programas->postgresql->9.2->data
           Onde tem 127.0.0.1/32 - clicar duas vezes e alterar esta opção para 0.0.0.0/0, que fará com que o postgresql
           aceite a entrada em seus serviços de qualquer computador da rede... 

           OBS. ESTE É APENAS UM JEITO, EXISTEM VÁRIAS FORMAS NO POSTGRESQL, PARA SEGURANÇA DE DADOS PROCESSADOS,,
           QUAIS IP'S DE ACESSO AO BANCO E CONFIGURAÇÕES DIVERSAS... OK

         - EM REDE E MAQUINA LOCAL
         - No postgresql 9.2(localhost:5432), clicar 02 vezes colocar a senha que informou na instalação.
         - depois é só criar uma base de dados ou utilizar a que vem padrão com o nome de "postgresql"

    NO SEU SOFTWARE:
          
    - ABRINDO O POSTGRESQL A PARTIR DE SEU SOFTWARE
     ( O trecho abaixo é retirado do meu fonte, mais pode ser da forma que quiser..)

    
    function main()
             // Conexao com a base de dados........................................
             oserver = ""
             cserver   = space(20)  // Em máquina local será (127.0.0.1) ou o IP da máquina de rede que foi instalado o postgresql.
             cdatabase = space(20)  // O nome do banco de dados criado ou o que instalado automatico com o postgre (postgresql)
             cuser     = space(20)  // Caso você não mude, sempre será (postgres)
             cpass     = space(20)  // A senha que foi colocada na instalação do postgresql.(xxxxxxxxx)
    
             // Verifica as configuracoes em arquivo..............................
             cDirXML = "wsiscom.xml"
             if !file(cDirXML)                                                                // cores colocadas em variaveis...
                define dialog XML title "Configurando o PostgreSQL" from 10,20 to 23,60 color corobjjan, corfdojan
                       define font mtahoma  name "Tahoma"          size 5.5,13
    
                          @ 15.5,002 say "I.P do servidor" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 15, 050 get oserver var cserver font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel
    
                          @ 30.5,002 say "Banco de Dados" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 30, 050 get odatabase var cdatabase font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel
    
                          @ 45.5,002 say "Usuario" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 45, 050 get ouser var cuser font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel
    
                          @ 60.5,002 say "Senha" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 60, 050 get opass var cpass font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel password
    
                          @ 085,116 BUTTON olbut3 prompt "&Continuar" size 040,12 font mtahoma OF XML pixel action ( gera_xml_postgresql() )
    
                activate dialog XML center
             endif
             if GetKeyState(VK_ESCAPE)
                return nil
             endif
             
             // FWAIT É UMA FUNÇÃO MINHA QUE MOSTRA A MENSAGE ABAIXO NA TELA...
             fwait(" ...Tentativa acesso 1 ...")
             
             nn = 0
             ns = "S"
             do while .t.
                
                             // A função abrir_xml lê o xml gerado pela função gera_xml_postgresql()
                cserver   =  abrir_xml(cDirXML,"server")
                cdatabase =  abrir_xml(cDirXML,"database")
                cuser     =  abrir_xml(cDirXML,"user")
                cpass     =  abrir_xml(cDirXML,"pass")
                
                
                // FAZ A CONEXÃO COM O POSTGRESQL A PARTIR DAS INFORMAÇÕES .......
                oserver := tpqserver():new(cserver, cdatabase, cuser, cpass)
                
                // oserver - será a variavel que guarda a conexão com o postgresql para todo o software.
                
                // VERIFICA SE HOUVE ERRO COM A ABERTURA DO POSTGRESQL E TENTA 05 VEZES A CONEXÃO.
                if oserver:neterr()
                   oserver = ""
                   if nn = 1
                      // FECHA A FWAIT
                      odlgwait:end()
                      
                      // FWAIT É UMA FUNÇÃO MINHA QUE MOSTRA A MENSAGE ABAIXO NA TELA...
                      fwait(" ...Tentativa acesso 2 ...")
                      
                      SysWait(3)
                   elseif nn = 2
                      odlgwait:end()
                      fwait(" ...Tentativa acesso 3 ...")
                      SysWait(3)
                   elseif nn = 3
                      odlgwait:end()
                      fwait(" ...Tentativa acesso 4 ...")
                      SysWait(3)
                   elseif nn = 4
                      odlgwait:end()
                      fwait(" ...Tentativa acesso 5 ...")
                      SysWait(3)
                   elseif nn = 5
                      ns = "N"          
                      exit
                   endif
                else
                   exit
                endif
                ++nn
                loop
             enddo
             if ns = "N"
                odlgwait:end()
                ferase(cDirXML)
                msgstop("Erro de conexão com a base de dados. Contate o suporte","Atenção")
                return nil
             else
                odlgwait:end()
             endif
    return nil
    function gera_xml_postgresql()
             if empty(cserver)
                msgstop("I.P do servidor em branco.","Atenção")
                return nil
             endif
             if empty(cdatabase)
                msgstop("Banco de dados em branco.","Atenção")
                return nil
             endif
             if empty(cuser)
                msgstop("Usuario em branco.","Atenção")
                return nil
             endif
             if empty(cpass)
                msgstop("Senha em branco.","Atenção")
                return nil
             endif
    
             lh := 00
             oPrn := TDosPrn():New(cDirXML)
             oPrn:StartPage()
             oPrn:lZeraBuffer:=.T.
    
             mlinha = '<?xml version='+'"'+'1.0'+'"'+ ' encoding='+'"'+'UTF-8'+'"'+' ?>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<confPostgreSQL xmlns='+'"'+'http://www.wsiscom.com.br'+'"'+ ' versao='+'"'+ "1.0" +'"'+'>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<server>'+alltrim(cserver)+'</server>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<database>'+alltrim(cdatabase)+'</database>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<user>'+alltrim(cuser)+'</user>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<pass>'+alltrim(cpass)+'</pass>'
             //mlinha = '<pass>'+encrypt(alltrim(cpass))+'</pass>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '</confPostgreSQL>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             oPrn:EndPage()
             oPrn:End()
    
             // Fecha a caixa de dialog da configuracao do XML....................
             XML:end()
    return nil
    Function abrir_xml(cFileName,cTipoName,cvazioounao)
             local hFile, cXml,xmlDoc, xmlIter, xmlNode, cNode, cAttrib, cValue, cData
             hFile := FOpen( cFileName )
             xmlDoc := TXmlDocument():New( hFile )
             if xmlDoc:nStatus != HBXML_STATUS_OK
                 msgstop("Falha no arquivo XML ","ERRO Arquivo XML")
                 return("")
             endif
             xmlIter := TXmlIterator():New( xmlDoc:oRoot )
             xmlNode := xmlIter:Find()
             ctipo  = ""
             npassa = "N"
             do while xmlNode != NIL
                cName := xmlNode:cName
                cData := xmlNode:cData
                if empty(cvazioounao)
                   if cName = cTipoName
                      npassa = "S"
                      exit
                   endif
                else
                   if cName = cTipoName
                      ctipo = cData
                      npassa = "S"
                   endif
                endif
                xmlNode := xmlIter:Next()
             enddo
             fclose(hFile)
             if !empty(cvazioounao)
                cData = ctipo
             endif
             if npassa = "N"
                cData = ""
             endif
    Return(cData)

    - CRIANDO UMA TABELA EM SUA BASE DE DADOS.....
     ( O trecho abaixo é retirado do meu fonte, mais pode ser da forma que quiser..)         

    // oserver      -> conexão com o postgresql
    // "cabacertos" -> nome da tabela a ser criada
             

    
             if oServer:TableExists("cabacertos")  
                
                // eu uso este espaço para alterações na base quando tem, a partir de um ftp....
                // futuramente eu posso colocar como faço...
                
             else                                  
                cQuery := 'CREATE TABLE cabacertos('
                cQuery += 'asqn serial primary key,'    && sequencial
                cQuery += 'loja smallint,'              && empresa
                cQuery += 'adtm date,'                  && data do acerto
                cQuery += 'arep smallint,'              && vendedor
                cQuery += 'acli smallint,'              && cliente
                cQuery += 'asub double precision,'      && subtotal das duplicatas.
                cQuery += 'ades double precision,'      && desconto dado nas duplicatas.
                cQuery += 'ajur double precision,'      && juros dado nas duplicatas.
                cQuery += 'amul double precision,'      && multa dado nas duplicatas.
                cQuery += 'atot double precision,'      && total (subtotal - descontos)
                cQuery += 'acre double precision,'      && credito aproveitado.
                cQuery += 'arec double precision,'      && valor dos recebimentos..
                cQuery += 'aeco double precision,'      && valor em kg acerto para o sistema eco
                cQuery += 'aecoabatenovalordevido boolean,'&& 
                cQuery += 'aecoreal double precision,'  && 
                cQuery += 'aecorealkg double precision,'&& 
                cQuery += 'absd text,'                  // observacao desconto..
                cQuery += 'absa text,'                  // observacao acrescimo..
                cQuery += 'aapr double precision,'      // ndebito - se igual a zero.. nao tem credito e nem debito
                                                        //           se positivo ficou devendo..
                                                        //           se negativo tem credito a ser lancado nos clientes...
    
                cQuery += 'aope character(2),'          && operador
                cQuery += 'alib character(1),'          && liberado..
                cQuery += 'asdn double precision,'      && saldo anterior do cliente credito/debito
                cQuery += 'asda double precision,'      && saldo atual do cliente credito/debito
                cQuery += 'aseq integer)'               && sequencia...
                oQuery := oServer:Query(cQuery)
                if oQuery:neterr()
                   msgstop("Nao foi possível criar arquivo de cabacertos. O sistema sera finalizado.","ATENÇÃO")
                   oServer:Destroy()
                endif
                oQuery:Destroy()
             endif
             
             
             if oServer:TableExists("conta_corrente_acertos")
             else
                cQuery := 'CREATE TABLE conta_corrente_acertos('
                cQuery += 'ascr serial primary key,'   && sequencial
                cquery += 'loja smallint,'
                cQuery += 'asqn integer,'              && sequencial do cabacertos
                cQuery += 'adtm date,'                 && data do conta_corrente
                cQuery += 'acli smallint,'             && cliente
                cQuery += 'arep smallint,'             && vendedor
                cQuery += 'avlr double precision,'     && valor
                cQuery += 'aobs character(100),'       && Observacao
                cQuery += 'acre character(01))'        && (C)redito (D)ebito
                oQuery := oServer:Query(cQuery)
                if oQuery:neterr()
                   msgstop("Nao foi possível criar arquivo de conta_corrente_acertos. O sistema sera finalizado.","ATENÇÃO")
                   oServer:Destroy()
                   janela_principal:end()
                   return .t.
                endif
                oQuery:Destroy()
             endif

            
     
     - INSERINDO DADOS NA BASE DE DADOS......
             
             OBS. CAMPOS CARACTER,DATA,boolean tem que ser precedidos de '    e de pois de '  ex:  nome character(60), 
             grava-se assim :  'WELLINGTON LLSLSLSLSLSLSLSLSLSL'

             ex de com fica uma query: insert into cabacertos(loja,adtm,arep,)values(1,'2018-09-10',1)

    
             // aqui todos os campos da tabela..
             cQuery := "insert into cabacertos(loja,adtm,arep,acli,asub,ades,ajur,"+;
                       "atot,acre,arec,aeco,aecoabatenovalordevido,aecoreal,aecorealkg,aapr,alib,absd,absa,asdn,aseq)"
             
             // aqui as variaveis que serão guardadas nos campos da tabela.
             // lembrando que os campos caracter,data,booleans são precedidos de '    e depois de  '
             cQuery += "values("+str(zseqloja)+","+;
                       "'"+madtm+"'"+","+;
                       alltrim(str(marep))+","+;
                       alltrim(str(mccod))+","+;
                       alltrim(str(stotal))+","+;
                       alltrim(str(mdesc))+","+;
                       alltrim(str(mjuro))+","+;
                       alltrim(str(ntotal))+","+;
                       alltrim(str(ncredi))+","+;
                       alltrim(str(nTRece))+","+;
                       iif(!empty(npgeco),alltrim(str(npgeco)),"0")+","+;
                       "'" + iif(nabatenovalordevido = .f.,"n","y") + "'" +","+;
                       iif(!empty(npgEcoReais),alltrim(str(npgEcoReais)),"0")+","+;
                       iif(!empty(npgEcoKilos),alltrim(str(npgEcoKilos)),"0")+","+;
                       alltrim(str(ndebito))+","+;
                       "'"+"N"+"'"+","+;
                       "'"+mobsd+"'"+","+;
                       "'"+mobsa+"'"+","+;
                       iif(!empty(msaldoanteriorcliente),alltrim(str(msaldoanteriorcliente)),"0")+","+;
                       alltrim(str(mdncd))+")"
             
             // Cria um objeto ( variavel ) que chama o postgresql na variavel oserver e executa a query
             oQuery := oServer:Query(cQuery)
             
             // Se der erro na gravação exibe a mensagem abaixo.
             if oQuery:neterr()
                msgStop("Erro na inclusão do cabacerto.","Atenção")
             endif
             
             // destroy a query.....
             oQuery:destroy()
             
             // faz o commit do insert.....
             oServer:Commit()

    - ALTERANDO DADOS NA BASE DE DADOS...         

             // supondo que mdncd é igual a 2587, o update irá até o registro 2587,
             // lembrando que na criação da base ele primary key [cQuery += 'asqn serial primary key,'], ou pode ser através de indices etc...
             
     

    
            cQuery := "Update cabacertos set "+;
                       "asda = " + iif(!empty(msaldoatualcliente),alltrim(str(msaldoatualcliente)),"0")  +;
                       " where " + " aseq = " + alltrim(str(mdncd))
             oQuery := oServer:Query(cQuery)
             if oQuery:neterr()
                msgStop("Não foi possível realizar a alteração no conta corrente.","Atenção")
             endif
             oQuery:destroy()
             oServer:Commit()

    - EXCLUINDO DADOS NA BASE DE DADOS....

             // supondo que mdncd é igual a 2587, o delete irá até o registro 2587,
             // lembrando que na criação da base ele primary key [cQuery += 'asqn serial primary key,'], ou pode ser através de indices etc...

    
             cQuery := "delete from cabacertos where "+;
                       "aseq = " + alltrim(str(mdncd))
             oQuery := oServer:Query(cQuery)
             if oQuery:neterr()
                msgstop("Não foi possível realizar a operação de exclusão.","ATENÇÃO")
             endif
             oQuery:destroy()
             oServer:Commit()
    


    - EXECUTANDO UM SELECT

            // SUPONDO QUE MCULF - CODIGO DO CLIENTE SEJA 2879 E ZSEQLOJA - 1 LOJA 1
            

    
            cQuery := "select * from conta_corrente_acertos where"+;
                      " acli = " + alltrim(str(mculf))+;
                      " and loja = " + alltrim(str(zseqloja))
            cQuery += " order by adtm asc;"
            oQuery := oServer:Query(cQuery)
            DO WHILE ! oQuery:Eof()
               nacre = oQuery:Fieldget(oQuery:Fieldpos('acre'))
               navlr = oQuery:Fieldget(oQuery:Fieldpos('avlr'))
               if nacre = "C"
                  nvalorcredito = nvalorcredito + navlr
               elseif nacre = "D"
                  nvalorcredito = nvalorcredito - navlr
               endif
               oQuery:Skip()
            END
            oQuery:destroy()

            
    OBS. AS FUNCOES, DE INSERT, UPDATE E DELETE, TAIS COMO SELECT ETC.. PODEM SER CRIADAS A PARTIR DE FUNCOES UNICAS QUE VOCÊ PODERÁ 
             CRIAR, PARA FACILITAR NO DESENVOLVIMENTO E MANUTENÇÃO DOS FONTES, TAIS COMO BROWSER'S ETC..
        
             A PARTIR DAQUI, CASO VC, SE ANIME A UTILIZAR PODE ME PEDIR INFORMAÇÕES QUE O QUE ESTIVER AO MEU ALCANCE EU AUXILIO.
     

    Boa tarde Wellington.

    Então meu amigo, baixei a contrib.  

    Eu não encontrei  libhbpg.lib. Como faço para gerar? Eu utilizo Fw-xHarbour 13.07 com bcc73.

    Obrigado

    Os bats que vieram foram esses:

    Pasta de C:\xharbour1307\contrib\freeimage\tests
    11/03/2018  14:34             3.975 bldtest.bat

    Pasta de C:\xharbour1307\contrib\gd
    11/03/2018  14:34               356 makemsvcimport.bat

    Pasta de C:\xharbour1307\contrib\gd\samples\barcode
    11/03/2018  14:34             3.758 bldtest.bat
    11/03/2018  14:34             6.572 bldtestvc.bat

    Pasta de C:\xharbour1307\contrib\gd\samples\counter
    11/03/2018  14:34             3.758 bldtest.bat

    Pasta de C:\xharbour1307\contrib\gd\tests
    11/03/2018  14:34             3.752 bldtest.bat
    11/03/2018  14:34                33 setfont.bat

    Pasta de C:\xharbour1307\contrib\gtwvw\samples
    11/03/2018  14:34             2.616 bldwvw.bat
    11/03/2018  14:34               911 wvwtest9.bat

    Pasta de C:\xharbour1307\contrib\rdd_ads\doc
    11/03/2018  14:33               618 gendoc.bat

    Pasta de C:\xharbour1307\contrib\xwt\test
    11/03/2018  14:35               452 bldtest.bat
     

     

     

     

  9.  

    CONTRIB PGSQL -> Dentro das contribs do xharbour

    1º - Compilar a contrib usando o seu xharbour e bcc( borland) instalado, conforme os bat's contidos na pasta xharbour.
         ou na própria pasta da contrib.
         É necessário compilar para gerar um LIB, de acordo com o seu xharbour e bcc(borland), instalados...
         O nome da lib a ser gerada é o nome de : libhbpg.lib

         OBS. CASO A LIB QUE VEM COM A CONTRIB, já esteja no formato do xharbour e bcc(borland) que esteja usando, não
         será necessário compilar, para gerar a lib...

    2º - No postgresql vem uma lib que é a libpq.lib , mas esta vem para o  microsoft visual C , então tem que criar 
         uma nova lib  para o formato borland (instalado):  implib -a libpq.lib libpq.dll
         implib.exe -> pertence ao seu bcc(borland) instalado..

    OBS. A 1º e 2º você fará somente em seu computador, para compilar os seus executáveis, nos clientes a instalação do
         postgresql é normal..

    3º - Na execução de seu software caso ele pedir Dll's, batas ir na pasta onde foi instalada o postgresql e copiar as dll's
         para a pasta onde fica o seu executável e mante-las lá inclusive em seus clientes.

    OBS. Copiará as dll's caso o executável exigir as dll's, e mante-las para compilações futuras. E levar estas dll's junto
         com o seu executável aos clientes.. ( Isto dependerá do path da sua máquina e dos cliente), o mais fácil e já ter as
         dll's junto com o seu executável.

    4º - No seu bat de compilação acrescentar as duas lib's criadas: libhbpg.lib, libpq.lib

    INSTALANDO O POSTGRESQL.

         - Sempre verificar na sua máquina ou máquinas dos clientes, qual postgresql 32 ou 64 bits, e instalar o correto,
           podendo ser 9.2, 9.3 ou 10 etc.. ( postgresql)

           OBS. EU ESTOU UTILIZANDO.. OS
           postgresql-9.2.4-1-windows 32/64 Bits ou postgresql-10.4-1-windows 32/64 Bits, mas já testei versões superiores
           e anteriores começadas com o 8.2 e funcionam normalmente.

         - No firewal do windows defender ( ir em Configurações Avançadas) - Regras de Entrada - Nova regra
           Escolher porta - tcp - ( A porta é a 5432) e permir a conexão usando esta porta.
           
           OBS. Eu faço isso, porque se for utilizar o postgresql em rede ou no futuro eu não tenha que alterar essas confi
           gurações, independente se for em uma máquina ou em várias.

         - Em ferramentas administrativas - serviços - Logon secudário -> colocar o tipo de inicialização automático e iniciar.
           Aplicar -> OK

         - instalar o postgresql.. ( Na instalação ele pedirá uma senha que será a senha de acesso ao postgresql).
           (guardar a mesma)

         - Geralmente é instalado em Arquivos de programas-> postgresql -> ai vem as versões em pastas 9.2, 9.3 etc..

         - MAQUINA LOCAL
         - Após instalado o postgresql, ele sempre instalará na porta 5432 e a máquina local será sempre
           localhost ou 127.0.0.1, depois da instalação.


         - EM REDE.
         - Caso seja em rede, na máquina que será o servidor tem que ter ip,dns e gateway na máquina
           da, pois se deixar pelo ip gerado pelo modem de acesso a internet, este poderá mudar de tempos em tempos
           caso não seja ip fixo.

         - No postgresql, na pasta bin tem um executavel chamado de PGADMIN, acessar o mesmo e ir em File(Arquivo)->
           Open pg_hba.conf que esta em Arquivos de programas->postgresql->9.2->data
           Onde tem 127.0.0.1/32 - clicar duas vezes e alterar esta opção para 0.0.0.0/0, que fará com que o postgresql
           aceite a entrada em seus serviços de qualquer computador da rede... 

           OBS. ESTE É APENAS UM JEITO, EXISTEM VÁRIAS FORMAS NO POSTGRESQL, PARA SEGURANÇA DE DADOS PROCESSADOS,,
           QUAIS IP'S DE ACESSO AO BANCO E CONFIGURAÇÕES DIVERSAS... OK

         - EM REDE E MAQUINA LOCAL
         - No postgresql 9.2(localhost:5432), clicar 02 vezes colocar a senha que informou na instalação.
         - depois é só criar uma base de dados ou utilizar a que vem padrão com o nome de "postgresql"

    NO SEU SOFTWARE:
          
    - ABRINDO O POSTGRESQL A PARTIR DE SEU SOFTWARE
     ( O trecho abaixo é retirado do meu fonte, mais pode ser da forma que quiser..)

    
    function main()
             // Conexao com a base de dados........................................
             oserver = ""
             cserver   = space(20)  // Em máquina local será (127.0.0.1) ou o IP da máquina de rede que foi instalado o postgresql.
             cdatabase = space(20)  // O nome do banco de dados criado ou o que instalado automatico com o postgre (postgresql)
             cuser     = space(20)  // Caso você não mude, sempre será (postgres)
             cpass     = space(20)  // A senha que foi colocada na instalação do postgresql.(xxxxxxxxx)
    
             // Verifica as configuracoes em arquivo..............................
             cDirXML = "wsiscom.xml"
             if !file(cDirXML)                                                                // cores colocadas em variaveis...
                define dialog XML title "Configurando o PostgreSQL" from 10,20 to 23,60 color corobjjan, corfdojan
                       define font mtahoma  name "Tahoma"          size 5.5,13
    
                          @ 15.5,002 say "I.P do servidor" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 15, 050 get oserver var cserver font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel
    
                          @ 30.5,002 say "Banco de Dados" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 30, 050 get odatabase var cdatabase font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel
    
                          @ 45.5,002 say "Usuario" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 45, 050 get ouser var cuser font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel
    
                          @ 60.5,002 say "Senha" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 60, 050 get opass var cpass font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel password
    
                          @ 085,116 BUTTON olbut3 prompt "&Continuar" size 040,12 font mtahoma OF XML pixel action ( gera_xml_postgresql() )
    
                activate dialog XML center
             endif
             if GetKeyState(VK_ESCAPE)
                return nil
             endif
             
             // FWAIT É UMA FUNÇÃO MINHA QUE MOSTRA A MENSAGE ABAIXO NA TELA...
             fwait(" ...Tentativa acesso 1 ...")
             
             nn = 0
             ns = "S"
             do while .t.
                
                             // A função abrir_xml lê o xml gerado pela função gera_xml_postgresql()
                cserver   =  abrir_xml(cDirXML,"server")
                cdatabase =  abrir_xml(cDirXML,"database")
                cuser     =  abrir_xml(cDirXML,"user")
                cpass     =  abrir_xml(cDirXML,"pass")
                
                
                // FAZ A CONEXÃO COM O POSTGRESQL A PARTIR DAS INFORMAÇÕES .......
                oserver := tpqserver():new(cserver, cdatabase, cuser, cpass)
                
                // oserver - será a variavel que guarda a conexão com o postgresql para todo o software.
                
                // VERIFICA SE HOUVE ERRO COM A ABERTURA DO POSTGRESQL E TENTA 05 VEZES A CONEXÃO.
                if oserver:neterr()
                   oserver = ""
                   if nn = 1
                      // FECHA A FWAIT
                      odlgwait:end()
                      
                      // FWAIT É UMA FUNÇÃO MINHA QUE MOSTRA A MENSAGE ABAIXO NA TELA...
                      fwait(" ...Tentativa acesso 2 ...")
                      
                      SysWait(3)
                   elseif nn = 2
                      odlgwait:end()
                      fwait(" ...Tentativa acesso 3 ...")
                      SysWait(3)
                   elseif nn = 3
                      odlgwait:end()
                      fwait(" ...Tentativa acesso 4 ...")
                      SysWait(3)
                   elseif nn = 4
                      odlgwait:end()
                      fwait(" ...Tentativa acesso 5 ...")
                      SysWait(3)
                   elseif nn = 5
                      ns = "N"          
                      exit
                   endif
                else
                   exit
                endif
                ++nn
                loop
             enddo
             if ns = "N"
                odlgwait:end()
                ferase(cDirXML)
                msgstop("Erro de conexão com a base de dados. Contate o suporte","Atenção")
                return nil
             else
                odlgwait:end()
             endif
    return nil
    function gera_xml_postgresql()
             if empty(cserver)
                msgstop("I.P do servidor em branco.","Atenção")
                return nil
             endif
             if empty(cdatabase)
                msgstop("Banco de dados em branco.","Atenção")
                return nil
             endif
             if empty(cuser)
                msgstop("Usuario em branco.","Atenção")
                return nil
             endif
             if empty(cpass)
                msgstop("Senha em branco.","Atenção")
                return nil
             endif
    
             lh := 00
             oPrn := TDosPrn():New(cDirXML)
             oPrn:StartPage()
             oPrn:lZeraBuffer:=.T.
    
             mlinha = '<?xml version='+'"'+'1.0'+'"'+ ' encoding='+'"'+'UTF-8'+'"'+' ?>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<confPostgreSQL xmlns='+'"'+'http://www.wsiscom.com.br'+'"'+ ' versao='+'"'+ "1.0" +'"'+'>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<server>'+alltrim(cserver)+'</server>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<database>'+alltrim(cdatabase)+'</database>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<user>'+alltrim(cuser)+'</user>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<pass>'+alltrim(cpass)+'</pass>'
             //mlinha = '<pass>'+encrypt(alltrim(cpass))+'</pass>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '</confPostgreSQL>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             oPrn:EndPage()
             oPrn:End()
    
             // Fecha a caixa de dialog da configuracao do XML....................
             XML:end()
    return nil
    Function abrir_xml(cFileName,cTipoName,cvazioounao)
             local hFile, cXml,xmlDoc, xmlIter, xmlNode, cNode, cAttrib, cValue, cData
             hFile := FOpen( cFileName )
             xmlDoc := TXmlDocument():New( hFile )
             if xmlDoc:nStatus != HBXML_STATUS_OK
                 msgstop("Falha no arquivo XML ","ERRO Arquivo XML")
                 return("")
             endif
             xmlIter := TXmlIterator():New( xmlDoc:oRoot )
             xmlNode := xmlIter:Find()
             ctipo  = ""
             npassa = "N"
             do while xmlNode != NIL
                cName := xmlNode:cName
                cData := xmlNode:cData
                if empty(cvazioounao)
                   if cName = cTipoName
                      npassa = "S"
                      exit
                   endif
                else
                   if cName = cTipoName
                      ctipo = cData
                      npassa = "S"
                   endif
                endif
                xmlNode := xmlIter:Next()
             enddo
             fclose(hFile)
             if !empty(cvazioounao)
                cData = ctipo
             endif
             if npassa = "N"
                cData = ""
             endif
    Return(cData)

    - CRIANDO UMA TABELA EM SUA BASE DE DADOS.....
     ( O trecho abaixo é retirado do meu fonte, mais pode ser da forma que quiser..)         

    // oserver      -> conexão com o postgresql
    // "cabacertos" -> nome da tabela a ser criada
             

    
             if oServer:TableExists("cabacertos")  
                
                // eu uso este espaço para alterações na base quando tem, a partir de um ftp....
                // futuramente eu posso colocar como faço...
                
             else                                  
                cQuery := 'CREATE TABLE cabacertos('
                cQuery += 'asqn serial primary key,'    && sequencial
                cQuery += 'loja smallint,'              && empresa
                cQuery += 'adtm date,'                  && data do acerto
                cQuery += 'arep smallint,'              && vendedor
                cQuery += 'acli smallint,'              && cliente
                cQuery += 'asub double precision,'      && subtotal das duplicatas.
                cQuery += 'ades double precision,'      && desconto dado nas duplicatas.
                cQuery += 'ajur double precision,'      && juros dado nas duplicatas.
                cQuery += 'amul double precision,'      && multa dado nas duplicatas.
                cQuery += 'atot double precision,'      && total (subtotal - descontos)
                cQuery += 'acre double precision,'      && credito aproveitado.
                cQuery += 'arec double precision,'      && valor dos recebimentos..
                cQuery += 'aeco double precision,'      && valor em kg acerto para o sistema eco
                cQuery += 'aecoabatenovalordevido boolean,'&& 
                cQuery += 'aecoreal double precision,'  && 
                cQuery += 'aecorealkg double precision,'&& 
                cQuery += 'absd text,'                  // observacao desconto..
                cQuery += 'absa text,'                  // observacao acrescimo..
                cQuery += 'aapr double precision,'      // ndebito - se igual a zero.. nao tem credito e nem debito
                                                        //           se positivo ficou devendo..
                                                        //           se negativo tem credito a ser lancado nos clientes...
    
                cQuery += 'aope character(2),'          && operador
                cQuery += 'alib character(1),'          && liberado..
                cQuery += 'asdn double precision,'      && saldo anterior do cliente credito/debito
                cQuery += 'asda double precision,'      && saldo atual do cliente credito/debito
                cQuery += 'aseq integer)'               && sequencia...
                oQuery := oServer:Query(cQuery)
                if oQuery:neterr()
                   msgstop("Nao foi possível criar arquivo de cabacertos. O sistema sera finalizado.","ATENÇÃO")
                   oServer:Destroy()
                endif
                oQuery:Destroy()
             endif
             
             
             if oServer:TableExists("conta_corrente_acertos")
             else
                cQuery := 'CREATE TABLE conta_corrente_acertos('
                cQuery += 'ascr serial primary key,'   && sequencial
                cquery += 'loja smallint,'
                cQuery += 'asqn integer,'              && sequencial do cabacertos
                cQuery += 'adtm date,'                 && data do conta_corrente
                cQuery += 'acli smallint,'             && cliente
                cQuery += 'arep smallint,'             && vendedor
                cQuery += 'avlr double precision,'     && valor
                cQuery += 'aobs character(100),'       && Observacao
                cQuery += 'acre character(01))'        && (C)redito (D)ebito
                oQuery := oServer:Query(cQuery)
                if oQuery:neterr()
                   msgstop("Nao foi possível criar arquivo de conta_corrente_acertos. O sistema sera finalizado.","ATENÇÃO")
                   oServer:Destroy()
                   janela_principal:end()
                   return .t.
                endif
                oQuery:Destroy()
             endif

            
     
     - INSERINDO DADOS NA BASE DE DADOS......
             
             OBS. CAMPOS CARACTER,DATA,boolean tem que ser precedidos de '    e de pois de '  ex:  nome character(60), 
             grava-se assim :  'WELLINGTON LLSLSLSLSLSLSLSLSLSL'

             ex de com fica uma query: insert into cabacertos(loja,adtm,arep,)values(1,'2018-09-10',1)

    
             // aqui todos os campos da tabela..
             cQuery := "insert into cabacertos(loja,adtm,arep,acli,asub,ades,ajur,"+;
                       "atot,acre,arec,aeco,aecoabatenovalordevido,aecoreal,aecorealkg,aapr,alib,absd,absa,asdn,aseq)"
             
             // aqui as variaveis que serão guardadas nos campos da tabela.
             // lembrando que os campos caracter,data,booleans são precedidos de '    e depois de  '
             cQuery += "values("+str(zseqloja)+","+;
                       "'"+madtm+"'"+","+;
                       alltrim(str(marep))+","+;
                       alltrim(str(mccod))+","+;
                       alltrim(str(stotal))+","+;
                       alltrim(str(mdesc))+","+;
                       alltrim(str(mjuro))+","+;
                       alltrim(str(ntotal))+","+;
                       alltrim(str(ncredi))+","+;
                       alltrim(str(nTRece))+","+;
                       iif(!empty(npgeco),alltrim(str(npgeco)),"0")+","+;
                       "'" + iif(nabatenovalordevido = .f.,"n","y") + "'" +","+;
                       iif(!empty(npgEcoReais),alltrim(str(npgEcoReais)),"0")+","+;
                       iif(!empty(npgEcoKilos),alltrim(str(npgEcoKilos)),"0")+","+;
                       alltrim(str(ndebito))+","+;
                       "'"+"N"+"'"+","+;
                       "'"+mobsd+"'"+","+;
                       "'"+mobsa+"'"+","+;
                       iif(!empty(msaldoanteriorcliente),alltrim(str(msaldoanteriorcliente)),"0")+","+;
                       alltrim(str(mdncd))+")"
             
             // Cria um objeto ( variavel ) que chama o postgresql na variavel oserver e executa a query
             oQuery := oServer:Query(cQuery)
             
             // Se der erro na gravação exibe a mensagem abaixo.
             if oQuery:neterr()
                msgStop("Erro na inclusão do cabacerto.","Atenção")
             endif
             
             // destroy a query.....
             oQuery:destroy()
             
             // faz o commit do insert.....
             oServer:Commit()

    - ALTERANDO DADOS NA BASE DE DADOS...         

             // supondo que mdncd é igual a 2587, o update irá até o registro 2587,
             // lembrando que na criação da base ele primary key [cQuery += 'asqn serial primary key,'], ou pode ser através de indices etc...
             
     

    
            cQuery := "Update cabacertos set "+;
                       "asda = " + iif(!empty(msaldoatualcliente),alltrim(str(msaldoatualcliente)),"0")  +;
                       " where " + " aseq = " + alltrim(str(mdncd))
             oQuery := oServer:Query(cQuery)
             if oQuery:neterr()
                msgStop("Não foi possível realizar a alteração no conta corrente.","Atenção")
             endif
             oQuery:destroy()
             oServer:Commit()

    - EXCLUINDO DADOS NA BASE DE DADOS....

             // supondo que mdncd é igual a 2587, o delete irá até o registro 2587,
             // lembrando que na criação da base ele primary key [cQuery += 'asqn serial primary key,'], ou pode ser através de indices etc...

    
             cQuery := "delete from cabacertos where "+;
                       "aseq = " + alltrim(str(mdncd))
             oQuery := oServer:Query(cQuery)
             if oQuery:neterr()
                msgstop("Não foi possível realizar a operação de exclusão.","ATENÇÃO")
             endif
             oQuery:destroy()
             oServer:Commit()
    


    - EXECUTANDO UM SELECT

            // SUPONDO QUE MCULF - CODIGO DO CLIENTE SEJA 2879 E ZSEQLOJA - 1 LOJA 1
            

    
            cQuery := "select * from conta_corrente_acertos where"+;
                      " acli = " + alltrim(str(mculf))+;
                      " and loja = " + alltrim(str(zseqloja))
            cQuery += " order by adtm asc;"
            oQuery := oServer:Query(cQuery)
            DO WHILE ! oQuery:Eof()
               nacre = oQuery:Fieldget(oQuery:Fieldpos('acre'))
               navlr = oQuery:Fieldget(oQuery:Fieldpos('avlr'))
               if nacre = "C"
                  nvalorcredito = nvalorcredito + navlr
               elseif nacre = "D"
                  nvalorcredito = nvalorcredito - navlr
               endif
               oQuery:Skip()
            END
            oQuery:destroy()

            
    OBS. AS FUNCOES, DE INSERT, UPDATE E DELETE, TAIS COMO SELECT ETC.. PODEM SER CRIADAS A PARTIR DE FUNCOES UNICAS QUE VOCÊ PODERÁ 
             CRIAR, PARA FACILITAR NO DESENVOLVIMENTO E MANUTENÇÃO DOS FONTES, TAIS COMO BROWSER'S ETC..
        
             A PARTIR DAQUI, CASO VC, SE ANIME A UTILIZAR PODE ME PEDIR INFORMAÇÕES QUE O QUE ESTIVER AO MEU ALCANCE EU AUXILIO.
     

    Desde já que agradecer a essa tão grande ajuda. Gostaria de saber onde baixo essa contrib com 

    libhbpg.lib.

    Muito obrigado

     

     

    CONTRIB PGSQL -> Dentro das contribs do xharbour

    1º - Compilar a contrib usando o seu xharbour e bcc( borland) instalado, conforme os bat's contidos na pasta xharbour.
         ou na própria pasta da contrib.
         É necessário compilar para gerar um LIB, de acordo com o seu xharbour e bcc(borland), instalados...
         O nome da lib a ser gerada é o nome de : libhbpg.lib

         OBS. CASO A LIB QUE VEM COM A CONTRIB, já esteja no formato do xharbour e bcc(borland) que esteja usando, não
         será necessário compilar, para gerar a lib...

    2º - No postgresql vem uma lib que é a libpq.lib , mas esta vem para o  microsoft visual C , então tem que criar 
         uma nova lib  para o formato borland (instalado):  implib -a libpq.lib libpq.dll
         implib.exe -> pertence ao seu bcc(borland) instalado..

    OBS. A 1º e 2º você fará somente em seu computador, para compilar os seus executáveis, nos clientes a instalação do
         postgresql é normal..

    3º - Na execução de seu software caso ele pedir Dll's, batas ir na pasta onde foi instalada o postgresql e copiar as dll's
         para a pasta onde fica o seu executável e mante-las lá inclusive em seus clientes.

    OBS. Copiará as dll's caso o executável exigir as dll's, e mante-las para compilações futuras. E levar estas dll's junto
         com o seu executável aos clientes.. ( Isto dependerá do path da sua máquina e dos cliente), o mais fácil e já ter as
         dll's junto com o seu executável.

    4º - No seu bat de compilação acrescentar as duas lib's criadas: libhbpg.lib, libpq.lib

    INSTALANDO O POSTGRESQL.

         - Sempre verificar na sua máquina ou máquinas dos clientes, qual postgresql 32 ou 64 bits, e instalar o correto,
           podendo ser 9.2, 9.3 ou 10 etc.. ( postgresql)

           OBS. EU ESTOU UTILIZANDO.. OS
           postgresql-9.2.4-1-windows 32/64 Bits ou postgresql-10.4-1-windows 32/64 Bits, mas já testei versões superiores
           e anteriores começadas com o 8.2 e funcionam normalmente.

         - No firewal do windows defender ( ir em Configurações Avançadas) - Regras de Entrada - Nova regra
           Escolher porta - tcp - ( A porta é a 5432) e permir a conexão usando esta porta.
           
           OBS. Eu faço isso, porque se for utilizar o postgresql em rede ou no futuro eu não tenha que alterar essas confi
           gurações, independente se for em uma máquina ou em várias.

         - Em ferramentas administrativas - serviços - Logon secudário -> colocar o tipo de inicialização automático e iniciar.
           Aplicar -> OK

         - instalar o postgresql.. ( Na instalação ele pedirá uma senha que será a senha de acesso ao postgresql).
           (guardar a mesma)

         - Geralmente é instalado em Arquivos de programas-> postgresql -> ai vem as versões em pastas 9.2, 9.3 etc..

         - MAQUINA LOCAL
         - Após instalado o postgresql, ele sempre instalará na porta 5432 e a máquina local será sempre
           localhost ou 127.0.0.1, depois da instalação.


         - EM REDE.
         - Caso seja em rede, na máquina que será o servidor tem que ter ip,dns e gateway na máquina
           da, pois se deixar pelo ip gerado pelo modem de acesso a internet, este poderá mudar de tempos em tempos
           caso não seja ip fixo.

         - No postgresql, na pasta bin tem um executavel chamado de PGADMIN, acessar o mesmo e ir em File(Arquivo)->
           Open pg_hba.conf que esta em Arquivos de programas->postgresql->9.2->data
           Onde tem 127.0.0.1/32 - clicar duas vezes e alterar esta opção para 0.0.0.0/0, que fará com que o postgresql
           aceite a entrada em seus serviços de qualquer computador da rede... 

           OBS. ESTE É APENAS UM JEITO, EXISTEM VÁRIAS FORMAS NO POSTGRESQL, PARA SEGURANÇA DE DADOS PROCESSADOS,,
           QUAIS IP'S DE ACESSO AO BANCO E CONFIGURAÇÕES DIVERSAS... OK

         - EM REDE E MAQUINA LOCAL
         - No postgresql 9.2(localhost:5432), clicar 02 vezes colocar a senha que informou na instalação.
         - depois é só criar uma base de dados ou utilizar a que vem padrão com o nome de "postgresql"

    NO SEU SOFTWARE:
          
    - ABRINDO O POSTGRESQL A PARTIR DE SEU SOFTWARE
     ( O trecho abaixo é retirado do meu fonte, mais pode ser da forma que quiser..)

    
    function main()
             // Conexao com a base de dados........................................
             oserver = ""
             cserver   = space(20)  // Em máquina local será (127.0.0.1) ou o IP da máquina de rede que foi instalado o postgresql.
             cdatabase = space(20)  // O nome do banco de dados criado ou o que instalado automatico com o postgre (postgresql)
             cuser     = space(20)  // Caso você não mude, sempre será (postgres)
             cpass     = space(20)  // A senha que foi colocada na instalação do postgresql.(xxxxxxxxx)
    
             // Verifica as configuracoes em arquivo..............................
             cDirXML = "wsiscom.xml"
             if !file(cDirXML)                                                                // cores colocadas em variaveis...
                define dialog XML title "Configurando o PostgreSQL" from 10,20 to 23,60 color corobjjan, corfdojan
                       define font mtahoma  name "Tahoma"          size 5.5,13
    
                          @ 15.5,002 say "I.P do servidor" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 15, 050 get oserver var cserver font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel
    
                          @ 30.5,002 say "Banco de Dados" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 30, 050 get odatabase var cdatabase font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel
    
                          @ 45.5,002 say "Usuario" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 45, 050 get ouser var cuser font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel
    
                          @ 60.5,002 say "Senha" of XML font mtahoma color corfrtsay,corfdosay pixel
                          @ 60, 050 get opass var cpass font mtahoma size 080,9 of XML color corfrtget,corfdoget pixel password
    
                          @ 085,116 BUTTON olbut3 prompt "&Continuar" size 040,12 font mtahoma OF XML pixel action ( gera_xml_postgresql() )
    
                activate dialog XML center
             endif
             if GetKeyState(VK_ESCAPE)
                return nil
             endif
             
             // FWAIT É UMA FUNÇÃO MINHA QUE MOSTRA A MENSAGE ABAIXO NA TELA...
             fwait(" ...Tentativa acesso 1 ...")
             
             nn = 0
             ns = "S"
             do while .t.
                
                             // A função abrir_xml lê o xml gerado pela função gera_xml_postgresql()
                cserver   =  abrir_xml(cDirXML,"server")
                cdatabase =  abrir_xml(cDirXML,"database")
                cuser     =  abrir_xml(cDirXML,"user")
                cpass     =  abrir_xml(cDirXML,"pass")
                
                
                // FAZ A CONEXÃO COM O POSTGRESQL A PARTIR DAS INFORMAÇÕES .......
                oserver := tpqserver():new(cserver, cdatabase, cuser, cpass)
                
                // oserver - será a variavel que guarda a conexão com o postgresql para todo o software.
                
                // VERIFICA SE HOUVE ERRO COM A ABERTURA DO POSTGRESQL E TENTA 05 VEZES A CONEXÃO.
                if oserver:neterr()
                   oserver = ""
                   if nn = 1
                      // FECHA A FWAIT
                      odlgwait:end()
                      
                      // FWAIT É UMA FUNÇÃO MINHA QUE MOSTRA A MENSAGE ABAIXO NA TELA...
                      fwait(" ...Tentativa acesso 2 ...")
                      
                      SysWait(3)
                   elseif nn = 2
                      odlgwait:end()
                      fwait(" ...Tentativa acesso 3 ...")
                      SysWait(3)
                   elseif nn = 3
                      odlgwait:end()
                      fwait(" ...Tentativa acesso 4 ...")
                      SysWait(3)
                   elseif nn = 4
                      odlgwait:end()
                      fwait(" ...Tentativa acesso 5 ...")
                      SysWait(3)
                   elseif nn = 5
                      ns = "N"          
                      exit
                   endif
                else
                   exit
                endif
                ++nn
                loop
             enddo
             if ns = "N"
                odlgwait:end()
                ferase(cDirXML)
                msgstop("Erro de conexão com a base de dados. Contate o suporte","Atenção")
                return nil
             else
                odlgwait:end()
             endif
    return nil
    function gera_xml_postgresql()
             if empty(cserver)
                msgstop("I.P do servidor em branco.","Atenção")
                return nil
             endif
             if empty(cdatabase)
                msgstop("Banco de dados em branco.","Atenção")
                return nil
             endif
             if empty(cuser)
                msgstop("Usuario em branco.","Atenção")
                return nil
             endif
             if empty(cpass)
                msgstop("Senha em branco.","Atenção")
                return nil
             endif
    
             lh := 00
             oPrn := TDosPrn():New(cDirXML)
             oPrn:StartPage()
             oPrn:lZeraBuffer:=.T.
    
             mlinha = '<?xml version='+'"'+'1.0'+'"'+ ' encoding='+'"'+'UTF-8'+'"'+' ?>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<confPostgreSQL xmlns='+'"'+'http://www.wsiscom.com.br'+'"'+ ' versao='+'"'+ "1.0" +'"'+'>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<server>'+alltrim(cserver)+'</server>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<database>'+alltrim(cdatabase)+'</database>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<user>'+alltrim(cuser)+'</user>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<pass>'+alltrim(cpass)+'</pass>'
             //mlinha = '<pass>'+encrypt(alltrim(cpass))+'</pass>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '</confPostgreSQL>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             oPrn:EndPage()
             oPrn:End()
    
             // Fecha a caixa de dialog da configuracao do XML....................
             XML:end()
    return nil
    Function abrir_xml(cFileName,cTipoName,cvazioounao)
             local hFile, cXml,xmlDoc, xmlIter, xmlNode, cNode, cAttrib, cValue, cData
             hFile := FOpen( cFileName )
             xmlDoc := TXmlDocument():New( hFile )
             if xmlDoc:nStatus != HBXML_STATUS_OK
                 msgstop("Falha no arquivo XML ","ERRO Arquivo XML")
                 return("")
             endif
             xmlIter := TXmlIterator():New( xmlDoc:oRoot )
             xmlNode := xmlIter:Find()
             ctipo  = ""
             npassa = "N"
             do while xmlNode != NIL
                cName := xmlNode:cName
                cData := xmlNode:cData
                if empty(cvazioounao)
                   if cName = cTipoName
                      npassa = "S"
                      exit
                   endif
                else
                   if cName = cTipoName
                      ctipo = cData
                      npassa = "S"
                   endif
                endif
                xmlNode := xmlIter:Next()
             enddo
             fclose(hFile)
             if !empty(cvazioounao)
                cData = ctipo
             endif
             if npassa = "N"
                cData = ""
             endif
    Return(cData)

    - CRIANDO UMA TABELA EM SUA BASE DE DADOS.....
     ( O trecho abaixo é retirado do meu fonte, mais pode ser da forma que quiser..)         

    // oserver      -> conexão com o postgresql
    // "cabacertos" -> nome da tabela a ser criada
             

    
             if oServer:TableExists("cabacertos")  
                
                // eu uso este espaço para alterações na base quando tem, a partir de um ftp....
                // futuramente eu posso colocar como faço...
                
             else                                  
                cQuery := 'CREATE TABLE cabacertos('
                cQuery += 'asqn serial primary key,'    && sequencial
                cQuery += 'loja smallint,'              && empresa
                cQuery += 'adtm date,'                  && data do acerto
                cQuery += 'arep smallint,'              && vendedor
                cQuery += 'acli smallint,'              && cliente
                cQuery += 'asub double precision,'      && subtotal das duplicatas.
                cQuery += 'ades double precision,'      && desconto dado nas duplicatas.
                cQuery += 'ajur double precision,'      && juros dado nas duplicatas.
                cQuery += 'amul double precision,'      && multa dado nas duplicatas.
                cQuery += 'atot double precision,'      && total (subtotal - descontos)
                cQuery += 'acre double precision,'      && credito aproveitado.
                cQuery += 'arec double precision,'      && valor dos recebimentos..
                cQuery += 'aeco double precision,'      && valor em kg acerto para o sistema eco
                cQuery += 'aecoabatenovalordevido boolean,'&& 
                cQuery += 'aecoreal double precision,'  && 
                cQuery += 'aecorealkg double precision,'&& 
                cQuery += 'absd text,'                  // observacao desconto..
                cQuery += 'absa text,'                  // observacao acrescimo..
                cQuery += 'aapr double precision,'      // ndebito - se igual a zero.. nao tem credito e nem debito
                                                        //           se positivo ficou devendo..
                                                        //           se negativo tem credito a ser lancado nos clientes...
    
                cQuery += 'aope character(2),'          && operador
                cQuery += 'alib character(1),'          && liberado..
                cQuery += 'asdn double precision,'      && saldo anterior do cliente credito/debito
                cQuery += 'asda double precision,'      && saldo atual do cliente credito/debito
                cQuery += 'aseq integer)'               && sequencia...
                oQuery := oServer:Query(cQuery)
                if oQuery:neterr()
                   msgstop("Nao foi possível criar arquivo de cabacertos. O sistema sera finalizado.","ATENÇÃO")
                   oServer:Destroy()
                endif
                oQuery:Destroy()
             endif
             
             
             if oServer:TableExists("conta_corrente_acertos")
             else
                cQuery := 'CREATE TABLE conta_corrente_acertos('
                cQuery += 'ascr serial primary key,'   && sequencial
                cquery += 'loja smallint,'
                cQuery += 'asqn integer,'              && sequencial do cabacertos
                cQuery += 'adtm date,'                 && data do conta_corrente
                cQuery += 'acli smallint,'             && cliente
                cQuery += 'arep smallint,'             && vendedor
                cQuery += 'avlr double precision,'     && valor
                cQuery += 'aobs character(100),'       && Observacao
                cQuery += 'acre character(01))'        && (C)redito (D)ebito
                oQuery := oServer:Query(cQuery)
                if oQuery:neterr()
                   msgstop("Nao foi possível criar arquivo de conta_corrente_acertos. O sistema sera finalizado.","ATENÇÃO")
                   oServer:Destroy()
                   janela_principal:end()
                   return .t.
                endif
                oQuery:Destroy()
             endif

            
     
     - INSERINDO DADOS NA BASE DE DADOS......
             
             OBS. CAMPOS CARACTER,DATA,boolean tem que ser precedidos de '    e de pois de '  ex:  nome character(60), 
             grava-se assim :  'WELLINGTON LLSLSLSLSLSLSLSLSLSL'

             ex de com fica uma query: insert into cabacertos(loja,adtm,arep,)values(1,'2018-09-10',1)

    
             // aqui todos os campos da tabela..
             cQuery := "insert into cabacertos(loja,adtm,arep,acli,asub,ades,ajur,"+;
                       "atot,acre,arec,aeco,aecoabatenovalordevido,aecoreal,aecorealkg,aapr,alib,absd,absa,asdn,aseq)"
             
             // aqui as variaveis que serão guardadas nos campos da tabela.
             // lembrando que os campos caracter,data,booleans são precedidos de '    e depois de  '
             cQuery += "values("+str(zseqloja)+","+;
                       "'"+madtm+"'"+","+;
                       alltrim(str(marep))+","+;
                       alltrim(str(mccod))+","+;
                       alltrim(str(stotal))+","+;
                       alltrim(str(mdesc))+","+;
                       alltrim(str(mjuro))+","+;
                       alltrim(str(ntotal))+","+;
                       alltrim(str(ncredi))+","+;
                       alltrim(str(nTRece))+","+;
                       iif(!empty(npgeco),alltrim(str(npgeco)),"0")+","+;
                       "'" + iif(nabatenovalordevido = .f.,"n","y") + "'" +","+;
                       iif(!empty(npgEcoReais),alltrim(str(npgEcoReais)),"0")+","+;
                       iif(!empty(npgEcoKilos),alltrim(str(npgEcoKilos)),"0")+","+;
                       alltrim(str(ndebito))+","+;
                       "'"+"N"+"'"+","+;
                       "'"+mobsd+"'"+","+;
                       "'"+mobsa+"'"+","+;
                       iif(!empty(msaldoanteriorcliente),alltrim(str(msaldoanteriorcliente)),"0")+","+;
                       alltrim(str(mdncd))+")"
             
             // Cria um objeto ( variavel ) que chama o postgresql na variavel oserver e executa a query
             oQuery := oServer:Query(cQuery)
             
             // Se der erro na gravação exibe a mensagem abaixo.
             if oQuery:neterr()
                msgStop("Erro na inclusão do cabacerto.","Atenção")
             endif
             
             // destroy a query.....
             oQuery:destroy()
             
             // faz o commit do insert.....
             oServer:Commit()

    - ALTERANDO DADOS NA BASE DE DADOS...         

             // supondo que mdncd é igual a 2587, o update irá até o registro 2587,
             // lembrando que na criação da base ele primary key [cQuery += 'asqn serial primary key,'], ou pode ser através de indices etc...
             
     

    
            cQuery := "Update cabacertos set "+;
                       "asda = " + iif(!empty(msaldoatualcliente),alltrim(str(msaldoatualcliente)),"0")  +;
                       " where " + " aseq = " + alltrim(str(mdncd))
             oQuery := oServer:Query(cQuery)
             if oQuery:neterr()
                msgStop("Não foi possível realizar a alteração no conta corrente.","Atenção")
             endif
             oQuery:destroy()
             oServer:Commit()

    - EXCLUINDO DADOS NA BASE DE DADOS....

             // supondo que mdncd é igual a 2587, o delete irá até o registro 2587,
             // lembrando que na criação da base ele primary key [cQuery += 'asqn serial primary key,'], ou pode ser através de indices etc...

    
             cQuery := "delete from cabacertos where "+;
                       "aseq = " + alltrim(str(mdncd))
             oQuery := oServer:Query(cQuery)
             if oQuery:neterr()
                msgstop("Não foi possível realizar a operação de exclusão.","ATENÇÃO")
             endif
             oQuery:destroy()
             oServer:Commit()
    


    - EXECUTANDO UM SELECT

            // SUPONDO QUE MCULF - CODIGO DO CLIENTE SEJA 2879 E ZSEQLOJA - 1 LOJA 1
            

    
            cQuery := "select * from conta_corrente_acertos where"+;
                      " acli = " + alltrim(str(mculf))+;
                      " and loja = " + alltrim(str(zseqloja))
            cQuery += " order by adtm asc;"
            oQuery := oServer:Query(cQuery)
            DO WHILE ! oQuery:Eof()
               nacre = oQuery:Fieldget(oQuery:Fieldpos('acre'))
               navlr = oQuery:Fieldget(oQuery:Fieldpos('avlr'))
               if nacre = "C"
                  nvalorcredito = nvalorcredito + navlr
               elseif nacre = "D"
                  nvalorcredito = nvalorcredito - navlr
               endif
               oQuery:Skip()
            END
            oQuery:destroy()

            
    OBS. AS FUNCOES, DE INSERT, UPDATE E DELETE, TAIS COMO SELECT ETC.. PODEM SER CRIADAS A PARTIR DE FUNCOES UNICAS QUE VOCÊ PODERÁ 
             CRIAR, PARA FACILITAR NO DESENVOLVIMENTO E MANUTENÇÃO DOS FONTES, TAIS COMO BROWSER'S ETC..
        
             A PARTIR DAQUI, CASO VC, SE ANIME A UTILIZAR PODE ME PEDIR INFORMAÇÕES QUE O QUE ESTIVER AO MEU ALCANCE EU AUXILIO.
     

    Obrigado Wellington. Vou partir pra cima. obrigado mesmo

  10.  

    Boa tarde jfaguiar

    Vou preparar um resumo de tudo ( como gerar a lib, compilar e exemplos no prg) com insert,update,select etc... para você e lhe envio. ( Talvez eu demore uns 02 ou 03 dias), pois tá corrido.. ok..

    Nossa rapaz, eu estava entrando no computador agora exatamente para te solicitar essa assessoria. Já conheço alguma coisa de sql, mas com uma ajudinha para acessá-lo com o FW, tudo fica mais fácil.

    Isso muito me interessa. Faz um precinho bom por cada solicitação e a gente vai acertando Wellington.

    Preciso saber por exemplo qual a instalação adequada. Se posso utilizar o FW 13.07, ou se terei que adquirir a versão atual. Como criar minhas minhas tabelas via código e exportar os dados para ela. etc etc etc rsrsrs

    Muito obrigao. 

    Conto com você.

     

    Meu e-mail joaosiscom@hotmail.com

    Skype: Skypejfaguiar.

     

  11.  

    Esta compilada com o xharbour, bcc que esteja usando e fivewin. No postgresql vem uma lib que é a  libpq.lib , mas esta vem para o  microsoft visual C , então tem que criar uma nova lib  para o formato borland:  implib -a libpq.lib libpq.dll

    Poxa, bacana Wellington. Sem quer abusar, você  teria algum link com algum exemplo utilizando essa lib e Postgre. Vou precisar exportar meus dbfs para um banco postgre e iniciar a programação dos INSERT UPDATE DELETE  SELECT rsrs. Muito obrigado pelas informações.

     

  12. Caríssimo, essa funcionalidade recebe os dados de forma diferenciada conforme o banco, exemplo: 

    IF !"033" $ nCDBCOAG
       oCBX:CodigoCedente := LEFT(TBCCOR->CONTA,7)  // "0815433"
    ELSE
       oCBX:CodigoCedente := SUBSTR(TBCCOR->CODEMPR,6,6)+"-"+SUBSTR(TBCCOR->CODEMPR,12,1) 
    ENDIF                        

    Verifique o manual do Itaú para maior clareza e se necessário coloque zeros a esquerda, de modo que coincida com o manual do Itaú.                                                        

  13.  

    Boa tarde a todos, já fiz de tudo na NFe. Cheguei a  desenvolver um programa para verificar QUEBRAS (tudo certo em qualquer xml ). Funciona, mas se existirem dados da tag cobr, fica complicao.Porém agora processando em um cliente a mensagem é 5507 - Erro: O XML não possui nenhuma tag com o namespace da NF-e. Incrivel, o arquivo esta perfeito. ALGUEM PODE ME AJUDAR ???: 

    35180804657443000100550010000081891446836674nfe.xml

    Vi o seu xml e comparei com um meu. remove o :IndPag que resolve. Veja a minha função acima que está em comentário essa tag conforme fui orientado pelo suporte nota 10 da Flexdocs.

    <cobr>
     <fat>
       <nFat>501</nFat>
       <vOrig>105249.38</vOrig>
       <vLiq>105249.38</vLiq>
     </fat>
     <dup>
       <nDup>1</nDup>
       <dVenc>2018-08-27</dVenc>
       <vDup>105249.38</vDup>
     </dup>
    </cobr>
    <pag>
     <detPag>
      <tPag>15</tPag>
      <vPag>105249.38</vPag>
     </detPag>
    </pag>

     

×
×
  • Create New...