Filtro na select [RESOLVIDO]

10 respostas
M

Pessoal seguinte:
tenho uma select com UNION, ou seja, unindo duas consultas SQL que fiz… a consulta ta funcionando normal:

String sql = "select " + "clientes.cod_cliente, " + " docum.cod_empresa," + " docum.num_docum," + " docum.dat_emis," + " docum.dat_vencto_s_desc," + " (dat_vencto_s_desc - today) as dat_venc," + " docum.dat_prorrogada," + " (dat_prorrogada - today) as dat_pro," + " docum.val_liquido," + " docum.val_bruto," + " docum.val_saldo," + " docum_banco.num_titulo_banco," + "portador.cod_portador," + " portador.nom_portador," + " docum.ies_tip_docum," + " docum. ies_pgto_docum," + " case when (((docum.dat_vencto_s_desc - today) < 0) and ((docum.dat_prorrogada - today) is null))" + " then ((docum.val_saldo * ( 1 + (0.001* ((docum.dat_vencto_s_desc - today)*-1))))- docum.val_saldo)" + " else case when (((docum.dat_vencto_s_desc - today) < 0) and ((docum.dat_prorrogada - today) < 0 ) or" + " ((docum.dat_vencto_s_desc - today) < 0) and ((docum.dat_prorrogada - today) > 0))then" + " ((docum.val_saldo * ( 1 + (0.001* ((docum.dat_vencto_s_desc - today)*-1))))- docum.val_saldo)end end as val_juros," + " case when (((docum.dat_vencto_s_desc - today) < 0) and ((docum.dat_prorrogada - today) is null)) then" + " ((docum.val_saldo * ( 1 + (0.001* ((docum.dat_vencto_s_desc - today)*-1))))) else case when" + " (((docum.dat_vencto_s_desc - today) < 0) and ((docum.dat_prorrogada - today) < 0 ) or" + " ((docum.dat_vencto_s_desc - today) < 0) and ((docum.dat_prorrogada - today) > 0)) then" + " ((docum.val_saldo * ( 1 + (0.001* ((docum.dat_vencto_s_desc - today)*-1))))) end end as val_total_receber" + " from docum left outer join docum_banco on (docum.num_docum = docum_banco.num_docum)" + " left outer join portador on (docum.cod_portador = portador.cod_portador) and (docum.ies_tip_portador = portador.ies_tip_portador)" + " left outer join clientes on (docum.cod_cliente = clientes.cod_cliente)" + " where docum.val_saldo > 0" + " and clientes.cod_cliente like ? " -------------------------------------------------- + " union all" + " select " + " clientes.cod_cliente," + " cheque_mestre.cod_empresa," + " cheque_mestre.num_cheque," + " cheque_mestre.dat_emissao," + " cheque_mestre.dat_vencto," + " (cheque_mestre.dat_vencto - today) as dat_venc," + " cheque_vcto.dat_prorrogada," + " (cheque_vcto.dat_prorrogada - today) as dat_pro," + " cheque_mestre.val_bruto," + " cheque_mestre.val_bruto," + " cheque_mestre.val_saldo," + " '' as num_titulo_banco," + " portador.cod_portador," + " portador.nom_portador," + " 'CH' as ies_tip_cheque," + " '' as is_pgto_cheque," + " case when (((cheque_mestre.dat_vencto - today) < 0) and ((cheque_vcto.dat_prorrogada - today) is null))" + " then ((estorno_cheque.val_saldo * ( 1 + (0.001* ((cheque_mestre.dat_vencto - today)*-1))))- estorno_cheque.val_saldo)" + " else case when (((cheque_mestre.dat_vencto - today) < 0) and ((cheque_vcto.dat_prorrogada - today) < 0 )) or" + " (((cheque_mestre.dat_vencto - today) < 0) and ((cheque_vcto.dat_prorrogada - today) > 0))" + " then ((estorno_cheque.val_saldo * ( 1 + (0.001* ((cheque_vcto.dat_venc_ant - today)*-1))))- estorno_cheque.val_saldo) " + " end " + " end as val_juros," + " case when (((cheque_mestre.dat_vencto - today) < 0) and ((cheque_vcto.dat_prorrogada - today) is null))" + " then ((estorno_cheque.val_saldo * ( 1 + (0.001* ((cheque_mestre.dat_vencto - today)*-1))))) " + " else case when (((cheque_mestre.dat_vencto - today) < 0) and ((cheque_vcto.dat_prorrogada - today) < 0 )) or" + " (((cheque_mestre.dat_vencto - today) < 0) and ((cheque_vcto.dat_prorrogada - today) > 0))" + " then ((estorno_cheque.val_saldo * ( 1 + (0.001* ((cheque_vcto.dat_venc_ant - today)*-1)))))" + " end" + " end as val_saldo_jur" + " from cheque_mestre" + " left outer join cheque_vcto on (cheque_vcto.cod_empresa = cheque_mestre.cod_empresa and cheque_vcto.num_cheque = cheque_mestre.num_cheque" + " and cheque_vcto.num_cpf_cgc = cheque_mestre.num_cpf_cgc)" + " left outer join portador on (cheque_mestre.cod_portador = portador.cod_portador) and (cheque_mestre.ies_tip_portador = portador.ies_tip_portador)" + " left outer join clientes on (cheque_mestre.cod_cliente = clientes.cod_cliente)" + " left outer join estorno_cheque on (cheque_mestre.num_cheque = estorno_cheque.num_cheque)" + " where cheque_mestre.val_saldo > 0" + " and clientes.cod_cliente like ? "; -----------------------------

