> ## Acesso a banco de dados externos(ISAM) padrão Xbase(Dbase/Clipper).

##### Conteúdo

Acesso utilizando o Controle de Dados Vinculados. (Data Control)

- Como acessar uma base de dados padrão XBase(Dbase,Fox,Clipper).
- Desenhando a interface
- Código do projeto.

Acesso utilizando a DAO. (Data Access Object)

- Como acessar uma base de dados padrão XBase(Dbase,Fox,Clipper).
- Desenhando a interface
- Código do projeto.
- Utilizando indices.(DbaseIII/Fox)
- Anexando arquivos DBF.

### Como acessar uma base de dados padrão XBase(Dbase,Fox,Clipper) via Data Control.

    O Visual Basic utiliza o formato do banco de dados do Access, isto significa
    que os objetos:tabelas,consultas, índices, etc., são armazenados em um
    único arquivo MDB o qual é considerado como o banco de dados.

    No Dbase,FoxPro e Clipper o banco de dados pode ser constituído de muitos
    arquivos; arquivos de dados(DBF), arquivos de índices(NDX ou NTX) , etc.

    Esse formato de banco de dados é considerado um banco de dados externo do tipo
    ISAM.(Indexed Sequential Access Method)

    Ao usar o Controle de Dados para acessar uma base de dados padrão XBase
    você deverá fornecer as seguintes informações ao Visual Basic:

    1-Propriedade Connect      - Tipo de arquivo: dBaseIII, DbaseIV, FoxPro 2.X, etc.
                                 Ex: Connect: DbaseIII;

    2-Propriedade Databasename - Caminho do diretório dos arquivos do banco de dados.
                                 Ex: Databasename: C:\CONTROLE

    3-Propriedade RecordSource - Nome do arquivo DBF que contém os registros que
                                 você quer acessar via controle de dados, sem a
                                 a extensão DBF. EX: Recordsource: Agenda

Obs:Para arquivos XBase com extensão diferente de DBF informe a extensão separada do nome do arquivo pelo caractere #. Ex:Recordsource: Agenda#dat.

4-Finalmente você deverá informar ao Visual Basic qual DLL utilizar com o banco de dados denominado na propriedade Connect. Para os arquivos do formato Xbase faça uma entrada no arquivo INI da sua aplicação com a seguinte linha: Dbase III=XBS200.DLL

Obs:Se durante a instalação do VB você optou pela instalação dos arquivos ISAM, o Setup colocará automaticamente as entradas no arquivo VB.INI, mas lembre-se que ao distribuir a sua aplicação você deverá instalar um arquivo INI com o mesmo nome do seu arquivo executável no diretório Windows do usuário.(Ou informar o diretório usando a propriedade IniPath).Ex:DBEngine.INIPath=path) Além disso verifique se o arquivo XBS200.DLL está presente no diretório System do Windows caso contrário você obterá a mensagem de erro: "Can't find installable ISAM".

Exemplo de arquivo INI: [Installable ISAMs] Dbase III=C:\WINDOWS\SYSTEM\XBS200.DLL Dbase IV=C:\WINDOWS\SYSTEM\XBS200.DLL FoxPro 2.0=C:\WINDOWS\SYSTEM\XBS200.DLL FoxPro 2.5=C:\WINDOWS\SYSTEM\XBS200.DLL Btrieve=C:\WINDOWS\SYSTEM\BTRV200.DLL | Além disso devemos incluir a seção abaixo no arquivo INI: [Dbase ISAM] Deleted=On Isto evita que os registros deletados que ainda não foram removidos do arquivo apareçam nos seus dados. (A eliminação física requer a execução de procedimentos do próprio Dbase/Clipper.)

Finalizando, tenha em mente que o acesso a arquivos externos do tipo ISAM apresentam algumas restrições , tais como:

- Não suportam os objetos: QueryDef, Relation, Container e Document
- Não suportam os métodos: CompactDatabase , RepairDatabase, CreateQueryDef, OpenQueryDef e DeleteQueryDef
- Não suportam a criação de índices.(Acesso via Data control). (Neste caso você pode controlar a ordem na qual os registros serão exibidos utilizando uma instrução SQL com propriedade Recordsource) Conteúdo

### Desenhando a Interface.

    Vamos supor que você quer acessar o arquivo agenda.dbf
    (Arquivo padrão Dbase) que está no diretório teste no
    drive c.(C:\teste) usando o controle de dados.

    O arquivo agenda possui a seguinte estrutura:

     -----------------------------------
     Nome do campo    Tipo       Tamanho
     -----------------------------------
     Nome             Caracter     30
     Endereco         Caracter     30
     Telefone         Caracter     11
     -----------------------------------
    Vamos montar o formulário Agenda conforme descrito abaixo:

    -Inicie  um novo projeto no Visual Basic.Grave o formulário Form1
     como Agenda , e a seguir insira o controle de dados como
     indicado abaixo:

fig1. | De início selecione o objeto controle de dados na Toolbox do Visual Basic e acrescente-o ao seu formulário.(Fig.1)
fig2. | Defina a seguir as propriedades Name - Nome do Controle (O padrão é data1) e Caption - Especifica o nome que aparece no controle de dados.(O padrão é Data1) e dimensione o controle de dados.(Fig.2)
fig3. | A seguir acrescente ao seu formulário um quadro de texto(TextBox) para cada campo que desejar acessar a partir do Recordsource, anexe cada quadro de texto ao objeto de controle de dados(DataSource) e especifique o campo que cada quadro de texto deverá exibir(DataField).(fig3.)

Ao final deveremos obter o formulário como mostrado na figura 4.0 abaixo:

fig 4.0

-Agora adicione ao Form1 os objetos e configure as propriedades conforme a tabela 1.0 : Tabela 1.0 - Objetos e propriedades do formulário Clientes ------------------------------------------------------------------ Objeto Propriedade Configuração ------------------------------------------------------------------ Form Name Agenda Caption "Agenda" ------------------------------------------------------------------ Data Name data1 Caption "C:\teste\Agenda.dbf" Connect "dBase III;" Databasename "C:\TESTE"(*) RecordSource "AGENDA" ------------------------------------------------------------------ label Name label1 Caption "Nome" Autosize True ------------------------------------------------------------------ label Name label2 Caption "Endereço" Autosize True ------------------------------------------------------------------ label Name label3 Caption "Telefone" Autosize True ------------------------------------------------------------------ TextBox Name TEXT1 index 0 (**) DataField "Nome" DataSource data1 ------------------------------------------------------------------ TextBox Name TEXT1 index 1 DataField "Endereco" DataSource data1 ------------------------------------------------------------------ TextBox Name TEXT1 index 2 DataField "telefone" DataSource data1 ------------------------------------------------------------------ CommandButton Name COMMAND1 index 0 (***) Caption "&Incluir" ------------------------------------------------------------------ CommandButton Name COMMAND1 index 1 Caption "&Excluir" ------------------------------------------------------------------ CommandButton Name COMMAND1 index 2 Caption "&Sair" ------------------------------------------------------------------ (*)Ao informar o diretório no qual os arquivos estão localizados o Visual Basic passa a considerá-lo como o banco de dados onde estão localizados as tabelas, os índices, etc. . (**)As caixas de texto são controladas por um vetor com um índice identificador, possuindo em comum o nome e o tipo. (***)Os botões de comandos também são um control array como as caixas de texto. Conteúdo

### Código do projeto.

Vamos usar o mínimo de código possível, apenas para ilustrar o funcionamento da conexão do motor Jet com o arquivo agenda.dbf.

    1-Código da seção de declarações do formulário

        Option Explicit

        Private rs As Recordset

    2-Código do evento Activate do Formulário.

    Private Sub Form_Activate()
      Set rs = Data1.Recordset 'designamos o conjunto de registro
                               'á variável recordset rs .
                               '(isso melhora o desempenho)

      If rs.RecordCount = 0 Then
         MsgBox "O arquivo vazio , inserir registro .", vbExclamation
         Command1_Click (0) 'botão p/incluir registro
      End If

    End Sub

    Como o controle de dados não pode lidar com um conjunto de
    registros vazio, se o arquivo estiver vazio ocorrerá uma
    mensagem de erro. Por isso o evento Activate verifica se
    a propriedade Recordcount indica que o arquivo está vazio,
    em caso positivo emitimos uma mensagem ao usuário(mgsbox) e "forçamos"
    a inclusão de um registro no arquivo.(Command1_click(0)).

    3-Código associado aos botões Incluir , Excluir e Sair.

    Private Sub Command1_Click(Index As Integer)
      Select Case Index
         Case 0   ' botão incluir registro
            rs.AddNew
            Text1(0).SetFocus  'foca caixa de texto vinculada ao nome
         Case 1          'botão excluir registro
            If MsgBox("Confirma exclusão deste registro ? " & rs!nome, _
            vbQuestion + vbYesNo + vbDefaultButton2) = vbYes Then
               rs.Delete 'exclui registro do arquivo
               rs.MoveNext
               If rs.EOF Then
                  If rs.BOF Then
                     MsgBox "O arquivo vazio , inserir registro .", vbExclamation
                     Command1_Click (0)   'incluir registro
                  Else
                     rs.MoveLast
                  End If
               End If
             End If
         Case 2  'botão sair do sistema
             End
      End Select
    End Sub

    Obs:Para movimentar-se pelo arquivo use o controle de dados:

| Note que não há necessidade de código para movimentar-se pelos registros.

Conteúdo

### Como acessar uma base de dados padrão XBase(Dbase,Fox,Clipper) via DAO.

Para se conectar a arquivos do Dbase/Clipper usando a DAO você usará o método Opendatabase para abrir a base de dados e o método Openrecordset para abrir o conjunto de registros que deseja acessar. Esses são os procedimentos normalmente usados para trabalhar com os arquivos do Access. A diferença esta na sintaxe utilizada, veja a seguir como fazer:

    1-Ao invés de informar o nome do arquivo você deverá informar o caminho do
    diretório de localização de seus arquivos DBF.( C:\TESTE )

    2-Você deverá informar também qual o tipo de arquivo ao qual você esta se
    conectando.(DbaseIII, DbaseIV, etc.) Veja abaixo como ficará o código
    para o nosso caso:

    Dim db as Database
    Set db=DBEngine.Workspaces(0).Opendatabase("C:\TESTE",false,false,"DbaseIII")

    3-Finalmente utilize o método OpenRecordset e informe o nome do arquivo
    DBF , sem extensão , que você quer acessar. ( AGENDA )

    Dim rs as Recordset
    Set rs= db.OpenRecordset("agenda", dbOpenTable )

    Conteúdo

### Desenhando a Interface.

Utilizaremos o mesmo arquivo agenda.dbf que se encontra no diretório c:\teste. -Inicie um novo projeto no Visual Basic.Grave o formulário Form1 como Agenda2 , o qual deverá ter a seguinte aparência:

fig 5.0

    -Adicione ao Form1 os objetos e configure as propriedades conforme
     a tabela 2.0 :

     Tabela 2.0 - Objetos e propriedades do formulário Agenda2
     ------------------------------------------------------------------
      Objeto              Propriedade         Configuração
     ------------------------------------------------------------------
      Form                  Name                Agenda
                            Caption             "Agenda"
     ------------------------------------------------------------------
      label                 Name                label1
                            Caption             "Nome"
                            Autosize             True
     ------------------------------------------------------------------
      label                 Name                label2
                            Caption             "Endereço"
                            Autosize             True
     ------------------------------------------------------------------
      label                 Name                label3
                            Caption             "Telefone"
                            Autosize             True
     ------------------------------------------------------------------
      TextBox               Name                TEXT1
                            index               0 (**)
                            DataField           "Nome"
                            DataSource          data1
     ------------------------------------------------------------------
      TextBox               Name                TEXT1
                            index               1
                            DataField           "Endereco"
                            DataSource          data1
     ------------------------------------------------------------------
      TextBox               Name                TEXT1
                            index               2
                            DataField           "telefone"
                            DataSource          data1
     ------------------------------------------------------------------
      CommandButton         Name                COMMAND1
                            index               0 (***)
                            Caption             "&Incluir"
      ------------------------------------------------------------------
      CommandButton         Name                COMMAND1
                            index               1
                            Caption             "&Excluir"
     ------------------------------------------------------------------
      CommandButton         Name                COMMAND1
                            index               2
                            Caption             "&Sair"
     ------------------------------------------------------------------
      CommandButton         Name                COMMAND1
                            index               3
                            Caption             "&Alterar"
     ------------------------------------------------------------------
      CommandButton         Name                COMMAND1
                            index               4
                            Caption             "&Gravar"
     ------------------------------------------------------------------
      CommandButton         Name                COMMAND2
                            index               0 (****)
                            Caption             "<<"
      ------------------------------------------------------------------
      CommandButton         Name                COMMAND2
                            index               1
                            Caption             "<"
     ------------------------------------------------------------------
      CommandButton         Name                COMMAND2
                            index               2
                            Caption             ">"
     ------------------------------------------------------------------
      CommandButton         Name                COMMAND2
                            index               3
                            Caption             ">>"
     ------------------------------------------------------------------
     (*)Ao informar o diretório no qual os arquivos estão localizados o
        Visual Basic passa a considerá-lo como o banco de dados onde
        estão localizados as tabelas, os índices, etc. .

    (**)As caixas de texto são controladas por um vetor com um índice
        identificador, possuindo em comum o nome e o tipo.

    (***)(****)Os botões de comandos também são um control array como
        as caixas de texto.

    Conteúdo

