Como fazer calculos, com condições

Dicas e truques sobre Oracle Reports Builder - modo gráfico ou modo caractere, ascii, arquivo .PRT, etc
Responder
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Boa Tarde Pessoal
Tenho um código aqui que me retorna duas linhas. Iguais em parte
Um é saída do estoque e outra retorno.
Pedi pra sair 30 produtos. E retornei 15. No meu relatorio preciso que saia somente o total daqueles que sairam.
OU seja somente 15. COmo eu poderia fazer isso. Não tenho ideia como
Aguardo respostas
Jimmy Biff
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Ter, 19 Abr 2011 10:24 am
Localização: São paulo - SP
JImmy

deixa eu ver se entendi
você pediu pra sair 30 produtos e retornou 15. Você quer o total dos que não retornaram, que no caso é 15?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Exatamente isso
um exemplo do meu codigo

Selecionar tudo

 (select me.nr_solicitacao, me.dt_movto, me.cd_estado, me.tp_movto, me.qt_movto
 from movto_est_medicamento me
 where me.cd_estado
 and me.dt_movto between '14/07/2011' and '14/07/2011')
Jimmy Biff
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Ter, 19 Abr 2011 10:24 am
Localização: São paulo - SP
JImmy

Algum desses campos serve de parâmetro pra saber o que saiu e o que retornou? Ex. o que retornou grava com um 'R'.
Nesse select, o range '14/07/2011' - '14/07/2011' é dos produtos que saíram?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Não. Ele traz tudo.
Tudo que saiu. POrém ele faz uma copia do que foi retornado também. QUando faço retorno ele não atualiza e sim cria outra linha.
Essa data deveria trazer todos produtor que foram fornecidos.
Ou seja,
Se retornou 15, deveria retornar 15.
sairam 30
Não sei se deu pra entender
Jimmy Biff
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Ter, 19 Abr 2011 10:24 am
Localização: São paulo - SP
JImmy

então, deixa eu ver se esse exemplo se encaixa
no intervalo '14/07/2011' - '14/07/2011' você pediu pra listar todos os produtos que sairam, certo? No total, sairam 15 produtos. No select, deveria retornar 15. Porém, quando você registra o retorno, ele grava uma outra linha. Então, ao invés de retornar 15, retorna 30. É isso Pri?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Exatamente isso
Retorna os 30 que sairam
E também os 15 que retornaram. Mais eu quero que sai o total realmente saidos. Mesmo com o retorno.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

alguém pode me ajudar ai

Consegui agora fazer

Selecionar tudo

sum(decode(m.tp_movto,'S',m.qt_servico)) - sum(decode(m.tp_movto,'R',m.qt_servico))
faz o que eu quero. Porem não retorna nada quando tiver somente S.
alguém pode me dar uma luz.;....
marcus.kobel
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Qui, 12 Mai 2011 4:54 pm
Localização: Porto Alegre - RS

HEHEHEHE
Que esculhambação....
A Priscila mal conseguiu explicar o seu problema.
A pergunta principal aqui é: como que tu sabe que um produto retornou? Existe algum campo que te diz isso? Que tabela é essa que tu está consultando?
marcus.kobel
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Qui, 12 Mai 2011 4:54 pm
Localização: Porto Alegre - RS

QUando faço retorno ele não atualiza e sim cria outra linha
Então, tu deve ta olhando os registros em uma tabela de HISTÓRICO de movimentações, certo?
Cada vez que entra ou saem produtos, fica registrado o que foi movimentado, certo?

Tipo assim:

Selecionar tudo

cod_prod  nome_prod      qt_movimentada  dt_movimentada  tp_movimento
     123  produto ABC               30       14/07/2011  Saida
     123  produto ABC               15       14/07/2001  Retorno
Isso ai?
A partir dai, tu precisa ler os registros e deduzir que tem 15 produtos que não voltaram, certo?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Certo isso mesmo
marcus.kobel
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 45
Registrado em: Qui, 12 Mai 2011 4:54 pm
Localização: Porto Alegre - RS

Então, segue pelo caminho que tu está indo que é o certo.
Usa o SUM( DECODE(....) ) como você está utilizando, e depois bota um GROUP BY nos campos principais: cod_produto, nome_prod, dt_movimento, etc...

Isso deve funcionar. Senão funcionar, avisa.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Dae Marcus
Olha so
Não funcionou não

Selecionar tudo

select  sum(decode(m.tp_movto,'S',m.qt_servico,0)) - sum(decode(m.tp_movto,'R',m.qt_servico,0))testesa, m.dt_movto, m.nr_solicitacao, pj.nm_entidade, 
       s.ds_servico, m.qt_servico, m.dt_validade, 
       m.cd_lote, pfabr.nm_fantasia, m.fg_ddu
