# Problem mit Fremdschlüssel



## paran11 (28. Feb 2009)

Hallo zusammen!

Ich habe folgendes Problem:

Ich bin gerade dabei mir ein kleines Buchführungsprogramm mithilfe von Java und Access zu programmieren.
Mein Problem liegt momentan bei der Erstellung der Datenbank mit Access.

Ich habe 2 Tabellen (buchungen, konten)
Die Entität 'buchungen' hat dabei folgende Attribute: buchungsnr(Auto-Wert(PK)), belegnr(Text), datum(date), buchungstext(Text),betrag(Währung)
Die Entität 'konten' hat: kontonr(Text(PK)),bezeichnung(Text),soll(ährung),haben(Währung),aktivkonto(JA/NEIN),passivkonto(JA/NEIN)

Die Daten, die ich mithilfe der Java-Applikation eintrage, werden dann auch in die MS-Access-DB eingetragen und alles wunderbar übernommen.

Ich habe nur ein Problem, wenn ich jetzt einen Datensatz mithilfe der Java-App. stornieren möchte.
(Die Daten werden in eine JList eingetragen und gleichzeitig in die DB geschrieben)

Wenn mir jetzt nach einiger Zeit auffällt, dass ich mich bei einem Buchungssatz vertippt habe und diesen stornieren möchte, kann ich ja den Buchungssatz aus der Tabelle 'buchungen' mit dem PK 'buchungsnr' ansprechen und löschen...ist auch kein Problem.
NUR... ich würde auch gerne, dass der Betrag, der mit diesem Datensatz in Verbindung steht, auch aus der Tabelle 'konten' löschen...also den betroffenen Betrag, der mit dem Buchungssatz in Verbindung steht wieder abziehen vom Konto.

Ich weiß leider nicht, wie ich das Problem lösen kann... evtl. mit einem Fremdschlüssel, Beziehungen zwischen den Tabellen ???

Könnte mir jemand sagen, wie ich das am besten anstelle...ich versuch´s jetzt scho nseit ca. 3 Std. ...hab aber bisher keine komfortable Lösung gefunden ??!??

Ich hoffe, dass das Problem einigermaßen verständlich ist...Buchführung ist ja nicht jedermanns sache 

Vielen Dank im Voraus 

Gruß


----------



## abollm (28. Feb 2009)

paran11 hat gesagt.:


> [..]
> Mein Problem liegt momentan bei der Erstellung der Datenbank mit Access.
> 
> Ich habe 2 Tabellen (buchungen, konten)
> ...



Meine Betätigung mit Buchführung liegt schon einige Jahre zurück, aber folgende Frage:
IIRC musst du doch jede Buchung in jeweils zwei Konten berücksichtigen? 
Dann kannst bzw. musst du auch in deinen Buchungssätzen jeweils einen Fremdverweis auf die Kontonummer mitführen. Danach ist die Sache dann auch relativ einfach.
Z.B. 
'buchungen' hat dann folgende Attribute: buchungsnr(Auto-Wert(PK)), belegnr(Text), datum(date), buchungstext(Text),betrag(Währung), kontonr(Text(FK))


----------



## paran11 (28. Feb 2009)

Ja da hast du Recht...man hat ja entweder 2 Konten, wenn man ohne Steuer bucht und 3 Konten, wenn man die Vorsteuer/Umsatzsteuer berücksichtigt...wenn es dass ist, was du meinst

Aber ich weiß einfach nicht, wie ich das in Access realisieren soll


----------



## abollm (28. Feb 2009)

paran11 hat gesagt.:


> Ja da hast du Recht...man hat ja entweder 2 Konten, wenn man ohne Steuer bucht und 3 Konten, wenn man die Vorsteuer/Umsatzsteuer berücksichtigt...wenn es dass ist, was du meinst
> 
> Aber ich weiß einfach nicht, wie ich das in Access realisieren soll



Ich weiß nicht genau, womit genau du jetzt ein Problem hast. Willst du unbedingt mit einem vom DB-System MS Access erstellten Fremdverweis arbeiten?
Ich habe leider kein MS Access auf meinem Rechner (müsste ich erst installieren, und dazu hab ich jetzt keine Zeit/Lust). Grundsätzlich kannst du in deiner eigenen Java-Applikation für die korrekte Auflösung der Fremdverweise sorgen, indem du grundsätzlich (zwingend) in jedem Buchungssatz die Kontonummer füllst und somit selbst für die Integrität der Daten sorgst.
Wenn ich aber erneut darüber nachdenke, musst du ja grundsätzlich bei Fehlbuchungen gegenbuchen (GOB! ;-). Somit brauchst du bei derartigen Fehl- oder Falschbuchungen zunächst nur den gleichen, aber mit dem entgegengesetzten Vorzeichen versehenen Buchungsbetrag zuerst nur gegenbuchen. Dann sind die betr. Konten betragsmäßig wieder auf dem Stand wie vor der Fehlbuchung. Ist doch richtig, oder?


----------



## frapo (28. Feb 2009)

