Clipper On Line • Ver Tópico - Iniciante xHarbour - Como acessar .Fdb .Gdb

Iniciante xHarbour - Como acessar .Fdb .Gdb

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Itamar M. Lins Jr. » 10 Out 2016 10:16

Ola!
Peguei seu código e só comentei as duas linhas abaixo.
//#include "hbrddsql.ch"
//#include "firebird.ch" // PARA FIREBIRD
Aqui o resultado.
C:\fontes\teste>hbmk2 fdb.prg sddodbc.hbc sddfb.hbc
hbmk2: Processando script local make: hbmk.hbm
Harbour 3.4.0dev (bde5c0c) (2016-09-28 18:12)
Copyright (c) 1999-2016, https://github.com/vszakats/harbour-core/
Compiling 'fdb.prg'...
Lines 678, Functions/Procedures 2
Generating C source output to 'C:\Users\Itamar\AppData\Local\Temp\hbmk_8xmai4.di
r\fdb.c'... Done.
RDD's instaladas: >> SQLBASE SQLMIX DBF DBFCDX
-----------------------------------------------------
Connecetion=>          0
-----------------------------------------------------
Connecetion=>          0
-----------------------------------------------------
Connecetion=>          0
-----------------------------------------------------
C:\fontes\teste>


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3676
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 125 vezes
Mens.Curtidas: 191 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Itamar M. Lins Jr. » 10 Out 2016 10:37

E com a linha #include "hbrddsql.ch" não comentada.
RDD's instaladas: >> SQLBASE SQLMIX DBF DBFCDX
-----------------------------------------------------
Retornou ARRAY para nConn1
         1 ODBC
         2 Server=localhost;Driver={Firebird/InterBase(r) driver 2.00.04.155};ds
n=;User=SYSDBA;Password=masterkey;database=G:\Dev2\DentalOff\Small.gdb;
-----------------------------------------------------
Retornou ARRAY para nConn5
         1 ODBC
         2 Server=localhost;Database=G:\Dev2\DentalOff\Small.gdb;User=SYSDBA;Pas
sword=masterkey;Driver={Firebird/InterBase(r) driver};
-----------------------------------------------------
Retornou ARRAY para nConn6
         1 ODBC
         2 Server=localhost;Database=127.0.0.1:G:\Dev2\DentalOff\Small.gdb;User=
SYSDBA;Password=masterkey;Driver={Firebird/InterBase(r) driver};
-----------------------------------------------------
C:\fontes\teste>


Vamos ver no forum internacional...

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3676
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 125 vezes
Mens.Curtidas: 191 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Itamar M. Lins Jr. » 10 Out 2016 10:57

Ola!
Não precisou.
Seu arquivo dbinfo.ch está com problema, ou não tem essa parte.
*
#include "dbinfo.ch"

#require "rddsql"
#require "sddodbc"
*
REQUEST SQLMIX, DBFCDX, SDDODBC
*
ANNOUNCE RDDSYS
*
PROCEDURE Main()
   *
   SETMODE( 25, 80 )
   rddSetDefault( "SQLMIX" )
   Set( _SET_DATEFORMAT, "yyyy-mm-dd" )
   *
   clear
   *
   ? "RDD's install: >>"
   ?? AEval( rddList(), {| x | QQOut( "", x ) } )             
   ? "-----------------------------------------------------"
   *
   nConn1 := rddInfo( RDDI_CONNECT, { "ODBC", "Server=localhost;Driver={Firebird/InterBase(r) driver};dsn=;User=SYSDBA;Password=masterkey;database=G:\Dev2\DentalOff\Small.gdb;" } )
   IF ValType( nConn1 ) = "N"
      ? "Connection=>", nConn1
   ELSEIF ValType( nConn1 ) = "A"
      ? "Return ARRAY of nConn1"
      For x1 = 1 TO Len( nConn1 )
         ? x1, nConn1[x1]
      Next x1
   ELSE
      Alert( 'connection fault nConn1' )
   ENDIF

Dentro do meu dbinfo.ch do 3.4

/* SQL */
#define RDDI_CONNECT             61   /* connect to database */
#define RDDI_DISCONNECT          62   /* disconnect from database */
#define RDDI_EXECUTE             63   /* execute SQL statement */
#define RDDI_ERROR               64   /* error number */
#define RDDI_ERRORNO             65   /* error description */
#define RDDI_INSERTID            66   /* last auto insert ID */
#define RDDI_AFFECTEDROWS        67   /* number of affected rows after UPDATE */
#define RDDI_QUERY               68   /* last executed query */

e se colocar a hbrddsql.ch
/* NOTE: This file is also used by C code. */

#ifndef HB_RDDSQL_CH_
#define HB_RDDSQL_CH_

/* New ...INFO_ constants */
#define DBI_QUERY             1001

#define RDDI_CONNECT          1001
#define RDDI_DISCONNECT       1002
#define RDDI_EXECUTE          1003
#define RDDI_ERROR            1004
#define RDDI_ERRORNO          1005
#define RDDI_NEWID            1006
#define RDDI_AFFECTEDROWS     1007
#define RDDI_QUERY            1008

#endif


Muito diferente. O problema deve ser a salada de versões ai...

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3676
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 125 vezes
Mens.Curtidas: 191 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Hasse » 10 Out 2016 12:58

Oi Itamar.

Você matou a charada. O problema estava no dbinfo.ch.

Eu havia copiado ele da pasta do MiniGui 3.4.1

Fui na pasta do HB32 recém instalado e usei aquele.

A Compilação passou e a conexão retorna um número, iniciando com 1. A cada nova conexão este número incrementa em 1.

Um pequeno detalhe, mas fundamental. Estou curioso para saber como você chegou a esta conclusão. Foi uma sacada genial.

Valeu mesmo Itamar. Mais uma vez obrigado pela tua valiosa e prestimosa colaboração. Sinceramente, eu nunca chegaria lá.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 782
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 18 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Itamar M. Lins Jr. » 10 Out 2016 14:27

Ola!
A Compilação passou e a conexão retorna um número, iniciando com 1. A cada nova conexão este número incrementa em 1.


Esta correto, vc pode ter múltiplas conexões MySQL = nConn1, Firebird = nConn2...
Use RDDI_DISCONNECT para desconectar.
RDDINFO(RDDI_DISCONNECT,,"SQLMIX",nConn1) //tem que colocar o tipo de RDD
RDDINFO(RDDI_DISCONNECT,,"SQLMIX",nConn2)


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3676
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 125 vezes
Mens.Curtidas: 191 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Itamar M. Lins Jr. » 10 Out 2016 14:35

Ola!
Estou curioso para saber como você chegou a esta conclusão.

Porque aqui funciona, quando copiei o seu código deixou de funcionar, ai fui eliminando as linhas desnecessárias.
Eu ia colocar seu código no forum internacional, e lá eles pedem o menor código possível.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3676
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 125 vezes
Mens.Curtidas: 191 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Hasse » 14 Out 2016 11:16

Bom dia Itamar.

Estou testando e brincando com as Funções, Comandos do Firebird direto ou nativo: FBCreateDB(), FBConnect(), etc.

Consigo criar o BANCO, criar uma Tabela, e inserir dados (em parte).
Veja os PRG's abaixo:
   ? "Create Tabela Teste_2=======>>", tmp   := FBQuery( db, "CREATE TABLE Teste_Dbas( COD smallint, CLIENTE char(20), CIDADE char(25) )", nDialect, trans )
O campo COD é smallint.

   FOR xx1 = 1 TO 5
      ? "Exec Insert Teste_Dbas======>>", tmp   := FBExecute( db, 'insert into Teste_Dbas(COD) values(1)', nDialect, trans )
   NEXT xx1
Funciona corretamente inserindo o valor 1 em todos os registros.
      ? "Exec Insert Teste_Dbas======>>", tmp   := FBExecute( db, 'insert into Teste_Dbas(COD) values(xx1)', nDialect, trans )
      ? "Exec Insert Teste_Dbas======>>", tmp   := FBExecute( db, 'insert into Teste_Dbas(COD) values(&xx1)', nDialect, trans )
      ? "Exec Insert Teste_Dbas======>>", tmp   := FBExecute( db, 'insert into Teste_Dbas(COD) values("xx1")', nDialect, trans )
      ? "Exec Insert Teste_Dbas======>>", tmp   := FBExecute( db, 'insert into Teste_Dbas(COD) values("&xx1")', nDialect, trans )
NÃO funciona se quero inserir o valor crescente de contido na variável xx1 incrementada em FOR xx1.
Já testei usar xx1 (erro -206), &xx1 (erro -104), "xx1" (erro -413) e "&xx1" (erro -413)

Como fazer ?
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 782
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 18 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Hasse » 15 Out 2016 11:49

A mesma coisa acontece com o ODBC RDDINFO - NÃO grava valores numéricos:
   RDDINFO(RDDI_EXECUTE, "CREATE TABLE Teste_ODBC ( COD int, CLIENTE char(10), CIDADE char(20)) " )
   FOR xx1 = 1 TO 05
      cd1 := StrZero( xx1, 10 )
      cd2 := StrZero( xx1, 20 )
      ? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC ( CLIENTE, CIDADE ) values( '&cd1', '&cd2' )" )  && OK - grava a string da variável.
      *
      ? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC (COD) values( xx1 )" )              && erro.
      ? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC (COD) values( &xx1 )" )             && erro.
      ? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC (COD) values( 'xx1' )" )            && erro.
      ? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC (COD) values( '&xx1' )" )           && erro.
   NEXT xx1
Nenhuma das 4 opções grava o valor da variável numérica XX1.

Variáveis char e varchar gravam corretamente.

