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

Hugo Ricardo hdricard em gmail.com
Ter Mar 28 07:14:24 -03 2006


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 







Mais detalhes sobre a lista de discussão lista