Jump to content
Fivewin Brasil

Passar a SQL passo a passo para Novatos..


kapiaba

Recommended Posts

Ola amigos

Oscar realmente existem varias formas e varios SGDB, voce devera optar por aquele que você melhor se identificar, no caso de uso em NUVEM, EU "particularmente" recomendaria o POSTGRES, mais tem o MariaDB o qual este substitui o Mysql em velocidade com folga e com os mesmos comandos e DLL do Mysql, isso caso voce queira migrar de Mysql para MariaDB. Exite a SQLRDD que te dá todo este suporte de migração sem voce ter que refazer todo o teu codigo, apenas convertendo de DBF para SQL, exceto que voce tera que se conectar no SGDB de sua preferencia.

Eu mesmo quando converti meus DBFs para Mysql que foi minha opção inicial, fiquei usando os comandos xBASE por um bom tempo, o qual ainda uso até hoje, exceto para relatorios, pois acabou os DO WHILE !EOF e varias condições dentro do DO WHILE.

Uma pequena amostra de como uso por exemplo para fazer um somatorio de NFe por CST e CFOP.

Select a.arcodigo AS COD_ITEM, 
a.arqtdent AS QTD, 
b.arunidad AS UNID, 
SUM( COALESCE( a.arvtotal, a.arvrunit * a.arqtdent ) ) AS VL_ITEM, 
sum( a.arvrdesc ) AS VL_DESC, 
COALESCE( d.arcstopr, a.arcodcst ) AS CST_ICMS, 
a.arcfop AS CFOP, 
d.arcodopr AS COD_NAT, 
SUM( ROUND( IF( a.arvricms IS NOT NULL,a.arvrbase_icms, 0 ), 2 ) ) AS VL_BC_ICMS, 
a.arpericm AS ALIQ_ICMS, 
SUM( ROUND( COALESCE( a.arvricms, 0 ), 2 ) ) AS VL_ICMS, 
SUM( ROUND( COALESCE( a.arvrbs_icm_st, 0 ), 2 ) ) AS VL_BC_ICMS_ST, 
0 AS ALIQ_ST, 
SUM( ROUND( COALESCE( a.arvricms_st, 0 ), 2 ) ) AS VL_ICMS_ST, 
ROUND( IF( COALESCE( d.arcstopr, a.arcodcst ) = '20', SUM( a.arvrunit * a.arqtdent ) - SUM(arvrbase_icms), 0 ), 2 ) AS VL_RED_BC, 
IF( a.arcst_pis = '0.', '', a.arcst_pis ) AS CST_PIS,   
SUM( ROUND( COALESCE( a.arvbcpis, 0 ), 2 ) )  AS VL_BC_PIS, 
a.arperpis  AS ALIQ_PIS,  
SUM( ROUND( COALESCE( a.arvalpis, 0 ), 2 ) )  AS VL_PIS,    
IF( a.arcst_cof = '0.', '', a.arcst_cof ) AS CST_COF,   
SUM( ROUND( COALESCE( a.arvbccof, 0 ), 2 ) )  AS VL_BC_COF, 
a.arpercof  AS ALIQ_COF,  
SUM( ROUND( COALESCE( a.arvalcof, 0 ), 2 ) )  AS VL_COF,    
a.arperipi  AS ALIQ_IPI,  
SUM( ROUND( COALESCE( a.arvripei, 0 ), 2 ) )  AS VR_IPI     
FROM ent2prod AS a 
LEFT JOIN pg02 c ON a.arcodfor = c.arcodfor AND c.sr_deleted != 'T' 
LEFT JOIN estoque b ON a.arcodigo = b.arcodigo 
LEFT JOIN natopera d ON a.arcfop = d.arnroopr 
WHERE a.arnrnota = '0000139362' AND a.arcodfor = '0039' AND a.ardtentr = str_to_date( '20140731', '%Y%m%d' ) AND a.sr_deleted != 'T' GROUP BY 6, 7, a.arpericm 

