Iniciante Java jsf

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:dataTable var="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:ajax event="page" oncomplete="app.ajaxModal.init()"/>
                        <p:ajax event="filter" oncomplete="app.ajaxModal.init()"/>
                        <p:ajax event="sort" oncomplete="app.ajaxModal.init()"/>
						
						 <p:column sortBy="#{item.qtdEstoque}" filterBy="#{item.qtdEstoque}">
                            <f:facet name="header">Em estoque</f:facet>
                            <f:facet name="footer">Em estoque</f:facet>
                            <h:outputText value="#{item.qtdEstoque}">
                                <f:convertNumber minFractionDigits="#{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:dataTable var="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:ajax event="page" oncomplete="app.ajaxModal.init()"/>
                    <p:ajax event="filter" oncomplete="app.ajaxModal.init()"/>
                    <p:ajax event="sort" oncomplete="app.ajaxModal.init()"/>

                    <f:facet name="header">
                        Resultados da busca
                    </f:facet>

                    <p:column sortBy="#{item.codBarras}" filterBy="#{item.codBarras}">
                        <f:facet name="header">Cód. barras</f:facet>
                        <f:facet name="footer">Cód. barras</f:facet>
                        #{item.codBarras}
                    </p:column>

                    <p:column filterBy="#{item.produto}" sortBy="#{item.produto}">
                        <f:facet name="header">Tipo</f:facet>
                        <f:facet name="footer">Tipo</f:facet>
                        <span jsf:rendered="#{item.produto}">Produto</span>
                        <span jsf:rendered="#{not item.produto}">Serviço</span>
                    </p:column>
                    <p:column sortBy="#{item.nome}" filterBy="#{item.nome}">
                        <f:facet name="header">Nome</f:facet>
                        <f:facet name="footer">Nome</f:facet>

                        <div imgTooltip="#{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?

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.

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

Essa é a classe da tela onde quero colocar para exibir o estoque de cada item:

public class ProdutoServicoMB implements Serializable {

private static final Logger logger = LoggerFactory.getLogger(ProdutoServicoMB.class);

private ProdutoServico produtoServico;
private boolean isTipoSelecionado;
private String terms;
private boolean isError;
private boolean isSearch;
private boolean isProdutoAdicionado;
private boolean habilitarNFe;
private Double estoqueInicial;
private Double qtdBusca;
private Double qtdTmpBusca;
private ViewQuantidadeEstoque qtdEstoque;
private boolean cancelamentoConcluido;
private boolean ativamentoConcluido;
private Double pctValorVendaCalculo;
private final Map<Integer, ProdutoServico> sequencial;
private Integer numeroSequencialBusca;

private List<ProdutoServico> produtosServicos;
private List<ProdutoServico> variacoesRemover;
private List<CategoriaProduto> categorias;
private List<ItemProdutoComposto> itensRemoverProdComposto;
private List<ViewProdutoEstoqueBaixo> viewProdutoEstoqueBaixo;

private final ProdutoServicoDao produtoServicoDao;
private final PessoaDao pessoaDao;
private final CategoriaProdutoDao categoriaDao;
private final ViewQuantidadeEstoqueDao quantidadeEstoqueDao;
private final ViewProdutoEstoqueBaixoDao viewProdutoEstoqueBaixoDao;

private Part imagemPart;

// 1 - Simples; 2 - Composto; 3 - Derivado
private Integer tipoProduto;

public ProdutoServicoMB() {
    this.produtoServico = new ProdutoServico();
    this.produtoServico.setDadosFiscais(null);
    this.isTipoSelecionado = false;
    this.habilitarNFe = false;
    this.estoqueInicial = 0D;
    this.qtdBusca = 1D;
    this.categoriaDao = DaoFactory.getDao(CategoriaProdutoDao.class);
    this.quantidadeEstoqueDao = DaoFactory.getDao(ViewQuantidadeEstoqueDao.class);
    this.categorias = categoriaDao.getAll();
    this.sequencial = new HashMap<>();
    this.variacoesRemover = new ArrayList<>();
    this.itensRemoverProdComposto = new ArrayList<>();

    this.pctValorVendaCalculo = 100D;
    this.tipoProduto = 1;

    this.produtoServicoDao = DaoFactory.getDao(ProdutoServicoDao.class);
    this.pessoaDao = DaoFactory.getDao(PessoaDao.class);
    this.viewProdutoEstoqueBaixoDao = DaoFactory.getDao(ViewProdutoEstoqueBaixoDao.class);

    if (this.produtoServico.getDadosFiscais() == null) {
        this.produtoServico.setDadosFiscais(new DadosFiscaisNFe());
        this.produtoServico.getDadosFiscais().setProdutoServico(this.produtoServico);
    }

    this.produtoServico.getDadosFiscais().setProdutoServico(this.produtoServico);
}

Essa é a classe usada para a tela onde já exibe o estoque dos itens:

public class ConsultaEstoqueMB implements Serializable {

private final ProdutoServicoDao produtoServicoDao;
private final MovimentoEstoqueDao movimentoEstoqueDao;
private final ViewQuantidadeEstoqueDao quantidadeEstoqueDao;

private ProdutoServico produto;
private List<ProdutoServico> produtos;
private List<MovimentoEstoque> movimentos;
private List<ViewQuantidadeEstoque> quantidadesEstoque;
private ViewQuantidadeEstoque quantidadeEstoque;
private boolean exibirTodosSelecionado;

public ConsultaEstoqueMB() {
    this.produtoServicoDao = DaoFactory.getDao(ProdutoServicoDao.class);
    this.movimentoEstoqueDao = DaoFactory.getDao(MovimentoEstoqueDao.class);
    this.quantidadeEstoqueDao = DaoFactory.getDao(ViewQuantidadeEstoqueDao.class);

    this.movimentos = new ArrayList<>();
}

public void verificarPermissao(){
    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;
    }else if(!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);
    }
}

public void callbackProduto() {

    Integer id = JsfFacade.getParameterAsInteger("id_produto");
    ProdutoServico produto = produtoServicoDao.getById(id);

    if (produto instanceof ProdutoServico) {
        setProduto(produto);
        this.exibirTodosSelecionado = false;
        this.quantidadesEstoque = null;

        AuditoriaFacade.save(TipoAuditoria.ESTOQUE_CONSULTA_MOVIMENTOS_REALIZADA);
    }
}

public void exibirPorProduto(ProdutoServico produto) {
    if (produto instanceof ProdutoServico) {
        setProduto(produto);
        this.exibirTodosSelecionado = false;
        this.quantidadesEstoque = null;

        AuditoriaFacade.save(TipoAuditoria.ESTOQUE_CONSULTA_MOVIMENTOS_REALIZADA);
    }
}

public void exibirTodos() {
    this.exibirTodosSelecionado = true;
    this.quantidadesEstoque = quantidadeEstoqueDao.getAll();
    this.produto = null;

    AuditoriaFacade.save(TipoAuditoria.ESTOQUE_CONSULTA_SUMARIZADA_REALIZADA);
}

public ProdutoServico getProduto() {
    return produto;
}

public void setProduto(ProdutoServico produto) {
    this.produto = produto;

    this.movimentos = movimentoEstoqueDao.getAllByProduto(produto);
    this.quantidadeEstoque = quantidadeEstoqueDao.getByProduto(produto);
}

public boolean isProdutoSelecionado() {
    return produto != null;
}

public boolean isProdutoNotServico() {
    return (produto == null) ? false : produto.getProduto();
}

public List<MovimentoEstoque> getMovimentos() {
    return this.movimentos;
}

public ViewQuantidadeEstoque getQuantidadeEstoque() {
    return quantidadeEstoque;
}

public boolean isExibirTodosSelecionado() {
    return exibirTodosSelecionado;
}

public List<ViewQuantidadeEstoque> getQuantidadesEstoque() {
    return quantidadesEstoque;
}

}

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.

No ProdutoServicoMB a lista produtosServicos é do tipo ProdutoServico e vc declara private ViewQuantidadeEstoque qtdEstoque; no Produto, então tenta:

 <h:outputText value="#{item.qtdEstoque.qtdEstoque}">

dessa forma estaria pegando o qtdEstoque da ViewQuantidadeEstoque

ou então posta aí as classes ViewQuantidadeEstoque e o ProdutoServico

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 {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "fake_id")
private Integer fakeId;
@JoinColumn(name = "produto", referencedColumnName = "id", nullable = false)
@OneToOne
private ProdutoServico produto;
// @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)
private Double compra;
@Column(precision = 17, scale = 17)
private Double venda;
@Column(name = "uso_interno", precision = 17, scale = 17)
private Double usoInterno;
@Column(name = "fabricacao", precision = 17, scale = 17)
private Double fabricacao;

public ViewQuantidadeEstoque() {
}

public Integer getFakeId() {
    return fakeId;
}

public void setFakeId(Integer fakeId) {
    this.fakeId = fakeId;
}

public ProdutoServico getProduto() {
    return produto;
}

public void setProduto(ProdutoServico produto) {
    this.produto = produto;
}

public Double getCompra() {
    return compra;
}

public void setCompra(Double compra) {
    this.compra = compra;
}

public Double getVenda() {
    return venda;
}

public void setVenda(Double venda) {
    this.venda = venda;
}

public Double getUsoInterno() {
    return usoInterno;
}

public void setUsoInterno(Double usoInterno) {
    this.usoInterno = usoInterno;
}

public Double getQtdEstoque() {
    return compra - venda - usoInterno + fabricacao;
}

public Double getFabricacao() {
    return fabricacao;
}

public void setFabricacao(Double fabricacao) {
    this.fabricacao = fabricacao;
}

@Override
public String toString() {
    return "ViewQuantidadeEstoque{" + "fakeId=" + fakeId + '}';
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;

    if (o == null || getClass() != o.getClass()) return false;

    ViewQuantidadeEstoque that = (ViewQuantidadeEstoque) o;

    if (fakeId == null && that.fakeId == null) return super.equals(o);
    return new EqualsBuilder()
            .append(fakeId, that.fakeId)
            .isEquals();
}

Trecho da ProdutoServico:

public ProdutoServico() {
this.initObject();
}

public ProdutoServico(Integer id) {
    this();
    this.id = id;
}

public ProdutoServico(Integer id, boolean produto, String nome, double valorVenda) {
    this();
    this.id = id;
    this.produto = produto;
    this.nome = nome;
    this.valorVenda = valorVenda;
}

private void initObject() {
    this.valorCompra = 0D;
    this.valorVenda = 0D;
    this.estoqueInicial = 0D;
    this.produtoComposto = false;
    this.produtoVariado = false;
    this.produto = true;
    this.dadosFiscais = new DadosFiscaisNFe();
    this.dadosFiscais.setProdutoServico(this);
    this.formatoValor = FormatoValorProduto.FIXO;
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public boolean getProduto() {
    return produto;
}

public void setProduto(boolean produto) {
    this.produto = produto;
}

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:

 public List<ProdutoServico> pesquisaProdutos() {

 String jpql = "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) {
		ProdutoServico  produto = new ProdutoServico();
		produto.setNome(((String) objectArray[0]));
		produto.setQtdEstoque(((Double) objectArray[1]).doubleValue());
		
		produtosServicos.add(produto);
	}
return produtosServicos;
}

Nesse exemplo teria o nome e qtdEstoque que poderia ser usado

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.

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.