Página 1 de 1

Acesso ao FireBird

Enviado: 12 Jun 2009 16:46
por jelias
Amiguinhos,

Tenho um sistema em clipper 5.2e + Blinker 7.0 + Six 3.0, que já está rodando a bastante tempo sem nenhum problema.
Entretanto, o volume de dados tem crescido bastante, e veio a necessidade de criar um sistema de retaguarda, onde é feito análise das vendas. Para atingir as expectativas, fiz um sistema simples em Delphi que importa os dados dos dbf.
Recentimente com a ajuda do AlaminoJúnior e o Wagner, comecei a garimpar com o Xharbour, e hoje estou fazendo um upgrade no sistema usando xHarbour 1.0.0 (simplex) + hgWVW.
Confesso que estou muito feliz com o avanço que fiz.

Pesquisando aqui no forum, vi muita coisa sobre o mysql e pensei em migrar tanto o sistema xHarbour quanto em Delphi para Mysql.

- Agora, existe uma segunda opcão que seria até mais lógica, de deixar por enquanto os meus sistemas dbf normalmente, entretanto atualizando o banco do FireBird automaticamente. Só que é ai que entra a minha dúvida, como fazer isso?

Alguém sabe como eu posso usar o firebird 2.1 com xHarbour 1.0.0 (simplex). O que preciso é gravar os dados somentes, não irei utilizar os fb para query nem em relatórios no xh.

Muito Obrigado a todos!
Abraço!

Re: ACESSO AO FIREBIRD

Enviado: 15 Jun 2009 15:53
por sygecom
xHarbour acredito que somente usando a versão paga do xharbour.com, mas com harbour tem na pasta CONTRIB, veja abaixo um exemplo da pasta CONTRIB\HBFBIRD

simple.prg

Código: Selecionar todos

/*
 * $Id: simple.prg 10153 2009-02-03 02:05:45Z druzus $
 */

#include "common.ch"

Function main()
    Local oServer, oQuery, oRow, i, x, aTables, aStruct, aKey

    Local cServer := '192.168.1.33:D:\firebird\test\test.gdb' 
    Local cUser := 'sysdba'
    Local cPass := 'masterkey'
    Local nDialect := 1
    Local cQuery
    
    if File('test.gdb')
        FErase('test.gdb')
    end
    
    ? FBCreateDB('test.gdb', cuser, cpass, 1024, 'ASCII', nDialect )
               
    ? "Connecting..."
        
    oServer := TFBServer():New(cServer, cUser, cPass, nDialect)

    if oServer:NetErr()
        ? oServer:Error()
        quit
    end

    ? 'Tables...'
    
    For x := 1 to 1
        aTables := oServer:ListTables()
    
        For i := 1 to Len(aTables)
            ? aTables[i]
        next
    Next        
        
    ? 'Using implicit transaction...'
    
    if oServer:TableExists('TEST')
        oServer:Execute('DROP TABLE Test')
        oServer:Execute('DROP DOMAIN boolean_field')
    end        

    ? 'Creating domain for boolean fields...'
    oServer:Execute('create domain boolean_field as smallint default 0 not null check (value in (0,1))')
    
    oServer:StartTransaction()
    ? 'Creating test table...'
    cQuery := 'CREATE TABLE test('
    cQuery += '     Code SmallInt not null primary key, '
    cQuery += '     dept Integer, '
    cQuery += '     Name Varchar(40), '
    cQuery += '     Sales boolean_field, '
    cQuery += '     Tax Float, '
    cQuery += '     Salary Double Precision, '
    cQuery += '     Budget Numeric(12,2), '
    cQuery += '     Discount Decimal(5,2), '
    cQuery += '     Creation Date, '
    cQuery += '     Description blob sub_type 1 segment size 40 ) '

    oServer:Execute(cQuery)
    
    if oServer:neterr()
        ? oServer:Error()
    end

    oServer:Commit()
    
    oQuery := oServer:Query('SELECT code, dept, name, sales, salary, creation FROM test')    
    wait

    
    ? 'Structure of test table'
    aStruct := oServer:TableStruct('test')
    
    For i := 1 to Len(aStruct)
        ? 
        For x := 1 to Len(aStruct[i]) 
            ?? aStruct[i,x]
        Next            
    next
    
    ? 'Inserting, declared transaction control '
    oServer:StartTransaction()
    
    For i := 1 to 100
        cQuery := 'INSERT INTO test(code, dept, name, sales, tax, salary, budget, Discount, Creation, Description) '
        cQuery += 'VALUES( ' + str(i) + ', 2, "TEST", 1, 5, 3000, 1500.2, 7.5, "12-22-2003", "Short Description about what ? ")'
        
        oServer:Execute(cQuery)  
        
        if oServer:neterr()
            ? oServer:error()
        end              
    Next                    
        
    oServer:Commit()

    oQuery := oServer:Query('SELECT code, name, description, sales FROM test')
    
    aStruct := oQuery:Struct()
    
    For i := 1 to Len(aStruct)
        ? aStruct[i,1], aStruct[i,2], aStruct[i,3], aStruct[i,4]
    Next
        
    aKey := oQuery:GetKeyField()
    
    ? "Fields: ", oQuery:Fcount(), "Primary Key: ", aKey[1]

    oRow := oQuery:Blank()
    
    ? oRow:FCount(), ;
      oRow:Fieldpos('code'), ;
      oRow:Fieldget(1), ;
      oRow:Fieldname(1), ;
      oRow:Fieldtype(1), ;
      oRow:Fielddec(1), ;
      oRow:Fieldlen(1), ;
      len(oRow:Getkeyfield())

    oRow:Fieldput(1, 150)
    oRow:Fieldput(2, 'MY TEST')
    
    ? oRow:Fieldget(1), oRow:Fieldget(2)
    
    ? oServer:Append(oRow)
    
    ? oServer:Delete(oQuery:blank(), 'code = 200')
    
    ? oServer:Execute('error caused intentionaly')    

    DO WHILE ! oQuery:Eof()
        oQuery:Skip()
        ? oQuery:Fieldget(oQuery:Fieldpos('code')), ;
          oQuery:Fieldget(4), ;
          oQuery:Fieldget(2), ;
          oQuery:Fieldname(1),;
          oQuery:Fieldtype(1), ;
          oQuery:Fielddec(1), ;
          oQuery:Fieldlen(1),;
          oQuery:Fieldget(3)
    
        if oQuery:Recno() == 50
            oRow := oQuery:getrow()
            
            oRow:Fieldput(2, 'My Second test')
            ? 'Update: ', oServer:Update(oRow)
        end      
        
        if oQuery:Recno() == 60
            oRow := oQuery:getrow()
            ? 'Delete: ', oServer:Delete(oRow)
        end
    END    

    ? 'Delete: ', oServer:Delete(oQuery:Blank(), 'code = 70')

    oQuery:Refresh()
    
    DO WHILE oQuery:Fetch()
        oRow := oQuery:getrow()
        
        ? oRow:Fieldget(oRow:Fieldpos('code')), ;
          oRow:Fieldget(4), ;
          oRow:Fieldget(2), ;
          oRow:Fieldname(1),;
          oRow:Fieldtype(1), ;
          oRow:Fielddec(1), ;
          oRow:Fieldlen(1),;
          oRow:Fieldget(3)
    END    

    oQuery:Destroy()
    
    oServer:Destroy()
    
    
    ? "Closing..."
        
    return nil
    


