# Aus zwei bestehenden Table eine zusätzliche Gemeinsame machen (JavaFX)



## Zakon (15. Dez 2020)

Hallo ich habe eine Datenbank aus drei Tabellen Mitarbeiter,Firmen,Produkte.
Meine Frage nun ich habe eine TableUser und eine TableFirmen mit den dazugehörogen Informationen.


```
@FXML
    public void loadDataFirMi(ActionEvent event) {
        Connection conn = DBConnection.getInstance().getCon();
        String MiID_eingabe=MiID.getText();
        String FirID_eingabe=FirID.getText();
        try {
            data = FXCollections.observableArrayList();
            ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM Frimen F JOIN Mitarbeiter M ON F.ID=M.Firmen_ID WHERE Mitarbeiter_ID ='"+MiID_eingabe+"' OR ID='"+FirID_eingabe+"'");
            while (rs.next()) {
                data.add(new UserDetails(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getInt(4)));
            }
            rs.close();

            if (conn != null && conn.isClosed()) {
                System.out.println("Connected");
            } else {
                System.out.println("Connection lost");
            }
        } catch (SQLException s) {
            System.out.println("Error " + s);
        }

        columnID.setCellValueFactory(new PropertyValueFactory<>("ID"));
        columnFirmenName.setCellValueFactory(new PropertyValueFactory<>("FirmenName"));

        tableFirmen.setItems(null);
        tableFirmen.setItems(data1);

        columnMitarbeiter_ID.setCellValueFactory(new PropertyValueFactory<>("Mitarbeiter_ID"));
        columnVorname.setCellValueFactory(new PropertyValueFactory<>("Vorname"));
        columnNachname.setCellValueFactory(new PropertyValueFactory<>("Nachname"));
        columnFirmen_ID.setCellValueFactory(new PropertyValueFactory<>("Firmen_ID"));

        tableUser.setItems(null);
        tableUser.setItems(data);
    }
```

Kann ich die "zusammenfügen", dass ich halt nicht nochmal eine Table extra für beide anlegen muss und alles nochmal schreiben muss?

EDIT:
Meine Details für die jweiliogen Tabellen sehen so aus:

```
public class FirmenDetails {

    private final IntegerProperty ID;
    private final StringProperty FirmenName;


    public FirmenDetails(int ID,String FirmenName){
        this.ID = new SimpleIntegerProperty(ID);
        this.FirmenName = new SimpleStringProperty(FirmenName);
    }

    public int getID() {
        return ID.get();
    }

    public IntegerProperty IDProperty() {
        return ID;
    }

    public void setID(int ID) {
        this.ID.set(ID);
    }

    public String getFirmenName() {
        return FirmenName.get();
    }

    public StringProperty firmenNameProperty() {
        return FirmenName;
    }

    public void setFirmenName(String firmenName) {
        this.FirmenName.set(firmenName);
    }
}
```

Sind in der Controller class so verbunden:

```
@FXML
    private TableView<FirmenDetails> tableFirmen;
```

Danke im Vorraus für eure Hilfe


----------



## lam_tr (15. Dez 2020)

Du willst also alle Information aus drei Datenbank Tabellen in einer TableView darstellen?

Mach doch eine Klasse die die drei Klassen enthalten. 


```
class AlleInfos{
    private User user;
    private Firma firma;
    private Produkt produkt;
}
```

Du kannst dann diese Wrapper Klasse dann TableView<AlleInfos>() übergeben und darstellen.


----------



## Zakon (15. Dez 2020)

Ok danke ich spiele mal ein wenig rum und probiere es aus


----------



## lam_tr (15. Dez 2020)

Zakon hat gesagt.:


> Ok danke ich spiele mal ein wenig rum und probiere es aus


In dem Fall muss du nur die passsende CellValueFactory der TableView anpassen.

Das ist doch was du willst oder?


----------



## Zakon (15. Dez 2020)

Kann ich dir erst später brichten ich habe das jetzt per Copy and Paste erstmal nochmal geschrieben damit ich weiterabrieten kann und werde das erst gleich wenn ichh mein nächstes Probelm behoben habe umschreiben  😁


----------



## Zakon (15. Dez 2020)

Was mir jetzt auffällt ist,dass wenn ich jetzt eine Abfrage mache immer auf alle Tabellen zugreife. Somit muss ich auch immer die ganze Tabelle angeben oder?
Meine Frage war eher so gemeint ob es eine Möglichkeit gibt nur über den Kurzen zeitraum einer Methode eone Verbidung zwischen den Tabellen herzustellen. 🤔


----------



## Zakon (15. Dez 2020)

Controller:

```
@FXML
    public void loadDataFirMi(ActionEvent event) {
        Connection conn = DBConnection.getInstance().getCon();
        String MiID_eingabe=MiID.getText();
        String FirID_eingabe=FirID.getText();

        try {
            datafimi = FXCollections.observableArrayList();
            if(MiID_eingabe != null) {
                if (FirID_eingabe != null) {
                    ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM Frimen F JOIN Mitarbeiter M ON F.ID=M.Firmen_ID WHERE M.ID ='" + MiID_eingabe + "' OR F.ID='" + FirID_eingabe + "'");
                    while (rs.next()) {
                        datafimi.add(new AlleDetails(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4), rs.getString(5),rs.getInt(6)));
                    }
                    rs.close();
                }
                else{
                    ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM Frimen F JOIN Mitarbeiter M ON F.ID=M.Firmen_ID WHERE M.ID ='" + MiID_eingabe + "'");
                    while (rs.next()) {
                        datafimi.add(new AlleDetails(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4), rs.getString(5),rs.getInt(6)));
                    }
                    rs.close();
                }
            }
            else{
                ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM Frimen F JOIN Mitarbeiter M ON F.ID=M.Firmen_ID WHERE F.ID='" + FirID_eingabe + "'");
                while (rs.next()) {
                    datafimi.add(new AlleDetails(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4), rs.getString(5),rs.getInt(6)));
                }
                rs.close();
            }

            if (conn != null && conn.isClosed()) {
                System.out.println("Connected");
            } else {
                System.out.println("Connection lost");
            }
        } catch (SQLException s) {
            System.out.println("Error " + s);
        }

        columnID.setCellValueFactory(new PropertyValueFactory<>("ID1"));
        columnFirmenName.setCellValueFactory(new PropertyValueFactory<>("FirmenName1"));

        columnMitarbeiter_ID.setCellValueFactory(new PropertyValueFactory<>("Mitarbeiter_ID1"));
        columnVorname.setCellValueFactory(new PropertyValueFactory<>("Vorname1"));
        columnNachname.setCellValueFactory(new PropertyValueFactory<>("Nachname1"));

        tablealleDetails.setItems(null);
        tablealleDetails.setItems(datafimi);
    }
```

Class:

```
package Main;


public class AlleDetails {
    private UserDetails user;
    private FirmenDetails firmen;
}
```

Habe das ganze jetzt so gemacht falls du das so meintest.
Problem ist jetzt nur das ich 1.Meine Tabelle im SceneBuilder nicht zuweisen kann weil die ganzen Column Namen ja schon vergebn sind
und 2.
java: constructor AlleDetails in class Main.AlleDetails cannot be applied to given types;
  required: no arguments
  found:    int,java.lang.String,int,java.lang.String,java.lang.String,int
  reason: actual and formal argument lists differ in length

ich diese Fehlermeldung bekomme  🤔


----------



## lam_tr (15. Dez 2020)

Zakon hat gesagt.:


> Controller:
> 
> ```
> @FXML
> ...


Problem 1 und 2 verstehe ich ehrlichgesagt nicht. 

Hast du im AlleInfos Klasse einen Konstruktor mit 6 Parameter erstellt?


----------



## mrBrown (15. Dez 2020)

Zakon hat gesagt.:


> loadDataFirMi


Komisches schweizerdeutsch und du meintest "Für Mich"?


----------



## Zakon (15. Dez 2020)

Das ist ja das Problem ich möchte ja keine 6 Parameter. am liebsten hätte ich das so,dass wenn ich für Mitarbeiter X Firma die beiden Tabellen kurzzeitig zusammenfüge und für Mitarbeiter X Produkt das gleiche halt. Oder... das ich eins für alles habe was ich ja mit deiner Vorschlag hätte nur komm ich wieder wie gerade auf Problem 1 und, dass ich halt nicht immer alle 6 Parameter asufüllen kann je nachdem was ich abfrage und somit wieder in der Fehlermeldung lande... 🤔

und @mrBrown ist kei Schweizerdeutsch 😁 das ganze soll Fir(ma)Mi(tarbeiter) darstellen 😁

EDIT: wenn ich die beiden nämlich nicht irgendwie kurzzeitig zuzsammenfügen kannn muss ich ja eine klasse für jede Kombination immer wieder schreiben. So habe ich es jetzt gemacht es funtioniert ist aber nicht besonders schön. Wenn ich dann mal 10 Tabellen habe dann wars es mit der Technik auch, weil es total unübersichtlich wird und einfach viel zu schreiben.


----------



## lam_tr (15. Dez 2020)

mrBrown hat gesagt.:


> Komisches schweizerdeutsch und du meintest "Für Mich"?


Hahahahaha schweitzerdeutsch kommt echt hin wa? Ich glaube er meint damt Firma Mitarbeiter.


----------



## lam_tr (15. Dez 2020)

Zakon hat gesagt.:


> Das ist ja das Problem ich möchte ja keine 6 Parameter. am liebsten hätte ich das so,dass wenn ich für Mitarbeiter X Firma die beiden Tabellen kurzzeitig zusammenfüge und für Mitarbeiter X Produkt das gleiche halt. Oder... das ich eins für alles habe was ich ja mit deiner Vorschlag hätte nur komm ich wieder wie gerade auf Problem 1 und, dass ich halt nicht immer alle 6 Parameter asufüllen kann je nachdem was ich abfrage und somit wieder in der Fehlermeldung lande... 🤔
> 
> und @mrBrown ist kei Schweizerdeutsch 😁 das ganze soll Fir(ma)Mi(tarbeiter) darstellen 😁
> 
> EDIT: wenn ich die beiden nämlich nicht irgendwie kurzzeitig zuzsammenfügen kannn muss ich ja eine klasse für jede Kombination immer wieder schreiben. So habe ich es jetzt gemacht es funtioniert ist aber nicht besonders schön. Wenn ich dann mal 10 Tabellen habe dann wars es mit der Technik auch, weil es total unübersichtlich wird und einfach viel zu schreiben.


Dann mach doch über Setter?


----------



## mrBrown (15. Dez 2020)

Zakon hat gesagt.:


> und @mrBrown ist kei Schweizerdeutsch 😁 das ganze soll Fir(ma)Mi(tarbeiter) darstellen 😁


Das habe ich mir gedacht, ich habe aber nur Verachtung für Abkürzungen im Code übring 



Zakon hat gesagt.:


> Das ist ja das Problem ich möchte ja keine 6 Parameter. am liebsten hätte ich das so,dass wenn ich für Mitarbeiter X Firma die beiden Tabellen kurzzeitig zusammenfüge und für Mitarbeiter X Produkt das gleiche halt. Oder... das ich eins für alles habe was ich ja mit deiner Vorschlag hätte nur komm ich wieder wie gerade auf Problem 1 und, dass ich halt nicht immer alle 6 Parameter asufüllen kann je nachdem was ich abfrage und somit wieder in der Fehlermeldung lande... 🤔


Was willst du denn machen? Eine große Tabelle, in der Mitarbeiter und Firmen zusammen drin stehen?


----------



## Zakon (15. Dez 2020)

Ich möchte eine Tabelle die ausgibt (nach eingabe der ID in den eingabe Feldern) welche zusammenhängen. Bedeutet: Mitarbeiter_ID=1 und Firmen_ID=1 Ausgabe: Mitarbeiter XY mit ID=1 und Firmen ID=1

und sorry für meine Abkürzungen  😁
Hier Mal zum sehen vielleicht wird euch dann klar was ich in meinem Kopf Vorhabe  😁


----------



## mrBrown (15. Dez 2020)

Dann setz den Vorschlag von @lam_tr um: eine eigene Klasse pro Tabell, die dann alle Werte einer Spalte enthält.


----------



## Zakon (16. Dez 2020)

Da bin ich wieder 😁 
Habe mich jetzt umentschieden das ganze mit einer Dop Down Box zu machen bedeutet ein Drop Dwon menü für die Firmen und wenn ich dort eine Firma asuwähle wird mir in der tabelle daneben dann alle Informationen zu dieser Firma (Mitarbeiter,Produkte) angezeigt.
Ich komme aber weider zum gleichen Problem mein code sieht jetzt so aus:


```
//DropDown Firmen
    @FXML
    public void dropdownFirmen (ActionEvent event){
        Connection conn = DBConnection.getInstance().getCon();
        String auswahlfirma = (String) choiceBoxFirma.getSelectionModel().getSelectedItem();

        try{
            data=FXCollections.observableArrayList();
            data1=FXCollections.observableArrayList();
            data2=FXCollections.observableArrayList();

            ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM Frima F JOIN Mitarbeiter M ON F.ID=M.Firmen_ID " +
                    "JOIN Produkte P ON P.ID=M.ID WHERE F.Name IS LIKE '%"+auswahlfirma+"%'");
            while (rs.next()){
                data1.add(new FirmenDetails(rs.getInt(1),rs.getString(2)));
                data.add(new UserDetails(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getInt(4)));
                data2.add(new ProduktDetails(rs.getInt(1),rs.getString(2)));
            }
            rs.close();

            if (conn != null && conn.isClosed()) {
                System.out.println("Connected");
            } else {
                System.out.println("Connection lost");
            }
        }catch(Exception e){
            System.out.println(e.fillInStackTrace());
        }

        columnID.setCellValueFactory(new PropertyValueFactory<>("ID"));
        columnFirmenName.setCellValueFactory(new PropertyValueFactory<>("FirmenName"));

        columnMitarbeiter_ID.setCellValueFactory(new PropertyValueFactory<>("Mitarbeiter_ID"));
        columnVorname.setCellValueFactory(new PropertyValueFactory<>("Vorname"));
        columnNachname.setCellValueFactory(new PropertyValueFactory<>("Nachname"));
        columnFirmen_ID.setCellValueFactory(new PropertyValueFactory<>("Firmen_ID"));

        columnProdukt_ID.setCellValueFactory(new PropertyValueFactory<>("Produkt_ID"));
        columnProdukt.setCellValueFactory(new PropertyValueFactory<>("Produkt"));

        tableFirmen.setItems(null);
        tableFirmen.setItems(data1);

        tableUser.setItems(null);
        tableUser.setItems(data);

        tableProdukt.setItems(null);
        tableProdukt.setItems(data2);

    }
```

Ich habe keine Ahnung ob das nur ansatzweise so richtig ist. Problem nur hier wieder ich kann meiner Tabelle keine Column zuweisen weil diese halt schon in einer anderen Tabelle benutzt werden. Möchte jetzt aber nicht für die gleichen Daten die in die gleiche Tabelle (Tabelle steht nur an einem anderen Platz) die daten neu definieren müssen.


----------



## lam_tr (16. Dez 2020)

Zakon hat gesagt.:


> Da bin ich wieder 😁
> Habe mich jetzt umentschieden das ganze mit einer Dop Down Box zu machen bedeutet ein Drop Dwon menü für die Firmen und wenn ich dort eine Firma asuwähle wird mir in der tabelle daneben dann alle Informationen zu dieser Firma (Mitarbeiter,Produkte) angezeigt.
> Ich komme aber weider zum gleichen Problem mein code sieht jetzt so aus:
> 
> ...


Ich verstehe hier dein Problem überhaupt nicht, jede Column eine eindeutige id zuzuweisen soll doch das Ganze eigentlich lösen oder?

wenn ich zum Beispiel in der Tabelle Firmen und in der Tabelle die column Mitarbeiter habe, dann kann ich doch wie folgt definieren?
- columnFirmenMitarberterVorname
- columnFirmenMitarberterFamilienname
- columnUserMitarberterVorname
- columnUserMitarberterFamilienname


----------



## Zakon (16. Dez 2020)

Ja aber genau das wollte ich ja umgehen das ich quasi eine class für mitarbeiter schreibe eine für Firma und eine für produkt und diese dann immer nur in der Methode mit einander verbinde 🤔
Habe das jetzt so geschrieben:
[CODE lang="java" title="Controller Klasse"] //DropDown Firmen
    @FXML
    public void dropdownFirmen (ActionEvent event){
        Connection conn = DBConnection.getInstance().getCon();
        String auswahlfirma= (String) comboBoxFirma.getValue();

        try{
            dataall=FXCollections.observableArrayList();
            ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM Frima F JOIN Mitarbeiter M ON F.ID=M.Firmen_ID " +
                    "JOIN Produkte P ON P.ID=M.ID WHERE F.Name IS LIKE '%"+auswahlfirma+"%'");
            while (rs.next()){
                dataall.add(new allDetails(rs.getInt(1),rs.getString(2),rs.getInt(3),rs.getString(4),
                        rs.getString(5),rs.getInt(6),rs.getInt(7),rs.getString(8)));
            }
            rs.close();

            if (conn != null && conn.isClosed()) {
                System.out.println("Connected");
            } else {
                System.out.println("Connection lost");
            }
        }catch(Exception e){
            System.out.println(e.fillInStackTrace());
        }

        columnID2.setCellValueFactory(new PropertyValueFactory<>("ID"));
        columnFirmenName2.setCellValueFactory(new PropertyValueFactory<>("FirmenName"));

        columnMitarbeiter_ID2.setCellValueFactory(new PropertyValueFactory<>("Mitarbeiter_ID"));
        columnVorname2.setCellValueFactory(new PropertyValueFactory<>("Vorname"));
        columnNachname2.setCellValueFactory(new PropertyValueFactory<>("Nachname"));
        columnFirmen_ID2.setCellValueFactory(new PropertyValueFactory<>("Firmen_ID"));

        columnProdukt_ID2.setCellValueFactory(new PropertyValueFactory<>("Produkt_ID"));
        columnProdukt2.setCellValueFactory(new PropertyValueFactory<>("Produkt"));

        tableall.setItems(null);
        tableall.setItems(dataall);


    }[/CODE]

[CODE lang="java" title="Details Klasse"]public class allDetails {

    private final IntegerProperty ID2;
    private final StringProperty FirmenName2;

    private final IntegerProperty Mitarbeiter_ID2;
    private final StringProperty Vorname2;
    private final StringProperty Nachname2;
    private final IntegerProperty Firmen_ID2;

    private final IntegerProperty Produkt_ID2;
    private final StringProperty Produkt2;

    public allDetails(int ID2,String FirmenName2,int Mitarbeiter_ID2,String Vorname2,String Nachname2,int Firmen_ID2,int Produkt_ID2,String Produkt2) {
        this.ID2 = new SimpleIntegerProperty(ID2);
        this.FirmenName2 = new SimpleStringProperty(FirmenName2);

        this.Mitarbeiter_ID2 = new SimpleIntegerProperty(Mitarbeiter_ID2);
        this.Vorname2 = new SimpleStringProperty(Vorname2);
        this.Nachname2 = new SimpleStringProperty(Nachname2);
        this.Firmen_ID2 = new SimpleIntegerProperty(Firmen_ID2);

        this.Produkt_ID2 = new SimpleIntegerProperty(Produkt_ID2);
        this.Produkt2 = new SimpleStringProperty(Produkt2);
    }[/CODE]
Unten an der Details klasse kommen noch Getter und Setter die habe ich aber mal weggelassen.

Problem jetzt nur ich bekomme immer fehlermeldungen:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: javafx.fxml.LoadException: 
/C:/ude/svn/entwicklung/retail/Datenbank/out/production/Datenbank/Main/view.fxml

    at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2707)
    at javafx.fxml/javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2949)
    at javafx.fxml/javafx.fxml.FXMLLoader.processImport(FXMLLoader.java:2793)
    at javafx.fxml/javafx.fxml.FXMLLoader.processProcessingInstruction(FXMLLoader.java:2758)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2624)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3323)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3280)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3249)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3222)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3199)
    at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3192)
    at Main.Main.start(Main.java:13)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    ... 1 more
Caused by: java.lang.ClassNotFoundException: com.gluonhq.charm.glisten.control.DropdownButton
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:606)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:168)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadTypeForPackage(FXMLLoader.java:3017)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadType(FXMLLoader.java:3006)
    at javafx.fxml/javafx.fxml.FXMLLoader.importClass(FXMLLoader.java:2947)
    ... 20 more
Exception running application Main.Main

Process finished with exit code 1

Wobei oben ja steht das ich eine Exception in der start Method habe owbohl meinne start method immer funktioniert hat und ich da ran auch nichts geändert habe🤔

Danke aber schonmal für deine Hartnäkigkeit du gibst mir echt Hoffnung das hier noch irgendwie zu schaffen 😁


----------



## lam_tr (16. Dez 2020)

Zakon hat gesagt.:


> Ja aber genau das wollte ich ja umgehen das ich quasi eine class für mitarbeiter schreibe eine für Firma und eine für produkt und diese dann immer nur in der Methode mit einander verbinde 🤔
> Habe das jetzt so geschrieben:
> [CODE lang="java" title="Controller Klasse"] //DropDown Firmen
> @FXML
> ...


Du benutzt hier ein Control gluon charm, was für mobile Anwendungen gedacht ist

Caused by: java.lang.ClassNotFoundException: com.gluonhq.charm.glisten.control.DropdownButton

Tauscht dieser Control mal um.


----------



## Zakon (16. Dez 2020)

Ja danke die Fehlermeldungen sind weg. Nur jetzt habe ich kein DropdownMenü 
[CODE lang="java" highlight="11"]@FXML
    private ChoiceBox<String> boxFirma;

private ObservableList<String> ListeFirma = FXCollections.observableArrayList("IT-Schmidt","IT-Larsen","Autohaus Krueger");


 //DropDown Firmen
    @FXML
    public void dropdownFirmen (ActionEvent event){
        Connection conn = DBConnection.getInstance().getCon();
        boxFirma.setItems(ListeFirma);
        String auswahlFirma = boxFirma.getValue();
        try{
            dataall=FXCollections.observableArrayList();
            ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM Frima F JOIN Mitarbeiter M ON F.ID=M.Firmen_ID " +
                    "JOIN Produkte P ON P.ID=M.ID WHERE F.Name IS LIKE '%"+auswahlFirma+"%'");
            while (rs.next()){
                dataall.add(new allDetails(rs.getInt(1),rs.getString(2),rs.getInt(3),rs.getString(4),
                        rs.getString(5),rs.getInt(6),rs.getInt(7),rs.getString(8)));
            }
            rs.close();

            if (conn != null && conn.isClosed()) {
                System.out.println("Connected");
            } else {
                System.out.println("Connection lost");
            }
        }catch(Exception e){
            System.out.println(e.fillInStackTrace());
        }

        columnID2.setCellValueFactory(new PropertyValueFactory<>("ID"));
        columnFirmenName2.setCellValueFactory(new PropertyValueFactory<>("FirmenName"));

        columnMitarbeiter_ID2.setCellValueFactory(new PropertyValueFactory<>("Mitarbeiter_ID"));
        columnVorname2.setCellValueFactory(new PropertyValueFactory<>("Vorname"));
        columnNachname2.setCellValueFactory(new PropertyValueFactory<>("Nachname"));
        columnFirmen_ID2.setCellValueFactory(new PropertyValueFactory<>("Firmen_ID"));

        columnProdukt_ID2.setCellValueFactory(new PropertyValueFactory<>("Produkt_ID"));
        columnProdukt2.setCellValueFactory(new PropertyValueFactory<>("Produkt"));

        tableall.setItems(null);
        tableall.setItems(dataall);

    }[/CODE]

Obwohl ich das ganze in zeile 11 doch angegebaen habe 🤔


----------



## lam_tr (16. Dez 2020)

Zakon hat gesagt.:


> Ja danke die Fehlermeldungen sind weg. Nur jetzt habe ich kein DropdownMenü
> [CODE lang="java" highlight="11"]@FXML
> private ChoiceBox<String> boxFirma;
> 
> ...


Keine Ahnung, vielleicht import Problem.

Ich habe noch eine Sache gesehen. Du muss nicht jedes mal die Liste neu setzen bei TableView, wie hier:


```
tableall.setItems(null);
  tableall.setItems(dataall);
```

Es ist ausreichen, wenn du jedes mal bevor die Daten holst, dataall.clear() machst und im Anschluss dataall.addAll(...). deine TableView wird geupdated sobald die Liste sich verändert.


----------



## Zakon (16. Dez 2020)

Ok danke für den Tipp und mit dem DropDown menü muss ich nochmal gucken habe nämlich alle möglichen Varianten ausprobiert und geht immer noch nicht


----------

