[firebase-br] Base de Dados Firebird??? Ajuda

Sandro sandro em systemaonline.com.br
Ter Mar 28 08:30:53 -03 2006


Hugo,

Você usa Foreign key na tabela cliente_produto, ligando com a tabela 
cliente?
Leia sobre primary key, foreign keys, junção e união de tabelas.

Tente mudar a instrução SQL de pesquisa por produto para ter um melhor 
desempenho, retornando apenas os campos que realmente precisar.
Ex.:
'select C.ID, C.NOME from CLIENTE C
left join CLIENTE_PRODUTO CP on CP.CLIENTE = C.ID
where CP.PRODUTO = ' + QuotedStr(p2.Text);

Sugiro também que leia os artigos sobre firebird/interbase, do site 
FIREBASE. E se possível adquira o livro FIREBASE ESSENCIAL do Cantu.

Parece-me que o problema está na maneira como está desenvolvendo sua 
aplicação.
Não importa a "BASE DE DADOS", se não utilizá-lo da maneira mais correta, 
não terá bons resultados.

Espero tê-lo ajudado.

Sandro

----- Original Message ----- 
From: "Hugo Ricardo" <hdricard em gmail.com>
To: <lista em firebase.com.br>
Sent: Tuesday, March 28, 2006 7:14 AM
Subject: [firebase-br] Base de Dados Firebird??? Ajuda


> Boas.
>
> Vou voltar a ser repetitivo, mas ainda não consegui resolver o meu 
> problema de lentidão da minha aplicação com o Delphi/IBObjects/Firebird!
>
> Resolvi então descrever o meu projecto:
>
> Pretende-se uma aplicação que guarde informação acerca dos produtores de 
> determinados produtos.
>
> Tabela Cliente (guarda os dados relativos ao cliente) com 3917 (para 
> crescer):
>
> CREATE GENERATOR GEN_CLIENTE_ID;
>
> CREATE TABLE CLIENTE (
>    ID            INTEGER NOT NULL,
>    NOME          VARCHAR(200),
>    MORADA        VARCHAR(200),
>    COD_POSTAL    VARCHAR(20),
>    LOCALIDADE    VARCHAR(200),
>    CONCELHO      VARCHAR(200),
>    CONTRIBUINTE  VARCHAR(20),
>    TELEFONE      VARCHAR(20),
>    TELEMOVEL     VARCHAR(20),
>    FAX           VARCHAR(20),
>    EMAIL         VARCHAR(200),
>    WEB           VARCHAR(200),
>    BIOLOGICO     SMALLINT,
>    OPERADOR      SMALLINT,
>    BIOSATIVA     SMALLINT,
>    DISTRITO      VARCHAR(200),
>    TIPO_PRODUTO  VARCHAR(200),
>    OBSERVACOES   VARCHAR(255),
>    REGIAO        VARCHAR(200)
> );
>
> /* Trigger: CLIENTE_BI */
> CREATE TRIGGER CLIENTE_BI FOR CLIENTE
> ACTIVE BEFORE INSERT POSITION 0
> AS
> BEGIN
>  IF (NEW.ID IS NULL) THEN
>    NEW.ID = GEN_ID(GEN_CLIENTE_ID,1);
> END
>
> Tabela Cliente_Produto (guarda os produtos produzidos por cada 
> produtor/cliente) com 4529 (para crescer):
>
> CREATE GENERATOR GEN_CLIENTE_PRODUTO_ID;
>
> CREATE TABLE CLIENTE_PRODUTO (
>    ID       INTEGER NOT NULL,
>    CLIENTE  INTEGER,
>    PRODUTO  VARCHAR(200)
> );
>
> /* Trigger: CLIENTE_PRODUTO_BI */
> CREATE TRIGGER CLIENTE_PRODUTO_BI FOR CLIENTE_PRODUTO
> ACTIVE BEFORE INSERT POSITION 0
> AS
> BEGIN
>  IF (NEW.ID IS NULL) THEN
>    NEW.ID = GEN_ID(GEN_CLIENTE_PRODUTO_ID,1);
> END
>
> Tenho uma aplicação feita com o Delphi 6. Utilizei o IBObjects para a 
> comunicação com a Base de Dados.
>
> Utilizado os componentes do DevExpress (QuantumGrid, PageControl, ...)
>
> A minha aplicação resume-se a uma Grid com todos os produtores/clientes e 
> umas caixas de texto que mostram a informação (cada campo da tabela 
> cliente uma caixa de texto) do produtor/cliente e servem também para 
> adicionar, alterar... A aplicação permite tb eliminar. Existe uma opção de 
> pesquisa na aplicação que permite pesquisar determinados 
> produtores/clientes pela região, tipo de produto, operardor, biosativa, 
> biologico. A aplicação demora muito tempo quando se pretende realizar uma 
> pesquisa por tipo de produto!
>
> Descrevo o meu DataModule:
>
> - TIBODatabase Socert:
>  - Databasename: C:\dB\SOCERT.GDB
>
> - TIBOQuery Clientes --- TDataSource DSClientes
>  - SQL: SELECT * FROM cliente
>  - GENERATORLINKS: cliente.id = GEN_CLIENTE_ID
>
> - TIBOQuery ClienteProduto --- TDataSource DSClienteProduto
>  - SQL: SELECT * FROM cliente_produto WHERE cliente=:cliente.id
>  - GENERATORLINKS: cliente_produto.id = GE_CLIENTE_PRODUTO_ID
>  - DataSource: DSClientes
>
> procedure TDM.ClienteProdutoBeforePost(DataSet: TDataSet);
> begin
>  if (DSClienteProduto.State in [dsInsert]) then
>    ClienteProdutoCLIENTE.Value := DM.ClientesID.Value;
> end;
>
> Descrevo o codigo da aplicação:
>
> - DM.Clientes.Append; // para inserir
> - DM.Clientes.Edit; // para alterar
>
> --> Aplicação muito lenta sempre que se pretende confirmar a inserção ou 
> alteração de registos, ou simplesmente cancelar operação <--
>
> -   if (t2.Checked = False) then
>      DM.ClientesOPERADOR.Value := 0;
>
>    if (t13.Checked = False) then
>      DM.ClientesBIOSATIVA.Value := 0;
>
>    if (t12.Checked = False) then
>      DM.ClientesBIOLOGICO.Value := 0;
>
>    DM.Clientes.Post; // para guardar
>
>    if (DM.DSClientes.State in [dsInsert]) then
>      lblTotal.Caption := IntToStr(DM.Clientes.RecordCount); // mostrar 
> total de produtores/clientes
>
> - DM.Clientes.Cancel; // para cancelar;
>
> - Pesquisa por exemplo por tipo de produto:
>
>    with DM.Clientes do
>    begin
>      Close;
>      SQL.Clear;
>      SQL.Add('SELECT * FROM cliente');
>      SQL.Add('WHERE id IN (SELECT cliente FROM cliente_produto WHERE 
> produto = ' + QuotedStr(p2.Text) + '))';
>      Open;
>    end;
>
> Aqui está a minha aplicação descrita!
>
> Quem tiver paciência para me ajudar, agradecia imenso porque já cheguei a 
> um ponto que n sei o q fazer mais!!! Daqui para a frente só me resta a 
> opção de testar a aplicação noutro tipo de Base de Dados (MySQL (grátis tb 
> :) ...).
>
> Obrigado por qualquer coisa.
> Cumprimentos
> Hugo Ricardo, Portugal
>
>
>
>


--------------------------------------------------------------------------------


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista