JSF Bestimmte Daten aus der Datenbank anzeigen lassen

Crusher55

Mitglied
Hallo liebes Forum Team,

habe wieder ein problem wo ich nicht mehr weiter weiß, undzwar geht es um eine Bestands Seite, wo ich den Artikel aussuche und er mir denn Aktuellen Bestand und vlt auch andere sachen über den Artikel ausgibt. Bezüglich dieses Projektes muss ich leider mit DataModelList arbeiten was mir alles verkompliziert.

WWS.Java
Java:
    package controller;
     
    import javax.annotation.PostConstruct;
    import javax.annotation.Resource;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    import javax.faces.model.DataModel;
    import javax.faces.model.ListDataModel;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.transaction.HeuristicMixedException;
    import javax.transaction.HeuristicRollbackException;
    import javax.transaction.NotSupportedException;
    import javax.transaction.RollbackException;
    import javax.transaction.SystemException;
    import javax.transaction.UserTransaction;
    import model.Artikel;
    import model.Flaschenart;
    import model.Volumen;
     
    @ManagedBean(name = "mbWWS")
    @SessionScoped
     
    public class WWS {
     
        public WWS(){}
     
        private DataModel<Artikel> wws = new ListDataModel<Artikel>();
       
        @PersistenceContext
        private EntityManager em;
     
        @Resource
        private UserTransaction utx;
       
        private Artikel merkeArtikel = new Artikel();
     
        public void init() {
        try {
        utx.begin();
        em.persist(new Artikel("hugo", Volumen.Large, 15,20, Flaschenart.Glas, 6,15,15,15));
        em.persist(new Artikel("hans", Volumen.Large, 15,20, Flaschenart.Glas, 5,15,15,15));
            wws.setWrappedData(em.createNamedQuery("SelectWWS").getResultList());
            utx.commit();
        } catch (Exception e) {
                e.printStackTrace();
    }  
        }
        public Artikel getMerkeArtikel() {
            return merkeArtikel;
        }
       
        public void setMerkeArtikel(Artikel merkeArtikel) {
            this.merkeArtikel = merkeArtikel;
        }
       
        public DataModel<Artikel> getWws() {
            return wws;
        }
     
        public void setWws(DataModel<Artikel> wws) {
            this.wws = wws;
        }
    @SuppressWarnings("unchecked")
	public List<Artikel> getArtikelListFromWrapper() {
        this.artikelList = (ArrayList<Artikel>) this.wws.getWrappedData();
        
        return artikelList;
     }
	public String edit() {
		merkeArtikel = wws.getRowData();
		return "bestand";
	}
    }

Artikel.Java
Java:
    import javax.persistence.Entity;
    import javax.persistence.Enumerated;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.NamedQuery;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
     
    @NamedQuery(name="SelectWWS", query="Select a from Artikel a")
    @Entity
     
    public class Artikel {
       
        private static final long serialVersionUID = 2615809714551834760L;
        @Id @GeneratedValue(strategy=GenerationType.AUTO)
        private Integer id;
        @Size(min=1, max=30)
        String marke;
        @Enumerated
        Volumen volumen;
        @NotNull
        int anzKi;
        @NotNull
        int anzFl;
        @Enumerated
        Flaschenart flaschenart;
        @NotNull
        double steuersatz;
        @NotNull
        double gewinn;
        @NotNull
        double einkaufspreis;
        @NotNull
        double verkaufspreis;
        String Fehler;
       
        public Artikel(){
           
        }
       
        public Artikel(String marke,Volumen volumen,int anzKi,int anzFl,Flaschenart flaschenart,double steuersatz,double gewinn,double einkaufspreis,double verkaufspreis){
            super();
            this.marke = marke;
            this.volumen = volumen;
            this.anzKi = anzKi;
            this.anzFl = anzFl;
            this.flaschenart = flaschenart;
            this.steuersatz = steuersatz;
            this.gewinn = gewinn;  
            this.einkaufspreis = einkaufspreis;
            this.verkaufspreis = verkaufspreis;
       
        }
    //Getter und Setter
    }
Bestand.xhtml