com este codigo o SGDB me devolve o resultado prontamente e não preciso ficar fazendo Sub-condiçoes dentro do DO WHILE.

Qualquer coisa estamos aqui para SOMAR e MULTIPLICAR, nada de DIVIDIR ou DIMINUIR.

Link to comment
Share on other sites

Jackson,

É um prazer re-estabelecer o contato com você que já me ajudou muito no passado.

Lembro que você me incentivou a mudar para SQL mas o cabeça dura aqui ainda não fez isso, mas eu estou tendo alguns problemas com DBF/CDX em algumas redes instáveis de clientes que insistem em colocar a culpa no programa e eu imagino que um banco de dados SQL irá solucionar o meu problema. Estou certo?

Em dezembro eu adquiri a atualização do Fivewin com o Gilmer visando utilizar o SQLRDD mais recente, mas não obtive muito sucesso.

O problema maior que tive com SQL foi que o meu sistema é multi-empresas com as tabelas distribuídas em pastas da seguinte forma:

C:\SISTEMA\ (aqui ficam as tabelas compartilhadas por todas as lojas do grupo: CLIENTES, PRODUTOS, FORNECEDORES, ETC.)

C:\SISTEMA\00001 (aqui ficam as tabelas exclusivas da loja UM: NOTAS FISCAIS, MOVIMENTO NO ESTOQUE, CAIXA, CONTAS, ETC.)

C:\SISTEMA\00002 (aqui ficam as tabelas exclusivas da loja DOIS: NOTAS FISCAIS, MOVIMENTO NO ESTOQUE, CAIXA, CONTAS, ETC.)

etc...

Com o DBF/CDX eu tenho uma função que CRIA e ABRE as tabelas na pasta certa da empresa que está utilizando o sistema, não consegui fazer isso no PostGres.

Você tem alguma sugestão?

Obrigado,

Link to comment
Share on other sites

Ola Oscar.

Você tem 2 possibilidades de usar de forma parecida como o que você faz hoje em DBF.

1a. Recriar todas as suas tabelas com um campo COD_EMPRESA.

2a Usar o MariaDB e fazer uma verificação de o DB de determinada empresa ja existe, caso não exista é só criar o mesmo, assim como voce faz em DBF, só que vai ser no SGDB, não em diretorio.

Quando a problemas em REDES INSTAVEIS, pode ter certeza que mesmo em SGDB voce tera problemas tambem, o SGDB não faz milagres quanto a isso, ele pode até amenizar os problemas, mais isso pode acarretar em problemas MAIORES posteriormente, o que te aconselho e dependendo do cliente, faça um acordo com ele, resolva VOCÊ mesmo o problema da REDE, invista na infra estrutura do cliente, no qual se o problema for resolvido e dependendo do acordo, o cliente lhe reembolsa o seu valor investido, digo isso pois ja fiz isso com clientes meus, no meu caso valeu a pena, pois atraves deste cliente ganhei mais 3.

Se precisar de ajuda para mudar para SGDB posso te dar uma consultorias e ideias de como voce devera fazer para contornar teu problema de MULTI-EMPRESAS.

Espero ter ajudado.

Link to comment
Share on other sites

Vou explicar minha experiencia que começou em novembro/2006.... Comprei o Xharbour Enterprise + SQLRDD... Adaptamos nosso sistema para funcionar em DBF e SQL usando o mesmo codigo, porem sem nenhuma melhoria com comandos de banco. Chamo isso de fase 1, que é onde apenas migramos nossa base para um banco de dados sem obter as melhorias que são possiveis em um banco de dados. Desta maneira, alguns procedimentos ficam até mais lentos, porem com a segurança de um banco de dados por trás.

Já em 2007 iniciamos o que chamo de fase 2, que é um passo intermediário para começar a usar mais recursos de banco, porem sem muitas melhorias de código. É o momento que se utiliza muito a funcao SR_SETFILTER onde voce faz um filtro que roda direto no banco de dados e evita os famosos SKIP/LOOP em relatórios ou processos de fechamento. Isso já melhora bem a performance, mas ainda não é o ideal.

Com tudo isso estabilizado iniciamos a fase 3, onde temos vários IFs dentro da aplicação que executa de uma maneira em DBF porem quando o cliente está com um banco de dados SQL usamos SELECTs para obter as informações, ao invez de fazer DBSEEK/WHILE/ENDDO/ETC.

A fase 4 vamos iniciar agora que é a utilização de STORED PROCEDURES e também INSERT/UPDATE/DELETE em todas as rotinas.

Não sei avaliar outras soluções para banco mas cito aqui um caso real de 8 anos usando SQLRDD e funcionando. Vale a pena e quando se tem duvidas é só acionar o suporte do xHarbour Comercial que é muito eficiente.

Abraços e boa sorte

Esse tópico de SQL apresenta tantos motores que eu fiquei confuso.

Quero migrar a minha aplicação para SQL para evitar ter que reindexar arquivos e futuramente para gerar partes da minha aplicação na nuvem.

Mas, sinceramente, não sei por conte começar.

Link to comment
Share on other sites

Oscar,

Para usar bancos SQL é necessário estudar SQL e como o SGBD controla o banco pra você. Estamos acostumados a fazer com que nossos sistemas gerenciem os DBFs e isso com bancos SQL não ocorre. O pensamento em relação a banco de dados muda drasticamente, até mesmo porque DBF não é banco de dados e sim repositório de dados. Isso se aprende quando estudamos a fundo bancos SQL. Muitas vezes tentamos usar o SQL com linguagem xbase e isso não tira o melhor que o banco SQL oferece. Estude bem SQL antes de começar a tua migração. Existem vários textos na net mostrando como se usa bancos SQL. Não é complicado, mas é trabalhoso. Só que no final o resultado é compensador.

Quanto a migração, eu faria como o Eduardo Motta citou, indo por partes, mas sempre tendo o foco de usar ao máximo o que o SQL tem a oferecer.

Minha opinião.

Link to comment
Share on other sites

  • 2 months later...

Pessoal,

Criei coragem e vou iniciar a troca do DBF para PostGres.

Pretendo seguir os seguintes passos:

1º) Intalar o banco no meu servidor Windows Server 2008:

2º) Começar usando o SQLRDD release november-2009 (05/12/2010)

3º) Usar as funções nativas do SQLRLL

4º) Depois de estabilizado, passar a usar o SR_SETFILTER para evitar SKIP/LOOP

5º) Passar a usar SELECT no lugar de WHILE, DBSEEK, etc

6º) Inlcuir as TRIGGERS e STORED POCEDURES no banco

7º) Liberar o banco para acesso através da Internet e iniciar o desenvolvimento de algumas aplicações Web usando WebDev.

Vou precisar muito da ajuda dos colegas e vou deixar registrado nesse espaço toda a experiência para que outros se beneficiem.

Passo 1: Instalar o banco

- Para começar, qual é a versão do Postgres que eu devo instalar para rodar com o SQLRDD Nov/2009. No site, a última é a versão (postgresql-9.3.5-3-windows), mas eu li no site do xHarbour.com que o SQLRDD suporta o PostGres na versão 9.0, encontrei no site essa instalação (postgresql-9.0.18-2-windows) - É essa que vocês estão utilizando com o SQLRDD?

- Vocês tem alguma sugestão de respostas que eu devo dar ao instalador no momento da instalação?

- Qual ferramenta devo usar para administração desse banco?

Aguardo, obrigado.

Link to comment
Share on other sites

Jackson,

Espero que estejas bem, tu e tua família.

Obrigado pelo incentivo. Aliás, se eu estivesse acatado a sua sugestão ha anos atrás, já estaria utilizando o SQL. Bem! Não é tarde demais.

A sua ajuda é muito bem vinda porque, apesar de ter estudado a liguagem SQL, estou totalmente no escuro quanto a utilizá-la no Fivewin.

Ontem eu instalei o postgresql-9.0.18-2-windows.

Depois alterei o meu batch de compilação incluindo as linhas:

