# Accessdatenbankproblem



## JavaOHJA (3. Feb 2015)

Hi,

in meinem Programm kann man Gruppen archivieren, indem ein boolean in einer Tabelle gesetzt wird. Umgekehrt kann man eine Gruppe aus dem Archiv entfernen, wenn man den boolean wieder rausnimmt.

Das funktioniert soweit auch ohne Probleme.

Allerdings, wenn ich eine Gruppe archiviere und dann direkt wieder entarchivieren will, passiert nichts. Erst nach Neustart des Programmes kann man diese Gruppe dann wieder entarchivieren.

Kann das am Speicher oder sonstigem liegen? mir fällt dazu nichts ein.

Gruß

ps.s.: die gruppe ist auch sonst nicht editierbar, liegt also nicht am boolean


----------



## VfL_Freak (3. Feb 2015)

Moin,


JavaOHJA hat gesagt.:


> mir fällt dazu nichts ein.


Uns ohne Deinen Code auch nicht .....

Gruß Klaus


----------



## JavaOHJA (3. Feb 2015)

hier der code:


```
public boolean updateGruppe(String datum, String bezeichnung,String gruppenID, String level,
			String dozent, boolean archiv, String kommentar) {
		
		
		open();
		
		String dozentKurz = "";
		//System.out.println(dozent);
		String sql = "select * from Dozent where D_Name ='"+dozent+"'";
		
		try {
			ResultSet rs = stmt.executeQuery(sql);
			while (rs.next()) {
				dozentKurz = rs.getNString("D_Kurz");

			
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		close()
		;
		
		DateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");
		java.sql.Date sqlDate = null;
		try {
			java.util.Date date = formatter.parse(datum);
			sqlDate = new java.sql.Date(date.getTime());
			//System.out.println(date + "      " + sqlDate);
		} catch (java.text.ParseException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		if (!open()) {
			JOptionPane.showMessageDialog(null,
					"Verbindung zur Datenbank konnte nicht hergestellt werden");

		}
		//String sql = "update  Gruppen g set g.G_Startdatum = '"+sqlDate +" 00:00:00.000', g.G_Text = '"+kommentar+"', g.G_level = '"+level+"', g.Gruppen_ID = '"+bezeichnung+"' where g.Gruppen_ID = '"+gruppenID+"'";
		String sql1 = "update Gruppen set Gruppen_ID = '"+bezeichnung+"', G_Startdatum = '"+sqlDate +" 00:00:00.000', G_Text ='"+kommentar+"',G_Archiv = "+archiv+", D_Kurz ='"+dozentKurz+"', G_level ='"+level+"' where Gruppen_ID = '"+gruppenID+"'";
		
		try {
			System.out.println("archiv? :" + archiv);
			int rs =stmt.executeUpdate(sql1);
			close();
			
		} catch (Exception e) {
			e.getMessage();
		}

		
		close();
		return true;

	}
```


und hier noch der code des Dialogs, das die Methode oben aufruft:


```
package TestFiles;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

import org.hsqldb.TableDerived;

import FinalVersion.Dozent;
import FinalVersion.Gruppe;

import com.sun.org.apache.xerces.internal.impl.dv.xs.DateDV;



public class DialogGruppeAendern extends JDialog {

	//------------------------------------
	//Programm starten
	//------------------------------------
	public static void main(String[] args) {
		new DialogGruppeAendern(null, gruppenID);

	}

	//------------------------------------
	//Dialogelemente erzeugen
	//------------------------------------	
	TestDB db = new TestDB();
	Gruppe g = null;
	Dozent d = null;
	static String gruppenID = "";
	
	
	private ImageIcon img = new ImageIcon("logoAlt.png");
	
	
	private JLabel lbDatum = new JLabel("Datum: ", JLabel.LEFT);
	private JLabel lbGruppenBezeichnung = new JLabel("Englischgruppe(Bez.): ", JLabel.LEFT);
	private JLabel lbLevel = new JLabel("Level: ", JLabel.LEFT);
	private JLabel lbDozent = new JLabel("Dozent: ", JLabel.LEFT);
	private JLabel lbKommentar = new JLabel("Kommentar: ", JLabel.LEFT);
	private JLabel lbArchiv = new JLabel("Gruppe archivieren:", JLabel.LEFT);

	private JButton btnAbbrechen = new JButton("Abbrechen");
	static JButton btnSpeichern = new JButton("Speichern");
	
	JPanel panelArchiv = new JPanel(new GridLayout(1,5));
	private Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Germany/Berlin"));
	
	
	
	private JTextField tfDatum = new JTextField();
	private JTextField tfGruppenBezeichnung = new JTextField();
	private JTextArea  taKommentar = new JTextArea(10,10);
	private JCheckBox  checkArchiv = new JCheckBox();
	private JScrollPane sp = new JScrollPane(taKommentar);
	
	
	
	private JComboBox cbLevel = null;
	
	
	JComboBox cbDozent = null;
	
	
	private JPanel northPanel = new JPanel(new GridLayout(6,2,10,10));
	private JPanel centerPanel = new JPanel(new BorderLayout());
	private JPanel southPanel = new JPanel(new GridLayout(1,2,10,10));
	
	
	
	//------------------------------------
	//Konstruktor (baut GUI auf)
	//------------------------------------
	HauptFrame parent = null;
	
	
	
	public DialogGruppeAendern(final HauptFrame parent, final String gruppenID) {
super(parent);
this.parent = parent;
g = db.getGruppenObject(gruppenID);
d= db.getDozentObject(g.getD_kurz());

		//------------------------------------
		//Listener-Methoden (Reaktion auf Benutzereingaben)
		//------------------------------------
btnAbbrechen.addActionListener(new ActionListener() {
	
	@Override
	public void actionPerformed(ActionEvent e) {
		setVisible(false);
		
	}
});



	btnSpeichern.addActionListener(new ActionListener() {
		
		@Override
		public void actionPerformed(ActionEvent e) {
		
			
			
			
		String datum = tfDatum.getText();
		String bezeichnung = tfGruppenBezeichnung.getText();
		
		String level = cbLevel.getSelectedItem().toString();
		String dozent = cbDozent.getSelectedItem().toString();
		String kommentar = taKommentar.getText();
		boolean archiv = checkArchiv.isSelected();
		
		//System.out.println(datum + " " + bezeichnung + " " + level + " " + dozent + " " + kommentar);
			
			
			db.updateGruppe(datum, bezeichnung,gruppenID, level, dozent,archiv, kommentar);
			
//			System.out.println(archiv);
			setVisible(false);
			//zeigt tabelleninhalt verändert an
			
			
			
			
			if(parent.btnGruppeArchiv.isSelected()){
				
				parent.table.setModel(parent.getTableModelGruppenArchiv());
				db.close();
			}
			else{
				
				parent.table.setModel(parent.getTableModelGruppen());
			}
			
			return;
			
		}
	});
		//------------------------------------
		//Dialogelemente konfigurieren
		//------------------------------------	
String[] s = new String[db.getAnzahlDozenten()];
db.getDozenten(s);
cbDozent = new JComboBox(s);	
String[] level = new String[db.getAnzahlLevel()];
System.out.println("LEVEL: " +db.getAnzahlLevel());
db.getLevel(level);
cbLevel = new JComboBox(level);
setDialogContent();


//SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
//String date = sdf.format(c.getTime());
//tfDatum.setText(date);
		



//		sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);;
		taKommentar.setLineWrap(true);
		//------------------------------------
		//Dialogelemente platzieren
		//------------------------------------	
		panelArchiv.add(new JLabel(""));
		panelArchiv.add(new JLabel(""));
		panelArchiv.add(checkArchiv);
		panelArchiv.add(new JLabel(""));
		panelArchiv.add(new JLabel(""));
		
		northPanel.add(lbDatum);
		northPanel.add(tfDatum);
		northPanel.add(lbGruppenBezeichnung);
		northPanel.add(tfGruppenBezeichnung);
		northPanel.add(lbLevel);
		northPanel.add(cbLevel);
		northPanel.add(lbDozent);
		northPanel.add(cbDozent);
		northPanel.add(lbArchiv);
		northPanel.add(panelArchiv);
		northPanel.add(lbKommentar);
		
		
		
		
		centerPanel.add(sp);
		
		southPanel.add(btnAbbrechen);
		southPanel.add(btnSpeichern);
		
		
		
		
		JPanel mainPanel = new JPanel(new BorderLayout(10,10));
		
		mainPanel.add(northPanel,BorderLayout.NORTH);
		mainPanel.add(centerPanel,BorderLayout.CENTER);
		mainPanel.add(southPanel,BorderLayout.SOUTH);
		mainPanel.setBorder(new TitledBorder(new EmptyBorder(5, 5, 5, 5)));
		this.setIconImage(img.getImage());  
		add(mainPanel);
		//------------------------------------
		//Fenster konfigurieren
		//------------------------------------
		pack();
		//setSize(500, 300);
		setDefaultCloseOperation(HIDE_ON_CLOSE);//damit mit close von fenster auch in konsole terminiert wird/Programm ende sonst läufts im hintergrund noch weiter im speicher
		setTitle("Englischgruppe ändern");
		setLocationRelativeTo(getParent());
		
		
		setVisible(true); // ist letze anweisung im Konstruktor

	}
	
	public void setDialogContent(){
		SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
		
		tfDatum.setText(sdf.format(g.getG_startdatum())+"");
		tfGruppenBezeichnung.setText(g.getGruppen_id()+"");
		cbLevel.setSelectedItem(g.getG_level());
		cbDozent.setSelectedItem(d.getName());
		checkArchiv.setSelected(g.isG_archiv());
//		System.out.println("Name set:"+d.getName());
		taKommentar.setText(g.getG_text());
		
	}

}//class
```