HTML:
<h:outputLabel for="marke" value="Artikel: " />
		<p:selectOneMenu id="marke" value="#{mbWWS.artikelListFromWrapper}" required="true">
		<f:selectItems value="#{mbWWS.artikelListFromWrapper}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel}"/>
	 <p:ajax event="valueChange" update="grid" />
		</p:selectOneMenu> 
		
		<h:outputLabel for="anzKi" value="Kistenanzahl:" />
		<h:outputText  value="#{mbWWS.merkeArtikel.anzKi}" required="true" immediate="true"  />

Das ausfüllen der Felder bekomm ich hin, wenn ich die Bestands Seite mit einer Methode aufrufe und mit den befehl. merkeKunde = wws.getRowData(); arbeite bekomm leider nur die zuletzt benutzten Daten.

Ich hoffe ihr könnt mir helfen.
 
wws.getRowData(); arbeite bekomm leider nur die zuletzt benutzten Daten.
Genau das gibt die Methode getRowData() ja auch zurück, wenn der Index auf dem letzten Element steht. Wenn du die ganze Liste oder mehrere Einträge aus der Liste willst, musst du sie dir aus dem Wrapper-Objekt holen: getWrappedData(). Steht auch so in der Doku zu DataModel bzw. ListDataModel.
 
Hab es mal so versucht wie du es beschrieben hast und versucht auf den einzelnen eintrag der Liste zuzugreifen, bekomme aber leider dann einen convertierungsfehler.

HTML:
<p:dataTable id="grid" var="artikel" value="#{mbWWS.artikelListFromWrapper}" columns="2" cellspading="5" headerClass="header" footerClass="footer">  
    	<f:facet name="header">  Artikel Bestand    </f:facet>  
 
    	<h:outputLabel for="marke" value="Artikel: " />
		<p:selectOneMenu id="marke" value="#{mbWWS.artikelListFromWrapper}" required="true">
		<f:selectItems value="#{mbWWS.artikelListFromWrapper}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel}"/>
	 <p:ajax event="valueChange" update="grid" />
		</p:selectOneMenu> 
		
		<h:outputLabel for="anzKi" value="Kistenanzahl:" />
		<h:outputText  id="anzKi" value="#{artikel.anzKi}" />

	</p:dataTable>
 
Diese View ergibt keinen Sinn. Du vermischst eine Tabelle mit einem Auswahlmenü und verwendest für beide die gleiche Quelle. Hast du dir die Showcases von PrimeFaces schon angeschaut? Sieht nämlich nicht danach aus.
Gib doch außerdem konkret an, in welcher Zeile in der View und im Bean das Problem auftaucht und welche Fehlermeldung geworfen wird.
 
ok die Fehlermeldung habe ich nicht mehr habe es umgeschrieben, bekomme auch die Anzahl aus der Liste ausgegeben.
Doch wenn ich einen Artikel aussuche und das feld aktuallisiere ist es danach leer.

HTML:
<p:panelGrid id="grid" var="artikel" value="#{mbWWS.artikelList}" columns="2" cellspading="5" headerClass="header" footerClass="footer">  
    	<f:facet name="header">  Artikel Bestand    </f:facet>  
 
    	<h:outputLabel for="marke" value="Artikel: " />
		<p:selectOneMenu id="marke" value="#{mbWWS.artikelListFromWrapper}" required="true">
		<f:selectItems value="#{mbWWS.artikelListFromWrapper}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel}"/>
	    <p:ajax update="anz" />
		</p:selectOneMenu>  
		
		<h:outputText value="Kistenanzahl:" />
		<h:outputText id="anz" value="#{artikel.anzKi}" />

	</p:panelGrid>
 
HTML:
<p:selectOneMenu id="marke" value="#{mbWWS.artikelListFromWrapper}" required="true">
<f:selectItems value="#{mbWWS.artikelListFromWrapper}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel}"/>
Das ergibt ebenfalls keinen Sinn. selectOneMenu erhält das ausgewählte Element, selectItems die Liste der auswählbaren Elemente.
 
Habe es entsprechend geändert, doch komme immer noch nicht weiter. Muss ich hier eventuell mit DataTable arbeiten?