SQL = C:\SQLRDD\LIB\BORLAND
LIBFILES = $(FWH)\lib\fivehx.lib $(FWH)\lib\fivehc.lib lang.lib vm.lib rtl.lib rdd.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib dbffpt.lib common.lib gtgui.lib codepage.lib ct.lib tip.lib pcrepos.lib hsx.lib hbsix.lib zlib.lib hbzip.lib png.lib $(CC_DIR)\lib\import32.lib $(CC_DIR)\lib\cw32.lib $(CC_DIR)\lib\psdk\msimg32.lib $(CC_DIR)\lib\psdk\psapi.lib $(SQL)\sql.lib $(SQL)\oci.lib $(SQL)\fbclient_bc.lib $(SQL)\libpq.lib $(SQL)\odbccp32.lib $(SQL)\libmysql.lib $(CC_DIR)\lib\psdk\odbc32.lib

Daí, inclui as seguintes funções que eu encontrei no fórom para manipulação de BD:

******************************************************************************
STATIC FUNCTION SQLCONECTAR()
******************************************************************************
   // BANCO DE DADOS SQL VIA FTP //
   LOCAL oDlg
   PUBLIC cEND_FTP :='ftp.xpg.com.br'
   PUBLIC cDIR_FTP :='/sist/integr/'
   PUBLIC cARQ_FTP :='oasys.sia'
   PUBLIC cUSU_FTP :='oasysitu'
   PUBLIC cSEN_FTP :='12345678'
   cIConn   := cHost    := cNomTab := cPass := cUser := Space(10)
   cIniFile := pDado+"OASMEMO.MEM"
   aIConn   := {"MYSQL","POSTGRES","FIREBIRD"}
   IF FILE(cIniFile)
      cConnTipo :=          GetPvProfString( "CONECTE", "TipoConn", cIConn  , cIniFile)
      cConnBase := DEcrypt( GetPvProfString( "CONECTE", "DataBase", cNomTab , cIniFile) )
      cConnName := DEcrypt( GetPvProfString( "CONECTE", "HostName", cHost   , cIniFile) )
      cConnPass := DEcrypt( GetPvProfString( "CONECTE", "Password", cPass   , cIniFile) )
      cConnUsrs := DEcrypt( GetPvProfString( "CONECTE", "User"    , cUser   , cIniFile) )
   ENDIF
   cConnName:="" // Para foçar a conexão ao banco
   IF EMPTY(cConnName)
      cHost  := "localhost            "
      cPass  := SPACE(10)
      cIConn := "MySql"
      lConecte := .F.
      DEFINE DIALOG oDlg FROM 0,0 TO 13,30 TITLE "(OASyS) BD Conexão" STYLE NOR(WS_POPUPWINDOW)
      @ 0.9,001 SAY "Banco:"    OF oDlg
      @ 1.8,001 SAY "Servidor:" OF oDlg
      @ 2.7,001 SAY "Usuário:"  OF oDlg
      @ 3.6,001 SAY "Senha:"    OF oDlg
      @ 001,7.5 COMBOBOX  oIConn VAR cIConn ITEMS aIConn SIZE 50,70 OF oDlg
      @ 2.2,7.5 GET       oHost  VAR cHost SIZE 50,10 OF oDlg WHEN .T. PICTURE "@X!"
      @ 3.2,7.5 GET       oUser  VAR cUser SIZE 50,10 OF oDlg WHEN .T. PICTURE "@X!"
      @ 4.2,7.5 GET       oPass  VAR cPass SIZE 50,10 OF oDlg WHEN .T. PICTURE "@X!"
      @ 004,001 ButtonBmp oBtn1  PROMPT "Conecta" RESOURCE "B_OK1"   SIZE 49,17 OF oDlg ACTION (lConecte:=.T.,oDlg:End())
      @ 004,010 ButtonBmp oBtn2  PROMPT "Cancela" RESOURCE "B_CANC1" SIZE 49,17 OF oDlg ACTION (lConecte:=.F.,oDlg:End())  CANCEL
      ACTIVATE DIALOG oDlg CENTERED
      IF !(lConecte)
         MsgStop("O banco de dados não foi conectado","(OASyS) Conexão ao BD")
         Return .F.
      ELSE
         WritePProString( "CONECTE", "TipoConn", cIConn           , cIniFile)
         WritePProString( "CONECTE", "DataBase", Encrypt(cNomTab) , cIniFile)
         WritePProString( "CONECTE", "HostName", Encrypt(cHost)   , cIniFile)
         WritePProString( "CONECTE", "Password", Encrypt(cPass)   , cIniFile)
         WritePProString( "CONECTE", "User"    , Encrypt(cUser)   , cIniFile)
         cConnTipo :=          GetPvProfString( "CONECTE", "TipoConn", cIConn  , cIniFile)
         cConnBase := DEcrypt( GetPvProfString( "CONECTE", "DataBase", cNomTab , cIniFile) )
         cConnName := DEcrypt( GetPvProfString( "CONECTE", "HostName", cHost   , cIniFile) )
         cConnPass := DEcrypt( GetPvProfString( "CONECTE", "Password", cPass   , cIniFile) )
         cConnUsrs := DEcrypt( GetPvProfString( "CONECTE", "User"    , cUser   , cIniFile) )
      ENDIF
   ENDIF
   // Bibliotecas do SQLRDD //
   #include "sqlrdd.ch"
   REQUEST SQLRDD             // SQLRDD should be linked in
   REQUEST SQLEX              // SQLRDD Extreme should be linked in
   if     cIConn="MYSQL"
      #include "mysql.ch"     // Needed if you plan to use native connection to MySQL
      REQUEST SR_MYSQL        // Needed if you plan to use native connection to MySQL
   elseif cIConn="POSTGRESS"
      #include "pgs.ch"       // Needed if you plan to use native connection to Postgres
      REQUEST SR_PGS          // Needed if you plan to use native connection to Postgres
   elseif cIConn="FIREBIRD"
      #include "firebird.ch"  // Needed if you plan to use native connection to Firebird
      #include "vKEY.ch"      // Needed if you plan to use native connection to Firebird
      #include "BLOB.ch"      // Needed if you plan to use native connection to Firebird
      REQUEST SR_FIREBIRD     // Needed if you plan to use native connection to Firebird
   elseif cIConn="ORACLE"
      #include "oracle.ch"    // Needed if you plan to use native connection to Oracle
      REQUEST SR_ORACLE       // Needed if you plan to use native connection to Oracle
   else
      REQUEST SR_ODBC         // Needed if you plan to connect with ODBC
   endif
   rddSetDefault("SQLRDD")
   CONECTAR(cConnTipo,cConnBase,cConnName,cConnPass,cConnUsrs)