Gruß


----------



## xerion21 (3. Feb 2015)

JavaOHJA hat gesagt.:


> Hi,
> 
> in meinem Programm kann man Gruppen archivieren, indem ein boolean in einer Tabelle gesetzt wird. Umgekehrt kann man eine Gruppe aus dem Archiv entfernen, wenn man den boolean wieder rausnimmt.
> 
> ...



ohne deinen Code oder weitere Infos zum Aufbau können wir dir nicht helfen


----------



## JavaOHJA (3. Feb 2015)

hey, ok hier nochmal der Code:
buttonSpeichern fürht das hier aus:

```
btnSpeichern.addActionListener(new ActionListener() {
		
		
		
		@Override
		public void actionPerformed(ActionEvent e) {
		
			
			
			
		String datum = tfDatum.getText();
		String bezeichnung = tfGruppenBezeichnung.getText();
		
		String level = cbLevel.getSelectedItem().toString();
		String dozent = cbDozent.getSelectedItem().toString();
		String kommentar = taKommentar.getText();
		boolean archiv =  checkArchiv.isSelected();
		
		//System.out.println(datum + " " + bezeichnung + " " + level + " " + dozent + " " + kommentar);
			
			
			db.updateGruppe(datum, bezeichnung,gruppenID, level, dozent,archiv, kommentar);
			
//			System.out.println(archiv);
			setVisible(false);
			//zeigt tabelleninhalt verändert an
			
			System.out.println("archiv: "+archiv);
			
			
			if(parent.btnGruppeArchiv.isSelected()){
				
				parent.table.setModel(parent.getTableModelGruppenArchiv());
				
			}
			else{
				
				parent.table.setModel(parent.getTableModelGruppen());
			}
			
			return;
			
		}
	});
```


und die Datenbankabfragemethode:

```
public boolean updateGruppe(String datum, String bezeichnung,String gruppenID, String level,
			String dozent, boolean archiv, String kommentar) {
		
		
		open();
		
		String dozentKurz = "";
		//System.out.println(dozent);
		String sql = "select * from Dozent where D_Name ='"+dozent+"'";
		
		try {
			ResultSet rs = stmt.executeQuery(sql);
			while (rs.next()) {
				dozentKurz = rs.getNString("D_Kurz");

			
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	
		
		DateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");
		java.sql.Date sqlDate = null;
		try {
			java.util.Date date = formatter.parse(datum);
			sqlDate = new java.sql.Date(date.getTime());
			//System.out.println(date + "      " + sqlDate);
		} catch (java.text.ParseException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		
		//String sql = "update  Gruppen g set g.G_Startdatum = '"+sqlDate +" 00:00:00.000', g.G_Text = '"+kommentar+"', g.G_level = '"+level+"', g.Gruppen_ID = '"+bezeichnung+"' where g.Gruppen_ID = '"+gruppenID+"'";
		String sql1 = "update Gruppen set Gruppen_ID = '"+bezeichnung+"', G_Startdatum = '"+sqlDate +" 00:00:00.000', G_Text ='"+kommentar+"',G_Archiv = "+archiv+", D_Kurz ='"+dozentKurz+"', G_level ='"+level+"' where Gruppen_ID = '"+gruppenID+"'";
		
		try {
		
			System.out.println("archiv? :" + archiv);
			int rs =stmt.executeUpdate(sql1);
			
			
		} catch (Exception e) {
			e.getMessage();
		}

		
		close();
		return true;

	}
```

Es funktioniert alles reibungslos, bis auf Gruppe archivieren und direkt wieder entarchivieren.
Also ich kann zB. den Gruppennamen beliebig oft ändern und es funktioniert. 
Aber wenn ich den boolean für archiviert ändere, dann klappt es nur einmal.

Hinweis: durch die Konsole habe ich herausgefunden,dass der btnSpeichern mehrmals ausgefführt wird, ich verstehe aber nicht warum, ich drücke ihn nur einmal


----------



## JavaOHJA (4. Feb 2015)

Hey,

ich denke das Problem liegt daran, dass der Dialog, der die Gruppe ändert nicht vollständig geschlossen wird.
Den jedesmal wenn ich eine Gruppe ändere, bekomme ich eine weitere Ausgabe in der Console.

habe es mit dispose(); versucht, aber hat nichts geholfen.

wie kann ich einen JDialog komplett schließen mit drücken eines Buttons?


----------



## VfL_Freak (4. Feb 2015)

Moin,

eigentlich genau mit "dispose" ....

Was bedeutet denn " hat nichts geholfen" ???

Gruß Klaus


----------



## JavaOHJA (4. Feb 2015)

die Dialoge bestehen weiterhin im Hintergrund obwohl ich am Ender im ActionListener dispose(); habe.
Komisch ist aber , dass ich alle Felder beliebig oft ändern kann nur das boolean Feld wird nur beim erstel Mal geändert.

edit: ok, habe gerade noch herausgefunden, dass wenn ich den Gruppennamen nach dem archivieren ändere, ich den boolean erneut ändern kann mmh

Gruß

habs jetzt mal mit dem hier versucht:

```
DialogGruppeAendern.this.addWindowListener(new WindowAdapter() { 
			    @Override public void windowClosed(WindowEvent e) { 
			      System.exit(0);
			    }
			  });
```

allerdings beendet es das ganze Programm und nicht nur den Dialog


----------



## JavaOHJA (4. Feb 2015)

hab das Problme jetzt so gelöst, dass ich den Dialog GruppeAendern kopiert habe. Rufe in aktuellen Gruppen jetzt den Dialog GruppeAendern auf und in archivierte Gruppen den Dialog GruppeAendernArchiv auf(copy des Dialoges GruppeAendern).

Symptome bekämpfen :bae:

wäre trotzdem toll wenn jemane eine Lösung hätte

p.s.: nur ein Teilerfolg..wenn ich mehrmals editier, wird immernoch der booleanwert des ersten Dialogs  verwendet..mehr als 2 mal editieren geht also für die checkbox immernoch nicht


----------



## JavaOHJA (5. Feb 2015)

hey, habe jetzt anscheinend eine Lösung gefunden, die funktioniert.
ich setzt im Actionlistener des Dialogs am Ende die GruppenID = " ".
die Dialoge versuchen im Hintergrund immernoch einträge zu ändern, aber nur noch für die Gruppe mit ID = " ".

bekomm zwar folgende exception:
integrity constraint violation: unique constraint or index violation; SYS_PK_10260 table: GRUPPEN: 

aber es funktioniert jetzt alles.

Gruß


----------



## JavaOHJA (5. Feb 2015)

Hey,
habe es jetzt so gemacht, dass ich im HauptFrame einen Dialog erstelle und den dann je nach Gruppenwahl setze, statt jedesmal einen neuen Dialog zu erstellen und zu disposen/setVisible(false).

Allerdings stört mich jetzt, dass man den Dialog kurz sieht bevor das Hauptfenster öffnet, obwohl ich es direkt als ersten Befehl im Konstruktor des HauptFrames auf invisible setze.


----------

