7.2k Aufrufe
Gefragt in Datenbanken von
Hallo,
ich bin dabei eine Service Datenbank zu programmieren und habe folgendes Problem.
Es gibt eine Haupttabelle in der Aufträge gespeichert werden.
In einer Zwischentabelle werden zu dem Auftrag gehörende Ersatzteile gespeichert.
Ich erstelle einen Bericht der auf einer Abfrage basiert. Dieser Abfrage gibt aber leider #Fehler aus, wenn keine Ersatzteile verwendet werden (kein Eintrag in der Zwischentabelle existiert). Der Preis des Ersatzteiles wird in der Rechnung gebraucht um den Endpreis zu berechnen.

Hier die Formel für die Preisberechnung
=([qryErsatzteile Unterbericht].Bericht!txtSummeErsatzteilUF+[AuftragFestpreis])


Es müsste also, sollte [qryErsatzteile Unterbericht].Bericht!txtSummeErsatzteilUF (Textfeld aus dem Unterformular in dem die Summe der Ersatztteilpreise steht) nicht existieren(da keine Ersateile verwendet wurden und kein Datensatz in der Zwischentabelle existiert), eine 0 in die Rechnung einfließen oder das Textfeld nicht mit einbezogen werden.

Ich habe schon so einiges probiert, bin aber leider nicht bis zum Ziel gekommen.

Lg Andara

11 Antworten

0 Punkte
Beantwortet von
hi @ll,
mein letzter versuch war

If DCount("*", "qryErsatzteile") = 0 Then txtSummeErsatzteilUF.Value = 0


leider hat es nix gebracht.
0 Punkte
Beantwortet von marie Experte (2k Punkte)
=([qryErsatzteile Unterbericht].Bericht!txtSummeErsatzteilUF+[AuftragFestpreis])


Ich kann das alles leider nicht nachvollziehen. Aber an der Stelle oben müsstest Du vermutlich eine if Then Abfrage machen.


Also = [Auftrag festpreis] + blabla wenn DCount("*", "qryErsatzteile") > 0, else [Auftrag festpreis]

