relacionamento mestre / detalhe

31/07/2008

1

caros colegas. Tenho as seguintes tabelas:

Funcionarios (mestre)
    ID_FUNCIONARIO  INTEGER NOT NULL,
    NOME            VARCHAR(100) NOT NULL COLLATE WIN_PTBR,
    FOTO            BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NASCIMENTO      DATE,
    FONE            VARCHAR(20),
    ENDERECO        VARCHAR(1000) COLLATE WIN_PTBR,
    VALOR_AULA      NUMERIC(15,2) NOT NULL,
    ID_ATIVO        INTEGER NOT NULL


Funcionarios_produtos (detalhe de Funcionarios)
    ID_FUNC_PROD    INTEGER NOT NULL, 
    ID_FUNCIONARIO  INTEGER NOT NULL, // aponta para tabela mestre
    ID_PRODUTO      INTEGER NOT NULL,   // aponta para tabela produtos
    ID_ATIVO        INTEGER NOT NULL       // 1 = sim, 2 = nao



tudo funciona beleza em mestre detalhe com elas quando eu faço pesquisas atraves da tabela mestre.

meu problema:

vamos supor que tenho 2 funcionários cadastrados na tabela mestre, e que esses dois funcionários tem dois produtos iguais cadastrados na tabela detalhe.

quando um filtro na tabela detalhe para saber quais os funcionários que tem determinado produto cadastrado com status ´ativo = 1´ o sistema nao me retorna os dois funcionários cadastrados, e sim apenas um deles (o primeiro). alguem saberia me dizer o motivo disso, e como eu procedo corretamente para que esse filtro funcione?

segue abaixo meu código do filtro:

        // tabela produtos
        DM.cdsProd.Close;
        DM.cdsProd.Params[1].AsString := Combobox.Text;
        DM.cdsProd.Open;

        // tabela Funcionários (mestre)
        DM.cdsFunc.Close;
        DM.cdsFunc.Params[1].AsString := ´¬´;
        DM.cdsFunc.Open;

        // aqui filtra os produtos ativos do funcionario
        DM.cdsFuncProd.Close;
        DM.cdsFuncProd.Filtered := false;
        DM.cdsFuncProd.Filter   := ´ID_ATIVO = 1 AND ID_PRODUTO = ´ + QuotedStr(DM.cdsProdID_PRODUTO.AsString);
        DM.cdsFuncProd.Filtered := true;
        DM.cdsFuncProd.Open;



Responder

Posts

31/07/2008

Mahdak

correção: onde eu disse ´quando um filtro...´, na verdade eu queria dizer: ´quando aplico um filtro...´

Obs: os dois funcionários estão com status = 1 na tabela detalhe


Responder

01/08/2008

Thomaz_prg

Tem que ser revisto o SQL. DIgo isso pq, se existe dependencia entre os datasets´s mestre e detalhe, vc não conseguirá fazer com que, ao filtrar dados na tabela detalhe, ele apresente outros dados na tabela mestre (pois daí se inverteriam os papéis).


Responder

04/08/2008

José Henrique

mahdak,
Mostre o SQL de cdsFuncProd

Outra coisa, por que você usa
DM.cdsFuncProd.Filter   := ´ID_ATIVO = 1 AND ID_PRODUTO = ´ + QuotedStr(DM.cdsProdID_PRODUTO.AsString); 


ao invés de

DM.cdsFuncProd.Filter   := ´ID_ATIVO = 1 AND ID_PRODUTO = ´ + Combobox.Text; 



Responder