[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