Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Oi galera.
Estou tentando fazer um Select e estou apanhando um pouco.
Seguinte:
Tabelas: dry_os_item || dry_produto || dry_servico
Gostaria de trazer quase todas as informações da tabela "DRY_OS_ITEM", mas na Descrição do ITEM, buscar a descrição no produto, se for um produto, ou a Descrição do serviço, se for um Serviço. Isso usando o mesmo CAMPO.
Vou colocar as tabelas pra entender melhor.
DRY_OS_ITEM
OS_ITEM_ID OS_ID PRODUTO_ID PRODUTO_VALOR QUANTIDADE OS_ITEM_TOTAL OS_ITEM_DATA OS_ITEM_TAG
15 8 4 1.55 2 454.65 - produto
17 8 4 150 2 454.65 - servico
DRY_PRODUTO:
produto_id
produto_descricao
produto_tag
DRY_SERVICO
servico_id
servico_descricao
servico_tag
Eu fiz o seguinte Select:
select oi.os_item_id,
oi.os_id,
oi.produto_id,
pi.produto_descricao || se.servico_descricao as Produto,
oi.produto_valor,
oi.quantidade,
(oi.produto_valor * oi.quantidade) total
from dry_os_item oi, dry_produto pi, dry_servico se
where oi.OS_ID = 8
Resultado:
OS_ITEM_ID OS_ID PRODUTO_ID PRODUTO PRODUTO_VALOR QUANTIDADE TOTAL
15 8 4 Cerveja Skol - LataEspelhamento Carro Esportivo 1.55 2 3.1
16 8 4 Cerveja Skol - LataEspelhamento Carro Esportivo 1.55 1 1.55
17 8 4 Cerveja Skol - LataEspelhamento Carro Esportivo 150 2 300
18 8 4 Cerveja Skol - LataEspelhamento Carro Esportivo 150 1 150
Note que o PRODUTO esta trazendo as duas descrições, do serviço e do produto. Claro que esse select eu fiz para ilustrar a dúvida.
Tentei várias condições no WHERE, INNER JOIN, OUTER JOIN, IF EXISTS, etc etc e sem sucesso.
Desculpe pela dúvida ser um pouco tonta, mas ja nao sei o que fazer.
Se alguém puder me ajudar, por favor
Agradeço desde já.
Obrigado.Isso Motta. um ou outro!
Eu queria uma forma de aparecer só a descrição do Produto, se for um produto ou só a descrição do Serviço se for um serviço.
A tabela DRY_OS_ITEM só guarda o ID do serviço/produto e a TAG deles (Servico ou Produto).
>
Em 13/04/2017 at 17:32, Motta disse:
and oi.OS_ID = se.OS_ID
Essa condição está errada. Não tem o ID da OS na tabela Serviço.
Mas, obrigado pela ajuda Motta.
Como se sabe se é um produto ou serviço ?
Em que tabela/coluna tem o código de serviço
Então.
Olhando pra tabela dry_os_item tem a coluna os_item_tag. Nessa coluna da pra saber se é um "Produto" ou um "Servico"
Deixei um exemplo da tabela com 2 itens inseridos com o mesmo id do produto > "produto_id".
Agora eu não sei como fazer um Select pra trazer certo a descrição de cada um.
Se alguém tiver alguma ideia, ou talvez, criar um campo a mais nas tabelas pra ajudar no "where"..
Obrigado.Se OS_ITEM_TAG = 'produto'
Então Pesquisa DRY_PRODUTO por PRODUTO_ID
senão
Se OS_ITEM_TAG = 'servico'
Então Pesquisa DRY_SERVICO por OS_ID
Isto ?
>
2 minutos atrás, Motta disse:
Se OS_ITEM_TAG = 'produto'
Então Pesquisa DRY_PRODUTO por PRODUTO_ID
senão
Se OS_ITEM_TAG = 'servico'
Então Pesquisa DRY_SERVICO por OS_ID
Isto ?
É isso. Só que na parte do serviço seria: "Então Pesquisa DRY_SERVICO por SERVICO_ID."
>
Em 13/04/2017 at 16:31, Regis Oliver disse:
pi.produto_descricao || se.servico_descricao as Produto,
Eu quero que ele traga como nessa linha acima, por exemplo. Trazer um ou o outro.
Esta meio confuso ainda ?
Não , vejo duas saídas
1) Uma function que receberia tag e id por parametro e
pesquisaria pela tabela produto_id ou servico_id conforme o tag e retornaria o nome do produto ou serviço
2) criar uma view
create view v_serv_prod as
select produto_id, produto_descricao, produto_tag from DRY_PRODUTO
union all
select servico_id ,servico_descricao, servico_tag from DRY_SERVICO
faça o join nesta view unindo
por tag
select oi.os_item_id,
oi.os_id,
oi.produto_id,
pi.produto_descricao || se.servico_descricao as Produto,
oi.produto_valor,
oi.quantidade,
(oi.produto_valor * oi.quantidade) totalSalve Motta..
Eu criei a view, como você sugeriu.
Mas eu não entendi direito as condições que você colocou no "where"
>
18 horas atrás, Motta disse:
and (case when io.tag = 'produto' then PRODUTO_ID else OS_ID end0 = v.produto_id and io.tag = v.tag
Essa parte Acima "io.tag" está certo ? não seria "oi.os_item_tag" ?
Eu fiz as seguintes alterações abaixo.
E da o seguinte erro: ORA-06550: line 16, column 7: ORA-00942: table or view does not exist
from dry_os_item oi, v_serv_prod v
where oi.OS_ID = 8
and (case when oi.os_item_tag = 'produto' then PRODUTO_ID else SERVICO_ID end = v.produto_id)
and oi.os_item_tag = v.servico_tag
O que esta errado ??? Ele não esta encontrando a view ?
Obrigado Motta.
ORA-00942: table or view does not exist
a view com este nome não existe ou está em outro owner (user) de onde a sql está sendo executada
Resolvi o problema fazendo o seguinte código:
select
oi.os_id,
oi.produto_id,
(case when oi.os_item_tag = 'produto' then pi.produto_descricao
else se.servico_descricao end) as Produto,
oi.produto_valor,
oi.quantidade
from dry_os_item oi, dry_produto pi, dry_servico se
where oi.OS_ID = :P43_ORDER_ID
Simples, mas não conseguia enxergar.
Agradeço a ajuda de todos.
Deixei o código, talvez ajude.
Obrigado.Eu achei que tinha resolvido o problema.
Mas quando fui fazendo mais testes, ainda esta trazendo informações erradas.
Esta duplicando os produtos e também percebi que ele trouxe outro nome do produto. Segue o retorno do Select acima:
OS_ID
PRODUTO_ID
PRODUTO
PRODUTO_VALOR
QUANTIDADE
9
5
Cerveja Brahma - Lata
2.19
1
9
5
Cerveja Skol - Lata
2.19
1
9
4
Espelhamento Carro Esportivo
150
1
9
4
Espelhamento Carro Esportivo
150
1
vou deixar abaixo o retorno do select da tabela Dry_os_item com o OS_ID = 9 (Obs: tem somente 2 itens no banco)
select * from dry_os_item where os_id = 9
OS_ITEM_ID
OS_ID
PRODUTO_ID
PRODUTO_VALOR
QUANTIDADE
OS_ITEM_TOTAL
OS_ITEM_DATA
OS_ITEM_TAG
19
9
5
2.19
1
152.19
-
produto
20
9
4
150
1
152.19
-
servico
Alguém me dê uma luz, por favor
Obrigado.Tente um DISTINCT
Usei o DISTINCT e mesmo assim ele ainda trazia outro item, que nem esta na tabela Dry_os_item.
Eu mudei um pouco o select:
select DISTINCT
oi.os_item_id editlink,
oi.os_item_id,
oi.os_id,
oi.produto_id,
(select produto_descricao from dry_produto where produto_id = oi.produto_id and oi.os_item_tag = 'produto') as Produto,
(select servico_descricao from dry_servico where servico_id = oi.produto_id and oi.os_item_tag = 'servico') as Serviço,
oi.produto_valor,
oi.quantidade,
(oi.produto_valor * oi.quantidade) extended_price,
dbms_lob.getlength(produto_imagem) produto_imagem ,
decode(nvl(dbms_lob.getlength(pi.produto_imagem),0),0,null,
'<img style="border: 4px solid #CCC; -moz-border-radius: 4px; -webkit-border-radius: 4px;" '||
'src="'||
apex_util.get_blob_file_src('P29_PRODUTO_IMAGEM',pi.produto_id)||
'" height="75" width="75" alt="Produto Imagem" title="Produto Imagem" />')
detail_img
from dry_os_item oi, dry_produto pi
where oi.os_id = 10
Deixei ate o distinct.. eu tinha feito com Group by, mas mesmo assim retorna a mesma coisa:
EDITLINK OS_ITEM_ID OS_ID PRODUTO_ID PRODUTO SERVIÇO PRODUTO_VALOR QUANTIDADE EXTENDED_PRICE PRODUTO_IMAGEM DETAIL_IMG
21 21 10 4 Cerveja Skol - Lata - 1.55 1 1.55 - -
21 21 10 4 Cerveja Skol - Lata - 1.55 1 1.55 8435 < Exemplo: imagem />
não sei porque ele traz esse item de cima, era pra vir somente o que tem imagem..
"se for um produto, ou a Descrição do serviço "
são excludentes ? um ou outro ?
Em tese
from dry_os_item oi, dry_produto pi, dry_servico se where oi.OS_ID = 8 and oi.PRODUTO_ID = pi.PRODUTO_ID and oi.OS_ID = se.OS_IDdeve resolver