Consulta Entre Datas

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
thebranco
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Ter, 04 Ago 2009 7:29 pm
Localização: santa cruz das palmeiras

ola pessoal criei um form onde irei consultar os produtos cadastrados no entervalo de datas que eu informar..
usei o seguinte codigo pra fazer esta consulta pra mim porem ele da um erro de trigger levantou exceção:

Selecionar tudo

ORA-01422 não tratada...

Selecionar tudo

SELECT PRO_ID, PRO_DESCR, PRO_DTCAD INTO :BLK_PRODUTOS.PRO_ID,
:BLK_PRODUTOS.PRO_DESCR, :BLK_PRODUTOS.PRO_DTCAD FROM PRODUTOS  
WHERE PRO_DTCAD BETWEEN :BLK_PRODUTOS.TXT_DTINI AND :BLK_PRODUTOS.TXT_DTFIN;
grato pela ajuda !
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

A tua consulta esta retornando mais do que uma linha, logo você tenta inserir resultados de varias linhas em seu campo e o erro acontece.

Modifique o codigo para se certificar que você vai buscar apenas uma linha.

Ou modifique seu forms. No seu lugar eu criaria um datablock com mais de uma linha, e nele eu criaria uma grade de produtos e popularia ela.
thebranco
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Ter, 04 Ago 2009 7:29 pm
Localização: santa cruz das palmeiras

Eu já criei um datablock com mais de uma linha porque nesta consulta ele vai me retornar varios produtos...
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Ok , mas a sua consulta continua trazendo varios linhas e tentando inserir no mesmo registro.

Você pode ate ter uma grade, mas esta tentando inserir os resultados da query todos em uma linha da grade apenas.

Não é possivel você fazer este teu datablock ser base table, buscando estes teus produtos?
É bem mais facil do que tentar fazer este select.

Mas se não for possivel, eu tentaria:
- fazer um select row(count) da tabela para saber quantos produtos você tem, os quais se encaixam na sua query.
- ordernar esta tua atual query pelo prod_id.
- criar um contador
- restringir a query pelo rownum, onde o rownum seria igual ao seu contador
- colocar tudo isso dentro de um loop o qual executaria até o contador ser maior que o resultado do select rowcount
- e dentro do loop colocar um next_record (ou um create_record, não estou certo qual dos dois).

Se não conseguir fazer isto, poste suas duvidas no forum, para podermos solucionar.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Algo mais ou menos assim....

Selecionar tudo

DECLARE
 CURSOR C_QUANT_PRODUTOS IS
     SELECT ROWCOUNT
     FROM PRODUTOS
     WHERE PRO_DTCAD BETWEEN :BLK_PRODUTOS.TXT_DTINI AND :BLK_PRODUTOS.TXT_DTFIN;

  CURSOR C_PROD (LINHA NUMBER) IS
      SELECT PRO_ID, PRO_DESCR, PRO_DTCAD 
      FROM PRODUTOS 
      WHERE PRO_DTCAD BETWEEN :BLK_PRODUTOS.TXT_DTINI
AND :BLK_PRODUTOS.TXT_DTFIN
AND ROWNUM = LINHA
       ORDER BY PROD_ID;

    R_PROD_QUANT     NUMBER(7);
    R_PROD                 C_PROD%ROWTYPE;
    V_CONT                 NUMBER(5);
BEGIN
  OPEN C_PROD_QUANT;
  FETCH C_PROD_QUANT INTO R_PROD_QUANT;
  CLOSE C_PROD_QUANT;

  V_CONT := 0;

  LOOP
    V_CONT := V_CONT+1; 
    IF V_CONT > R_PROD_QUANT THEN
         EXIT; 
     END IF;

     OPEN C_PROD(V_CONT);
     FETCH C_PROD INTO R_PROD;
     CLOSE C_PROD;
     :BLK_PRODUTOS.PRO_ID := R_PROD.PROD_ID; 
     :BLK_PRODUTOS.PRO_DESCR := R_PROD.PROD_DESCR;
     :BLK_PRODUTOS.PRO_DTCAD := R_PROD.PRO_DTCAD;
   END LOOP;
END;
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

esqueci de colocar ali no fim antes do end loop um NEXT_RECORD;
thebranco
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Ter, 04 Ago 2009 7:29 pm
Localização: santa cruz das palmeiras

Amigo eu tentei fazer com este codigo mas ainda da erro com o NEXT_RECORD, ele fala que o procedimento é restrito...

você tem algum e-mail pra que eu possa enviar um print do meu form pra vê se ajuda a intender o que eu quero ?

por enquanto muito obrigado pela ajuda..

Branco
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Onde você esta chamando este procedimento???

Nem todas as trigger suportam todos comandos.

Aplique isto em uma das que começam com Key.

Ex:

Selecionar tudo

Key_Commit, Key_next_item, etc.
Só preste atenção que ao programar uma trigger desta natureza você não pdoe deixar de inserir a ação padrão dela.

Por exemplo: se você programar uma Key_commit e não colocar dentro dela em nenhum local um "COMMIT" o seu forms não vai commitar.

Se continuar com o erro poste novamente.
thebranco
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Ter, 04 Ago 2009 7:29 pm
Localização: santa cruz das palmeiras

bom o meu form tem o campo data inicial = blk_produtos.txt_dtini
e data final = blk_produtos.txtdtfin e tem um bloco e mais tres campos de forma tubular que vai ser preenchido com o resultado da pesquisa ...

eu quero que isso ocorra quando eu precionar a tecla enter no campo data final entendeu....num sei se isso ajuda !


grato


Branco
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Eu nunca programei uma KEY_ENTER, mas ela existe.

Tente programar a KEY_ENTER do campo onte você vai apertar enter.
davidmeloboy
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Sex, 05 Set 2008 1:53 pm
Localização: Parobé - RS
Contato:
David.

Isto é muito simples de fazer:

ao lado da data final crie um botão:
na when-button-pressed do botão crie:

O bloco tabular deve ser baseado na tabela que você quer consultar


1) na propriedade WHERE do bloco crie a restrição:

Selecionar tudo

  data between :bloco.data_inicial and :bloco.data_final
2)
--cursor vai para o bloco informado

Selecionar tudo

    go_block('bloco_tabular');
-- manda executar a consulta no bloco tabular

Selecionar tudo

    execute_query;
é só informar a datas e clicar no botão que ele irá fazer a consulta restringindo pelo intervalo de datas.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante