Java Programm und Dantebank umlagern

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.Umlagern.png

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
 
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
 
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?
 
@Dukel Die 5 im tf Lagerort steht für den Lagerort in Halle 8.
Code:
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.
 
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
Code:
        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();
                }
               
               
            }
        });
 
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?

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.
 
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 ....
 
@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.
 
Was ist an den Hallen unterschiedlich? Welche gleichen und unterschiedlichen Felder hast du denn da?
Kannst du einmal die komplette DB Struktur aufzeichnen?
 
Unbenannt.jpg 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.
Code:
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
 
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)

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.
 
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
 
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?
 
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.
 
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.
 
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.
 
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
 
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?
 
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...
 

Neue Themen


Zurück
Oben