HTML:
<p:panelGrid id="grid" var="artikel" value="#{mbWWS.artikelList}" columns="2" cellspading="5" headerClass="header" footerClass="footer">  
    	<f:facet name="header">  Artikel Bestand    </f:facet>  
 
    	<h:outputLabel for="marke" value="Artikel: " />
		<p:selectOneMenu id="marke" value="#{mbWWS.merkeArtikel.marke}" required="true">
		<f:selectItems value="#{mbWWS.artikelListFromWrapper}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel}"/>
	    <p:ajax update="anz" />
		</p:selectOneMenu>  
		
		<h:outputText value="Kistenanzahl:" />
		<h:outputText id="anz" value="#{artikel.anzKi}" />

	</p:panelGrid>
 
Für mich sieht das aus, als ob du wild irgendwas rumprobierst, ohne darüber nachzudenken, was der Code überhaupt soll. So drehen wir uns allerdings im Kreis.
Crusher55 hat gesagt.:
HTML:
<p:panelGrid id="grid" var="artikel" value="#{mbWWS.artikelList}" columns="2" cellspading="5" headerClass="header" footerClass="footer">
p😛anelGrid kennt kein Attribut value. Es ergibt auch keinen Sinn, weil es ein Container-Tag ist.
 
Bin halt noch ein Anfänger bezüglich JSF, bin erst seit paar wochen dabei und ist auch nur ein einmaliges Projekt. Deswegen kann es dazu kommen das ich manchmal dumme Fragen stelle.

Nun weiter, was ich nicht verstehe ist wenn ich Probeweise als Ausgabe die Marke ausgeben lasse die ich ausgewählt habe bekomme ich nur die Adressierung des Feldes.

HTML:
	<p:panelGrid id="grid" columns="2"  headerClass="header">
 
    	<f:facet name="header">  Artikel Bestand    </f:facet>  
 
    	<h:outputLabel for="marke" value="Artikel: " />
		<p:selectOneMenu id="marke" value="#{mbWWS.merkeArtikel.marke}" required="true">
		<f:selectItems value="#{mbWWS.artikelListFromWrapper}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel}"/>
	    <p:ajax update="anz" />
		</p:selectOneMenu>  
		
		<h:outputText value="Kistenanzahl:" />
		<h:outputText id="anz" value="#{mbWWS.merkeArtikel.marke}" />
		
	</p:panelGrid>
 
HTML:
<p:selectOneMenu id="marke" value="#{mbWWS.merkeArtikel.marke}" required="true">
<f:selectItems value="#{mbWWS.artikelListFromWrapper}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel}"/>
Das ausgewählte Element sollte logischerweise vom gleichen Typ sein wie die auswählbaren Elemente in der Liste.
 
So habe dieses Problem auch bewältigen können, nun habe ich aber immer noch mein Grundproblem das wenn ich einen Artikel auswähle und danach das Feld Kistenanzahl aktuallisiere bekomme ich nicht den dazugehörigen Wert.

HTML:
	<p:panelGrid id="grid" columns="2"  headerClass="header">
 
    	<f:facet name="header">  Artikel Bestand    </f:facet>  
 
    	<h:outputLabel for="marke" value="Artikel: " />
		<p:selectOneMenu id="marke" value="#{mbWWS.merkeArtikel.marke}" required="true">
		<f:selectItems value="#{mbWWS.artikelListFromWrapper}" var="artikel" itemLabel="#{artikel.marke}" itemValue="#{artikel.marke}"/>
	    <p:ajax update="anz" />
		</p:selectOneMenu>  
		
		<h:outputText value="Kistenanzahl:" />
		<h:outputText id="anz" value="#{mbWWS.merkeArtikel.anzKi}" />
		
	</p:panelGrid>
 
Also muss ich mit listener arbeiten und eine Methode aufrufen die Theoretisch den Artikel Namen vergleicht und wenn es dann zutrifft die Kistenanzahl zurückliefert?

Doch das ist nicht direkt was ich will, ich will genau auf den richtigen Index der Liste wechseln so das ich alle Daten des Artikels habe, nur weis ich nicht genau wie ich das mache und welche Liste ich dafür anvisiere die Arrayliste, die ich aus der Wrapper klasse habe oder die DataModelList?
 

Zurück
Oben