Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Währungsdatenfelder Begrenzen

Begonnen von Kromba, März 21, 2012, 16:01:43

⏪ vorheriges - nächstes ⏩

Kromba

Hallo zusammen,

ich muss für eine Buchführungsdatenbank die Buchungsbeiträge ("Beitrag") in einem Formular ("Buchfuehrung") mit Rücksicht auf den verfügbaren Mitteln (für die jeweiligen Kostenstellen/Verwendungszwecke) begrenzen.
Ich habe eine Haupttabelle "Buchfuehrung" in der sind Buchungen mittels einen Formular (Split Form) eingetragen. Unter anderem hat diese Tabelle einen Attribut "Kostenstelle" der den Verwendungszweck der Buchung einer bestimmte Ausgabenklasse zuordnet (z.B Dienstreise, Allgemeine Verwaltungsausgaben, Investitionen, ...). Diese Kostenstellen sind vordefiniert und in eine Tabelle "Ausgaben" gespeichert. Ihren Primärschlüssel ist einen Code (z.B 0815/ als Text definiert wegen dem Null am Anfang), andere Attribute sind die "Bezeichnung" und der "Grenzwert" . Das Budget wird durch diese Kostenstellen geteilt, und somit wird die Summe der Ausgaben jeder Kostenstelle mit diesem "Grenzwert" begrenzt. D.h, wenn ich mittel i.H.v 20.000 € für Dienstreisen habe, die Summe der Buchungsbeiträge aller Buchungen mit dem Wert "Dienstreise" als "Kostenstelle" muss nicht den "Grenzwert" der Ausgabenklasse "Dienstreise" überschreiten. Beim Eintragen einer Buchung die zum Überschreiten dieser Grenze führt soll der Benutzer eine Meldung/Warnung bekommen.
Ganz Konkret sehen die Tabellen so aus:

[Buchfuehrung]
+BuchungsNummer (Auto-Nummer)
+Kostentraeger (Text/Lookout)
+Kreditor (Text)
+Position (Text)
+Kostenstelle (Text/ Lookout)
+Beitrag (Währung)
+Buchungsdatum (Datum)

[Ausgaben]
+KostStelle (Text) {mit [Buchfuehrung].[Kostenstelle] verknüpft}
+Bezeichnung (Text)
+Grenze (Währung)

Die Idee ist nichts anderes als den "Beitrag" in dem Formular der ersten Tabelle so zu begrenzen, dass die Summe der Beitraege aller Einträge die dieselbe "Kostenstelle" haben, die "Grenze" dieser Kostenstelle nicht überschreiten dürfen.

Hat jemand eine Ahnung wie ich es implementieren kann?

DF6GL

Hallo,

etwa in dieser Art:

Sub Form_BeforeUpdate(Cancel as Integer)

If  nz(Me!Beitrag,0) + Dsum ("Beitrag","Buchfuehrung","KostStelle = '" & Me!Kostenstelle & "'") > Dlookup("Grenze","Ausgaben","KostStelle = '" & Me!Kostenstelle & "'")  Then
Msgbox  "Halt, so nicht!"
Me.Undo
Cancel =True
End If

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

Kromba

Das Funktionniert nicht.
Ich habe fast alles versucht, um es überhaupt für den Benutzer zu ermöglichen, die uebrige Mitteln für jede Kostenstelle zu wissen bevor er den Buchungsbeitrag eingibt, aber es scheint irgendwie hoffnungslos zu sein. Ein einfaches Vergleich der Summe der Ausgaben pro Kostenstelle mit den jeweiligen Grenzen scheint auch nicht zu funktionnieren, da Access 2007 die Summe (in Query kalkuliert) in kein kalkuliertes Feld miteinbeziehen kann.
Ich bin echt verzweifelt  :'(

DF6GL

Hallo,

"Das Funktionniert nicht."   ist auch zum Verzweifeln...   Damit kann man nichts anfangen.

"Ich habe fast alles versucht"  


WAS ALLES hast Du WIE versucht??

"aber es scheint irgendwie hoffnungslos zu sein"

ist auch anzuzweifeln...


"da Access 2007 die Summe (in Query kalkuliert) in kein kalkuliertes Feld miteinbeziehen kann"

???


nz(Me!Beitrag,0) + Dsum ("Beitrag","Buchfuehrung","KostenStelle = '" & Me!Kostenstelle & "'") > Dlookup("Grenze","Ausgaben","KostenStelle = '" & Me!Kostenstelle & "'")  



dieser Ausdruck prüft, ob der Wert aus  Formularfeld "Beitrag"   plus der Summe aus den  Werten in Tabellenspalte "Beitrag  (Tabelle "Buchführung"), die der Kostenstelle aus Formularfeld "Kostenstelle" zugeordnet sind   größer ist als der Wert aus Feld "Grenze" in Tabelle "Ausgaben" , der der Kostenstelle zugeordnet ist.


Der ganze Code läuft beim Auftreten des Formularereignisses "Vor Aktualisierung"  (des Datensatzes)  ab, wenn denn die Ereignisprozedur richtig angelegt wurde.



Prüf mal die Richtigkeit der angebenen Tabellen- und Textfeldnamen und setz einen Haltepunkt an den Anfang des Codes, um zu sehen, ob die Prozedur auch bei gegebener Situation aufgerufen wird.



Andererseits kann der "Grenze"-Wert auch lediglich in einem zusätzlichen Textfeld angezeigt werden, nachdem die Kostenstelle eingetragen, bzw. angezeigt wurde/wird:


Im Steuerelementinhalt eines zusätzlichenTextfeldes:

=Dlookup("Grenze";"Ausgaben";"KostenStelle = '" & [Kostenstelle] & "'")  




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

database

#4
Hallo,

ZitatDas Funktionniert nicht. ...
...liegt wahrscheinlich lediglich an einem kleinen Tippfehler.

Sub Form_BeforeUpdate(Cancel as Integer)

If  nz(Me!Beitrag,0) + Dsum ("Beitrag","Buchfuehrung","Kostenstelle = '" & Me!Kostenstelle & "'") > Dlookup("Grenze","Ausgaben","KostStelle = '" & Me!Kostenstelle & "'")  Then
Msgbox  "Halt, so nicht!"
Me.Undo
Cancel =True
End If

End Sub

...und auch hier ...

"Im Steuerelementinhalt eines zusätzlichenTextfeldes:"

=Dlookup("Grenze";"Ausgaben";"KostStelle = '" & [Kostenstelle] & "'")  

Beachte auch, dass im Code Kommata und beim Steuerelementinhalt Semikolons als Trennzeichen zu verwenden sind!

Ansonsten stimmt der Code von Franz und MUSS das erwartete Ergebnis liefern.

Schau mal nach, ob im Formularentwurf beim Ereignis 'Vor Aktualisierung' der Eintrag '[Ereignisprozedur]' drinsteht.

Weiterhin ist die Übereinstimmung der realen Feldbezeichnungen und Tabellennamen mit den Feldbezeichnungen und Tabellennamen
in deinem Beitrag zu überprüfen und ggf. anzupassen. (Aber darauf hat Franz schon hingewiesen)

Prüfe auch, ob die Formularfelder 'Beitrag' und 'Kostenstelle' in deinem Formular genau so benannt sind - wenn nicht, die richtigen Namen klarerweise ebenfalls im Code angleichen.


Kromba

Leider bekomme ich folgende Fehlermeldung:

<< Runtime Error '2471':

The expression you entered as a query parameter produced this error:
'K'  >>

DF6GL

Hallo,

Du sprichst in Rätseln...


Welche Abfrage verwendest Du da?  Wie heißt der SQL-String dieser Abfrage?

Bei welchem Statement taucht der Fehler auf?

Gibt es je ein Feld "Kostenstelle"  in den Tabellen?
Ist "Buchführung" und "Ausgaben" je eine Tabelle?

Gibt es ein Steuerelement "Kostenstelle" im Formular?

Hast Du die Namen im Code an die entspr. Feldnamen in den Tabellen angepasst?

Ist sichergestellt, dass das Formular-Feld "Kostenstelle" mit einem (Text-) Wert gefüllt (nicht leer) ist?
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

Kromba

ZitatWelche Abfrage verwendest Du da?  Wie heißt der SQL-String dieser Abfrage?
Soweit ich weiss, ich habe keine Abfrage benutzt. Die Fehlermeldung bekam ich als ich die Lösung die mir "database" vorgeschlagen hat (zusamen mit dem zusätzlichen Textfeld) angewendet habe.
Zitat von: database am März 24, 2012, 09:37:45
Hallo,

ZitatDas Funktionniert nicht. ...
...liegt wahrscheinlich lediglich an einem kleinen Tippfehler.

Sub Form_BeforeUpdate(Cancel as Integer)

If  nz(Me!Beitrag,0) + Dsum ("Beitrag","Buchfuehrung","Kostenstelle = '" & Me!Kostenstelle & "'") > Dlookup("Grenze","Ausgaben","KostStelle = '" & Me!Kostenstelle & "'")  Then
Msgbox  "Halt, so nicht!"
Me.Undo
Cancel =True
End If

End Sub

...und auch hier ...

"Im Steuerelementinhalt eines zusätzlichenTextfeldes:"

=Dlookup("Grenze";"Ausgaben";"KostStelle = '" & [Kostenstelle] & "'") 

Beachte auch, dass im Code Kommata und beim Steuerelementinhalt Semikolons als Trennzeichen zu verwenden sind!

Ansonsten stimmt der Code von Franz und MUSS das erwartete Ergebnis liefern.

Schau mal nach, ob im Formularentwurf beim Ereignis 'Vor Aktualisierung' der Eintrag '[Ereignisprozedur]' drinsteht.

Weiterhin ist die Übereinstimmung der realen Feldbezeichnungen und Tabellennamen mit den Feldbezeichnungen und Tabellennamen
in deinem Beitrag zu überprüfen und ggf. anzupassen. (Aber darauf hat Franz schon hingewiesen)

Prüfe auch, ob die Formularfelder 'Beitrag' und 'Kostenstelle' in deinem Formular genau so benannt sind - wenn nicht, die richtigen Namen klarerweise ebenfalls im Code angleichen.



ZitatBei welchem Statement taucht der Fehler auf?
der Fehler taucht auf, wenn ich irgendein Wert im Feld "Beitrag" eingebe (durch das Formular).

ZitatIst "Buchführung" und "Ausgaben" je eine Tabelle?
Ja. Die habe ich auch im meinem ersten Beitrag hier beschrieben.

ZitatGibt es ein Steuerelement "Kostenstelle" im Formular
Ja. Das Formular ist einfach für die Tabelle "Buchfuehrung" erstellt worden, und enthält alle Datenfelder dieser Tabelle.

ZitatHast Du die Namen im Code an die entspr. Feldnamen in den Tabellen angepasst
Ja.

Zitat
Ist sichergestellt, dass das Formular-Feld "Kostenstelle" mit einem (Text-) Wert gefüllt (nicht leer) ist?
Es hat keine default value, aber in dem Fall wo ich die Fehlermeldung bekommen habe, hatte dieses Feld schon einen Wert.

Ich hoffe ich habe mich richtig ausgedrückt  :-\

Kromba

Zitat von: DF6GL am März 23, 2012, 18:46:44

"da Access 2007 die Summe (in Query kalkuliert) in kein kalkuliertes Feld miteinbeziehen kann"

???


Ich habe versucht, ohne VBA eine Lösung zu finden, indem ich die Summe der Ausgaben(Buchungsbeiträge) pro Kostenstelle, mit den jeweiligen Grenzwerte zu vergleichen. Aber ich konnte leider kein Kalkuliertes Datensatz (summe der ausgaben pro Kostenstelle) in eine andere Abfrage als Variabel einsetzen.

DF6GL

#9
Hallo,

die "Query"-Lösung ist jetzt ja außen vor....


Was für ein "zusätzliches" Textfeld?


database hat lediglich auf die korrekt zu schrreibenden Namen Deiner Tabellen- und Formulartext-Felder hingewiesen
..

poste mal den Code (mit copy&paste) , den Du jetzt aktuell verwendest....

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

Kromba

Okay, stellen wir das Problem mal anders.
Ich habe eine Buchführungstabelle wo alle meine Buchungen gespeichert sind.
*Buchung: [BuchNr; Konto; Kreditor; Kostenstelle; Beitrag; BuchungsDatum]
Ich habe eine andere Tabelle wo ich alle Kostenstellen/Ausgabenkategorien (Dienstreisen, Gehälter, Sachmitteln, ...) gespeichert habe.
Eine Kostenstelle hat eine Nummer/ Code (z.B 0822), eine Bezeichnung (z.B Dienstreise) und eine Obergrenze (z.B 10.000€).

Die Idee ist eine Lösung zu finden, die Buchungsbeiträge zu begrenzen, sodass die Summe der Beiträge für eine bestimmte Kostenstelle die Obergrenze dieser Kostenstelle nicht überschreiten kann.

DF6GL

Hallo,


abgesehen von dem ungünstigen/unnormalisierten Tabellenaufbau prinzipiell (und wie letzthin schon angedeutet) etwa so:


Sub Form_BeforeUpdate(Cancel as Integer)

If nz(Me!Beitrag,0) + Dsum ("Beitrag","Buchfuehrung","KostenStelle = '" & Me!Kostenstelle & "'" ) > nz(Dlookup("OberGrenze","andere Tabelle","KostenStelle = '" & Me!Kostenstelle & "' And Ausgabekategorie ='" & Me!Ausgabekategorie & "'" ),0)  Then
Msgbox "So nicht"
Cancel=true
End If
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