Re: ACESSO AO FIREBIRD

Enviado: 16 Jun 2009 16:11
por RamonXHB
Vc pode usar o adodb/oledb pra usar com o firebird de qualquer versão, pode usar também o adordd pra isso.
Basta ter um conhecimento básico de sql, é algo que já está disponivel no windows xp, funciona bem tanto em harbour como em xharbour, também pode usar com outros bancos sql.

Re: Acesso ao FireBird

Enviado: 18 Jun 2009 21:33
por jelias
Amiguinhos,

Obrigado pelas respostas. Entretanto RamonXHB, poderia me explicar mais detalhadamente como trabalhar com o ADOdb, visto que pude observar na net é uma biblioteca de abstração de banco de dados.
- Gostaria de saber como compilar, como funciona o processo de gravação no banco Fb com esta biblioteca.
- Por favor, se tiver como citar um exemplo, ficaria muito agradecido.

Muito Obrigado,

Sucesso para todos.

Abraço.

Re: Acesso ao FireBird

Enviado: 22 Jun 2009 22:33
por RamonXHB
Existe nos arquivos do grupo miniguibrasil do yahoo um exemplo chamado Agendafb, desenvolvido com harbour-minigui, neste exemplo tem todas as necessidades de inclusão, alteração, exclusão e filtragem usando um banco de dados firebird.

Re: Acesso ao FireBird

Enviado: 10 Ago 2009 11:28
por gvc
[RamonXHB]
Vc teria esse arquivo de exemplo para me enviar.
Para entrar baixar o arquivo de onde vc informou, eu teria que fazer incrição no grupo, alem de pertencer ao yahoo.
Como eu só quero ver como é feito (fontes) acho que criar todas as incrições e contas é desperdicio. (dos recursos do yahoo)

Se puder enviar, gvcortez@uol.com.br

Desde já, obrigado.

Re: Acesso ao FireBird

Enviado: 22 Ago 2009 11:32
por sygecom
Bom, para quem sabe temos também o SQLRDD que é uma LIB comercial porem muito boa, e que acessa Firebird nativamente e os resultados são otimos com xHarbour.