Erro no Oracle falha ORA-22992

Setembro 11, 2009

Descrição

ORA-22992: cannot use LOB locators selected from remote tables

Causa

Este erro ocorre por causa que na consulta está sendo referenciado
um campo BLOB no meio do SQL. Esta falha ocorre porque o campo
blob não pode ser utilizado juntamente com um DBLINK, por causa
das restrições dos campos LOBs.

Correção

Para corrigir basta apenas no corpo da consulta retirar o campo BLOB,
desta forma o erro para de acontecer.

Exemplo:

Forma Errada
SELECT NI_PESSOA , VC_NOME , BL_FOTO FROM TB_PESSOA

Forma Correta
SELECT NI_PESSOA , VC_NOME FROM TB_PESSOA


Dependência DLL C++

Setembro 3, 2009

Dependência de dll é um saco com certeza, enquanto estava
tentando solucionar justamente um problema.

Com uma dll, muita antiga desenvolvida na empresa, achei
está excelente dica.

http://www.caloni.com.br/blog/archives/configurando-seus-projetos-no-visual-studio


Criando alias com o iBatis

Setembro 1, 2009
Nesta semana eu aprendi um macete sobre o iBatis do meu
amigo Wiliam Silva, que achei uma excelente prática.

No mapeamento do iBatis você precisa mapear o sqlMap, que
é um arquivo de configuração responsável pelos sql que vão
ser executados pela sua aplicação.

1 - Este mapeamento corresponde a 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="Carro" >

   <resultMap id="resultCarro" class="br.com.decimal.ibatis.Carro" >
      <result column="ID_CARRO" property="idCarro" jdbcType="DECIMAL" />
      <result column="NI_NUMERO_PORTA" property="numeroPorta" jdbcType="DECIMAL"/>
      <result column="VC_MODELO" property="modelo" jdbcType="DECIMAL"/>
      <result column="VC_NOME_CARRO" property="nomeCarro" jdbcType="DECIMAL"/>
   </resultMap>

   <select id="buscaCarro" resultClass="br.com.decimal.ibatis.Carro">
      SELECT * FROM t_carro
   </select>
</sqlMap>

A forma descrita acima é a maneira tradicional a se mapear uma consulta com o iBatis,
mas a grande sacada que ele usua é criar um alias.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap namespace="Carro" >
<pre>
<pre>   <typeAlias alias="carro" type="br.com.decimal.ibatis.Carro"/></pre>
</pre>
<resultMap id="resultCartao" >
 <result column="ID_CARRO" property="idCarro" jdbcType="DECIMAL" />
 <result column="NI_NUMERO_PORTA" property="numeroPorta" jdbcType="DECIMAL"/>
 <result column="VC_MODELO" property="modelo" jdbcType="DECIMAL"/>
 <result column="VC_NOME_CARRO" property="nomeCarro" jdbcType="DECIMAL"/>
 </resultMap>

 <select id="buscaCarro" resultClass="carro">
 SELECT * FROM t_carro
 </select>
</sqlMap>

Desta forma, você poderia trocar o retorno da classe de forma bem mais objetiva e
rápida.

Isto é apenas mais uma forma de fazer, caso seja util é só utilizar como eu
estou utilizando.

Até a próxima.


Disponibilizando um serviço com Struts 2

Agosto 19, 2009

Neste post explicarei como construir um serviço (SOA), através do
Struts 2 de uma forma meramente ilustrativa. Este post levará em
consideração que você já possuí o Struts 2, configurado
corretamente em sua página.

Para a construção deste serviço precisaremos, seguir apenas 4
passos bem simples.

1. Mapeamento da Action

Este mapeamento servira apenas como executador do método que se
encontra dentro da Action, você nunca utilizará o retorno do
mapeamento.

<action name="cliente!*" method="{1}" class="br.com.decimal.soa.action.ClienteAction">
   <result name="success" type="dispatcher"></result>
</action>

2. Implementação do Pojo de Cliente

public class Cliente implements Serializable {
   private Integer id;
   private Integer nome;
   private String endereco;

   // Getters and Setters
}

3. Implementação da Action

Na implementação da Action, você criará o serviço que será disponibilizado
para o seu cliente.

public class ClienteAction extends ActionSupport implements ServletResponseAware {
   private Integer id;

   public void liberarCompraCliente() {
      Short resultado = new Short("1");

      // Efetua um processamento qualquer e serializa a resposta, sendo que 1 = sucesso e 0 = falha

      serializarObjeto(resultado);
   }

   public HttpServletResponse getResponse() {
      return response;
   }

