# letzter Datensatz wird nicht gefunden?



## hawkeye78 (25. Jun 2004)

Hallo,

ich habe ein kleines Problem, mit einem Zugriff auf eine Access-Datenbank. Das hineinschreiben des Datensatzes in die Datenkbank funktioniert ohne Probleme. Wenn ich aber direkt darauf in einer zweiten Methode ein SELECT auf die gleiche Datenbanktabelle ausführe, befindet sich der zuletzt eingefügte Datensatz nicht im ResultSet. Ich habe nun zur Probe noch ein showMessageDialog eingebaut, sobald ich das wegklicke funktioniert es ohne Probleme. Meine Frage ist nun kann es sein das Java bzw. JDBC bzw. Access eine Verzögerung in dem schreiben der Daten und dem anschließenden auslesen hat?
Ich hoffe ich konnte eingermaßen verständlich erklären, wo genau mein Problem liegt und ich möchte schon einmal für die kommende Hilfe bedanken.   .
Gruß
Dan


----------



## nollario (25. Jun 2004)

erklärung war zwar gut, aber ich kann das so irgendwie nicht glauben! ;-)

vielleicht etwas code dazu?

sobald das statement ausgeführt wird, ist das statement auch in der db ausgeführt (die abarbeitung findet synchron statt!).


----------



## hawkeye78 (25. Jun 2004)

Hallo,

ich würde auch eher auf einen anderen Fehler tippen, aber aus irgendwelchen mir nicht verständlichen Gründen funktioniert es dann...Was den Quellcode betrifft habe ich das problem schon einmal gepostet weil ich erst auf ein Problem mit der aktualisierung von Tabellen getippt habe. http://www.java-forum.org/de/viewtopic.php?t=5791
Allerdings fehlt in dieser Aufführung noch der Abschnitt in welchem ich die beiden Methoden (neu, zum Anlegen des Datensatzes in der DB und Tabellefuellen zum aktualisieren der Tabelle) aufrufe. Das geschieht mit folgenden Quellcode:


```
import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;
import java.util.Vector;

import javax.swing.*;

public class Oberflaeche
extends JFrame
implements WindowListener
{
//[...]
	// Funktionsbelegung für den Erfassen-Button
		BerfassenEintrag.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				db1.neu(Oberflaeche.this);

				// Aufruf der Methode zum Füllen der Tabelle
				tab1.Tabellefuellen(Oberflaeche.this, iIDFahrzeug);
				
				// Leeren der Eingabefelder
				Oberflaeche.this.TFDatum.setText("");
				Oberflaeche.this.TFeuro.setText("");
				Oberflaeche.this.TFkm.setText("");
				Oberflaeche.this.TFliter.setText("");
			}
		});
//[...]		
}
```


Ich bin schon seit einiger Zeit ziemlich ratlos warum das nicht funktioniert, und bin zum einen für dein Posting und zum anderen für einen Hilfreichen Rat sehr dankbar.
Gruß
Dan :bahnhof: [/url]


----------



## Oliver001 (25. Jun 2004)

Ob es am "Graphic-handling liegt" oder an der DB-Abfrage, lässt sich ja einfach bestimmen, indem man das Resultset einfach mal an der Konsole ausgibt - ohne irgendwelche Graphic oder was auch immer.

Ich erinnere mich, dass ich auch mal ein solches Problem hatte - mag mich allerdings nicht mehr erinnern, wie ich's gelöst hatte. :-(
In dunkler Erinnerung habe ich einen ziemlichen Designwechsel vollzogen - am Schluss war's ein MVC.

Sorry,
Oli


----------



## Guest (25. Jun 2004)

Hallo Oliver,

ich habe bei dem auslesen des Resultsets jeweils ein Feld ausgeben zu lassen, um mal zu überprüfen ob der aktuell hinzugefügte Datensatz dabei ist, leider nicht 

Ich kann mir irgendwie nicht vorstellen das es wirklich mit dem Design zusammen hängt, aber ich kann auch mal wieder Meilenweit daneben liegt, und ich wirklich das gesamte Design umstricken muss.


----------



## Jaraz (26. Jun 2004)

Hi,

wenn ich das richtig sehe fügst du dasselbe Array mehrfach hinzu. Das kann zu komischen Effekte führen.
Erzeuge mal zwischendurch ein neues Array.

Gruß Jaraz


----------



## hawkeye78 (26. Jun 2004)

ich habe jetzt die deklaration des arrays mit in die schleife genommen, aber das zeigt auch keine Änderung. Wenn ich es nicht besser wüßte würde ich wirklich sagen das der JDBC-Treiber und mein Programm nicht synchron laufen. Da der erste Datensatz den ich erfasse nicht in der Tabelle angezeigt wird. wenn ich allerdings direkt danach noch einen Satz erfasse wird der zu erst erfasse Satz angezeigt. Allerdings habe ich auch noch die Vermutung das ich irgendwo einen grossen Designfehler in meinem Programm habe darum möchte ich einmal ganz gerne den Quellcode für meine Oberfläche posten:


