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:
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.
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.
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.
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:
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