Como contornar este problema ?
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 782
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 18 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Hasse » 15 Out 2016 12:59

Interessante que funciona gravando se NULL
      ? RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC ( COD, CLIENTE, CIDADE ) values( null, '&cd1', '&cd2' )" )  && OK - retorna .T.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 782
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 18 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Hasse » 15 Out 2016 14:04

Outro detalhe que me chamou a atenção !!!!!!!!!!!!!!
A velocidade de gravação.
Para gravar 10.000 registros com insert, tempos em segundos.
Vejam a EXTREMA diferença dos números. É inacreditável.
Somando ainda a grande instabilidade de desempenho entre uma medição e outra do ODBC !!!
ODBC-----------------FB
10.000----------------10.000 registros gravados
59,242----------------1,706 segundos
80,548----------------1,538 segundos
43,343----------------1,715 segundos
26,399----------------1,741 segundos
37,992----------------1,581 segundos
33,513----------------1,733 segundos
47,371----------------1,741 segundos
39,009----------------1,714 segundos
37,503----------------1,592 segundos
28,865----------------1,692 segundos

Concluindo:
Quem precisa de velocidade DEVE usar a FB direto, SEM ODBC. Aos meus Gurus de SGDB's, tem algum erro nesta minha conclusão ????

Detalhes: Não encontrei qualquer referência à possibilidade de uso do ROLLBACK com o ODBC.
Parece que não há necessidade de "commitar" os dados gravados com ODBC.
No FB exige, pois sem o COMMIT os dados não são gravados.

Abaixo o PRG usado para o caso do ODBC:
   RDDINFO(RDDI_EXECUTE, "CREATE TABLE Teste_ODBC ( CLIENTE char(10), CIDADE char(20) )" )
   c_Time1 := Subs( HB_ValToStr( DateTime() ), 12 )
   c_Tm1   := DateTime()
   ? "Time Inicial..:>"
   ?? c_Time1
   *
   FOR xx1 = 1 TO 10000
      cd1 := "1" + StrZero( xx1, 09 )
      cd2 := "2" + StrZero( xx1, 19 )
      RDDINFO(RDDI_EXECUTE, "insert into Teste_ODBC ( CLIENTE, CIDADE ) values( '&cd1', '&cd2' )" )
   NEXT xx1
   c_Time2 := Subs( HB_ValToStr( DateTime() ), 12 )
   c_Tm2   := DateTime()
   ? "Time Inicial...:>" + c_Time1,
   ? "Time Final.....:>" + c_Time2,
   ? "Total....:>"
   ?? c_Tm2 - c_Tm1, " dias  ==  ", ( c_Tm2 - c_Tm1 ) * 86400, " segundos"


E abaixo o código para o FB sem ODBC:
   trans := FBStartTransaction( db )
   FBQuery( db, "CREATE TABLE Teste_Dbas( COD int, CLIENTE char(20), CIDADE char(25) )", nDialect, trans )
   FBCommit( trans )
   *
   c_Time1 := Subs( HB_ValToStr( DateTime() ), 12 )
   c_Tm1   := DateTime()
   ? "Time Inicial..:>"
   ?? c_Time1
   *
   trans := FBStartTransaction( db )
   FOR xx1 = 1 TO 10000
      cd1 := "1" + strzero( xx1, 09 )
      cd2 := "2" + strzero( xx1, 19 )
      FBExecute( db, 'insert into Teste_Dbas(COD, CLIENTE, CIDADE) values( "&xx1" as integer, "&cd1", "&cd2")', nDialect, trans )
   NEXT xx1
   FBCommit( trans )
   c_Time2 := Subs( HB_ValToStr( DateTime() ), 12 )
   c_Tm2   := DateTime()
   ? "Time Inicial...:>" + c_Time1,
   ? "Time Final.....:>" + c_Time2,
   ? "Total....:>"
   ?? c_Tm2 - c_Tm1, " dias  ==  ", ( c_Tm2 - c_Tm1 ) * 86400, " segundos"
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 782
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 18 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Hasse » 16 Out 2016 20:49

Assunto da gravação de número resolvido.

Consultar o link abaixo:

http://www.pctoledo.com.br/forum/viewtopic.php?f=4&t=9800&start=30

Obrigado a todos que contribuíram.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 782
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 18 vezes

Iniciante xHarbour - Como acessar .Fdb .Gdb

Mensagempor Hasse » 16 Out 2016 20:53

Para o passo seguinte preciso:

1)-Listas das Funções e Comandos da biblioteca FB;

2)-Lista com os significados dos erros retornados.

Já pesquisei no site do Firebird e nada encontrei que mencionasse essa biblioteca FB.

Onde posso conseguir isso ?
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar de usuário

Hasse
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 782
Data de registro: 19 Out 2004 10:30
Cidade/Estado: Jaraguá do Sul - SC
Curtiu: 0 vez
Mens.Curtidas: 18 vezes

Anterior



Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro