[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