SQL Complexo ?

Delphi

05/04/2007

Olá Pessoal, bom dia !

tenho a seguinte situação:

tenho uma tabela:

TABELA_PRECO

ID
DESCRICAO
ID_PRODUTO
VALOR

nesta tabela o mesmo produto pode ter dois registros com preços diferentes, a pegunta e a seguinte, como fazer um select para mostrar um só registro com os preços do produto ?


[]´s


Renatacoimbra

Renatacoimbra

Curtidas 0

Respostas

Facc

Facc

05/04/2007

Bom dia
Uma sugestão que eu te dou é trabalhar com tabela de preço, eu trabalho assim aqui.

e qndo preciso pego pelo código do produto os preços dessa tabela de preço


GOSTEI 0
Martins

Martins

05/04/2007

Não sei se entendi direito, mas vc tá querendo algo assim.

[list:9546849fe8]ID DESCRICAO ID_PORDUTO VALOR
1 ÓLEO XXXX 01154 1,20
4 ÓLEO XXXX 02541 1,30 [/list:u:9546849fe8]

vc quer listar Óleo, mas quer uma coluna q mostre preço1 e preço2, mais ou menos isso?


GOSTEI 0
Pestana_

Pestana_

05/04/2007

como fazer um select para mostrar um só registro com os preços do produto ?


não sei se consegui entender, mas vou postar o que entendi.

acho que não tem como fazer o que você quer uzando somente um select, porque cada preço do produto em um registro é diferente do outro registro então por isso que sempre trás repetido a descrição do produto, com isso não dá pra colocar todos os preços em um só registro, é isso o problema que está aconteçento?.

o que vc poderia fazer é utilizar o conceito de master-detalhe ai vc utiliza dois selects

select master teria a descrição produto e o select detalhe teria os preços do produto


não sei se fui bem claro, mas qualquer coisa eu posto de novo,
Pestana.


GOSTEI 0
Motta

Motta

05/04/2007

Acho que falta uma vigencia na tabela de precos assim vc buscaria pela vigencia, algo assim

SELECT *
FROM    PRECOS
WHERE  COD-PROD = ´XXX´
AND      :DATA BETWEEN   DATA_INICIO AND DATA_FIM


A VIGENCIA (DATA_INICIO) DEVE ESTAR NA pk ASSIM SÓ TERIA UM PRECO POR VIGENCIA


GOSTEI 0
Renatacoimbra

Renatacoimbra

05/04/2007

Olá Pessoal, obrigada a todos pelas respostas.

Vou reformular minha dúvida, isso que estou fazendo é uma tabela de preços, o usuário tem a opção de gerar quantas tabelas de preços quiser, baseando-se nos preços principais dos produtos.

TABELA_PRECO

ID
DESCRICAO
ID_PRODUTO
DESC_PRODUTO
VALOR

[b:84d3216d69]Exemplo da Tabela:[/b:84d3216d69]


ID    DESCRICAO  ID_PRODUTO  DESC_PRODUTO          VALOR
---------------------------------------------------------------------------
01    TABELA A      000001   ÁCIDO BÓRICO           150,00
02    TABELA B      000001   ÁCIDO BÓRICO           200,00
03    TABELA C      000001   ÁCIDO BÓRICO           220,00



nesta situação eu preciso fazer uma Tabela impressa que mostre desta forma:


[b:84d3216d69]Exemplo da Listagem:[/b:84d3216d69]


ID_PRODUTO  DESC_PRODUTO      PRECO A   PRECO B   PRECO C
------------------------------------------------------------------------------
000001      ÁCIDO BÓRICO      150,00    200,00   220,00
...
...




Gostei da idéia que o [b:84d3216d69]Pestana_[/b:84d3216d69] colocou, se alguém tiver mas alguma solução favor postar.


Obrigada !


[]´s


GOSTEI 0
Robsonselzelin

Robsonselzelin

05/04/2007

Pelo que entendi, o que vc quer fazer é transformar os registros em colunas, ou seja, passar o registro de id 1 para coluna preço 1, id 2 para preço 2, de cada produto, e assim por diante

Se vc estiver utilizando banco de dados MySQL, se não me engano, ele tem uma função de transposição, do resultSet do select, de linhas para colunas, senão, vc vai ter que fazer isso via programação delphi.

Espero que isso ajude.


GOSTEI 0
Catunda

Catunda

05/04/2007

Renata... seu problema pode ser resolvido com uma StoredProcedure simples.

Obs:
1-Ajuste o tamanho do parametro DPROD que recebe a descrição do produto.
2-Substitua a palavra ´suatabela´ pelo nome da sua tabela.
3-Estou supondo que só existem 3 subtabelas ou preços pra cada produto.


CREATE PROCEDURE TABPRECO
RETURNS (
COD CHAR(3) CHARACTER SET NONE,
DPROD VARCHAR(10) CHARACTER SET NONE,
VR1 NUMERIC(15,2),
VR2 NUMERIC(15,2),
VR3 NUMERIC(15,2))
AS
DECLARE VARIABLE XZ INTEGER;
begin
for select id_produto,sum(valor) from suatabela group by id_produto
order by id_produto into :cod,:xz do
begin
select desc_produto,valor from suatabela
where (id_produto=:cod and descricao=´tabela a´) into :dprod,:vr1;
select desc_produto,valor from suatabela
where (id_produto=:cod and descricao=´tabela b´) into :dprod,:vr2;
select desc_produto,valor from suatabela
where (id_produto=:cod and descricao=´tabela c´) into :dprod,:vr3;
suspend;
end
end


GOSTEI 0
Renatacoimbra

Renatacoimbra

05/04/2007

[b:f33095a954]Catunda[/b:f33095a954], Obrigada pela sua dica !

mais o problema é que pode ter mais de 3 tabelas, teria q ser uma coisa dinamica, a opção de gerar tabelas de preços fica aberto para o usuário criar quantas desejar.



Obrigada !


[]´s


GOSTEI 0
Renatacoimbra

Renatacoimbra

05/04/2007

Pessoal, esquecir de colocar.

Uso FireBird 1.5


Também aceito sugestão de outras formas de criar tabela de preços, essa minha pode não ser a melhor meneira.



[]´s


GOSTEI 0
Catunda

Catunda

05/04/2007

O fato da qtde de colunas de preço diferentes para um mesmo produto ser indefinida torna essa metodologia de criação de tabela totalmente inviável. Melhor seria imprimir mesmo o codigo e descrição do produdo em uma linha e nas linhas abaixo listar os diferentes preços.
Eu particularmente não vejo uma razão plausivel para se criar tabelas dependentes dentro de uma outra tabela geral. Se fossem independentes eu entenderia.
Perceba que mesmo se coloca-se-mos um laço na procedure pra controlar o numero de preços diferentes essa linha acabaria não cabendo em uma folha de relatório dado o grande numero de colunas.
Ou vc limita a qtde de preços diferentes ou imprima uma tabela de preço normal para cada usuário.


GOSTEI 0
POSTAR