Für mich hört sich das nach einem Problem in deinem DB-Design an. Beide Tabellen scheinen in keiner weise eine Beziehung zueinander zu haben. Beispielsweise könnte man in der Tabelle Konto ein Feld einfügen, das eine direkte Beziehung zu einem Datensatz in der Tabelle Buchungen herstellt. Anbieten könnte sich hier das Feld BuchungsNr. In der Tabelle Buchungen ist es bereits enthalten, in der Tabelle Konto noch nicht. Je nachdem wie das später aussehen soll, könnte man eine 1:n Beziehung vereinbaren, ein Buchungsvorgang muss genau einem Konto zugewiesen (also 1) sein, ein Konto kann aber natürlich mehrere Buchungsvorgänge enthalten (also n).

vielleicht hilft dir dieser Gedanke ja bereits schon weiter 

Gruß
frapo


----------



## paran11 (1. Mrz 2009)

Hi!

Ich hab´s jetzt soweit gelöst...zwar nen bisschen anders als gewollt, aber es funktioniert
Nur mit dem Storno hab ich noch nen winziges Problem:

Ich habe die Datensätze ja in einer JList stehen
Das sieht dann z.B. folgendermaßen aus:

"2 . Aufwendungen für Rohstoffe EUR 10000
+ Vorsteuer EUR 1600
an Verbindlichkeiten EUR 11600"

Ich lese dann vorher den Autowert (also hier "2") mithilfe von:
String a = list.getSelectedItem().substring(0,1);
Ich habe jetzt versucht mit: "DELETE * FROM buchungen WHERE buchungsnr='"+a+"'";
...den Datensatz aus der DB zu löschen...nur wirft er mir da nen Fehlermeldung aus
"Datatype mismatch blalbla..."

Wie kann ich die beiden Sachen miteinander vergleichen, damit ich den Datensatz aus der Tabelle löschen kann ?

Danke im Voraus


----------



## paran11 (5. Mrz 2009)

Hallo!

Also das mit dem DELETE-Statement hab ich jetzt hinbekommen..hab´s mit nem preparedStatement gelöst!

Ich hätte da noch ne andere Frage:

Ich habe noch eine SELECT-Abfrage:
[HIGHLIGHT="Java"]Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
String sql = "SELECT Kto, text, Gesamt FROM tab1";
        ResultSet rst = stmt.executeQuery(sql);
        while (rst.next())
           {
             list.add(rst.getString("Kto")+ " "+" "+rst.getDouble("Gesamt"));
           }
rst.close();
stmt.close();
con.close();[/HIGHLIGHT]

Die while-Schleife wird ja solange durchlaufen, solange etwas im ResultSet enthalten ist...
Ich würde jetzt gerne die Spalte ("Gesamt") aufaddieren und dann als Ergebnis ausgeben lassen ...also nicht über ne weitere SQL-Abfrage sondern direkt in Java... wie kann ich das umsetzen ??

Danke im Voraus


----------



## abollm (5. Mrz 2009)

paran11 hat gesagt.:


> Ich hätte da noch ne andere Frage:
> 
> Ich habe noch eine SELECT-Abfrage:
> [HIGHLIGHT="Java"]Connection con = DriverManager.getConnection(url);
> ...



Das wäre ziemlicher Bullshit (SCNR), wenn du die Aufsummierung so wie von dir geplant lösen würdest. Versuche es besser mit einer Aggregatfunktion direkt via SQL zu lösen. Das ist grundsätzlich performanter.


----------



## paran11 (5. Mrz 2009)

Hallo...danke für die schnelle Antwort!

Ich weiß, dass es besser wäre über ein weiteres SQL-Statement wie SUM(Gesamt) den Betrag zu erfragen.
Mir ging es eigentlcih nur darum, ob es möglich ist...und wenn ja...wie ???

Vielen Dank nochmal für eure Hilfe


----------



## Ebenius (5. Mrz 2009)

Es ist möglich. Wenn's Dir nicht auf die Genaugkeit ankommt (Fließkommazahlen aufaddieren): [HIGHLIGHT="Java"]double acc = 0;
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
String sql = "SELECT Kto, text, Gesamt FROM tab1";
        ResultSet rst = stmt.executeQuery(sql);
        while (rst.next())
           {
             final double gesamt = rst.getDouble("Gesamt");
             acc += gesamt;
             list.add(rst.getString("Kto")+ " "+" "+gesamt);
           }
System.out.println("Akkumuliert Gesamt: " + acc);
rst.close();
stmt.close();
con.close();[/HIGHLIGHT] Ebenius


----------



## paran11 (5. Mrz 2009)

Hey...ne darum geht´s mir nicht primär...die genauigkeit ist halb so wild

Möchte nur wissen, wie ich es machen kann ??


----------



## Ebenius (5. Mrz 2009)

paran11 hat gesagt.:


> Möchte nur wissen, wie ich es machen kann ??


Im oberen Post steht Code... Aber da gibt's grad nen Bug im Forum, deswegen wird der nicht angezeigt. Bitte schau nochmal später nach.

Ebenius


----------



## paran11 (5. Mrz 2009)

Ahh..ok..vielen Dank für deine Hilfe!!


----------