RETURN NIL
******************************************************************************
STATIC FUNCTION CONECTAR(cConnTipo,cConnBase,cConnName,cConnPass,cConnUsrs)
******************************************************************************
   LOCAL cCriaBat:="", cConString1, nCon1, cBANCO:="", nError, lConectou:=.F. //lower(ALLTRIM(cConnUsrs))
   cSayNomeBd:="Conectado ao Banco de Dados "+ cConnTipo

   IF ALLTRIM(cConnTipo) == "POSTGRES"       // SE A CONEXÃO FOR POSTGRES
      cCriaBat:="CD "+CurDrive()+":\"+CurDir()+"\DLLS"+CRLF
      cCriaBat+="SET PGPASSWORD="+lower(ALLTRIM(cConnPass))+CRLF
      cCriaBat+="createdb -Ttemplate0 -U"+lower(ALLTRIM(cConnUsrs))+" -EWin1252 "+alltrim(LOWER(cConnBase))+CRLF
      cCriaBat+="SET PGPASSWORD=0"+CRLF
      cConString1:="pgs="+cConnName + ";" + "uid="+lower(ALLTRIM(cConnUsrs)) + ";"+"dtb="+alltrim(LOWER(cConnBase)) + ";" +"pwd="+lower(ALLTRIM(cConnPass))+";PRT=5432"
      nCon1 := SR_AddConnection( CONNECT_POSTGRES, cConString1 )
      IF nCon1 < 0
         IF MSGYESNO("BANCO DE DADOS NÃO ENCONTRADO, DESEJA CRIÁ-LO?","CONEXÃO MAL SUCEDIDA")
            MemoWrit( "conect.bat", cCriaBat )
            ShellExecute(oWnd, "Open", "conect.bat")
            MsgRun("Criando o Banco de Dados. Esta operação pode demorar alguns minutos...","Aguarde...",{|| CONECTANDO(@nCon1,cConString1) })
            ferase("conect.bat")
         ELSE
            QUIT
         ENDIF
      ELSE
         lConectou:=.T.
      ENDIF

   ELSEIF ALLTRIM(cConnTipo) == "MYSQL"    // SE A CONEXÃO FOR MYSQL
      cConString1  :="MySQL="+lower(ALLTRIM(cConnName)) + ";" + "UID="+lower(ALLTRIM(cConnUsrs))+ ";"+"pwd="+lower(ALLTRIM(cConnPass))+ ";" +"dtb="+alltrim(LOWER(cConnBase))+";PRT=3306"
      nCon1        := SR_AddConnection( CONNECT_MYSQL, cConString1 )
      IF nCon1 < 0
         IF ! MsgYesNo("O banco de dados "+lower(ALLTRIM(cConnName))+" não existe. Gostaria de criá-lo?","Criar banco de dados")
            QUIT
         ELSE
            cConString1:="MySQL="+lower(ALLTRIM(cConnName)) + ";" + "UID="+lower(ALLTRIM(cConnUsrs))+ ";"+"pwd="+lower(ALLTRIM(cConnPass))+ ";" +"dtb=mysql"+";PRT=3306"
            nCon1 := SR_AddConnection( CONNECT_MYSQL, cConString1 )
            IF nCon1 < 0
               MsgInfo("Erro de Conexão. Veja o Arquivo Sqlerror.log para mais Detalhes.", "Atenção, Erro")
               RETURN (.F.)
            ELSE
               oSql:= SR_GetConnection()
               oSql:exec("CREATE DATABASE "+alltrim(LOWER(cConnBase)))
               MsgWait( "Novo DataBase Criado "+alltrim(LOWER(cConnBase)), "OK",2 )
               SR_EndConnection( nCon1 )  //--> Encera a Conexao com o dataBase "MySql
               cConString1:="MySQL="+lower(ALLTRIM(cConnName))+ ";" + "UID="+lower(ALLTRIM(cConnUsrs))+ ";"+"pwd="+lower(ALLTRIM(cConnPass))+ ";" +"dtb="+alltrim(LOWER(cConnBase))+";PRT=3306"
               nCon1 := SR_AddConnection( CONNECT_MYSQL, cConString1 )
            ENDIF
         ENDIF
      ENDIF

   ELSEIF ALLTRIM(cConnTipo) == "FIREBIRD" // SE A CONEXÃO FOR FIREBIRD   93.104.215.135/cpanel
      cBANCO:=if(lower(ALLTRIM(cConnName))=='localhost',CurDrive()+":\"+CurDir()+"\BANCOS","\\"+lower(ALLTRIM(cConnName))+"\"+CurDrive()+"\"+CurDir()+"\BANCOS")
      IF ! IsDirectory( cBANCO )
         nError := MakeDir( cBANCO )
         IF nError == 5
            MSGINFO( "Error ao Criar o seguinte diretorio: "+cBANCO,"Erro de Criação" )
            RETURN .F.
         ENDIF
      ENDIF
      IF !FILE(cBANCO+"\"+alltrim(LOWER(cConnBase))+".fdb")
         IF FBCreateDB( lower(ALLTRIM(cConnName))+":"+if(lower(ALLTRIM(cConnName))=='localhost',CurDrive()+":\"+CurDir()+"\BANCOS\"+ALLTRIM(LOWER(cConnBase))+".fdb",;
            CurDrive()+":\"+CurDir()+"\BANCOS\"+ALLTRIM(LOWER(cConnBase))+".fdb"), lower(ALLTRIM(cConnUsrs)), lower(ALLTRIM(cConnPass)),"8192","ISO8859_2",3) # SQL_SUCCESS
            alert("Erro ao criar o banco de dados para o Firebird")
            quit
         ELSE
            MsgWait( "Novo DataBase Criado "+alltrim(LOWER(cConnBase)), "OK",2 )
         ENDIF
      ENDIF
      cConString1:="FIREBIRD="+ALLTRIM(LOWER(cConnName))+":"+if(lower(ALLTRIM(cConnName))=='localhost',CurDrive()+":\"+CurDir()+"\BANCOS\"+ALLTRIM(LOWER(cConnBase))+".fdb",;
      CurDrive()+":\"+CurDir()+"\BANCOS\"+ALLTRIM(LOWER(cConnBase))+".fdb")+";uid="+lower(ALLTRIM(cConnUsrs))+";pwd="+lower(ALLTRIM(cConnPass))+";charset=ISO8859_2"
      nCon1 := SR_AddConnection( CONNECT_FIREBIRD, cConString1 )
      IF nCon1 < 0
         MsgInfo("Erro de Conexão. Veja o Arquivo Sqlerror.log para mais Detalhes.", "Atenção, Erro")
         RETURN (.F.)
      ENDIF

   ENDIF
RETURN NIL
******************************************************************************
STATIC FUNCTION CONECTANDO(nCon,cConString1)
******************************************************************************
   LOCAL lConectar :=.F.
   DO WHILE lConectar == .F.
      nCon := SR_AddConnection( CONNECT_POSTGRES, cConString1 )
      IF nCon < 0
         lConectar:=.F.
      ELSE
         lConectar:=.T.
      ENDIF
      LOOP
   ENDDO
RETURN lConectar

Ao fazer isso e compilar, o sistema deu a seguinte mensagem de erro: O MVEND.EXE parou de funcionar. E não abre o sistema. Se eu removo essas funções ele abre. O que tem de errado nelas?

Aguardo, obrigado.

Link to comment
Share on other sites

Instalei o PostGres 8.3 que é o que aparece nos exemplos do SQLRDD.

Coloquei todas as DLL´s da pasta SQLRDD\DLL na pasta da minha aplicação.

Ao compilar ele indica que não encontrou o banco e que vai criar e daí fica travado nessa função:

******************************************************************************
STATIC FUNCTION CONECTANDO(nCon,cConString1)
******************************************************************************
   LOCAL lConectar :=.F.
   DO WHILE lConectar == .F.
      nCon := SR_AddConnection( CONNECT_POSTGRES, cConString1 )
      IF nCon < 0
         lConectar:=.F.
      ELSE
         lConectar:=.T.
      ENDIF
      LOOP
   ENDDO
RETURN lConectar

Os parâmetros que estão sendo passados para ela são:

Conteúdo do nCon:
-1

Conteúdo do cConString1:
pgs=servsys;uid=postgres;dtb=oasysbd;pwd=postgres;PRG=5432

Conteúdo do Conect.bat:
O:\SIST\WOASYS\SET PGPASSWORD=postgres
createdb -Ttemplate0 -Upostgres -EWin1252 oasysbd
SET PGPASSWORD=0

O que pode estar causando esse travamento? O banco não está sendo criado.

Link to comment
Share on other sites

Amiguinhos,

No seguinte trecho de código encontrei uma incoerencia, ou seja, não entendi, me desculpe pela critica, mas explicarei:

if     cIConn="MYSQL"
      #include "mysql.ch"     // Needed if you plan to use native connection to MySQL
      REQUEST SR_MYSQL        // Needed if you plan to use native connection to MySQL
   elseif cIConn="POSTGRESS"
      #include "pgs.ch"       // Needed if you plan to use native connection to Postgres
      REQUEST SR_PGS          // Needed if you plan to use native connection to Postgres
   elseif cIConn="FIREBIRD"
      #include "firebird.ch"  // Needed if you plan to use native connection to Firebird
      #include "vKEY.ch"      // Needed if you plan to use native connection to Firebird
      #include "BLOB.ch"      // Needed if you plan to use native connection to Firebird
      REQUEST SR_FIREBIRD     // Needed if you plan to use native connection to Firebird
   elseif cIConn="ORACLE"
      #include "oracle.ch"    // Needed if you plan to use native connection to Oracle
      REQUEST SR_ORACLE       // Needed if you plan to use native connection to Oracle
   else
      REQUEST SR_ODBC         // Needed if you plan to connect with ODBC
   endif

Os termos #define e #include não são dinâmicos para que seu uso possa ser feito em estruturas if..end, case..endcase, etc.

Tanto #define como #include serão manipulados somente no momento da compilação e portanto suas definições e conteúdos serão inclusos ao código resultado. Veja o resultado de um .PPO.

Mesmo que você tenha a estrutura:

if   critica1
     #include "header1.ch"
else critica2 
     #include "header2.ch"
else critica3
     #include "header3.ch"
endif

E dentro dos cabeçalhos você tenha variáveis de mesmo nome, ao compilar, a variável do ultimo cabeçalho irá suplantar as variáveis anteriores e a estrutura if..endif perderá seu comportamento.

Talvez, por isto, você vem obtendo erros.

Agora se usar assim:

#define cMotorSQL sim

#ifdef cMotorSQL
       #include "headerSQL.ch"
#else
       #include "headerDBF.ch"
#endif

Se cMotorSQL estiver definido somente o conteúdo de headerSQL.ch será embutido na compilação.

Resumindo, voce tem estruturas que deve usar somente na compilação e outras para momento da execução.

Eu ainda não uso SQLMix( ainda estou indeciso ), mas se fosse usar vários esquemas ao mesmo tempo o inicio de meu código ficaria assim:

#include "mysql.ch"   
#include "pgs.ch"     
#include "firebird.ch"
#include "vKEY.ch"    
#include "BLOB.ch"    
#include "oracle.ch"  

REQUEST SR_MYSQL      
REQUEST SR_PGS        
REQUEST SR_FIREBIRD   
REQUEST SR_ORACLE     
REQUEST SR_ODBC       

FUNCTION MAIN()
   ...
   CODIGO
   ...
   RETURN NIL

Desde que é claro, os conteúdos não se choquem e suplantem variáveis.

Bom trabalho.

Link to comment
Share on other sites

Pessoal,

É possível estar havendo alguma incompatibilidade entre o SQLRDD e o (Fwh1312 + xHarbour 1.2.3 + BCC582) e por esse motivo é que ele não cria o banco?

Pergunto isso porque os SAMPLES do SQLRDD funcionam com versões anteriores do FWH, mas não estão funcionando com essa que eu estou usando.

Alguém está rodando o SQLRDD com essa versão do FWH?

Aguardo, obrigado.

Link to comment
Share on other sites

Registrando a minha experiência:

1º) Intalei o banco Postgres 8.3 no meu servidor Windows Server 2008:

2º) Baixei o SQLRDD DEMO do xHarbour.com

3º) Passei a usar as funções nativas do SQLRLL

Até aqui eu criei o banco usando o PgAdmin3 (não consegui criá-lo por dentro da aplicação). Entretanto, todas as tabelas e chaves do banco foram criadas normalmente pela aplicação na rotina de organização dos arquivos. O próximo passo agora é testar todas as funções da aplicação e fazer os ajustes necessários para que tudo funcione com o Banco assim como já rodavam com DBF.

4º) Depois de estabilizado, vou usar o SR_SETFILTER para evitar SKIP/LOOP

5º) Passar a usar SELECT no lugar de WHILE, DBSEEK, etc

6º) Inlcuir as TRIGGERS e STORED POCEDURES no banco

7º) Liberar o banco para acesso através da Internet e iniciar o desenvolvimento de algumas aplicações Web usando WebDev.

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...