```
import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;
import java.util.Vector;

import javax.swing.*;

public class Oberflaeche
extends JFrame
implements WindowListener
{
	// Definition der Labels
	private JLabel LFahrzeug=new JLabel("  Fahrzeug");
	private JLabel LDatum=new JLabel("  Datum");
	private JLabel LBeleg=new JLabel("  Beleg");
	private JLabel Lkm=new JLabel("  km");
	private JLabel Lliter=new JLabel("  l");
	private JLabel Leuro=new JLabel("  €");
	public JLabel LMeldung=new JLabel(" ");
		
	// Definition der Textfelder
	public JTextField TFDatum=new JTextField(10);
	public JTextField TFkm=new JTextField(10);
	public JTextField TFliter=new JTextField(10);
	public JTextField TFeuro=new JTextField(10);
	
	// Definition der Dropdownlisten
	public JComboBox DDBeleg =new JComboBox();
	public JComboBox DDFahrzeug =new JComboBox();
	
	// Definition der Checkbox
	private JCheckBox CBvollgetankt =new JCheckBox("nicht vollgetankt?",false);
	
	// Definition der Buttons
	private JButton BerfassenEintrag=new JButton("Erfassen");
	private JButton BverwaltenAuto=new JButton("Fahrzeug verwalten");
	private JButton BdeleteEintrag=new JButton("Eintrag löschen");
	private JButton BeditEintrag=new JButton("Eintrag bearbeiten");
	private JButton BEnde=new JButton("Ende");
	private JButton BverwaltungBelege=new JButton("Belege verwalten");
		
	// Definition der Reiter
	JTabbedPane TPReiter = new JTabbedPane();
	
	// Definition der Tabelle
	JTable TABverbrauch = new JTable();
	
	// Definition der Panels für die einzelnen Reiter
	JPanel PListe = new JPanel();
	JPanel PGrafik= new JPanel();
	JPanel PKosten=new JPanel();
	
	boolean bolvollgetankt=false;            // Schalter ob das Fahrzeug vollgetankt wurde
	
	public Datenbank db1;

	public Vector vFahrzeug=new Vector();    // Vektor für die Fahrzeuge
	
	Tabelle tab1;
	
	int iIDFahrzeug;                         // ID des ausgewählten Fahrzeuges
	
	public Oberflaeche()
	{
		super("Benzinverwaltung");
		
		try
		{		
			db1=new Datenbank(this);
			tab1=new Tabelle(this);
		}
		catch(SQLException excep)
		{
			this.LMeldung.setText(excep.toString());
		}
		
		addWindowListener(this);
		
		// Definition der Panels
		JPanel linksoben=new JPanel();
		JPanel linksunten=new JPanel();
		JPanel linksgesamt=new JPanel();
		JPanel rechtsgesamt=new JPanel();
		JPanel rechtsunten=new JPanel();
		JPanel gesamt=new JPanel();
		
		// Definition Layouts für die Panels
		linksoben.setLayout(new GridLayout(6,2));
		linksunten.setLayout(new GridLayout(7,1));
		linksgesamt.setLayout(new GridLayout(2,1));
		
		// Zusammenfügen der Elemente für den Panel linksoben
		linksoben.add(DDFahrzeug);    // Dropdownliste für das Fahrzeug
		linksoben.add(LFahrzeug);     // Label für das Fahrzeug
		linksoben.add(TFDatum);       // Textfeld für das Datum
		linksoben.add(LDatum);        // Label für das Datum
		linksoben.add(DDBeleg);       // Dropdownliste für die Belegart
		linksoben.add(LBeleg);        // Label für den Beleg
		linksoben.add(TFkm);          // Textfeld für die Strecke
		linksoben.add(Lkm);           // Label für die Strecke
		linksoben.add(TFliter);       // Textfeld für die Kraftstoffmenge
		linksoben.add(Lliter);        // Label für die Kraftstoffmenge
		linksoben.add(TFeuro);        // Textfeld für den Betrag
		linksoben.add(Leuro);         // Label für den Betrag
		
		// Zusammenfügen der Elemente für den Panel linksunten
		linksunten.add(CBvollgetankt);		
		linksunten.add(BverwaltenAuto);
		linksunten.add(BverwaltungBelege);
		linksunten.add(BerfassenEintrag);
		linksunten.add(BeditEintrag);
		linksunten.add(BdeleteEintrag);
		linksunten.add(BEnde);
		
		// Festlegen der Tooltips für die Buttons
		BverwaltenAuto.setToolTipText("verwalten der Fahrzeuge");
		BverwaltungBelege.setToolTipText("Verwalten der Belegarten");
		BerfassenEintrag.setToolTipText("erfassen eines neuen Datensatzes");
		BeditEintrag.setToolTipText("Ändern eines Eintrages in der Datenbank");
		BdeleteEintrag.setToolTipText("Löscht einen Eintrag aus der Datenbank");
		BEnde.setToolTipText("Programm verlassen");
		
		// Zusammenfügen des linken Fensterelements
		linksgesamt.add(linksoben);
		linksgesamt.add(linksunten);

		Container contentPane=getContentPane();
		
		contentPane.setLayout(new BorderLayout());
		contentPane.add(linksgesamt,"West");
		contentPane.add(TPReiter, "Center");
		contentPane.add(LMeldung,"South");
		
		// Erzeugen der einzelnen Reiter
		TPReiter.add(PListe, "Liste");
		TPReiter.add(PGrafik, "Grafik");
		TPReiter.add(PKosten, "Kosten");

		JScrollPane sp=new JScrollPane(TABverbrauch);
		sp.setPreferredSize(new Dimension(470,260));
		PListe.add(sp);

		// Actionlistener für die Auswahl des Fahrzeuges
	    DDFahrzeug.addItemListener( new ItemListener()
	    {
	    	public void itemStateChanged( ItemEvent e )
	    	{
	    		if(e.getStateChange()==ItemEvent.SELECTED)
	    		{
	    			// Ermittelung der Fahrzeug ID aus der Dropdownauswahl
	    			int iauswahl=DDFahrzeug.getSelectedIndex();
	    			String sIDFahrzeug=vFahrzeug.elementAt(iauswahl).toString();	
	    			iIDFahrzeug= Integer.parseInt(sIDFahrzeug);
	    			
	    			// Aufruf der Methode zum Füllen der Tabellenfelder
	    			tab1.Tabellefuellen(Oberflaeche.this, iIDFahrzeug);
	    		}
	    	}
	    });
		
		// Listener für die Checkbox
		ItemListener listvollgetankt=new ItemListener(){
			public void itemStateChanged(ItemEvent e)
			{
				if(CBvollgetankt.isSelected()==true)
				{
					bolvollgetankt=true;
				}
				else
				{
					bolvollgetankt=false;
				}
			}
		};
		
		// Festlegen des Listeners auf die Checkbox
		CBvollgetankt.addItemListener(listvollgetankt);
		
		// Belegen des Verlassen Buttons
		BEnde.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				db1.schliessen();
				dispose();
				System.exit(0);
			}
		});
		
		// Funktionsbelegung für den Erfassen-Button
		BerfassenEintrag.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
// Einfügen des Datensatz in die Datenbank				
db1.neu(Oberflaeche.this);

				// Aufruf der Methode zum Füllen der Tabelle
				tab1.Tabellefuellen(Oberflaeche.this, iIDFahrzeug);
				
				// Leeren der Eingabefelder
				Oberflaeche.this.TFDatum.setText("");
				Oberflaeche.this.TFeuro.setText("");
				Oberflaeche.this.TFkm.setText("");
				Oberflaeche.this.TFliter.setText("");
			}
		});
		
		// Funktionsbelegung für den Fahrzeugverwalten-Button
		BverwaltenAuto.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				VerwaltenAuto v1;
				
				v1=new VerwaltenAuto(Oberflaeche.this, "Verwalten der Fahrzeuge", true);
				
				v1.setSize(350,200);
				v1.show();
			}
		});
		
		// Funktionsbelegung für den Button zum Verwalten der Belege
		BverwaltungBelege.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				VerwaltenBelege v2;
				
				v2=new VerwaltenBelege(Oberflaeche.this, "Verwalten der Belege", true);
				
				v2.setSize(350,270);
				v2.show();	
			}
		});			
	}
	
	public JTable getTable()
	{ 
	    return TABverbrauch; 
	} 
	
	public void windowOpened(WindowEvent e) {}
	
	// Schliessen des Fensters
	public void windowClosing(WindowEvent e)
	{
		// Schliessen der Datenbankverbindung zum Füllen der Dropdownlisten
		db1.schliessen();
  
		// Schliessen der Datenbankverbindung zum Auslesen der Datenstätze
		tab1.schliessen();
		dispose();
	}

	// Verlassen des Programms wenn das Fenster geschlossen ist
	public void windowClosed(WindowEvent e)
	{
		System.exit(0);
	}

	public void windowIconified(WindowEvent e) {}
	public void windowDeiconified(WindowEvent e) {}
	public void windowActivated(WindowEvent e)
	{
		// Entfernen aller Elemente aus den beiden Dropdownlisten
		Oberflaeche.this.DDBeleg.removeAllItems();
		Oberflaeche.this.DDFahrzeug.removeAllItems();
		
		// Methode zum füllen der beiden Dropdownlisten
		db1.fuellenfelder(Oberflaeche.this);
	}
	public void windowDeactivated(WindowEvent e) {}
}
```

Vielleicht könnte ja jemand mal über den Quellcode schauen ich bin auf jeden fall ziemlich ratlos warum das nicht funktioniert 
Noch einmal vielen Dank für diese grossartige Hilfe die mir bis jetzt zu teil geworden ist.
Gruß
Dan


----------

