segunda-feira, 31 de março de 2008

Chamando Páginas como Popups

Boa Tarde Galera,
Hoje o post é referente a chamada de páginas como Popups.

Iremos usar o cenário bem simples com duas páginas, onde a Pagina1.jspx chamará a Pagina2.jspx atravez de um botão ou Link. A ação desse botão ou link é explodir a Pagina1.jspx em formato de Popup conforme imagem abaixo.

A ligação entre as duas páginas é feito atravez do "JSF Navigation Case" que obrigatóriamente terá a propriedade "From OutCome" chamada "dialog:". o "dialog" indica que a página é um popup.

A página1.jspx terá um botão ou Link que irá chamar a outra página atravéz da Action "dialog:". Precisaremos adicionar as seguintes informações nas propriedades:

* UseWindow = true

* Window Height = 300 // tamanho do popup referente a altura da Pagina2.jspx.

* Window Widht = 600 // tamanho do popup referente a largura da Pagina2.jspx.

A Pagina2.jspx irá conter um botão, link ou coisa parecida para retornar a Pagina1.jspx. Nesse componente de retorno será criado um "returnActionListener" com a propriedade "Value" null, assim ao clicar nesse componente o retorno é imediato.

Um grande abraço e até a próxima.

quinta-feira, 27 de março de 2008

O componente Shuttle - Parte 2

Oi Pessoal!

Continuando com a série sobre a Shuttle, vamos destrinchar um pouco melhor o funcionamento detalhado do componente JSF que a monta.

O componente af:selectManyShuttle precisa saber quais são os itens que devem ser renderizados nas listas leading e trailing. Isto é feito gerando uma lista de objetos da classe javax.faces.view.SelectItem, ou através de uma tag [f:selectItems] ou através de um loop [f:forEach] que imprima uma sequência de [f:selectItem].
Todo objeto SelectItem tem um valor ("value") e uma descrição. Para informar a shuttle quais valores devem estar do lado trailing (selecionados), montamos uma lista contendo os códigos dos itens selecionados, que devem ser equivalentes ao atributo "value" dos selectItems existentes na Shuttle, e informamos no atributo "value" da própria Shuttle a referÊncia para esta lista no managed bean. Exemplo de shuttle baseada inteiramente no Backing Bean:

[af:selectManyShuttle value="#{ShuttleControl.shuttleValues}"]
[f:selectItems value="#{ShuttleControl.shuttleElements}"]
[/af:selectManyShuttle]

Código do Backing Bean:
public class ShuttleControl {
private int[] shuttleValues; (Lista de códigos, pode ser trocado para List)
private SelectItem[] shuttleElements; (Também pode virar List)

//Getters e Setters omitidos.
}

Exemplo baseado em um ADF Table Binding, usando forEach pra popular os itens (mantendo o backing bean inalterado):

[af:selectManyShuttle value="#{ShuttleControl.shuttleValues}"]
[af:forEach var="li" value="#{bindings.ShuttleElements.rangeSet}"]
[f:selectItem value="#{li.Cod}" description="#{li.Desc}"]
[/af:forEach]
[/af:selectManyShuttle]

PageDefinition desta página:
...
[bindings]
[table iterator="ShuttleVOIter" Id="ShuttleElements"]
[attributes]
[Item name="Cod"/]
[Item name="Desc"/]
[/attributes]
[/table]
[/bindings]


Com esta configuração, podemos colocar um botão na página que a submeta, apontando para um método do Backing Bean da Shuttle. Neste método, a lista com os códigos movidos pelo usuário da leading pra trailing estará disponível no Bean no atributo shuttleValues. Podemos passá-lo para um método do Application Module que faça a inserção programática dos registros no View Object.

