sexta-feira, 22 de fevereiro de 2013

JSF: selectBooleanCheckbox não funciona no primeiro click

Problema:
selectBooleanCheckbox não funciona no primeiro click, apenas do segundo em diante.


<a4j:commandButton
image="/resources/images/16x16/add.png"
execute="@form"
render="baixaPane"
oncomplete="#{rich:component('baixaPane')}.show();">
</a4j:commandButton>


<rich:column>

<f:facet name="header">BAIXAR</f:facet>
<h:selectBooleanCheckbox  value="#{lancamento.baixar}"
valueChangeListener="#{movimentoContaMB.receptor}" >
<a4j:ajax execute="@form" render="@form" />
</h:selectBooleanCheckbox>
</rich:column>

Solução:
Remover o render do a4j:commandButton.
<a4j:commandButton
image="/resources/images/16x16/add.png"
execute="@form"
oncomplete="#{rich:component('baixaPane')}.show();">
</a4j:commandButton>

terça-feira, 5 de fevereiro de 2013

Hibernate: Multipos @DiscriminatorValue / Multiple discriminator values



// Classe Base 
@DiscriminatorFormula("case when str_origem in ('CP','FE') then 'CP' when str_origem in ('CR','FE') then 'CR'  when str_origem in ('CP','CR','FE') then 'AL' end")
@DiscriminatorValue(value="AL")
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class LancamentoCc implements Serializable{
}

// SubClasse
@Entity
@DiscriminatorValue(value="CP")
public class ContaPagar extends LancamentoCc implements Serializable,Cloneable{
}

JSF: Exibir valor de h:inputText em managed bean

FacesContext ctx = FacesContext.getCurrentInstance();

Map<String,String> request = ctx.getExternalContext().getRequestParameterMap();
String data = request.get("NRO_PROCESSO");

sexta-feira, 1 de fevereiro de 2013

Firebird: Exibir total de registros de todas as tabelas


CREATE PROCEDURE SOMAREGISTROS
RETURNS (
    TABELA VARCHAR (31),
    QTD_REG INTEGER)
AS  declare variable comando varchar(100);
  declare variable qtdtot integer;
  declare variable qtdtab integer;

begin
     qtdtot = 0;
     qtdtab = 0;
   
     for select rdb$relation_name
         from rdb$relations
         where rdb$flags = 1 and rdb$view_blr is null
         order by 1
         into :tabela do
     begin
          qtdtab = qtdtab + 1;
          comando = 'select count(*) from ' || :tabela;
          execute statement :comando into :qtd_reg;
          qtdtot = :qtdtot + :qtd_reg;
          suspend;
     end
     tabela = :qtdtab || ' Tabelas - Total:';
     qtd_reg = :qtdtot;
     suspend;
end

segunda-feira, 21 de janeiro de 2013

Ignorar acentos no Oracle/Hibernate


No HibernateUtil:
Funciona para todas as queries, porém, pode haver perda de performance.


    public static Session getSession() {   
        if (SESSION_THREAD.get() == null) {   
            Session session = factory.openSession();   
            session.createSQLQuery("alter session set nls_comp=linguistic").executeUpdate();
            session.createSQLQuery("alter session set nls_sort=binary_ai").executeUpdate();
            SESSION_THREAD.set(session);   
        }   
        return (Session) SESSION_THREAD.get();   
    }

Diretamente no método de pesquisa:

public List<ContaPagar> findContaPagar(String campoPesquisa, String valor,Integer startRow, Integer MaxRows) {
List<ContaPagar> list = new ArrayList<ContaPagar>();
try{
    session.createSQLQuery("alter session set nls_comp=linguistic").executeUpdate();
    session.createSQLQuery("alter session set nls_sort=binary_ai").executeUpdate();
  Criteria c = session.createCriteria(ContaPagar.class,"contaPagar");
  c.createAlias("contaPagar.historicoFinanceiro", "historico",JoinType.LEFT_OUTER_JOIN);
  c.setCacheable(true);
  c.setMaxResults(MaxRows);
  c.setFirstResult(startRow);
  c.add(Restrictions.eq(campoPesquisa, StringToObject.toObject(valor)));
  
  list = c.list();
}catch (Exception e) {
e.printStackTrace();
}
return list;
}

Ignorando acentos no Oracle



Ignorando acentos no Oracle


 Hoje vamos falar um pouco sobre usabilidade utilizando o Oracle. É muito comum vermos
em grande sites de e-commerce, buscas e relacionamentos, entre outros,
que mesmo digitando uma palavra, sem sua acentuação correta, ou até
mesmo com acento colocado errado, encontramos a informação
desejada. Pois bem, veremos como isso é possível utilizando um banco
de dados Oracle.
Para
a consulta funcionar, devemos alterar os parâmetros nls_comp
e nls_sort.
O
parâmetro nls_comp
determina qual método de comparação será considerado na consulta.
Após a instalação do banco de dados seu valor inicial é “binary”.
  • Binary: todo SQL executado e baseado no
    método binário, exatamente da forma que está escrita a
    informação.
  • Linguistic: todo SQL executado e baseado no Método lingüístico, considerando
    a busca e a ordenação como a palavra e falada.
