Jump to content
Fivewin Brasil

PostGre-SQL


jfaguiar

Recommended Posts

 

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.

 

Link to comment
Share on other sites

 

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.

 

Link to comment
Share on other sites

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.
 

Link to comment
Share on other sites

 

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

Link to comment
Share on other sites

 

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
 

 

 

 

Link to comment
Share on other sites

Criando a lib -> libhbpg.lib

Criar uma arquivo de lote (.bat) que eu chamo de make_b32.bat ou qualquer nome que queira dar, salvar na pasta pgsql, que no meu caso fica em c:\xharbour\contrib\pgsql.

Este arquivo tem o seguinte conteúdo:

@echo off



if "%1" == "clean" goto CLEAN

if "%1" == "CLEAN" goto CLEAN


:BUILD



   \bcc55\bin\make -fmakefile.bc %1 %2 %3 > make_b32.log

   if errorlevel 1 goto BUILD_ERR



:BUILD_OK



   copy c:\xharbour\contrib\pgsql\lib\b32\libhbpg.lib c:\xharbour\lib\

   goto EXIT



:BUILD_ERR



   notepad make_b32.log

   goto EXIT



:CLEAN



   if exist ..\..\contrib\pgsql\lib\b32\libhbpg.lib    del ..\..\contrib\pgsql\lib\b32\libhbpg.lib

   if exist ..\..\contrib\pgsql\lib\b32\libhbpg.bak    del ..\..\contrib\pgsql\lib\b32\libhbpg.bak

   if exist ..\..\contrib\pgsql\obj\b32\postgres.obj   del ..\..\contrib\pgsql\obj\b32\postgres.obj

   if exist ..\..\contrib\pgsql\obj\b32\TPostgres.c    del ..\..\contrib\pgsql\obj\b32\TPostgres.c

   if exist ..\..\contrib\pgsql\obj\b32\TPostgres.obj  del ..\..\contrib\pgsql\obj\b32\TPostgres.obj

   goto EXIT



:EXIT

OBS.

Dentro da pasta pgsql, criar uma pasta lib e dentro desta pasta outra pasta chamada b32.

Dentro da pasta pgsql, criar uma pasta obj e dentro desta pasta outra pasta chamada b32.

* Os caminhos para o executável make, será o caminho que esta instalado no seu computador, tal como o do seu xharbour etc....

* Este arquivo executa o lote, digitando make_b32 e digitando make_b32 clean -> limpa o conteúdo para uma nova criação da lib. ( Lembrando que se chamar o arquivo de lote e gerar a lib, e depois chamar novamente o arquivo de lote não será criada uma nova lib, por isso que se tem o make_b32_clean, ou seja executa o bat para criar a lib e depois se quiser criar novamente, é necessário limpar com o make_b32 clean antes de executar o bat novamente.

 

Criar um outro arquivo com o nome de makefile.bc ou qualquer outro nome que queira dar , salvar na pasta pgsql, que no meu caso fica em c:\xharbour\contrib\pgsql.

Este arquivo tem o seguinte conteúdo:

# makefile for Borland C/C++ 32 bits
# Building of libhbpg.lib - Harbour API to postgres

# Postgresql running under Cygwin/Windows, unmark the line bellow to compile.
# PG_DIR = ..\..\..\cygwin\usr\src\postgresql-7.4.5

PG_DIR = C:\Postgresql\9.2

INCLUDE_DIR = ..\..\include
INCLUDE_PQ = $(PG_DIR)\include

BIN_DIR = c:\xharbour\bin
OBJ_DIR = ..\..\contrib\pgsql\obj\b32
LIB_DIR = ..\..\contrib\pgsql\lib\b32

$(LIB_DIR)\libhbpg.lib : \
  $(OBJ_DIR)\TPostgres.obj \
  $(OBJ_DIR)\postgres.obj

$(OBJ_DIR)\TPostgres.c    : TPostgres.prg
$(OBJ_DIR)\TPostgres.obj  : $(OBJ_DIR)\TPostgres.c
$(OBJ_DIR)\postgres.obj   : postgres.c

.c.obj:
  \bcc55\bin\bcc32 $(CLIBFLAGS) -c -O2 -I$(INCLUDE_DIR) -I$(INCLUDE_PQ) -DHB_OS_WIN_32_USED -DPG_DIAG_INTERNAL_POSITION -o$@ $<
  \bcc55\bin\tlib $(LIB_DIR)\libhbpg.lib -+$@,,

.prg.c:
  $(BIN_DIR)\harbour.exe $< -q0 -a -w -es2 -gc0 -n -i$(INCLUDE_DIR) -o$@

OBS.

Os caminhos do xharbour, bcc55 ou outro borland é de acordo como esta instalado no seu computador.

* Uma observação importante, é que no caso do POSTGRESQL, por padrão na instalação ele fica dentro da pasta ( c:\Arquivos de programas\Postgresql) ou (c:\Program Files\Postgresql), no arquivo acima é necessário informar o caminho de instalação do Postgresql, mas como esse por padrão é instalado em (c:\Arquivos de Programas) ou (c:\Program Files), se informar este caminho no arquivo acima dá erro na geração da LIB, não saberei explicar qual o motivo do WINDOWS, então basta copiar esta pasta Postgresql para a unidade c: e informar como no caso acima, esta pasta só servira para isso, para compilar a lib.

* Ficar atento aos caminhos nos dois arquivos..

OBS. TODA A VEZ QUE MUDAR O XHARBOUR OU O BCC (BORLAND), é necessário recriar esta lib e todas as outras que se usa das contrib..

BOA SORTE,

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...