porem essas linhas que estao com os ----------------------------- é onde o usuario vai digitar
o código cliente e fazer a busca no banco especificamente do cliente qual o código foi digitado,porém esta dando o seguinte erro:

ja fiz o teste de tirar a primeirolinha pontilhada que é essa:

dai ele exuta, porém nao com o filtro que é o que o código que o usuario digitar…
eu sei que o erro ta acontecendo por causa dessas duas linhas que destaquei no meu código,
porem eu preciso das duas porque em na UNION eu estou juntando uma select de
cheques e outra de duplicatas entao preciso do filtro do código do cliente em duas condiçoes exatamente
como está ai,porém esta dando esse erro…

sera que alguem saberia me explicar como fazer pra que ainda continue com as duas linhas
destacadas no código e ainda com o código que o usuario digitar?

10 Respostas

mauricioadl

cara, confesso que nao li sua select pois deu uma preguiça de ler todo esse codigo rsss, mas tenho uma dica boa pra te dar. nao ficaria mais facil vc usar uma View no banco de dados? alem de melhorar e muito seu codigo, vai ficar muito mais rapido.

M

eu acabei de ter essa ideia msm amigo…

só me responde uma coisa…
depois qe eu criei a view eu vou conseguir um filtro com ela??

no caso dessa dai ficaria assim:
minha view
where cod_cliente = ‘código que o usuário digitar’

mauricioadl

consegue tranquilamente, a view funciona como se fosse uma tabela do banco.

M

e na hora que eu for fazer ela inserir os campos da minha select num array assim:

PreparedStatement stmt = this.conexao.prepareStatement(sql);

stmt.setString(1, nome);

ResultSet rs = stmt.executeQuery();

List ListaMovimentoFinanceiro = new ArrayList();

while (rs.next()) {

ConsultaMovimentoFinanceiroBeans CB = new ConsultaMovimentoFinanceiroBeans();

CB.setCod_cliente(rs.getString(“cod_cliente”));

CB.setCod_empresa(rs.getString(“cod_empresa”));

CB.setNum_docum(rs.getString(“num_docum”));

CB.setDat_emiss(rs.getString(“dat_emis”));

CB.setDat_vencto_s_desc(rs.getString(“dat_vencto_s_desc”));

CB.setDat_venc(rs.getString(“dat_venc”));

CB.setDat_prorrogada(rs.getString(“dat_prorrogada”));

CB.setDat_pro(rs.getString(“dat_pro”));

CB.setVal_liquido(rs.getString(“val_liquido”));

CB.setVal_bruto(rs.getString(“val_bruto”));

CB.setVal_saldo(rs.getString(“val_saldo”));

CB.setNum_titulo_banco(rs.getString(“num_titulo_banco”));

CB.setCod_portador(rs.getString(“cod_portador”));

CB.setNom_portador(rs.getString(“nom_portador”));

CB.setIes_tip_docum(rs.getString(“ies_tip_docum”));

CB.setIes_pgto_docum(rs.getString(“ies_pgto_docum”));

CB.setVal_juros(rs.getString(“val_juros”));

CB.setVal_total_receber(rs.getString(“val_total_receber”));

ListaMovimentoFinanceiro.add(CB);

}

vou ter que colocar os campos que criei na view ou os que eu fiz na select??

Mike_Cristian

ALGUÉM SABE SE TEM TREINAMENTO JAVA NO ES?
OU UM EXCELENTE ONLINE?

OBRIGADO.

A

Imagino que seu problema ocorre pois no seu select existem dois parâmetros (os ?) e você está setando apenas um.

Como acredito ser o mesmo valor em ambos você pode fazer:

PreparedStatement stmt = this.conexao.prepareStatement(sql);
stmt.setString(1, nome); 
stmt.setString(2, nome);

Não utilize views nesse caso, vai acabar com o plano de execução da query.

Você pode encarar uma view como um replace. Não fica compilada como uma procedure.

Com a view, teria que usar o filtro após todo seu select e não “dentro” das partes como está fazendo.

mauricioadl

vc coloca os campos que vc pois na view exemplo:

create view sua_view (

select campo1, campo2, etc from dual;

);

rs.getString(“campo1”);

ou assim:

create view sua_view (campo1, campo2, etc)

select * from dual;

);

rs.getString(“campo1”);

alguns bancos podem variar o modo de fazer a view.

ViniGodoy

Normalmente stored procedures tem mais performance do que views.
Como o Abel falou, em muitos BDs, a view tem a péssima mania de executar inteira antes de rodar um WHERE dado sobre ela, ou de confundir o plano de execução.

Em todo caso, Marcos, você forneceu o código do cliente duas vezes para o seu Statement? Ele não tem como saber que as duas interrogações referem-se a mesma coisa:

pstm.setString(1, codCliente); pstm.setString(2, codCliente);

ViniGodoy

Antes que eu me esqueça, tópico movido para o fórum de Persistência. Por favor, leia com atenção a descrição dos fóruns antes de postar. Um SQL desse tamanho jamais se encaixaria no fórum de “Java Básico”.

M

ok, ViniGodoy, da proxima vez vou ficar mais atento onde postar o
codigo… e por falar nisso consegui resolver com sua dica do

agradeço a todos por ajudarem…

Criado 6 de julho de 2011
Ultima resposta 7 de jul. de 2011
Respostas 10
Participantes 5