O
Parâmetro nls_sort
define qual combinação lingüística será utilizada. Para
instalações em que o idioma escolhido é o Português
(nls_language= portuguese),
o valor para o padrão lingüístico é o “Binário” (nls_sort
= binary).
Por
exemplo, utilizando a combinação binária, temos as seguintes
opções:
O
sufixo _ci indica que será utilizada a combinação binária
com Case-Insensitive Sort.
O
sufixo _ai indica que será utilizada a combinação binária
com Accente Insensitive Sort. Pode haver outros valores para o
parâmetro como, por exemplo, xspanish_ia, mas isso já é
assunto para outro artigo.
  • Binary: segue
    exatamente da mesma forma que foi escrita.
  • Binary_ci: o algoritmo compara exatamente como a palavra foi
    escrita, desconsiderando as letras maiúsculas e minúsculas.
    (Case-Insensitive Sort).
  • Binary_ai: o algoritmo compara as palavras ignora a acentuação
    e os maiúsculos e minúsculos. (Accent Insensitive Sort).
Por exemplo:
A letra “a”
pode ser comparada com as letras “ã,á,ä,à,â,ä”; a
letra “é” pode ser comparada com as letras “e,è,ê,ë”,
dentre outras acentuações.
Estes
parâmetros podem ser definidos para todo o banco de dados ou somente
para uma seção. O ideal é utilizar em locais apenas onde há real
necessidade, pois se utilizado para todo ambiente, pode degradar a
performance do banco de dados.
Vamos praticar.
Em
nosso cenário vamos considerar um cadastro de produto, que será
utilizando em um E-Commerce.
Logo, se um cliente
digitar o nome do produto sem a acentuação necessária ou com a
acentuação errada, o sistema deve ser capaz de identificar e
retornar o produto que ele procura.
Vamos criar um simples
cadastro de produtos:

create table tb_produto(nome varchar2(40), valor number(16,4));
insert into tb_produto(nome,valor) values ('Fogão 4 bocas',300);
insert into tb_produto(nome,valor) values ('Fogao 6 bocas',600);
insert into tb_produto(nome,valor) values ('Lava-louças',800);
insert into tb_produto(nome,valor) values ('Jogo de Faca',120);

Primeira situação:

Digamos
que o cliente digitou o nome do produto com a acentuação correta,
mas toda a palavra em minúscula, e que estamos utilizando o método
binário para consulta. Logo, ele não encontrará o produto que
procura!
SQL> select * from tb_produto where nome = 'lava-louças';

NOME                                                  VALOR
---------------------------------------- ------------------
Vamos
mudar os nossos parâmetros para não diferenciar maiúsculos e
minúsculos.
SQL> alter session set nls_comp=linguistic;

Session 
altered

SQL> alter session set nls_sort=binary_ai;

Session
 altered
Veja
que agora o Oracle encontra o produto solicitado.
SQL>  select * from tb_produto where nome = 'lava-louças';

NOME                                                  VALOR
---------------------------------------- ------------------
Lava-louças                                        800,0000

Segunda situação:

Vamos
simular que o usuário digitou o nome do produto sem a acentuação
devida.
SQL> select * from tb_produto where nome = 'lava-louças';

NOME                                                  VALOR
---------------------------------------- ------------------
Agora
vamos mudar o método de comparação para lingüístico, na seção
que estamos trabalhando.
SQL> alter session set nls_comp=linguistic;

Session altered

SQL> alter session set nls_sort=binary_ai;

Session altered
Veja
que o Oracle interpretou a letra “c”
sendo a mesma que “ç”.
Ou seja, ignorou o acento.
SQL> select * from tb_produto where nome = 'lava-loucas';

NOME                                                  VALOR
---------------------------------------- ------------------
Lava-louças                                        800,0000
Veja que, mesmo se
forçarmos um acento indevido, poderemos saber o preço da
lava-louça.
SQL> select * from tb_produto where nome = 'lava-loucás';

NOME                                                  VALOR
---------------------------------------- ------------------
Lava-louças                                        800,0000
Assim chegamos ao final
de mais um artigo, espero que tenham gostado!

quinta-feira, 20 de dezembro de 2012

org.hibernate.AnnotationException: No identifier specified for entity

O problema ocorre porque a chave primária não foi definida!

Errado:
@Entity

@SequenceGenerator(name="SEQ_FIN_CLASSE",sequenceName="SEQ_FIN_CLASSE",allocationSize=1)
public class Classe implements Serializable{

@GeneratedValue(generator="SEQ_FIN_CLASSE",strategy=GenerationType.SEQUENCE)
private Integer id;
private String str_codigoclasse;
private String str_nomeclasse;
}


Certo:
@Entity

@SequenceGenerator(name="SEQ_FIN_CLASSE",sequenceName="SEQ_FIN_CLASSE",allocationSize=1)
public class Classe implements Serializable{

@GeneratedValue(generator="SEQ_FIN_CLASSE",strategy=GenerationType.SEQUENCE)
 @Id
private Integer id;
private String str_codigoclasse;
private String str_nomeclasse;
}