Docstoc

clientes

Document Sample
clientes Powered By Docstoc
					                                       Delphi – Lazarus (linux) : Banco de Dados com Busca
Objetivo                                                                          No dbGrid, coloque a propriedade Scrollbars =
                                                                                   ssBoth.
Implementar filtragem, ordenação e procura em um Dataset.                         Na IBConnection a propriedade DataBaseName deve
                                                                                   conter o caminho completo ao banco de dados. É
Implementação                                                                      bom criar uma cópia do BD em algum lugar para
                                                                                   não alterar o original:
        Usaremos neste projeto o Firebird, que é um banco de                      cp /opt/firebird/examples/employee.fdb
         dados relacional. Em particular, há um exemplo já                            /home/you/.../empregados.fdb
         pronto em /opt/firebird/examples/employee.fdb. Esse                       sudo chown firebird.firebird empregados.fdb
         banco possui várias tabelas:                                             A propriedade SQL do SQLQuery deve conter o
                                                                                   valor 'select * from customer'.
           COUNTRY                  CUSTOMER
           DEPARTMENT               EMPLOYEE
                                                                                  No SQLTransaction e no SQLQuery, coloque a
                                                                                   propriedade Active = True.
           EMPLOYEE_PROJECT         JOB
           PHONE_LIST               PROJECT
           PROJ_DEPT_BUDGET         SALARY_HISTORY                        3.    Crie duas variáveis globais com o nome do atributo
                                                                                usado como chave e com o nome da tabela usada
           SALES
                                                                                neste exemplo:
         Escolhemos, então, a tabela CUSTOMER, que tem a
                                                                                var
         seguinte estrutura:
                                                                                  frmClientes: TfrmClientes;
                                                                                  dbKey: String = 'CUST_NO';
         CUST_NO       (CUSTNO)        INTEGER     Not Null
                                                                                  tbName: String = 'CUSTOMER';
                        CHECK (VALUE > 1000)
         CUSTOMER                      VARCHAR(25) Not Null
                                                                          4.    Crie um procedimento IsInteger para validar um
         CONTACT_FIRST (FIRSTNAME)     VARCHAR(15) Nullable
                                                                                valor numérico inteiro:
         CONTACT_LAST (LASTNAME)       VARCHAR(20) Nullable
         PHONE_NO      (PHONENUMBER)   VARCHAR(20) Nullable
                                                                               // Retorna se uma string contem um numero inteiro.
         ADDRESS_LINE1 (ADDRESSLINE)   VARCHAR(30) Nullable
                                                                               function IsInteger (S: String) : Boolean;
         ADDRESS_LINE2 (ADDRESSLINE)   VARCHAR(30) Nullable
                                                                               var
         CITY                          VARCHAR(25) Nullable
         STATE_PROVINCE                VARCHAR(15) Nullable                       aNo, err : integer;
                                                                               begin
         COUNTRY       (COUNTRYNAME)   VARCHAR(15) Nullable
         POSTAL_CODE                   VARCHAR(12) Nullable                       val (S,aNo,err);
                                                                                  if err = 0 then
         ON_HOLD                       CHAR(1)     Nullable
                        DEFAULT NULL                                                 result := true
                                                                                  else
         CONSTRAINT INTEG_61: Foreign key (COUNTRY)
                        References COUNTRY (COUNTRY)                                 result := false;
                                                                               end;
         CONSTRAINT INTEG_60: Primary key (CUST_NO)
         CONSTRAINT INTEG_59: CHECK (on_hold IS NULL OR
                                                                          5.    Ao se clicar numa posição do dbGrid, o valor da
                        on_hold = '*')
                                                                                chave CUST_NO deve ser copiado para a propriedade
                                                                                txtKey.Text, o nome do atributo selecionado deve
    1.    Crie um formulário, chamado frmClientes, conforme                     ser copiado para a propriedade txtAtributo.Text e
                                                                                o valor do atributo para a propriedade
          mostrado abaixo:
                                                                                txtValor.Text.

                                                                                O parâmetro Column contém a coluna do dbGrid
                                                                                selecinada (clicada) pelo usuário. Nos interessam
                                                                                os seus métodos FieldName e Field, que retornam o
                                                                                nome e valor da coluna (atributo do DB)
                                                                                selecionada. O método Index retorna o índice da
                                                                                coluna entre 0 e n.

                                                                               procedure TfrmClientes.dbGrid1CellClick(Column:
                                                                               TColumn);
                                                                               begin
                                                                                 if ( Column.Index >= 0 ) then
                                                                                 begin
                                                                                   txtIndice.text   := IntToStr (Column.Index);
                                                                                   txtAtributo.Text := Column.FieldName;
                                                                                   txtValor.Text    := Column.Field.AsString;
                                                                                   txtKey.Text      :=
                                                                                          SQLQuery1.FieldByName(dbKey).asString;
                                                                                 end;
                                                                               end;

          São usados 2 TEdit (txtKey, txtValor), 6 TButton                6.    Caso o usuário use as setas do teclado, ao invés
          (cmdIncluir, cmdModificar, cmdExcluir, cmdFiltro,                     do mouse, para selecionar a coluna do dbGrid, será
          cmdLocalizar e cmdCompleto), 1 TRadioGroup                            chamado o procedimento dbGrid1ColEnter para
          (rgrOrdem), 1 TComboBox (ComboBox1), 3 TLabel                         acessar o nome e valor do atributo selecionado.
          (sqlEcho, txtIndice, txtAtributo), 5 TgroupBox e 1                    Neste caso, a classe SelectedField do dbGrid
          TdbGrid.                                                              fornece o nome do atributo e seu valor.

    2.    Adicione os componentes para lidar com o BD e faça                   Note-se que o procedimento é chamado quando se entra
          as seguintes conexões: TIBConnection <->                             em uma nova coluna. Nada acontece ao se mover sobre
          TSQLTransaction <-> TSQLQuery <-> TDataSource <->                    a mesma coluna.
          TdbGrid.


                                                              Página 13
                                 Delphi – Lazarus (linux) : Banco de Dados com Busca
     procedure TfrmClientes.dbGrid1ColEnter(Sender:                             SQLQuery1.SQL.Text := 'Insert Into ' +
     TObject);                                                                  tbName + ' (CUST_NO, CUSTOMER, ' +
     begin                                                                         'COUNTRY, ON_HOLD )' +
       if ( dbGrid1.SelectedIndex >= 0 ) then                                      'values (' + txtKey.Text + ', '' '',
       begin                                                                       ''USA'', ''*'' )';
          txtIndice.text   := Inttostr
                (dbGrid1.SelectedIndex);                                         sqlEcho.Text := SQLQuery1.SQL.Text;
          txtAtributo.Text :=                                                    SQLQuery1.ExecSQL;
                 dbGrid1.SelectedField.FieldName;                                SQLTransaction1.Commit;
          txtValor.Text    :=                                                    SQLTransaction1.Active := false;
                 dbGrid1.SelectedField.AsString;                                 SQLQuery1.SQL.Text := 'Select * from ' +
          txtKey.Text      :=                                                       tbName + ' where ' +
                 SQLQuery1.FieldByName(dbKey).asString;                             dbKey + ' = ' + txtKey.Text;
       end;                                                                      SQLQuery1.Open;
     end;                                                                      end;
                                                                             end;
     O comando SQL, empregado em cada consulta, deve ser                   end;
     ecoado através de um TLabel, chamado sqlEcho,
     posicionado imediatamente acima do dbGrid. A ordem                    procedure TfrmClientes.cmdModificarClick(Sender:
     dos registros pode ser ascedente ou descentete, de                    TObject);
     acordo com a chave.                                                   begin
                                                                             if (txtAtributo.Text <> '') and
7.    A exibição dos registros da tabela CUSTOMER é feita                       (IsInteger (txtKey.text)) then
      no dbGrid, ao se clicar os botões Filtro ou                            begin
      Completo. Para isso, são usados comandos SQL                             SQLQuery1.Close;
      'Select'.                                                                SQLTransaction1.Active := true;
                                                                               SQLQuery1.SQL.Text := 'Update ' + tbName +
     procedure TfrmClientes.cmdFiltroClick(Sender:                               ' set ' +
     TObject);                                                                   txtAtributo.Text + ' = ' +
     var ordem : String;                                                         '''' + txtValor.Text + '''' + ' where ' +
     begin                                                                       dbKey + ' = ' + txtKey.Text;
       SQLQuery1.close;                                                        sqlEcho.Text := SQLQuery1.SQL.Text;
       if ( IsInteger (txtKey.text) ) then                                     SQLQuery1.ExecSQL;
       begin                                                                   SQLTransaction1.Commit;
           if ( rgrOrdem.ItemIndex = 0 ) then                                  SQLTransaction1.Active := false;
                ordem := ' asc'                                                SQLQuery1.SQL.Text := 'Select * from ' +
           else                                                                   tbName + ' where ' +
                ordem := ' desc';                                                 dbKey + ' = ' + txtKey.Text;
                                                                               SQLQuery1.Open;
          SQLQuery1.SQL.Text := 'Select * from ' +                           end;
                tbName   + ' where ' + dbKey +                             end;
                 ' ' + ComboBox1.Text + ' ' +
                txtKey.Text +                                              No procedimento de exclusão, a SQLQuery corrente é
                 ' order by ' + dbKey + ordem;                             salva e restaurada após a conclusão da eliminação,
          sqlEcho.Text := SQLQuery1.SQL.Text;                              para manter o dbGrid com a mesma aparência.
          SQLQuery1.Open;
       end;                                                                procedure TfrmClientes.cmdExcluirClick(Sender:
     end;                                                                  TObject);
                                                                           var previousQuery: String;
                                                                           begin
8.    Para se incluir, excluir ou modificar um registro,                     if ( IsInteger (txtKey.Text) ) then
      são usados o valor da chave corrente (txtKey.Text)                     begin
      e o valor do atributo selecionado, no caso da                            SQLQuery1.Close;
      modificação:                                                             SQLTransaction1.Active := true;
                                                                               previousQuery := SQLQuery1.SQL.Text;
      Note-se que na inclusão, todos os atributos não                          SQLQuery1.SQL.Text := 'Delete From ' +
      marcados como Nullable na definição da tabela não                              tbName + ' where ' +
      podem ser omitidos. Além disso, o atributo ON_HOLD                             dbKey + ' = ' + txtKey.Text;
      só pode assumir os valores 'NULL' ou '*'.                                sqlEcho.Text := SQLQuery1.SQL.Text;
                                                                               SQLQuery1.ExecSQL;
     procedure TfrmClientes.cmdIncluirClick(Sender:                            SQLTransaction1.Commit;
     TObject);                                                                 SQLTransaction1.Active := false;
     begin                                                                     SQLQuery1.SQL.Text := previousQuery;
       if ( IsInteger (txtKey.Text) ) then                                     SQLQuery1.Open;
       begin                                                                 end;
         SQLQuery1.close;                                                  end;
         SQLQuery1.SQL.Text := 'Select * from ' +
              tbName + ' where ' +
              dbKey + ' = ' + '''' + txtkey.Text + '''';              9.    O comando localizar procura um registro no banco
         sqlEcho.caption := SQLQuery1.SQL.Text;                             de dados baseado no valor do atributo selecionado
         SQLQuery1.Open;                                                    na caixa de texto txtValor.
         if (SQLQuery1.EOF) then // chave nao encontrada
         begin                                                             procedure TfrmClientes.cmdLocalizarClick(Sender:
           SQLQuery1.Close;                                                Tobject);
           // Uma transacao deve dar um "lock" no BD                       var ordem : String;
              (registro ou tabela).                                        begin
           SQLTransaction1.Active := true;                                   SQLQuery1.close;
           // Os outros parametros sao Nullable – nao                        if ( txtValor.Text <> '' ) then
             precisam ser fornecidos                                         begin
                                                          Página 23
                                 Delphi – Lazarus (linux) : Banco de Dados com Busca
           if ( rgrOrdem.ItemIndex = 0 ) then
                ordem := ' asc'
           else
                ordem := ' desc';

          SQLQuery1.SQL.Text := 'Select * from ' + tbName
     + ' where ' +
             txtAtributo.Text + ' = ' +
             '''' + txtValor.Text + '''' +
             ' order by ' + dbKey + ordem;
          sqlEcho.Text := SQLQuery1.SQL.Text;
          SQLQuery1.Open;
       end;
     end;


Execução do Projeto




1.    Execute o projeto e tente inserir e modificar
      valores no banco de dados.

2.    Na eliminação, alguns registros não podem ser
      eliminados, porque quebram as regras de
      consistência do banco. O campo CUST_NO é uma chave
      secundária da tabela SALES. Logo, se houver alguma
      referência a ele lá, a eliminação produz o seguinte
      erro:

      -violation of FOREIGN KEY constaraint “INTEG_77” on
      table “SALES”.


Desafios

1.    Permitir modificar valores do banco diretamente no
      dbGrid, sem a necessidade de digitá-los no TEdit
      txtValor.

2.    Usar um TListBox para exibir todas as tabelas do
      banco.

3.    Permitir que tudo o que foi feito possa ser
      executado sobre qualquer tabela e não apenas com a
      tabela CUSTOMER.




                                                         Página 33

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:32
posted:9/24/2011
language:Portuguese
pages:3