Data

23 abr, 2013

Criando um item do tipo Shuttle no Oracle APEX.

Publicidade

Olá, pessoal! Depois de algum tempo sem escrever, hoje vou descrever como criar e utilizar um recurso muito comum em aplicações web: o item do tipo Shuttle. Para esse artigo, utilizarei a aplicação de demonstração que criamos nos artigos anteriores.

O tipo de item Shuttle é muito útil para efetuar simples associações entre registros. Por exemplo, a associação entre programas que o usuário pode ter acesso ou depósitos em que um item pode ser estocado.

Nesse artigo, vou exemplificar a associação entre Chefes-Funcionários. Onde o usuário irá selecionar o Funcionário que irá representar um Chefe e posteriormente selecionará os Funcionários que são seus subordinados.

Para isso, vamos acrescentar ao modelo atual a tabela TB_FUNCIONARIO_HIERARQUIA, responsável por efetuar o relacionamento entre Chefes-Funcionários:

001

Neste modelo, será permitido que um funcionário tenha mais de chefe.

Após criado o modelo de dados, vamos criar o item Shuttle na tela de cadastro de funcionários. Crie uma nova região do tipo HTML, denominada Subordinados e crie um item do tipo SHUTTLE dentro desta região.

002
Vamos chamar este item de P2_SUBORDINADOS.

Durante a criação do item, é possível selecionar quais tipos de controles do item estarão disponíveis para o usuário:

  • All – Todos controles habilitados;
  • Moving Only – Habilita o controle de movimentação dos valores do item;
  • Ordening Only – Habilita o controle  de ordernação dos valores contidos no item;
  • None – Nenhum controle habilitado.

Lembrando que esses tipos de controles podem ser alterados posteriormente.

003

Neste momento, é obrigatório determinar qual a query que será utilizada para carregar as opções de valores do item. Utilize a query abaixo:

select NOME as display_value, MATRICULA as return_value 
  from TB_FUNCIONARIO
 where MATRICULA <> nvl(:P2_MATRICULA,MATRICULA)
 order by 1

Utilizando esta query serão listados todos os funcionários cadastrados – com exceção ao funcionário que está sendo alterado ou incluído – e será exibido no item o nome do funcionário e a matrícula será utilizada como chave.

004

Também pode ser utilizado um lista de valores pré-determinada.

Após criar o novo item, altere as propriedades da nova região criada para que fique ao lado da região já existente. Veja o resultado abaixo:

005

Agora que o item foi criado e parametrizado adequadamente, vou demonstrar como carregar os dados já associados ao item e como gravar os valores selecionados.

Para atribuir valores selecionados à um item do tipo Shuttle, devem ser passados os valores delimitados por “:”.

Para carregar os valores já associados, vou criar um processo do tipo “After Header” que será executado durante a renderização da página. O processo será responsável por ler os registros cadastrados na tabela associativa TB_FUNCIONARIO_HIERARQUIA, carregar uma variável do tipo array. Para efetuar a transformação vou utilizar uma API core do APEX, APEX_UTIL.TABLE_TO_STRING responsável por receber um ARRAY e retornar um texto com os dados delimitados por “:”.

DECLARE

recSubordinados         APEX_APPLICATION_GLOBAL.VC_ARR2;

BEGIN

     --lê a relação 
   for dd in  (select rownum, p.matricula_funcionario
                 from tb_funcionario_hierarquia p
                where p.matricula_funcionario_superior    = :P2_MATRICULA) loop

          recSubordinados(dd.rownum) := dd.matricula_funcionario;

        end loop;

      --transforma a tabela do shuffle em string
     :P2_SUBORDINADOS  := APEX_UTIL.TABLE_TO_STRING(recSubordinados);

END;

Para gravar os valores selecionados, vou criar um processo que será executado os botões “Alterar” ou “Incluir” forem clicados. Deverá ler o item P2_SUBORDINADOS, transformar o texto delimitado em um aray com as matrículas dos funcionários subordinados, e então inserir na tabela TB_FUNCIONARIO_HIERARQUIA.

DECLARE

recSubordinados          APEX_APPLICATION_GLOBAL.VC_ARR2;

BEGIN

  delete tb_funcionario_hierarquia p
    where p.matricula_funcionario_superior    = :P2_MATRICULA;

    --transforma o string do shuffle em tabela
     recSubordinados  := APEX_UTIL.STRING_TO_TABLE(:P2_SUBORDINADOS);

     --insere na tabela associativa
     for dd in 1.. recSubordinados.count loop

     insert into tb_funcionario_hierarquia(matricula_funcionario_superior, matricula_funcionario)
                                 values (:P2_MATRICULA, recSubordinados(dd));

     end loop;

END;

Veja que no código acima estou deletando todos os subordinados antes de inserir as alterações efetuadas nesse item. Existem outras formas de controlar as alterações de subordinados, mas isso é pauta para outro artigo.

Pessoal, nesse artigo vimos como utilizar um item do tipo Shuttle. Para acessar aplicação demo utilize o link http://apex.oracle.com/pls/apex/f?p=30361

  • Usuário: DEMO
  • Senha: imasters