[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