Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Laufzeitfehler 3075 - Syntaxfehler (fehlender Operator) in Abfrageausdruck

Begonnen von maex005, November 24, 2019, 04:10:02

⏪ vorheriges - nächstes ⏩

maex005

Hola zusammen

ich habe mir da ein kleines Rechnungsprogramm in Access2016 geschrieben um Dienstleistungen im Gesundheitswesen verrechnen zu können. Siehe angehängtes Bild!

Dazu habe ich mir unter anderem zwei Tabellen angelegt, eine für Kopfdaten und eine für Positionsdaten, mit je einem Feld für die Rechnungsnummer r_nummer in der Kopfdatentabelle und p_r_nummer in der Positionstabelle.

Seit nun gut einer Woche (seit ungefähr dem Microsoft Access (Bug) Update) habe ich einen Laufzeitfehler, wenn ich die letzte Position löschen will: (ich habe die Korrektur-Patches von Microsoft bereits installiert)

Laufzeitfehler '3075':
Syntaxfehler (fehlender Operator) in Abfrageausdruck 'p_r_nummer='.

Wenn eine neue Position erfasst wird, lasse ich jeweils das Total aller Positionen in das Feld p_tpreis eintragen. Das passiert auch, wenn ich eine Position lösche. Mit diesem Laufzeitfehler passiert das leider nicht mehr.

Der Debugger springt dann jeweils auf folgende Zeile:

Private Sub Form_AfterDelConfirm(Status As Integer)
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT SUM(p_tpreis) AS total FROM r_pos_sr WHERE p_r_nummer = " & Me.p_r_nummer)
CurrentDb.Execute "UPDATE r_kopf_sr SET r_total = " & rs!total & " WHERE r_nummer = " & Me.p_r_nummer
End Sub

Ich muss noch unbedingt erwähnen, dass dieser Laufzeitfehler nur aufpoppt, wenn ich die LETZTE Position löschen will. Wenn ich die erste, zweite Position löschen will, geht das OHNE Fehler - nur bei der letzten Position kommt der Laufzeitfehler. Komisch....!

Kann mir da jemand bitte weiterhelfen? Ich hoffe ich habe euch genügend Angaben geliefert - falls ihr jedoch mehr Infos braucht, bitte ich um Mitteilung! Ich bin leider in Access nicht sehr bewandert, weshalb ich um "einfache Erklärungen" sehr froh bin.

Ganz herzlichen Dank im Voraus.

Freundliche Grüsse
maex

P.S.: hier der Link zum Heise Artikel zum Access-Bug:
https://www.heise.de/newsticker/meld...6-4591159.html

DF6GL

Hallo,

bin nicht ganz sicher, was bei Dir der "letzte DS" ist..


Im Bild zeigt das UFO 2 Positionen an, der "letzte DS" wäre also Pos 2.


Der DS mit dem Sternchen ist nicht der letzte, es ist ein neuer DS, der noch keine Feldwerte besitzt, auch wenn Felder  Vorschlagswerte (Standardwerte) anzeigen.

Dieser DS kann auch nicht gelöscht werden.

Zudem, wenn ein DS gelöscht wurde, sind natürlich die Feldinhalte dieses DS nicht mehr vorhanden (--->NULL)  und es kommt zum gezeigten Fehler. D. H. es wäre hier vorteilhaft, sich auf den Primärschlüssel der Rechnung im Hauptform zu beziehen:
Zitat
Private Sub Form_AfterDelConfirm(Status As Integer)
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT SUM(p_tpreis) AS total FROM r_pos_sr WHERE p_r_nummer = " & Me.parent!r_nummer)
CurrentDb.Execute "UPDATE r_kopf_sr SET r_total = " & rs!total & " WHERE r_nummer = " & Me.Parent!r_nummer
End Sub



Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MzKlMu

Hallo,
ich würde hier das Unterformular als Endlosformular (nicht in Datenblattsicht) anlegen. Dann kann man im Formularkopf (dann steht das Feld immer an der gleichen Stelle) ein Summenfeld anordnen mit folgendem Steuerelementinhalt:
=Summe(Betrag)
Dieses Feld aktualisiert sich automatisch, ega ob ein DS hinzukommt, oder einer gelöscht wird.
Es ist kein VBA notwendig.

PS:
Wieso steht eigentlich 360 im Summenfeld, obwohl es nur 2 Positionen sind (=240) ?
Gruß Klaus

maex005

Hallo DF6GL und MzKIMu

zunächst mal - vielen Dank für eure Inputs.


@DF6GL Franz vom Bodensee

ich habe den Code wie empfohlen geändert. Das Total wird nun wieder zuverlässig geändert. Vielen, vielen Dank - ich bin sooo happy..!

Aaaaaber - ich habe bei meinem ursprünglichen Beitrag nicht den ganzen Code gezeigt (ich dachte es sei übersichtlicher so - verzeih!).

Es hat nämlich noch die Funktion, dass das jeweilige neue Positionsdatum (von einer neuen Position) in der Kopfdatentabelle das Rechnungsdatum anpasst - eben auf die letzte Behandlung bzw. neueste Position.

Jetzt fällt das Programm dort auf die Nase bzw. der Debugger springt auf folgende Zeile:

ZitatPrivate Sub Form_AfterDelConfirm(Status As Integer)
    Dim rs As Recordset
    'Set rs = CurrentDb.OpenRecordset("SELECT SUM(p_tpreis) AS total FROM r_pos_sr WHERE p_r_nummer = " & Me.p_r_nummer)
    Set rs = CurrentDb.OpenRecordset("SELECT SUM(p_tpreis) AS total FROM r_pos_sr WHERE p_r_nummer = " & Me.Parent!r_nummer)
    'CurrentDb.Execute "UPDATE r_kopf_sr SET r_total = " & rs!total & " WHERE r_nummer = " & Me.p_r_nummer
    CurrentDb.Execute "UPDATE r_kopf_sr SET r_total = " & rs!total & " WHERE r_nummer = " & Me.Parent!r_nummer
    Set rs = CurrentDb.OpenRecordset("SELECT p_behdat FROM r_pos_sr WHERE p_r_nummer = " & Me.p_r_nummer & " ORDER BY p_behdat DESC")
    CurrentDb.Execute "UPDATE r_kopf_sr SET r_datum = '" & rs!p_behdat & "' WHERE r_nummer = " & Me.p_r_nummer
End Sub

Kannst du mir hier bitte nochmals behilflich sein? Herzlichen Dank im Voraus.

Beste Grüsse vom Lauerzersee (Kanton Schwyz)
maex

maex005

....und - ich habe da gleich noch ein Problem:

Immer wenn ich eine neue Position erfasse bzw. abschliesse, springt der Cursor auf die OBERSTE Position (siehe Bild im Anhang - roter Pfeil!)
anstatt immer auf die letzte bzw. den neuen Datensatz mit dem Stern ganz unten (siehe Bild im Anhang - rot eingekreist).

Kannst du mir da eventuell auch helfen mit einem wertvollen Rat?

Vielen Dank im Voraus.

Grüsse von maex

DF6GL

Hallo,

Zitatich habe den Code wie empfohlen geändert.

Nein, hast du nicht...  Es gilt das Selbe wie im meinem Vorpost. Nutze die Referenz auf die "r_nummer" im HFO.


Zitatanstatt immer auf die letzte bzw. den neuen Datensatz mit dem Stern ganz unten

Auch hier:  es gibt keine Anweisung, die das erledigt...

Und: Soll das wirklich so sein, dass der Cursor immer auf einem neuen DS zu stehen kommt?


Mit Docmd.Gotorecord,,acNewRecord  wird der Cursor auf den neuen DS gesetzt.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

maex005

ZitatZitat
ich habe den Code wie empfohlen geändert.

Nein, hast du nicht...  Es gilt das Selbe wie im meinem Vorpost. Nutze die Referenz auf die "r_nummer" im HFO.

gut - habe ich jetzt gemacht. Funzt tipptopp - danke...

und....

ZitatAuch hier:  es gibt keine Anweisung, die das erledigt...

Und: Soll das wirklich so sein, dass der Cursor immer auf einem neuen DS zu stehen kommt?

Ja - ich möchte gerne, dass der Cursor noch unten springt, damit eine neue Position erfasst werden kann.

Ich habe es probiert mit:

ZitatOption Compare Database

Private Sub Form_AfterDelConfirm(Status As Integer)
    Dim rs As Recordset
    'Set rs = CurrentDb.OpenRecordset("SELECT SUM(p_tpreis) AS total FROM r_pos_sr WHERE p_r_nummer = " & Me.p_r_nummer)
    Set rs = CurrentDb.OpenRecordset("SELECT SUM(p_tpreis) AS total FROM r_pos_sr WHERE p_r_nummer = " & Me.Parent!r_nummer)
    'CurrentDb.Execute "UPDATE r_kopf_sr SET r_total = " & rs!total & " WHERE r_nummer = " & Me.p_r_nummer
    CurrentDb.Execute "UPDATE r_kopf_sr SET r_total = " & rs!total & " WHERE r_nummer = " & Me.Parent!r_nummer
    'Set rs = CurrentDb.OpenRecordset("SELECT p_behdat FROM r_pos_sr WHERE p_r_nummer = " & Me.p_r_nummer & " ORDER BY p_behdat DESC")
    Set rs = CurrentDb.OpenRecordset("SELECT p_behdat FROM r_pos_sr WHERE p_r_nummer = " & Me.Parent!r_nummer & " ORDER BY p_behdat DESC")
    'CurrentDb.Execute "UPDATE r_kopf_sr SET r_datum = '" & rs!p_behdat & "' WHERE r_nummer = " & Me.p_r_nummer
    CurrentDb.Execute "UPDATE r_kopf_sr SET r_datum = '" & rs!p_behdat & "' WHERE r_nummer = " & Me.Parent!r_nummer
    DoCmd.GoToRecord , , acNewRecord
End Sub

Private Sub Form_AfterUpdate()
   
   
    Dim rs As Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT SUM(p_tpreis) AS total FROM r_pos_sr WHERE p_r_nummer = " & Me.p_r_nummer)
    CurrentDb.Execute "UPDATE r_kopf_sr SET r_total = " & rs!total & " WHERE r_nummer = " & Me.p_r_nummer
   
    Set rs = CurrentDb.OpenRecordset("SELECT p_behdat FROM r_pos_sr WHERE p_r_nummer = " & Me.p_r_nummer & " ORDER BY p_behdat DESC")
    CurrentDb.Execute "UPDATE r_kopf_sr SET r_datum = '" & rs!p_behdat & "' WHERE r_nummer = " & Me.p_r_nummer
   
    'DoCmd.GoToRecord , , acNewRec
    DoCmd.GoToRecord , , acNewRecord

End Sub

ABER leider geht es so nicht - siehe Printscreen im Anhang. Der Cursor springt auch so wieder auf den obersten DS - leider.

MzKlMu

Hallo,
ich halte das Vorhaben in dieser Form für ersatzlos überflüssig. Das geht viel einfacher mit dem Vorschlag von mir aus #2.
Da braucht es keinen Code, keinen Buchstaben und der Cursor steht auch immer auf einem neuen Datensatz, alles automatisch.

PS:
Die Mahnungen gehören in eine extra Tabelle.
Gruß Klaus

maex005

Hallo MzKIMu

es gibt schon wichtige Gründe, weshalb dein Vorschlag leider nicht möglich ist. Das heisst aber nicht, dass es ein "schlechter" Vorschlag ist. Aber trotzdem danke für die Idee.

Ich wäre aber froh, wenn du mir Vorschläge zur Problemlösung präsentieren könntest - einfach keine Umbau-Vorschläge. Vielen Dank im Voraus.

@DF6GL - Franz, bitte beachte meinen vorletzten Post - leider hat dein Vorschlag so nicht funktioniert, bzw. irgendetwas übersehe ich.

Gruss - maex

MzKlMu

Hallo,
ich kann mir da gerade keinen wichtigen Grund vorstellen warum mein Vorschlag nicht anwendbar ist , aber egal, da halte ich mich dann raus. Eine andere Lösung habe ich nicht.
Gruß Klaus

DF6GL

Hallo,

ich pflichte  Klaus  vollumfänglich bei...

Zitates gibt schon wichtige Gründe, weshalb dein Vorschlag leider nicht möglich ist.

dann erklär uns mal die Gründe... 



Zitatirgendetwas übersehe ich.


wie schon zweimal gesagt: nutze die Referenz auf das HFO-Feld, wobei die "Form_AfterUpdate()"-Prozedur insgesamt überflüssig ist, bzw. keinen Sinn ergibt.




Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

maex005


DF6GL

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access