Jump to content
Fórum Script Brasil
  • 0

Parametros Master/Datail ClientDataSet


coisvaes

Question

Tenho 2 Tabelas, conforme abaixo:

Tabela VENDAS (Master)

PedidoID

CommandText - 'select * from VENDAS'

tabela VENDAITEM (Detail)

PedidoID

ProdutoID

CommandText - 'select * from VENDAITEM where PedidoID = :PedidoID and ProdutoID = :ProdutoID'

Estou ligando o Detail ao Master através de um DataSource e do DataSetField, do ClientDataSet.

Supondo que eu precise selecionar somente o ProdutoID igual a 10. O valor do parametro :ProdutoID seria enviado a partir do click de um botão, mais ou menos assim:

sdsVendaItem.Open;

sdsVendaItem.Params.ParamByName('PRODUTOID').Value := 10;

sdsVendaItem.Open;

O problema é que o campo PRODUTOID existe na tabela VENDAITEM mas NÃO EXISTE na tabela VENDAS e, quando tento carregar os campos em sdsVendas, sou informado que o campo PRODUTOID não existe.

Para resolver isso estou usando: cdsVendaItem.Filter := 'PRODUTOID ='+10;

Entretanto, preciso resolver isto na instrução SQL porque a tabela ITEMVENDA tem mais de 1 milhão de registros.

Se eu fizer "SELECT * FROM VENDAITEM WHERE VENDAID = :VENDAID AND PRODUTOID = 10" não dá erro, mas, preciso usar o paramentro, pois, é o usuário quem vai escolher o produto.

Edited by coisvaes
Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Olá, tenta assim:

SELECT * FROM VENDAITEM

WHERE (:PRODUTOID IS NULL OR PRODUTOID = :PRODUTOID)

AND VENDAID = :VENDAID

quando tiver que trazer todos os itens , utilize:

sdsVendaItem.Open;

sdsVendaItem.Params.ParamByName('PRODUTOID').Value := null;

sdsVendaItem.Open;

e quando escolher o item:

sdsVendaItem.Open;

sdsVendaItem.Params.ParamByName('PRODUTOID').Value := 10;

sdsVendaItem.Open;

Abs. Progr'amador

Link to comment
Share on other sites

  • 0

Obrigado, Progr'amador. Valeu!

O problema é que o campo PRODUTOID não existe na tabela VENDAS e quando tento carregar os campos em cdsVendas, dá erro por não existir o campo.

Para fazer o relacionamento Master/Detail, de uma forma, digamos, "padrão", a instrução SQL seria assim:

sdsVendas - select * from vendas e

sdsItemVenda - select * from itemvenda where vendaid = :vendaid

Só para lembrar, no relacionamento Master/Detail (com DataSetField) o nome do parametro, na tabela Detail, tem que ser, obrigatoriamente, igual ao nome do campo chave primaria na tabela Master.

Observou o problema? Em "select * from itemvenda where vendaid = :vendaid", o nome do parametro é igual ao nome do campo chave primaria na tabela master, ou seja, :VENDAID. Mas, seu eu fizer "select * from itemvenda where vendaid = :vendaid and produtoid = :produtoid", PRODUTOID não existe na tabela Master, e dá erro quando tento carregar os campos em ClientDataSetVendas, mesmo que eu informe que o parametro :PRODUTOID é NULL.

Edited by coisvaes
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...