   public void setResponse(HttpServletResponse response) {
      this.response = response;
   }

   private void serializarObjeto(Object objeto) throws Exception {
      ServletOutputStream outputStream = null;
      ObjectOutputStream out = null;

      try {
         if (objeto == null) {
            throw new IllegalArgumentException("objeto cannot be null");
         }

         outputStream = response.getOutputStream();
         out = new ObjectOutputStream(outputStream);
         out.writeObject(objeto);
         outputStream.flush();
      } catch (IOException e) {
         throw new Exception(e);
      } finally {
         if (out != null) {
            try {
               out.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
<pre>         if (out != null) {
            try {
               out.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
      }
   }</pre>
}

4. Implementação do Cliente

Na implementação do lado cliente (desktop), implemente um método
que retorne um Short, que nada mais é do que a chamada para o
seu método remoto.

public Short getUrl(String value) throws IOException, ClassNotFoundException {
   URL url = new URL(value);
   ObjectInputStream out = new ObjectInputStream(url.openStream());
   return (Short)out.readObject();
}

Conclusão

Após a execução dos passos acima, você terá um serviço implementado
e que será acessivél através de serialização com o Struts 2. Esta com
certeza não é a melhor forma para se criar um serviço, mas com certeza
é uma maneira que pode ser implementado rapidamente.

Até a próxima pessoal.


SQL Padrão no iBatis

Agosto 13, 2009

Boa noite pessoal, vamos retirar um pouco a poeira do meu blog, estas últimas semanas tem sido bastante corrido.

Hoje eu estava fazendo uma consulta simples utilizando iBatis, que estava me
dando um enorme trabalho.  Até que descobri mais a função do CDATA para um xml.

Para fazer uma consulta simples como esta

SELECT * FROM t_pessoa p WHERE p.idade < 18

Estava me gerando uma enorme dor de cabeça pois na documentação eles indicam o
uso da tag <isLessThen> que deveria funcionar para fazer justamente está comparação
de menor.

Como não consegui compreender este comando corretamente, eu utilizei a seguinte forma
para a implementação da consulta.

<select id=”sqlMenorIdade” resultClass=”br.com.decimal.Pessoa” parameterClass=”int” >
<![CDATA[
SELECT * FROM t_pessoa WHERE t.idade = #idade#
]]>
</select>

Desta maneira funciona, porque a definição do XML ao parsear o arquivo encontra a diretiva
CDATA que ignora o conteúdo interno da mesma.

Espero que está dica seja util para você.

Até a próxima


Palavras Reservadas no extJS

Julho 25, 2009

Após um longo tempo sem escrever até que enfim saiu um novo
post, embora bem curto mas que pode lhe poupar um bom
tempo de trabalho desnecessário.

Nesta semana quando eu o Mineiro Jakui (risos), estavamos
construindo uma nova tela para uma funcionalidade que envolvia
um Wizard louco com o CardLayout nos deparamos com um erro
que nem tinhamos noção que poderia ocorrer.

Na funcionalidade que estavamos construindo definimos um id com
com o nome de ‘card’ que por coincidencia, e a forma como o componente
CardLayout pode ser chamado pela configuração layout: ‘card’.

Quando definimos o id com este nome, não conseguiamos acessar
o nosso componente através do comando Ext.getCmp(‘id’).

Este comando possibilita recuperar um determinando componente
da tela através do seu id.

Como estavamos colocando o nome resumido de um determinado
componente, ele simplesmente nos retornava ‘undefined’, que a grosso
modo significa que ainda não foi definido o determinado atributo.

Abaixo segue a lista de algumas palavras reservadas:

xtype            Class
————-    ——————
box              Ext.BoxComponent
button           Ext.Button
colorpalette     Ext.ColorPalette
component        Ext.Component
container        Ext.Container
cycle            Ext.CycleButton
dataview         Ext.DataView
datepicker       Ext.DatePicker
editor           Ext.Editor
editorgrid       Ext.grid.EditorGridPanel
grid             Ext.grid.GridPanel
paging           Ext.PagingToolbar
panel            Ext.Panel
progress         Ext.ProgressBar
propertygrid     Ext.grid.PropertyGrid
slider           Ext.Slider
splitbutton      Ext.SplitButton
statusbar        Ext.StatusBar
tabpanel         Ext.TabPanel
treepanel        Ext.tree.TreePanel
viewport         Ext.Viewport
window           Ext.Window

Toolbar components
—————————————
toolbar          Ext.Toolbar
tbbutton         Ext.Toolbar.Button
tbfill           Ext.Toolbar.Fill
tbitem           Ext.Toolbar.Item
tbseparator      Ext.Toolbar.Separator
tbspacer         Ext.Toolbar.Spacer
tbsplit          Ext.Toolbar.SplitButton
tbtext           Ext.Toolbar.TextItem

Form components
—————————————
form             Ext.FormPanel
checkbox         Ext.form.Checkbox
combo            Ext.form.ComboBox
datefield        Ext.form.DateField
field            Ext.form.Field
fieldset         Ext.form.FieldSet
hidden           Ext.form.Hidden
htmleditor       Ext.form.HtmlEditor
label            Ext.form.Label
numberfield      Ext.form.NumberField
radio            Ext.form.Radio
textarea         Ext.form.TextArea
textfield        Ext.form.TextField
timefield        Ext.form.TimeField
trigger          Ext.form.TriggerField

Essas palavras foram encontradas na documentação extJS.

Abraços e até a próxima


Contato inicial com o iBatis

Junho 15, 2009

Neste primeiro post sobre o assunto não explicarei detalhes sobre
a arquitetura do framework, ficando esta para um futuro post, o
objetivo deste post e apenas fazer uma breve introdução sobre
o assunto.

O que é o iBatis ?

Está semana comecei a pesquisar informações sobre iBatis. O iBatis
é um framework ORM, ele é mantido pela Apache, antes de começar
a trabalhar com ele, alguns pontos estavão me desagradando
bastante, até cheguei a abrir uma Thread em vários foruns
relacionados com Java sobre o assunto, onde perguntei se valia a
pena investir em um framework onde toda a sua configuração fosse
através de xml.

Atráves das várias respostas que obtive pude visualizar vários pontos
de vistas sobre o mesmo assunto, o que me chamou bastante a atenção.

A partir dai comecei á investigar como o iBatis trabalha, para isso dei
uma lida por cima no livro iBatis in action, onde fiquei conhecendo
bastante vantagens com relação a utilização do iBatis.

Vantagem

1. Reduz a quantidade de código

2. Maior controle em termo de abertura e fechamento de conexão

3. Provê a facilidade de se trabalhar com objetos ao invês de campos
do sql

4. Ele encapsula os comandos do JDBC

5. Mantém a performance do JDBC, o que torna bastante viavél em
sistemas que dependam desta caracteristica.

6. Emborá tenha bastante configuração em xml, não é uma coisa
dificil de ser mapeada.

Desvantagem

1. Muita configuração xml

2. O plugin iBator que gera os xmls de forma autómatica, ainda
deixa um pouco a desejar.

Exemplo com iBatis

Para construirmos um exemplo utilizando o iBatis devemos seguir os
seguintes passos.

1. Fazer download do iBatis neste endereço aqui

2. Adicione o mesmo no ClassPath do seu projeto.

3. Você deve copiar o arquivo SqlMapConfig que representa as
configurações do seu banco de dados, para dentro da pasta de
fontes do seu projeto.

4. Crie a Entidade que representará a sua tabela no banco de dados.

5. Depois construa o arquivo xml que representará o mapeamento
da sua tabela do banco de dados, este arquivo que criará o
relacionamento entre a tabela e seu objeto.

6. É so criar uma classe com um método main e testar.

Obs: Esta dica só funcionará se você tiver um banco de dados instalado no seu
computador, isso é obvio.(risos)

Conclusão

O iBatis é bastante util em alguns casos que você precise de
performance e um controle maior sobre as operações efetuadas
no banco de dados e que você não queira fazer utilizando JDBC Puro.

Como opção poderia existir duas formas de configurar um projeto usando
o iBatis com Anotação e utilizando xml.


Grid com Checkbox no Ext JS

Abril 24, 2009

Resolvi escrever está dica de como inserir um Checkbox em um Grid,
após passar algumas horas apanhando.

O caminho para obter o resultado esperado foi pesquisar, risos e
bastante. Brincadeira crie os métodos abaixo

function formatImagem(value, cell, rec, rowIndex, colIndex, ds) {
   return ['<img ', 'class="checkbox" ', 'src="./images/',
               value? 'checked.gif' : 'unchecked.gif', '"/>'].join("");
};

function formatBoolean(value, cell, rec, rowIndex, colIndex, ds) {
	  if(value == true)
		  return '<input type="checkbox" name="' + 1 + '" checked disabled/>';
	  else
		  return '<input type="checkbox" name="' + 1 + '" disabled/>';

};

Para a criação de uma Grid utilizei a classe Ext.grid.ColumnModel
do Ext JS, você pode encontrar mais detalhes sobre o assunto aqui.

var cm = new Ext.grid.ColumnModel([
   { header : 'Nome' , dataIndex : 'Nome', sortable : true} ,
   { header : 'Cargo' , dataIndex : 'Cargo', sortable : true } ,
   { header : 'Status' , dataIndex : 'Status 1' , renderer: formatBoolean } ,
   { header : 'Status' , dataIndex : 'Status 2' , renderer: formatImagem }
]);

O que faz a mágica e o atributo chamado renderer que renderiza
um HTML dentro do Grid com isto é possível inserir uma imagem
ou o tão esperado Checkbox.

Mas para futuras pesquisas pretendo descobrir como utilizar o
atributo editor que insere o Checkbox dentro do Grid como um
componente onde poderia facilitar bastante o seu uso.

Visualize o resultado deste tutorial:

Tela utilizando Grid com Checkbox

Tela utilizando Grid com Checkbox

Mas este será um próximo estudo que terei que fazer, por hora
ficaremos por aqui.

Espero que essa dica possa ser útil, pra alguém e se alguém quiser
completar, seria bem legal.


TabPanel não renderiza Ext JS

Março 18, 2009

Neste post iremos demonstrar como solucionar um problema que passei quando estava utilizando o componente do Ext JS.

Segue a baixo o código que cria um TabPanel:

var form = new Ext.form.FormPanel( {
	applyTo :Ext.getBody(),
	title :'TabPanel Simples',
	width :500,
	height :300,
	region :'center',

	items : [ {
		id :'tp',
		xtype :'tabpanel',
		activeTab :0,
		width :450,
		height :250,
		bufferResize :500,
		bodyBorder :false,
		items : [ {
			title :'Aba 1',
			// layout :'form',
			items : [ new Ext.form.TextField( {
				id :'tf1',
				name :'uname',
				inputType :'text',
				fieldLabel :'Name',
				width :150
			}) ]
		}, {
			title :'Aba 2',
			// layout :'form',
			items : [ new Ext.form.TextField( {
				id :'tf2',
				name :'uname',
				inputType :'text',
				fieldLabel :'Name',
				width :150
			}) ]
		} ]
	// Inserir Listener aqui
	} ]

});

Este trecho de código produz, uma tela parecida com está:

TabPanel com o conteúdo incorreto

TabPanel com o conteúdo incorreto

Após descomentar o seguinte trecho de código tudo volta ao normal:

layout:'form',

A resposta para este problema, e que aparentemente o componente
se perde e não consegue adicionar os outros componentes no local
correto.

Após ter descomentado o código, a tela ficará da seguinte maneira:

TabPanel correto, exibindo a informação do Painel interno.

Outra maneira de resolver este mesmo problema é implementando
um listener, que atualiza o layout em tempo de execução.

, listeners: {
   tabchange: function(tabp,tab){
      tab.doLayout();
   }
}

Espero que está dica sirva pra você caso esteja passando pela
mesma coisa.

Até a próxima.


Desabilitando caixa de texto do JFileChooser

Março 17, 2009

Nesta semana tinhamos uma atividade que parecia estremamente
simples. A única coisa que teriamos que fazer, era desabilitar a caixa
de texto do componente JFileChooser.

Até descobrirmos que não existia qualquer tipo método implementado
com está finalidade, ou seja teriamos que implementar isto.

Após algumas horas de pesquisas sem nenhum sucesso. Decidimos
perguntar a um colega ‘Que diga-se de passagem é o melhor Swingueiro,
que já conheci.’ , valeu Gyowanny  pela dica postada abaixo:

private void disableTextComponent(Container parent, boolean hide) { 
   Component[] c = parent.getComponents();  

   for(int j = 0; j < c.length; j++) {                     
      if(unpack(c[j]).equals("MetalFileChooserUI$3")) {                     
         if(hide)
            c[j].getParent().setVisible(false); 
         else    // disable 
            c[j].setEnabled(false);
       }</pre>
<pre class="gmail_quote">       if(((Container)c[j]).getComponentCount() > 0) { 
            disableTextComponent((Container)c[j], hide); 
       } 
   } 
}

private String unpack(Component c) {
   String s = c.getClass().getName(); 
   int dot = s.lastIndexOf("."); 
   if(dot != -1) 
      s = s.substring(dot+1); 
   return s; 
}

Para utilizar este código agora ficou fácil. Basta apenas.

JFileChooser chooser = new JFileChooser(".");
disableTextComponent(chooser,true);

Valeu e até a próxima.