### Código do projeto.

Vejamos agora o código associado a cada evento ou botão de comando.

    1-Código da seção declarações gerais do formulário

    Option Explicit
    Private db As Database
    Private rs As Recordset

    2-Código do evento Activate do formulário

    Private Sub Form_Activate()
       If rs.BOF And rs.EOF Then
           MsgBox "O arquivo está vazio , vamos inserir um registro .", vbExclamation, "incluir registro"
           Command1_Click (0)
       End If
       mostra_reg
    End Sub

    3-Código do evento Load do formulário

    Private Sub Form_Load()
      'abre base de dados e o arquivo dbf a acessar
      Set db = DBEngine.Workspaces(0).OpenDatabase("C:\TESTE", False, False, "Dbase III;")
      Set rs = db.OpenRecordset("agenda", dbOpenTable)
    End Sub

    4-Código dos botões de comandos de movimentação pelo arquivo

    Private Sub Command2_Click(Index As Integer)
      Const MOVE_FIRST = 0
      Const MOVE_PREVIOUS = 1
      Const MOVE_NEXT = 2
      Const MOVE_LAST = 3
      Dim marca As Variant

      If (rs.EditMode = dbEditAdd) Or _
        (rs.EditMode = dbEditInProgress) Then
            rs.CancelUpdate
            Exit Sub
      End If
      Select Case Index
          Case MOVE_FIRST
            rs.MoveFirst
          Case MOVE_PREVIOUS
            If Not rs.BOF Then
               rs.MovePrevious
               If rs.BOF Then rs.MoveNext
            End If
          Case MOVE_NEXT
            If Not rs.EOF Then
               rs.MoveNext
               If rs.EOF Then rs.MovePrevious
            End If
          Case MOVE_LAST
            rs.MoveLast
    End Select
          mostra_reg
    End Sub

    5-Código dos botões de comandos de Incluir, Alterar, Excluir, Gravar e Sair.

    Private Sub Command1_Click(Index As Integer)
      Select Case Index
         Case 0  'incluir registro
            rs.AddNew
            limpa_regs
            Text1(0).SetFocus
         Case 1          'excluir registro
            If MsgBox("Confirma exclusão deste registro ? " & Chr(13) & rs!nome, _
            vbQuestion + vbYesNo + vbDefaultButton2) = vbYes Then
               rs.Delete 'exclui registro do arquivo
               rs.MoveNext
               If rs.EOF Then
                  If rs.BOF Then
                     MsgBox "O arquivo está vazio , vamos inserir um registro .", vbExclamation, "agenda"
                     Command1_Click (0)   'incluir registro
                  Else
                     rs.MoveLast
                  End If
               End If
             End If
         Case 2   'sair do sistema
             End
         Case 3   'alterar
             rs.Edit
             Text1(0).SetFocus
         Case 4   'gravar registros
             grava_regs
      End Select
      mostra_reg
    End Sub

    6-Código da procedure para mostrar os registros nas caixas de texto.

    Public Sub mostra_reg()
      Dim i As Integer
      For i = 0 To 2
        Text1(i) = IIf(Not IsNull(rs.Fields(i)), rs.Fields(i), "")
      Next i
      Text1(0).SetFocus
    End Sub

    6-Código da procedure para gravar os registros no arquivo

    Public Sub grava_regs()
      Dim i As Integer
      If rs.EditMode = dbEditAdd Or _
      rs.EditMode = dbEditInProgress Then
        For i = 0 To 2
          rs.Fields(i) = Text1(i)
        Next i
        rs.Update 'atualiza registro
      End If
    End Sub

    7-Código da procedure para limpar o conteúdo das caixas de texto.

    Public Sub limpa_regs()
      'limpa as caixas de texto
      Dim i As Integer
      For i = 0 To 2
        Text1(i) = ""
      Next
    End Sub

    Conteúdo

### Utilizando índices.(Dbase/Fox).

A grande vantagem da conexão com base externas via DAO é que você pode utilizar os índices para os formatos de arquivos DbaseIII e FoxPro.
Para isso você deverá fazer o seguinte:

    1-Com o NotePad ou outro editor de texto crie um arquivo com estensão INF
    com o mesmo nome do arquivo DBF que quer acessar.

    2-No arquivo INF crie uma seção chamada [Dbase III] e relacione os
    arquivos de índices que deseja utilizar da seguinte maneira:

[Dbase III] NDX1=NOME.NDX NDX2=IDADE.NDX ... ... | Para o nosso exemplo, o nome do arquivo seria AGENDA.INF e teria o formato: [Dbase III] NDX1=NOME.NDX

3-Altere o código do evento Load do formulário para: Private Sub Form_Load() 'abre base de dados o arquivo dbf a acessar e ativa o indíce NOME Set db = DBEngine.Workspaces(0).OpenDatabase("C:\TESTE", False, False, "Dbase III;") Set rs = db.OpenRecordset("agenda", dbOpenTable) rs.index="NOME" End Sub Note que o nome do indice é informado sem a extensão NDX.

Nota: O padrão de índices .NTX utilizados pelo Clipper não é suportado pelo Jet. Uma forma de resolver isto é utilizar filtros e ordenações.

Conteúdo

### Anexando arquivos DBF.

Dependendo da situação será mais produtivo anexar os arquivos DBF a um banco de dados padrão Access. Isto permite ao Visual Basic acessar os arquivos anexados como se fossem tabelas originais do Access.Vejamos como fazer isto:

    1-Se você possuir o Microsoft Access a tarefa é simples.

- Abra o seu arquivo MDB.
- Selecione a opção Arquivo->Anexar Tabela...
- Na janela Anexar selecione o tipo de arquivo a anexar.(Dbase III)
- Selecione agora o arquivo DBF a ser anexado e a seguir os índices utilizados.

Se tudo estiver certo o Access informa que o arquivo foi anexado com sucesso. Na janela banco de dados o arquivo anexado é visualizado como: 2-No Visual Basic, usando o Data Manager faça o seguinte:

- Abra o Data Manager e selecione a opção File->Open Database
- Selecione o nome do banco de dados da caixa de diálogo Open Database e clique em Open
- Clique no botão Attached Tables e escolha o botão New
- Na caixa de diálogo Attached tables preencha os campos da seguinte forma:

| Attachment Name - Nome que deseja para a tabela a anexar.(Agenda) Database Name - Diretório dos arquivos DBF a anexar.(C:\teste) Connect String - Selecione o tipo de arquivo a anexar.(Dbase III) Table to Attach - Nome do arquivo DBF a anexar.(Agenda.dbf) Finalmente clique no botão Attach para anexar a tabela ao seu banco de dados.

As restrições para as tabelas anexadas são:

1. Você não pode forçar a integridade referencial entre as tabelas anexadas e as tabelas nativas
2. Você só pode abrir as tabelas anexadas como um Dynaset ou Snapshot mas não como Table
3. Você não pode alterar as propriedades: FieldSize, Validation Rule, DefaultValue e AllowZeroLength.

Conteúdo

Retorna