Parametro Léxico

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
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

Galera, preciso da ajuda de vocês...

Vamos ao meu problema. Criei uma tela no forms onde preencho alguns campos que chama um relatório no Reports.

- Depois de preencher os campos e clicar em ok o forms chama o relatório, passa os parametros e funciona normalmente.

- Essa semana precisei fazer uma alteração e criei um parametro Léxico. Quando passo os dados do parametro léxico com numero ele funciona normalmente.

vamos supor que o valor passado no parametro seja esse exemplo:
and cd_setor in (1,2,3)

até ai tudo bem, funciona de boa. mas quando eu tento passar no parametro um texto não funciona. eu clico no botão para chamar o relatório e nada acontece. nem erro aparece.
Ex: and setor in ('rh','compras')

Percebi que se eu tirar a aspas simples funciona de boa....segue meu código....

Selecionar tudo


   declare
     ret number;
     Print_Name    Varchar2(100); 
     Port_name     Varchar2(100); 
     vNumero varchar2(255) := '0';
     p1_id  paramlist;
     WRK_WHERE VARCHAR2(1000) := 'AND  LC.CD_LOCALIZACAO in ("''';
     --WRK_WHERE VARCHAR2(255):= 'AND  LC.CD_LOCALIZACAO in (';     --> esse funciona de boa
   begin
     
     p1_id := GET_PARAMETER_LIST('parm');
     IF NOT ID_NULL(p1_id) THEN 
         DESTROY_PARAMETER_LIST(p1_id);
     END IF;
     
     p1_id := create_parameter_list('parm');
     
     GO_BLOCK('BL_LOCALIZACAO');
	   FIRST_RECORD;
    
    LOOP
     WRK_WHERE := WRK_WHERE || :BL_LOCALIZACAO.CD_LOCALIZACAO || ''',''';
--     WRK_WHERE := WRK_WHERE || :BL_LOCALIZACAO.CD_LOCALIZACAO || ','; --> esse funciona de boa
          
      LOOP
     WRK_WHERE := WRK_WHERE || :BL_LOCALIZACAO.CD_LOCALIZACAO || ''',''';
          
     IF :SYSTEM.LAST_RECORD = 'TRUE'
     THEN EXIT;
     ELSE NEXT_RECORD;
     END IF;
     END LOOP;
   
     WRK_WHERE := WRK_WHERE || '0'')';
     --WRK_WHERE := WRK_WHERE || '0)'; --> esse funciona de boa
     
     IF :BL_LOCALIZACAO.CD_LOCALIZACAO = '%' THEN
     	 WRK_WHERE := 'AND LC.CD_LOCALIZACAO LIKE ''%'' ';
     END IF;
     
     /******************************************************************/
     
     if  :SN_SALDO = 'S' THEN
     	   vNumero := '-1';
     end if ;
     
     add_parameter(p1_id  ,'P_CD_ESPECIE', text_parameter,:BL_PARAMETRO.cd_especie);
     add_parameter(p1_id  ,'P_CD_ESTOQUE', text_parameter,:BL_PARAMETRO.cd_estoque);
     add_parameter(p1_id  ,'P_DS_ESPECIE', text_parameter,:BL_PARAMETRO.ds_especie); 
     add_parameter(p1_id  ,'P_DS_ESTOQUE', text_parameter,:BL_PARAMETRO.ds_estoque);
     add_parameter(p1_id  ,'P_AND'       , text_parameter,WRK_WHERE);
     add_parameter(p1_id  ,'P_CONTAGEM'  , text_parameter,:BL_PARAMETRO.contagem);
     add_parameter(p1_id  ,'P_SALDO'     , text_parameter,vNumero);
     
     ADD_PARAMETER (p1_id ,'PARAMFORM',TEXT_PARAMETER,'no');
     add_parameter(p1_id  ,'MAXIMIZE',     text_parameter , 'YES'); 
       
     run_product(reports,'E:\mv2000\mges\relatorio\r_contagem_fisica2_NEW.rep',synchronous,runtime,
       filesystem,p1_id,null);
   
   end;

ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Boa Tarde,

Trabalhar com esta forma dinâmica de parâmetros "in" com valores varchar pode dar uma "perdida" mesmo, tem que ficar controlando o número de aspas para definir o que é da variável e o que realmente é da informação.

Você pode tentar mudar a concatenação da aspa do valor, ao invés de usar o caracter mesmo " ' ", tenta concatenar com o ASCII dele, por exemplo:

Selecionar tudo

--Ao invés de
'and coluna in ('||'''valor'''||')'

--Mude para
'and coluna in '||chr(39)||valor||chr(39)||')'

Fica mais implícito e fácil de entender, ao meu gosto pelo menos, pode ser que ele interprete melhor desta forma.
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Simulando em um bloco anônimo

Selecionar tudo

declare
  type tChar is table of Varchar2(50);
  vTextos tChar;
  
  WRK_WHERE  VARCHAR2(1000) := 'AND  LC.CD_LOCALIZACAO in (';--Retirei a Aspa Dulpa(")
  --WRK_WHERE VARCHAR2(255):= 'AND  LC.CD_LOCALIZACAO in (';     --> esse funciona de boa
begin
  --Simulando o Loop do Bloco
  vTextos := tChar('teste','teste2','teste3','teste4');  
  for i in vTextos.first..vTextos.last loop
    --Concatenando com chr(39) e vírgula
    WRK_WHERE := WRK_WHERE || chr(39) || vTextos(i) || chr(39)|| ',';      
  END LOOP;
  
  --Retira a última vírgula
  WRK_WHERE := rtrim(WRK_WHERE,',');
  
  --Fecha com o parenteses
  WRK_WHERE := WRK_WHERE || ')';
  
  --Mostra o resultado
  dbms_output.put_line(wrk_where);
end;
douglasmattos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 19 Mar 2012 2:28 pm

Valeu pelas dicas galera.....

Vou fazer uns testes aqui e posto o resultado....

:D :D :D
Responder
  • Informação
  • Quem está online

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