from solicitacao_medicamento sm, 
     movto_est_medicamento m,
     item_solicitacao_medicamento i,
     pessoa_juridica pj,
     servicos s,
     pessoa_juridica pfabr
where  m.dt_movto between '14/07/2011' and '14/07/2011'
and sm.nr_solicitacao = m.nr_solicitacao
and sm.nr_solicitacao = i.nr_solicitacao
and i.cd_servico = m.cd_servico
and sm.cd_entidade_solicitacao = pj.id_pessoajuridica
and i.cd_servico = s.cd_servico
and m.cd_fabricante = pfabr.id_pessoajuridica(+)
group by m.cd_lote,m.dt_movto, m.nr_solicitacao, pj.nm_entidade, 
       s.ds_servico, m.qt_servico, m.dt_validade, 
        pfabr.nm_fantasia, m.fg_ddu
Ele ainda retorna as duas linhas normais. O resultado do sum da. Saida 20 e depois o retorno -15. Onde o resultado deveria ser 5
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Posta as duas linhas do resultado para avaliação...
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Selecionar tudo


teste   data          Nome                     Servico                                 Tipo
 20	14/07/2011  3 HOSPITAL	LIOFILIZADO FATOR VIII - 250 UI  Saída
-15	14/07/2011  3 HOSPITAL	LIOFILIZADO FATOR VIII - 250 UI  Retorno 
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Outro detalhe se eu tirar os itens do select e deixa somente o sum e outro cd_lote. Ele retorna uma linha como eu quero. Porém preciso deixar esses itens. Será que existe outra forma.
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

O problema é o seguinte, você tem um agrupador pelo serviço, considerando que existem 2 serviços diferentes, um saída e um retorno, não tem como agrupar desta forma.

A solução é reescrever toda a consulta. Vou ver se monto um exemplo para você.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Faltam algumas informações..
- Como identificar a qual solicitação se refere o retorno? O movimento do tipo 'R' é gerado sempre com o mesmo número de solicitação de saída?
- Pode haver mais de um retorno para uma mesma saída?
- A data do movimento de retorno pode ser diferente da data de saída? Caso afirmativo, você deve considerar a data do movimento de retorno?
Por exemplo:
Dia 01 é gerada uma saída de 10 unidades.
Dia 02 é gerado o retorno de 02 unidades.
Dia 03 é gerado o retorno de 08 unidades.
Gerando o relatório do dia 01 ao dia 02, deve retornar 08 unidades? Ou deverá considerar o movimento do dia 03 também, retornando 0?

Considerando que o número da solicitação seja a forma de agrupar os registros de saída e retorno, e que devem ser considerados apenas os movimentos limitados ao intervalo das datas informadas como parâmetro:

Selecionar tudo

select *
from
(
  select sum( decode( tp_movto, 'S', 1, 'R', -1, 0 ) * qt_servico ) over ( partition by nr_solicitacao ) qt_movimentada
       , dt_movto
       , nr_solicitacao
       , nm_entidade
       , tp_movto
  from
  (
    -- Apenas para simular alguns registros
    select 20 qt_servico
         , to_date('14/07/2011', 'dd/mm/yyyy') dt_movto
         , 3 nr_solicitacao
         , 'HOSPITAL   LIOFILIZADO FATOR VIII - 250 UI' nm_entidade
         , 'S' tp_movto
    from   dual
    union all
    select 5 qt_servico
         , to_date('14/07/2011', 'dd/mm/yyyy') dt_movto
         , 3 nr_solicitacao
         , 'HOSPITAL   LIOFILIZADO FATOR VIII - 250 UI' nm_entidade
         , 'R' tp_movto
    from   dual
    union all
    select 2 qt_servico
         , to_date('17/07/2011', 'dd/mm/yyyy') dt_movto
         , 3 nr_solicitacao
         , 'HOSPITAL   LIOFILIZADO FATOR VIII - 250 UI' nm_entidade
         , 'R' tp_movto
    from   dual
    union all
    select 10 qt_servico
         , to_date('15/07/2011', 'dd/mm/yyyy') dt_movto
         , 4 nr_solicitacao
         , 'TESTE' nm_entidade
         , 'S' tp_movto
    from   dual
    --
  ) a
  where dt_movto between to_date('14/07/2011', 'dd/mm/yyyy') and to_date('19/07/2011', 'dd/mm/yyyy')
) a
where a.tp_movto = 'S'
and   a.qt_movimentada >= 0 -- Se houver retorno de todos os itens movimentados, exibir a linha?
                            -- E se a quantidade retornada for maior do que a quantidade registrada na saída?
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

COnsegui fazer aqui
Colocando subselect que faça o sum
Porem, eu posso sim ter saida na mesma data, e retorno também
Agora não sei como coloco no group by
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Deu certo pessoal
Coloquei um subselect e coloquei o group by. o numero da solicitacao, e o codigo do lote.

Agora fico OK
Obrigada pela atenção
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes