# Java Programm und Dantebank umlagern



## BrauneKartoffel (9. Nov 2016)

Hey Leute,
ich stehe mal wieder vor einem Problem. Ich versuche im Moment Artikel die sich in der Datenbank befinden, von der einen Tabelle, in die andere Tabelle zu übertragen und gleichzeigt aus der alten Tabelle zu löschen. Ich habe gleich ein Bild erstellt damit man es vielleicht besser verstehen kann was ich meine.

Also ich hab es soweit hinbekommen das, wenn man den Artikel mit der Maus andrückt gleichzeitig in den TextFields die Informationen landen. Wenn ich dann auf den Button (H7 (der leider gerade nicht zu lesen ist)) drücke  soll der Artikel in die Tabelle Halle 7 umgelagert werden und aus Halle 8 gelöscht.
Ich hoffe man kann mich verstehen was ich meine, ich freue mich über jede Hilfe .

Mit freundlichen Grüße


----------



## Robat (9. Nov 2016)

Als Idee:
-Du holst dir die Daten / den Datensatz des Artikels aus der alten Tablle (bzw aus den Textfeldern die du schon hast)
- Machst dir ein INSERT Statement für deine Tablle (Halle 7) fertig und führst das aus
- Machst dir eine DELTE Statement für deine Tabelle (Halle 8) fertig und führst das aus

Aus deinem Post kann man leider nicht entnehmen ob du sowas in der Art schon mal versucht hast, ob du dafür überhaupt schon Code hast oder ob du bei Null stehst 

Gruß
Robert


----------



## Dukel (9. Nov 2016)

Wie sieht deine DB aus? Ich hoffe du hast nicht für jeden Halle eine eigene Tabelle.
Wenn es z.B. so aussieht:
ID|Artikel|Halle
22|1000|5
Änderst du einfach den Eintrag der Halle.

Wieso steht im screenshot "5", wenn es doch die Halle 7 ist?


----------



## Robat (9. Nov 2016)

Dukel hat gesagt.:


> Wieso steht im screenshot "5", wenn es doch die Halle 7 ist?



So wie ich das sehe, ist der Lagerort != Halle.
Lagerort ist sicherlich sowas wie die Regalnummer o.ä. (auch wenn man es dann Regalnummer hätte nennen können  )


----------



## BrauneKartoffel (9. Nov 2016)

@Dukel Die 5 im tf Lagerort steht für den Lagerort in Halle 8. 

```
JButton btnH = new JButton("H 7");
        btnH.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                try{
                    String query="";
                    PreparedStatement pst=connection.prepareStatement(query);
                   
                    pst.execute();
                   
                    JOptionPane.showMessageDialog(null, "");
                   
                    pst.close();
                    }catch(Exception ex){
                        ex.printStackTrace();;
                       
                    }
                    }   
                       
                   
                });
```

Soweit hab ich den schon. 

Und ja ich habe für jeden Halle eine eigene Seite und Tabelle.


----------



## BrauneKartoffel (9. Nov 2016)

So hab ich das nun geändert. Es wird umgelagert nur nicht das akte geköscht. Da weiß ich nicht wie ich das machen soll 

```
JButton btnH = new JButton("H 7");
        btnH.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                try{
                    String query="insert into HalleSiebenListe (Artikelnummer,Artikelbezeichnung,Menge, Lagerort, Bemerkung) values (?,?,?,?,?)";
               
                   
                    PreparedStatement pst=connection.prepareStatement(query);
                    //pst.setString(1, tfId.getText() );
                    pst.setString(1,tfArtikelNr1.getText() );
                    pst.setString(2,tfArtikelBez1.getText() );
                    pst.setString(3,tfMenge1.getText() );
                    pst.setString(4,tfLagerort.getText() );
                    pst.setString(5,tfBemerkung.getText());
                   
                    pst.execute();
                   
                    JOptionPane.showMessageDialog(null, "Artikel in Halle 7 umgelagert!");
                   
                    pst.close();
                   
                   
                }catch ( Exception e){
                    e.printStackTrace();
                }
               
               
            }
        });
```


----------



## Dukel (9. Nov 2016)

BrauneKartoffel hat gesagt.:


> Und ja ich habe für jeden Halle eine eigene Seite und Tabelle.


Wozu das denn? Sind alle Hallen so unterschiedlich, dass es für diese eine eigene Tabelle mit eigenen Feldern benötigt?



BrauneKartoffel hat gesagt.:


> So hab ich das nun geändert. Es wird umgelagert nur nicht das akte geköscht. Da weiß ich nicht wie ich das machen soll


Du machst ja auch nur einen Insert und kein Delete in der anderen Tabelle. Hierbei solltest du dich einmal über Transaktionen informieren.
Wenn das Programm zwischen Löschen und Einfügen abstürzt willst du nicht dass einer der beiden Aktionen fehlt.


----------



## thet1983 (9. Nov 2016)

Ich würde mich mal mit den Datenbank Basics ( Normalformen, Aufbau etc ) beschäftigen...und danach erst eine App programmieren.

@Dukel hat dir das schon geschrieben... ein update und fertig ....


----------



## BrauneKartoffel (10. Nov 2016)

@thet1983 Das mach ich ja, aber man brauch auch was zum üben um das besser zu verstehen( so ist das zumindest bei mir) .
Die Hallen sind tatsächlich unterschiedlich und darum brauche ich auch für jede Halle eine eigene Tabelle.


----------



## Dukel (10. Nov 2016)

Was ist an den Hallen unterschiedlich? Welche gleichen und unterschiedlichen Felder hast du denn da?
Kannst du einmal die komplette DB Struktur aufzeichnen?


----------



## BrauneKartoffel (11. Nov 2016)

Ich hab das mal versucht mit Paint dazustellen was ich meine.  Der Artikel bei Halle 8 soll umgelagert(verschoben) werden in Halle 7 und dabei soll sich der Lagerort dann auf 0 setzen. Ich hab das schon hinbekommen mit dem verschieben, was aber nicht die beste Lösung ist. Bin aber für weitere Lösungen offen.

```
JButton btnHSieben = new JButton("H 7");
        btnHSieben.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                try{
                    String query="insert into HalleSiebenListe (Artikelnummer,Artikelbezeichnung,Menge, Lagerort, Bemerkung) values (?,?,?,?,?)";
               
                   
                    PreparedStatement pst=connection.prepareStatement(query);
                    //pst.setString(1, tfId.getText() );
                    pst.setString(1,tfArtikelNr1.getText() );
                    pst.setString(2,tfArtikelBez1.getText() );
                    pst.setString(3,tfMenge1.getText() );
                    pst.setString(4,tfLagerort.getText() );
                    pst.setString(5,tfBemerkung.getText());
                   
                                            
                   
                   
                    pst.execute();
                   
                    JOptionPane.showMessageDialog(null, "Artikel in Halle 7 umgelagert.");
                   
                    pst.close();
                   
                    String query1="delete from HalleAchtListe where ID='"+tfId.getText()+"'   ";
                    PreparedStatement pst1=connection.prepareStatement(query1);
                   
                    pst1.execute();
                   
                   
                }catch ( Exception e){
                    e.printStackTrace();
                }
               
               
            }
        });
        btnHSieben.setBounds(1056, 322, 61
```


----------



## Joose (11. Nov 2016)

BrauneKartoffel hat gesagt.:


> Ich hab das mal versucht mit Paint dazustellen was ich meine.  Der Artikel bei Halle 8 soll umgelagert(verschoben) werden in Halle 7 und dabei soll sich der Lagerort dann auf 0 setzen.



Es ergibt keinen Sinn warum du für Halle 7 und Halle 8 jeweils eine eigene Tabelle erstellt hast. Mache eine Tabelle für alle Lagerhallen und füge stattdessen eine weitere Spalte hinzu in welcher die Nummer der Lagerhalle steht 

(nach dieser Logik musst du für jede neue Halle eine neue Tabelle anlegen)



BrauneKartoffel hat gesagt.:


> Ich hab das schon hinbekommen mit dem verschieben, was aber nicht die beste Lösung ist. Bin aber für weitere Lösungen offen.


Wenn du wie oben beschrieben nur eine Tabelle für alle Lagerhallen hast, dann wird die Lösung auch einfacher.
Statt einem INSERT auf die eine Tabelle und einem DELETE auf die andere Tabelle, reicht ein einfaches UPDATE Statement aus.


Mir ist noch aufgefallen dass du in der Hallen Tabelle auch eine Spalte Artikelbezeichnung hast. Wenn du in 2 verschiedenen Hallen den gleichen Artikel lagerst, dann steht diese Information mehrmals in unterschiedlichen Tabellen. Würdest du nun die Artikelbezeichnung ändern wollen, müsstest du alle Hallen Tabellen durchschauen und die entsprechende Bezeichnung ändern. (
Auch hier hast du mit nur einer Tabelle für alle Hallen wieder einen Vorteil was das betrifft. Noch bessere wäre es eine eigene Tabelle Artikel anzulegen und nur dort die Artikelbezeichnung zu speichern bzw. zu ändern. In der Hallen Tabelle steht eh die entsprechende Artikelnummer, dadurch kann man die Bezeichnung dann zuordnen.


----------



## Thallius (11. Nov 2016)

Die beste Lösung wurde bereits mehrfach erwähnt. Beschäftige Dich mit Normalisierung von Datenbanken und baue die Tabellen dann mit dem Wissen komplett neu auf.

Für jede Halle eine Tabelle zu machen ist totaler Quatsch.

Es gibt viele mehr oder weniger komplexe Ansätze wie man die Tabellen aufbauen kann. Was aber Du im Endeffekt brauchst wissen wir ja nicht. Kann ein Artikel gleichzeitig in mehreren Hallen sein? Kann ein Artikel mehrere Preise haben? Immer wenn ein Object mehrere Relationen haben kann, dann sollte man auch mit Crossreferenz-Tabellen arbeiten. Also z.B.

Artikel -> Id, Anzahl, Nummer    : Das sind alle unveränderlichen Attribute des Artikels
Halle -> Id, Nummer : Das sind alle unveränderlichen Attribute der Hallen
xArtikelHalle -> ArtikelId, HallenId, Anzahl

Damit kannst du dann sehr schnell abfragen wieviele Artikel habe ich insgesamt, wieviel in Halle 7 oder 8 etc. Du kannst sehr schnell aus einer Halle einen Artikel herausnehmen und in eine andere hinzufügen.
Dafür must du immer nur die xArtikelHalle verändern. Die Artikel und die Hallen bleiben gleich, wie sie es ja auch im richtigen Leben tun. Denn durch das umlagern eines Artikels von Halle 7 nach Halle 8 ändert sich weder die Halle noch der Artikel.

Gruß

Claus


----------



## BrauneKartoffel (11. Nov 2016)

Ich brauche aber die verschiedenen Tabellen. Da jemand der auf halle 7 zugreift nicht auf Halle 8 zugreifen darf. Und da ist das die beste Lösung mit verschiedenen Tabellen oder übersehe ich da was?


----------



## Thallius (11. Nov 2016)

Und wie verhinderst du das jemand nicht auf eine andere Halle zugreifen darf? Hast du einen mysql Benutzer für jeden angelegt oder was? Nein, du hast wahrscheinlich eine Logik in Deiner Software die das regelt. Und genau das geht genauso wenn alle Hallen in einer Tabelle sind. Du must ja nur bei einem Select die "Verbotenen" Hallen im WHERE rausfiltern.


----------



## BrauneKartoffel (11. Nov 2016)

Ich hab noch ein recht einfaches Loginsystem, das beim öffnen der Halle immer eine Abfrage startet. Suche aber genau so ein System wie du es beschreibst, wenn ich das finden und hinkriegen würde, würde ich das auch mit einer Tabelle machen. Aber so wie ich das bis her habe ist es nich möglich.


----------



## Joose (11. Nov 2016)

Irgendwo wird hinterlegt sein welcher User Zugriff auf welche Halle hat (entweder entsprechende Tabellen in der Datenbank oder eben Logik im Code)
Und bevor du nun das UPDATE auf die eine Tabelle ausführst bzw. beim Update prüfst du eben noch auf die Berechtigung.

Tipp: Auch wenn du jetzt schon weißt dass nicht jeder auf jede Halle Zugriff haben darf. Verwende lieber eine Tabelle für alle Hallen, und vorerst hat jeder auf alle Zugriff. Das Sperren von Hallen für bestimmte User kannst du dir dann immer noch überlegen und entsprechend einbauen.


----------



## thet1983 (11. Nov 2016)

spontan fällt mir jetzt eine zahlen kombi ein 

du hast acht hallen.  das würde bedeuten deine kombi hat 8 stellen

basis ist 
1: kein zugriff
2: lesen
3: schreiben

und so gehst du halle für halle durch 
22331213 
halle1 = lesen
halle2 = lesen
halle3 = schreiben
halle4 = schreiben
halle5 = kein zugriff
halle6 = lesen
halle7 = keinzugriff
halle8 = schreiben 

diese zahl schmeisst du in ein array und prüfst dann immer vorher die rechte


----------



## Joose (11. Nov 2016)

thet1983 hat gesagt.:


> spontan fällt mir jetzt eine zahlen kombi ein
> basis ist
> 1: kein zugriff
> 2: lesen
> 3: schreiben



 und darf man gleichzeitig etwas lesen und schreiben?


----------



## BrauneKartoffel (11. Nov 2016)

Ihr habt Recht damit, ich werde das alles überarbeiten und auf einer Tabeller laufen lassen. @Joose Hast du vielleicht ein link oder so für mich wo erklärt wird wie  so ein System funktioniert um die Zugriffe an den Usern zu verteilen?


----------



## BrauneKartoffel (11. Nov 2016)

@thet1983 und wo stellt ich sowas ein? Bei meiner Datenbank Phpmyadmin oder in mein Code?


----------



## thet1983 (11. Nov 2016)

@Joose klar wenn ich ein schreibe recht hab dann hab ich ja wohl automatisch ein lese recht...mein Gedanke

@BrauneKartoffel ich würde die Kombi in der Benutzerverwaltung speichern und bei der Anmeldung mit geben


----------



## BrauneKartoffel (11. Nov 2016)

Ich steh etas auf dem Schlauch @thet1983 ? 
Bei phpMyAdmin? Hast du vielleicht an Link mit einer Anleitung? Ich weiß gar nicht wo ich da anfangen soll


----------



## thet1983 (11. Nov 2016)

Bin jetzt gerade in einem Kurs...


----------



## BrauneKartoffel (14. Nov 2016)

Hättest du noch was für mich @thet1983?


----------



## thet1983 (14. Nov 2016)

wie schon gesagt ich würde mir für das login eine benutzerverwaltung schreiben,
datenbank anlegen..
In dieser kannst du die rechte dann handlen entweder für jede halle eine column oder nur eine verwenden...

in etwas so:
table UserManagement
id | firstname | familyname | password ( würde ich aber verschlüsseln ) | accesslevels (oder einzelen hallen ) | access_hall_1 usw..|

dann erstellst du dir ein UserObjekt mit den enstrechenden properties und beim login prüfst du ob 
z.b der nachname und das ( entschlüsselte ) passwort überein stimmen, wenn ja lade die daten in das object, wenn nicht dann gibt meldung das die daten nicht stimmen...
wenn das login erfolgreich war kannst du das Userobject in deine MainView übergeben, und kannst immer die rechte vor dem laden einer tabelle überprüfen...


----------