Exemplo:
[af:commandButton value="Submeter" action="#{ShuttleControl.onSubmitShuttle}"/]
Método no Backing Bean:
public String onSubmitShuttle() {
OperationBinding method = FacesContext.getCurrentInstance().getValue("#{bindings.applyShuttleValues}");
method.getParamsMap().put("nomeDoparametroList", shuttleValues");
method.execute();
return null; //fica na mesma página
}

Método no Application Module:
public void applyShuttleValues(List nomeDoParametroList) {
ViewObjectImpl view = getShuttleVO();
for (Iterator it = nomeDoParametroList.iterator(); it.hasNext();) {
Integer i = (Integer) it.next();
Row r = view.createRow();
r.setAttribute("Cod", i);
view.insertRow(r);
r.setStatus(Row.STATUS_INITIALIZED);
}
}

No próximo Post vamos demonstrar algumas maneiras de incrementar esta shuttle. Até lá!

quarta-feira, 19 de março de 2008

Dica ADF: Usando o componente Shuttle, Parte 1

Oi Pessoal! Agora que conseguimos colocar a cabeça pra fora da água vou postar aqui. Os últimos dias foram cansativos... mas vamos ao que interessa.

Neste post, vou demonstrar o uso de um dos componentes mais interessantes do ADF Faces, mas pouco usado pela falta de documentação sobre seu uso: o Shuttle, representado pela tag [af:selectmanyshuttle]. Isto é um complemento ao Frank Nimphius em seu blog , onde inclusive existe um projeto de exemplo que pode ser baixado.

O componente Shuttle é composto por duas listas coordenadas entre si, uma delas com os valores possíveis (chamada de leading list) e outra com os valores selecionados (chamada de trailing list). Entre as duas listas, existem controles de mover valor da leading para trailing e vice-versa. Este componente possui também dois facets interessantes, o filter que permite colocar um item acima da lista Leading, como um af:inputText ou af:selectOneChoice, para filtrá-la, e o trailingFooter que permite inserir itens abaixo da lista trailing, como botões de comando etc. O resultado final fica assim:




Vamos entender um pouco mais do seu funcionamento. A Leading List da Shuttle trabalha com um vetor de itens do tipo [af:selectitem], que podem ser populados tanto programaticamente em um Backing Bean, como através de um Table Binding ADF, iremos explorar a segunda opção. Já a Trailing List é baseada em uma lista comum, do tipo java.util.List, contendo o código de cada uma das opções selecionadas baseado na propriedade Code da [af:selectitem]. Segue o código comentado da montagem da Shuttle:

[af:selectmanyshuttle leadingheader="Disponiveis" //-- Cabeçalho da Lista Leading
trailingHeader="Selecionados" //-- Cabeçalho da Lista Trailing
value="#{ShuttleBean.shuttleValues}" //-- java.util.List no Backing Bean
partialTriggers="ShuttleFilter"] //-- Escuta eventos do Filter
[af:foreach var="li" items="#{bindings.Lbc.rangeSet}"]
//--> Dentro do pageDefinition, tenho um Table Binding de nome Lbc. Suas linhas
//--> são representadas pelo rangeSet, para cada uma adicionar um SelectItem
[af:selectitem label="#{li.DescLbc}" value="#{li.CodLbc}"]
[/af:selectitem]
[f:facet name="filter"]
[af:inputtext label="Filtro:" columns="5" valuechangelistener="#ShuttleBean.onFilterHeadingList}" autosubmit="true" id="ShuttleFilter"/]
[f:facet name="trailingFooter"]
[af:panelgroup]
[af:commandbutton text="Aplicar Valores" action="#{LbcShuttleBean.applyShuttleConfig}"]
[/af:commandbutton]
[/af:panelgroup]
[/f:facet]
[/af:selectmanyshuttle]


Este post vai ter mais 3 partes explicando o funcionamento da Shuttle, portanto fiquem ligados, e até mais!

quinta-feira, 13 de março de 2008

Histórico dos atributos.

Normalmente nas aplicações ADF precisamos manter as informações no histórico como:
Quem criou a informação?
Quando foi criada?
Quem fez a última modificação da entidade?
Quando foi modificada?
Quantas vezes a linha foi modificada?
Os Entity Objects armazenam as informações históricas na coluna do atributo conforme imagem abaixo:


Se um atributo de dados é do tipo Number, String ou Date, e não é parte da chave primária, então você pode ativar essa propriedade para ter sua entidade automaticamente manter o atributo de valor históricos para controle interno.

Se você escolher o tipo History Column (Version Number), o ADF automaticamente irá incrementar o valor do atributo numérico a cada vez que o objeto é atualizado. Se você escolher Create on, Create by, Modified on ou Modified by, o valor será atualizado ou criado pelo o usuário ou data corrente.
Até o próximo....
[]'s

terça-feira, 11 de março de 2008

Funcionalidades (Data Integrator e BPEL)

Essa é para a galera que vem entrando no mundo das Integrações. Com a chegada da técnologia Fusion Middleware da Oracle vem crescendo muito a procura por ferramentas de integração para e-Business Suite R12 e legados. Hoje se houve falar muito em ((Bpel - ESB) , BPA e Data Integrator) essas técnologias tem a mesma finalidade mas com caracteristicas diferentes, por exemplo:

* BPA: Ferramenta que vem do mundo ARIS, onde os analistas de negócios criam todas as regras e processos a serem integrados. Após a criação dos fluxos BPAs, é gerado um BPEL que será importado para o JDev para os ajustes técnicos.



* BPEL e ESB: Utilizam um servidor de aplicação e atuam na orquestração dos fluxos de integração, podendo ser desenvolvidas na IDE JDeveloper. São recomendados para pequenos e médios volumes de dados, pois proporcionam mais visibilidade dos processos via BPEL Console e até mesmo utilizando o BAM.

* Data Integrator: Essa Técnologia é voltada para grande volumes de cargas, pois a integração é flexível e muito produtiva, podendo atuar em sistemas de origem e destino heterogêneos. Com o Oracle Data Integrator, o usuário não necessita de um servidor separado para ETL, pois poderá executar as operações de transformação dentro do sistema de origem ou do datawarehouse de destino, melhorando o desempenho, baixando o custo e simplificando a administração.
A solução permite ainda atender a mais de uma centena de bibliotecas de códigos reutilizaveis, que agregam optimizações específicas de origem e destino para bases de dados e pacotes de aplicações.
A utilização da mesma pode trazer beneficios como:
- Integrar grandes quantidades de dados dispersos em ambientes mistos de TI.
- Ótima Performance.
- Escalabilidade.
- Fácil gerenciamento.
- Baixo Custo.

Galera nos próximos posts, detalharemos mais cada uma dessas técnologias.

abraços

ADF: Duas maneiras de popular valores por Sequence

Oi Pessoal! Aqui estamos novamente!

Esta semana tivemos a idéia de demonstrar um dos requisitos mais frequentes dentro dos aplicativos ADF: Popular códigos ou chaves primárias baseados em uma SEQUENCE do banco Oracle.

Neste caso, temos duas situações distintas: quando o próprio aplicativo popula o valor derivado da SEQUENCE, ou quando um programa externo (trigger, PL/SQL) popula o valor no momento da inserção do registro, sem a interferência da aplicação.

Na primeira situação, como o valor da PK é um atributo que deve ser populado logo na criação do registro na tabela (mapeado para um Entity Object), devemos popular no método create(AttributeList) que é o método onde fazemos o defaulting dos valores para entidades novas. Desta maneira:


public void create(AttributeList attr) {

SequenceImpl seq = new SequenceImpl("SEQ_NOME");
this.setAtributoChavePrimaria(seq.getSequenceValue()); //SEQ_NOME.NEXTVAL
}


No segundo caso, como o valor só é populado APÓS o ADF ter passado o controle para o PL/SQL, usamos uma outra funcionalidade dos Entity Objects. Ao abrirmos um Entity Object e selecionarmos o atributo em questão, podemos dizer que seu tipo é DBSequence. Ao fazê-lo, a propriedade "Refresh After Insert" é marcada. Esta propriedade diz para o Entity Object que algum agente externo vai modificar esta entidade após o INSERT na tabela, forçando os View Objects que utilizam esta entidade a reconsultar o estado da mesma logo após o comando de INSERT ser emitido contra o BD. Ou seja, o Entity Object faz o INSERT, a trigger popula a PK, o View Object detecta este "Refresh After Insert" e faz o SELECT novamente.
Abraços, e até!

sexta-feira, 7 de março de 2008

Dica PL/SQL: Criando uma lista IN dinâmica

Boa Tarde pessoal! Vamos a mais uma de PL/SQL que é interessante...

Uma situação que ocorre com frequência em aplicativos ADF é quando precisamos criar uma lista de itens ou checkboxes, em que o usuário seleciona quantos quiser e precisamos montar uma consulta baseada nestes checkboxes. Por exemplo, se o usuário seleciona os checkboxes A, B e C precisamos montar na consulta a cláusula:

AND tabela.campo IN('A','B','C')

Sendo que não sabemos exatamente quantas opções virão marcadas. Uma solução interessante para este caso é o uso do CAST e da função THE no PL/SQL, com o qual fazemos uma cláusula IN aceitar uma TABLE OF VARCHAR2. Aí é só popular esta table com os valores dinâmicos e passar pra consulta!

Primeiro, criamos o tipo:
CREATE TYPE t_empTab
IS TABLE OF VARCHAR2(50); <-- Tem que ser type do banco, não local ou de package

Depois, fazemos uma procedure PL/SQL que pode nos retornar um REF CURSOR por exemplo.

DECLARE
v_empTab t_empTab := t_empTab();
CURSOR c_empTab IS
SELECT empno
FROM scott.emp
WHERE ename IN
(SELECT * FROM THE(SELECT cast(v_empTab AS t_empTab) from dual));
v_empNo c_empTab%ROWTYPE;
BEGIN
v_empTab.EXTEND;
v_empTab(v_empTab.LAST) := 'SMITH';
v_empTab.EXTEND;
v_empTab(v_empTab.LAST) := 'ALLEN';

OPEN c_emp_tab;
RETURN c_emp_tab;
END;

É isso pessoal! Abraços!

quinta-feira, 6 de março de 2008

Bom entendimento: Oracle Forms X ADF BC

Galera, para quem vem do mundo Oracle Forms, segue um comparativo entre Oracle Forms e ADF Business Component. Nessa imagem dá para ter uma visão melhor das familiaridades entre as técnologias.



Qualquer dúvida é só nos enviar.

Abraços

Criando Aplicação ADF - Step-by-Step

Bom Dia Galera,

Para quem está começando a se interessar no mundo Oracle ADF (Application Development Framework), segue o link para criação de uma aplicação step-by-step:
http://www.oracle.com/technology/obe/obe1013jdev/masterdetail_adf_bc/master-detail_pagewith_adf_bc.htm.
(Obs.: Lembrando que no tutorial as imagens irão aparecer quando passarem o "Mouse" nas figurinhas de (Óculos).

Galera, bom divertimento.

quarta-feira, 5 de março de 2008

Pesquisa Linguística: Ignorando Acentos no SQL

Olá pessoal!

Para iniciar as nossas postagens, vamos com uma dica útil aqui nas terras tupiniquins: Como fazer uma pesquisa SQL que ignore acentos na cláusula WHERE.

Para isso, basta trocarmos o método de comparação para linguístico, e tornar a pesquisa binária ignorando acentos:

alter session set nls_comp=linguistic; <-- Pesquisa Linguística
alter session set nls_sort=binary_ai; <-- Binário ignorando acentos

select nome from tabela where nome = 'marcio';

nome
-------------
Márcio
MÁRCIO
marcio

Abraços!
PS: Essa dica foi cortesia do nosso amigo Ricardo Monteiro, grande mestre do PLSQL! Abraços pra ele!

Post Inicial!

Oi Pessoal!
Bem vindos ao mais novo Blog de Tecnologia Oracle do Brasil!

Apresentando os nossos contribuintes:

Thiago Souza - Analista Técnico Oracle Applications e Oracle Fusion Middleware, especialista em Oracle PLSQL com E-Business Suite (AOL), J2EE e Oracle SOA Suite

Robert Nunes - Analista Técnico Oracle Fusion Middleware, especialista em J2EE e Oracle SOA Suite.

Pretendemos postar aqui as nossas descobertas sobre a Tecnologia Oracle que forem interessantes de compartilhar com todos!

Até o próximo post, e abraços!
Thiago / Robert