Gostaria de uma ajuda na seguinte situação. Tenho uma tela num sistema web ao qual tenho uma coluna que informa a quantidade em estoque dos itens. Eu preciso ter essa infomação em outra tela mas não consigo colocar. Abaixo segue os códigos explicando:
Esse primeiro trecho é da tela onde tenho o estoque dos itens na consulta:
<p:dataTablevar="item"value="#{consultaEstoqueMB.quantidadesEstoque}"rows="20"paginator="true"paginatorPosition="bottom"currentPageReportTemplate="Item {startRecord} a {endRecord} de {totalRecords}. Página {currentPage} de {totalPages}."id="dtQuantidades"rowStatePreserved="false"emptyMessage="Nenhum resultado encontrado"resizableColumns="true"caseSensitiveSort="false"paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"><p:ajaxevent="page"oncomplete="app.ajaxModal.init()"/><p:ajaxevent="filter"oncomplete="app.ajaxModal.init()"/><p:ajaxevent="sort"oncomplete="app.ajaxModal.init()"/><p:columnsortBy="#{item.qtdEstoque}"filterBy="#{item.qtdEstoque}"><f:facetname="header">Emestoque</f:facet><f:facetname="footer">Emestoque</f:facet><h:outputTextvalue="#{item.qtdEstoque}"><f:convertNumberminFractionDigits="#{configSistemaMB.financeiro.qtdCasasDecimais}"maxFractionDigits="#{configSistemaMB.financeiro.qtdCasasDecimais}"/></h:outputText></p:column></p:dataTable>
Esse outro trecho é da tela onde preciso ter a coluna com a exibição do estoque dos itens.
<p:dataTablevar="item"value="#{produtoServicoMB.produtosServicos}"rendered="#{not empty produtoServicoMB.produtosServicos}"rows="20"paginator="true"paginatorPosition="bottom"currentPageReportTemplate="Item {startRecord} a {endRecord} de {totalRecords}. Página {currentPage} de {totalPages}."id="searchResults"rowStatePreserved="false"emptyMessage="Nenhum resultado encontrado"resizableColumns="true"caseSensitiveSort="false"paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"><p:ajaxevent="page"oncomplete="app.ajaxModal.init()"/><p:ajaxevent="filter"oncomplete="app.ajaxModal.init()"/><p:ajaxevent="sort"oncomplete="app.ajaxModal.init()"/><f:facetname="header">Resultadosdabusca</f:facet><p:columnsortBy="#{item.codBarras}"filterBy="#{item.codBarras}"><f:facetname="header">Cód.barras</f:facet><f:facetname="footer">Cód.barras</f:facet>#{item.codBarras}</p:column><p:columnfilterBy="#{item.produto}"sortBy="#{item.produto}"><f:facetname="header">Tipo</f:facet><f:facetname="footer">Tipo</f:facet><spanjsf:rendered="#{item.produto}">Produto</span><spanjsf:rendered="#{not item.produto}">Serviço</span></p:column><p:columnsortBy="#{item.nome}"filterBy="#{item.nome}"><f:facetname="header">Nome</f:facet><f:facetname="footer">Nome</f:facet><divimgTooltip="#{not empty item.imagem}"prodId="#{item.id}">#{item.nome}</div></p:column>
Poderia explicar melhor? Quais entidades e métodos usados pra listagem? O seu #{item.produto} não tem estoque?
L
leo.souza
opa Bom Dia, eu preciso que ele faça exatamente o que faz no primeiro texto do código que mandei, pelo que vi ele pega a quantidade em estoque do item no item.qtdEstoque. Só que não consigo pegar isso e colocar no trecho seguinte, talvez por uma questão de herança não sei.
V
viniciusfip
Então coloque as classes envolvidas e os métodos. Assim fica mais fácil alguém identificar o possível problema.
Você declarou a variável item nos 2 DataTable e fez chamadas de 2 ManagedBeans diferentes… Poste seu código
L
leo.souza
Essa é a classe da tela onde quero colocar para exibir o estoque de cada item:
public class ProdutoServicoMB implements Serializable {
Essa é a classe usada para a tela onde já exibe o estoque dos itens:
public class ConsultaEstoqueMB implements Serializable {
privatefinalProdutoServicoDaoprodutoServicoDao;privatefinalMovimentoEstoqueDaomovimentoEstoqueDao;privatefinalViewQuantidadeEstoqueDaoquantidadeEstoqueDao;privateProdutoServicoproduto;privateList<ProdutoServico>produtos;privateList<MovimentoEstoque>movimentos;privateList<ViewQuantidadeEstoque>quantidadesEstoque;privateViewQuantidadeEstoquequantidadeEstoque;privatebooleanexibirTodosSelecionado;publicConsultaEstoqueMB(){this.produtoServicoDao=DaoFactory.getDao(ProdutoServicoDao.class);this.movimentoEstoqueDao=DaoFactory.getDao(MovimentoEstoqueDao.class);this.quantidadeEstoqueDao=DaoFactory.getDao(ViewQuantidadeEstoqueDao.class);this.movimentos=newArrayList<>();}publicvoidverificarPermissao(){if(!ConfigFacade.getAsBoolean("restricao.tela.estoque")){JsfFacade.redirect("/");Messenger.getInstance().addMessage(MessageType.INFO,"Desculpe. mas você não tem acesso aos serviços solicitados.",false);return;}elseif(!ConfigFacade.getAsBoolean("restricao.tela.consulta_estoque")){JsfFacade.redirect("/");Messenger.getInstance().addMessage(MessageType.INFO,"Desculpe, mas você não tem acesso a consulta de estoque.",false);}}publicvoidcallbackProduto(){Integerid=JsfFacade.getParameterAsInteger("id_produto");ProdutoServicoproduto=produtoServicoDao.getById(id);if(produtoinstanceofProdutoServico){setProduto(produto);this.exibirTodosSelecionado=false;this.quantidadesEstoque=null;AuditoriaFacade.save(TipoAuditoria.ESTOQUE_CONSULTA_MOVIMENTOS_REALIZADA);}}publicvoidexibirPorProduto(ProdutoServicoproduto){if(produtoinstanceofProdutoServico){setProduto(produto);this.exibirTodosSelecionado=false;this.quantidadesEstoque=null;AuditoriaFacade.save(TipoAuditoria.ESTOQUE_CONSULTA_MOVIMENTOS_REALIZADA);}}publicvoidexibirTodos(){this.exibirTodosSelecionado=true;this.quantidadesEstoque=quantidadeEstoqueDao.getAll();this.produto=null;AuditoriaFacade.save(TipoAuditoria.ESTOQUE_CONSULTA_SUMARIZADA_REALIZADA);}publicProdutoServicogetProduto(){returnproduto;}publicvoidsetProduto(ProdutoServicoproduto){this.produto=produto;this.movimentos=movimentoEstoqueDao.getAllByProduto(produto);this.quantidadeEstoque=quantidadeEstoqueDao.getByProduto(produto);}publicbooleanisProdutoSelecionado(){returnproduto!=null;}publicbooleanisProdutoNotServico(){return(produto==null)?false:produto.getProduto();}publicList<MovimentoEstoque>getMovimentos(){returnthis.movimentos;}publicViewQuantidadeEstoquegetQuantidadeEstoque(){returnquantidadeEstoque;}publicbooleanisExibirTodosSelecionado(){returnexibirTodosSelecionado;}publicList<ViewQuantidadeEstoque>getQuantidadesEstoque(){returnquantidadesEstoque;}
}
Espero que seja isso que vc pediu, ainda sou bem cru nisso e não foi eu que desenvolvi, caiu no meu colo essa tarefa para atender uma demanda.
V
viniciusfip
No ProdutoServicoMB a lista produtosServicos é do tipo ProdutoServico e vc declara private ViewQuantidadeEstoque qtdEstoque; no Produto, então tenta:
dessa forma estaria pegando o qtdEstoque da ViewQuantidadeEstoque
ou então posta aí as classes ViewQuantidadeEstoque e o ProdutoServico
L
leo.souza
Já tinha tentado isso que vc falou mas não deu certo. Abaixo seguem as classes que vc pediu:
trecho da ViewQuantidadeEstoque
public class ViewQuantidadeEstoque implements Serializable {
privatestaticfinallongserialVersionUID=1L;@Id@Column(name="fake_id")privateIntegerfakeId;@JoinColumn(name="produto",referencedColumnName="id",nullable=false)@OneToOneprivateProdutoServicoproduto;// @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation@Column(precision=17,scale=17)privateDoublecompra;@Column(precision=17,scale=17)privateDoublevenda;@Column(name="uso_interno",precision=17,scale=17)privateDoubleusoInterno;@Column(name="fabricacao",precision=17,scale=17)privateDoublefabricacao;publicViewQuantidadeEstoque(){}publicIntegergetFakeId(){returnfakeId;}publicvoidsetFakeId(IntegerfakeId){this.fakeId=fakeId;}publicProdutoServicogetProduto(){returnproduto;}publicvoidsetProduto(ProdutoServicoproduto){this.produto=produto;}publicDoublegetCompra(){returncompra;}publicvoidsetCompra(Doublecompra){this.compra=compra;}publicDoublegetVenda(){returnvenda;}publicvoidsetVenda(Doublevenda){this.venda=venda;}publicDoublegetUsoInterno(){returnusoInterno;}publicvoidsetUsoInterno(DoubleusoInterno){this.usoInterno=usoInterno;}publicDoublegetQtdEstoque(){returncompra-venda-usoInterno+fabricacao;}publicDoublegetFabricacao(){returnfabricacao;}publicvoidsetFabricacao(Doublefabricacao){this.fabricacao=fabricacao;}@OverridepublicStringtoString(){return"ViewQuantidadeEstoque{"+"fakeId="+fakeId+'}';}@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;ViewQuantidadeEstoquethat=(ViewQuantidadeEstoque)o;if(fakeId==null&&that.fakeId==null)returnsuper.equals(o);returnnewEqualsBuilder().append(fakeId,that.fakeId).isEquals();}
quer exibir essa informação no produto, certo?
Não sei bem como e onde a tela está sendo chamada, mas a primeira coisa que pensei foi: Posso alterar o value="#{produtoServicoMB.produtosServicos}" por : value="#{consultaEstoqueMB.quantidadesEstoque}" ? E assim chamar : #{item.produto.nome}, `#{item.qtdEstoque} mas nao sei o que impactaria na sua aplicação.
Outra coisa que imaginei foi: Criar um campo @transient em Produto e fazer algo do tipo na consulta:
publicList<ProdutoServico>pesquisaProdutos(){Stringjpql="select p.nome, (v.compra - v.venda - v.usoInterno + v.fabricacao) as qtdEstoque from ProdutoServico p"+" inner join ViewQuantidadeEstoque as v on v.produtoServico.id = p.id";jpql+=" order by p.nome";List<Object[]>list=result.getResultList();for(Object[]objectArray:list){ProdutoServicoproduto=newProdutoServico();produto.setNome(((String)objectArray[0]));produto.setQtdEstoque(((Double)objectArray[1]).doubleValue());produtosServicos.add(produto);}returnprodutosServicos;}
Nesse exemplo teria o nome e qtdEstoque que poderia ser usado
L
leo.souza
Bom dia, tudo certo ?
então, com relação a primeira idéia não posso fazer isso pq se eu alterar aquela linha pois na tela exibem várias outras colunas que dependem daquela classe e só adicionar a coluna em estoque.
Vou verificar com relação a segunda idéia que vc falou. Obrigado.
V
viniciusfip
Na sua ViewQuantidadeEstoque você tem Produto sendo assim você poderia fazer: #{item.produto.nome}; #{item.produto.codBarras}... esses dados do produto e também poderia fazer #{item.qtdEstoque} só pela listagem funcionaria, mas como disse: Não sei o que causaria na aplicação.
De toda forma tenta as 2 formas pra vê se resolve o problema.