oder anstelle DCount("*", "qryErsatzteile")>0 ([qryErsatzteile Unterbericht].Bericht!txtSummeErsatzteilUF>0

keine Ahnung, nur mal so geraten, denn nachvollziehen kann ich das Ganze nicht. Du schreibst weder wo Du das

If DCount("*", "qryErsatzteile") = 0 Then txtSummeErsatzteilUF.Value = 0
hinschreibst, noch welche Fehlermeldung du bekommen hast oder wieso es nichts gebracht hat.

Gruß Marie
0 Punkte
Beantwortet von
Hallo Andara!

Die Berichte, wie in der Frage erwähnt, werden alle nach Abfragen erstellt.
Beim Testen (Acces 2003) der Abfragen und der Berichte konnte ich nirgends eine Fehlermeldung entdecken, selbst wenn Datensätze in der Abfrage gelöscht wurden.
Wenn in der sogenannten Zwischentabelle keine Datensätze sind, können sie auch nicht in der Abfrage bzw. Bericht vorhanden sein.
Außerdem sollen, wenn ich die Frage richtig verstanden habe die Einzelpreise (ohne Mengen) aufscheinen, was auch zu keinen Fehler führen kann.

Was in der Datenbank wo einfließen soll wären konkretere Angaben erforderlich

Ohne selbst programmieren zu können, glaube ich, dass in der Applikation ein Fehler liegt, den es zu finden bedarf.

Aus der MS Office Acces Hilfe – Fehlermöglichkeiten (kleiner Auszug)

<0s> darf in diesem Abfragetyp nicht verwendet werden.
<0s> im Ausdruck ist kein Teil der Abfrage.
<0s>-Unterstützung ist in dieser Serverversion nicht verfügbar.
Leere Einschränkungsausdrücke sind nicht zulässig
Ein Datenbankdiagramm mit diesem Namen existiert bereits in der Datenbank.
Es waren mehrere Zeilen betroffen.
Zum Erstellen einer Beziehung sind zwei zusammengehörige Spalten erforderlich.
In Spalte "<0s>" kann kein Primärschlüssel erstellt werden, da sie Nullwerte zulässt.
In Spalten mit dem Datentyp <0s> kann kein Primärschlüssel und kein Index erstellt werden.
Ein Primärschlüssel oder ein Index kann nicht über mehr als <0d> Spalten verfügen.
Bevor Tabelle "<0s>" an einer Beziehung teilnehmen kann, muss ein Primärschlüssel oder eine eindeutige Einschränkung definiert sein.
Es kann keine Beziehung mit einem Primärschlüssel erstellt werden, der mehr als "<0d>" Spalten hat.
Beim Hinzufügen einer Formel zu der markierten Spalte werden alle Indizes und usw. usw..........
In der „Nordwind“ Beispieldatenbank (herunterladbar in der Office-Hilfe) ist so ziemlich alles ersichtlich, was mit Acces möglich ist.

Mit Acces hatte ich in der Praxis eher weniger zu tun, außerdem ist es ca. 3 Jahre her, als ich den ECDL (alle Module) gemacht habe und einiges jetzt wieder auffrischen und dazulernen sollte.

Ich hoffe trotzdem nach meinen Möglichkeiten zumindest Anhaltspunkte geben bzw. Vorschläge machen zu können.

Schöne Grüße

Paul1
0 Punkte
Beantwortet von
Morgen marie und paul1,
sry, dass ich das problem zu dürftig beschrieben habe.
Der
=([qryErsatzteile Unterbericht].Bericht!txtSummeErsatzteilUF+[AuftragFestpreis])

Eintrag ist der Steuerelementinhalt eines Textfeldes (txtPreis) in dem der Preis ausgegeben werden soll.

#Fehler steht direkt im Textfeld txtPreis wenn kein Ersatzteildatensatz vorhanden ist.

If DCount("*", "qryErsatzteile") = 0 Then txtSummeErsatzteilUF.Value = 0

hatte ich beim öffnen des Berichtes eingefügt, damit falls es keinen kein datensatz für die ersatzteile vorhanden ist eine 0 in das Textfeld geschrieben wird und ich mit diesem Wert weiter arbeiten kann. es wurde auch hier nur #Fehler in dem Textfeld ausgegeben.


= [Auftrag festpreis] + blabla wenn DCount("*", "qryErsatzteile") > 0, else [Auftrag festpreis]

genau sowas brauch ich. So, dass falls kein ersatzteil existiert nur der Festpreis genommen wird. ich weis aber nicht, wo ich das wie eintragen muss. ich bin DB anfänger und meine fähigkeiten sind zZ noch sehr mager.

LG Andara
0 Punkte
Beantwortet von
Hallo Andara!

Wenn kein Datensatz vorhanden ist, von wo soll dann den Preis herkommen.
Sollte es nur darum gehen, dass keine Mengen auf Lager sind, dann steht bei Menge ohnehin 0 und den Datensatz, egal von wo er herkommt könnte man belassen.
Zu den Formeln kann ich leider nichts sagen, da ich mich nicht auskenne.
Ganz klar ist mir das alles noch immer nicht.

Was soll dabei herauskommen, wenn es fertig ist (ein Arbeitsauftrag, eine Rechnung etc.) und wie soll es aussehen.

Ich habe zwar auch einen Nachholbedarf was Acces betrifft, aber bei Zahlen und logischen Abläufen könnte ich mir was vorstellen.

Genaueres wäre von Vorteil, zum Beispiel:
Welche Tabellen, Abfragen, Berichte, Unterberichte usw. gibt es
>was soll die auftragsbezogene Haupttabelle können
>wie schaut die zum Auftrag gehörende Zwischentabelle mit den Ersatzteilen aus.

Für meine Begriffe einiges an offenen Fragen.

schöne Grüße


Paul1
0 Punkte
Beantwortet von
moin,
es gibt eine Haupttabelle (tblAuftrag) hier sind alle Auftragsbezogenen Daten gespeichert Auftragsnummer, Kundenname, Festpreis usw.
Es gibt eine zweite Tabelle (tblErsatzteile) in der alle Ersatzteildaten inkl Preis enthalten sind.

Beide Tabellen sind über eine Zwichentabelle (tblAuftragErsatzteile) verbunden. In dieser Tabelle sind lediglich die beiden Fremdschlüssel und ein Primärschlüssel enthalten.

Der Bericht ist eine Rechnung. Im Hauptbericht sind alle Auftragsdaten enthalten.
In einem Unterbericht sind alle Ersatzteil bezogenen Daten enthalten. Im Berichtsfuß gibt es ein Textfeld(txtSummeErsatzteile), in dem die Einzelpreise(Preis*Menge) der Ersatzteilpositionen addiert werden. Dieses Textfeld spreche ich an um den entgültigen Gesamtpreis zu errechnen. Existiert kein Datensatz in der tblAuftragErsatzteile so existiert das txtSummeErsatzteile nicht und ich kann nicht ansprechen.

Hier mal die SQL Abfrage für die Ersatzteile (falls es hilft)

SELECT tblAuftragErsatzteil.AuftragNr, tblAuftragErsatzteil.ErsatzteilNr, tblAuftragErsatzteil.AuftragErsatzteilMenge, tblAuftragErsatzteil.AuftragErsatzteilBestelltAm, tblAuftragErsatzteil.AuftragErsatzteilGeliefertAm, tblErsatzteil.ErsatzteilBeschreibung, tblErsatzteil.ErsatzteilPreis
FROM tblErsatzteil INNER JOIN tblAuftragErsatzteil ON tblErsatzteil.ErsatzteilNr = tblAuftragErsatzteil.ErsatzteilNr;


Vielen Dank für Deine Hilfe!

Lg Adrian
0 Punkte
Beantwortet von
Hallo Adrian!

Das Feld im Berichtsfuß entspricht der Formel:
Gesamtpreis (als Text),
daneben =Summe([Menge]*[Preis])

Textfeld ab| verwenden!

Dieses Feld wurde im Bericht angelegt und ist von den Feldern im Datensatz abhängig, sonst könnte keine Berechnung durchgeführt werden.
Wenn kein Datensatz vorhanden ist, kann nichts berechnet werden.
Ein direktes Ansprechen ist daher so gesehen nicht möglich.

Ich würde Dir empfehlen zu improvisieren, lege einen Datensatz z.B. "Diverses" an und
gib als Menge 1 ein und als Einzelpreis (Preis) eine Summe ein.
Dann hat das Feld Gesamtpreis was zum Rechnen und Du brauchst nichts separat einzugeben.

Ich hoffe, daß diese Lösung in Dein Konzept passt.


schöne Grüße

Paul1
0 Punkte
Beantwortet von
Hallo Adrian!

Es stimmt, wenn keine Datensätze vorhanden schreibt der Bericht #Fehler an.
Allerdings bei Nullwerten in Menge und Preis gibt der Bericht auch Null aus.
Daher muß in diesem Fall mindestens ein Datensatz z.B.Festpreis (ich sagte in der Vorantwort "Diverses") in der für den Bericht zugrundeliegenden Tabelle drinnenbleiben, ob leer oder mit Inhalt, dann gibt es keinen #Fehler mehr.


schöne Grüße

Paul1
0 Punkte
Beantwortet von marie Experte (2k Punkte)
Tja endlich versteh ich wenigstens mal wo dein fehler liegen muss, wenngleich du ja nur die Datensatzherkunft beschrieben hast und nicht die Abfrage, die den Fehler bringt. Und so ganz hab ich natürlich immer noch nicht kapiert wieso da Datensätze sein können wo ein Ersatzteil bestellt ist, aber nicht vorhanden ist?? Ich denke mal da steht dann etwas drin, was nicht zu den Ersatzteilen gehört? Also 10 Kaugummi auch ohne Preis?? Oder wat?? Denn der Preis steht ja in der Artikelliste.

Also wieso schreibst Du INNER JOIN, falls in der Tabelle tblAuftragErsatzteil Datensätze sind, die keinen Datensatz in der Tabelle tblErsatzteil haben und trotzdem angezeigt werden müssen, dann musst Du schreiben RIGHT JOIN

SELECT tblAuftragErsatzteil.AuftragNR, tblAuftragErsatzteil.ErsatzteilNr, tblAuftragErsatzteil.AuftragErsatzteilMenge, tblAuftragErsatzteil.AuftragErsatzteilBestelltAm, tblAuftragErsatzteil.AuftragErsatzteilGeliefertAm, tblErsatzteil.ErsatzteilBeschreibung, tblErsatzteil.ErsatzteilPreis
FROM tblErsatzteil RIGHT JOIN tblAuftragErsatzteil ON tblErsatzteil.ErsatzteilNr = tblAuftragErsatzteil.ErsatzteilNr;


ich seh zwar keinen Sinn darin, aber anders kannst Du keine 0 einsetzen, wenn der Datensatz gar nicht angezeigt wird.

Hab ich das jetzt richtig rum verstanden?? Oder meinst Du noch was anderes?

Gruß marie
0 Punkte
Beantwortet von marie Experte (2k Punkte)
Upps, andersrum macht das mehr sinn, ja, also wenn Du natürlich die gesamte Artikelliste brauchst, dann musst Du schreiben LEFT JOIN
...