Neuigkeiten:

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

Mobiles Hauptmenü

Zählwert bei neuen Datensatz in Abhängigkeit von Fremdschlüssel

Begonnen von cyorps, Juli 10, 2010, 09:18:55

⏪ vorheriges - nächstes ⏩

cyorps

Hallo,

in einer Tabelle ist ein Zähler einer Gemeinde und ein Fremdschlüssel, welches der Indexwert eines Kreises ist, enthalten. Das sieht so aus:

id-kg
1
2
1
2
  id-kr
1
1
2
2

Der Nutzer soll später in Abhängigkeit des Kreises neue Gemeinden anlegen können. Dabei soll automatisch eine neue id-kg in Form von "letzte id-kg + 1" generiert werden. Ich weiß nur nicht so richtig, wo und wie ich ansetzen soll. Ist die Abfrage überhaupt der richtige Ort dafür? Oder sollte ich dies besser direkt im Formular machen? Diese Hilfestellung von donkarl ist glaube ich nicht der richtige Ansatz, da doch hier alle Datensätze gezählt werden. Oder sehe ich das falsch?

Gruß
cyorps
- Peripherie: Win XP Prof; Office 2000
- VBA Copy&Paste; ansonsten Dummy

MzKlMu

Hallo,
eine Abfrage ist dazu nicht geeignet, daher ist DonKarl hier aus dem Rennen.
Hinterlege im Ereignis "Nach Aktualisierung" des Formularfeldes "IDKR" folgenden Code:

Private Sub IDKR_AfterUpdate()
   If Me.NewRecord = True Then
       Me!IDKG = Nz(DMax("IDKG", "TabellenName", "IDKR = " & Me!IDKR),0) + 1
   End If
End Sub


Eventuell kannst Du auf die Bedingung für NewRecord verzichten und nach jeder Aktualisierung den Wert ermitteln.
Bedenke auch, dass damit keine Lücken gefüllt werden. Wenn also ein datensatz bei der gemeinde gelöscht wird, wird die entstandene Lücke nicht gefüllt.


Dringender Rat:
Verzichte in Feldnamen auf Sonder und Leerzeichen.
Aus ID-KR habe ich daher IDKR gemacht. Mit Sonderzeichen ist immer ein [] Paar erforderlich. Das kannst Du Dir sparen.
Gruß Klaus

cyorps

ZitatEventuell kannst Du auf die Bedingung für NewRecord verzichten und nach jeder Aktualisierung den Wert ermitteln. Bedenke auch, dass damit keine Lücken gefüllt werden.
Ich glaube das geht nicht. Denn idkg und idkr sind Bestandteile eines alten Aktenzeichens (idkr/idkg/weitere Zuordnung -> 01/02-...), welches erhalten bleiben soll. Daher ist es auch in Ordnung, wenn entstandene Lücken nicht gefüllt werden, da es sonst möglich wäre, dass eine andere, neuangelegte Gemeinde dieses Kreises ein identisches Aktenzeichen einer alten Gemeinde erhält. In der angesprochenen Tabelle arbeite ich zusätzlich mit einer indexkg als eindeutige Gemeindezuordnung für die Datenbank.

ZitatVerzichte in Feldnamen auf Sonder und Leerzeichen.
Schnief! Danke für den Hinweis. Das zieht zwar größere Korrekturarbeiten nach sich, aber wenn dann mache ich es richtig. Danke für den Hinweis.

Zum VBA-Code:
Ich benutze den Code bei der Aktion "beim Hingehen", da sonst der Benutzer etwas hätte eingeben müssen, damit diese Funktion greift. Allerdings verstehe ich den Code nicht hunderprozentig und würde mich freuen, wenn mir jemand weiterhelfen könnte. Was ich meine zu verstehen ist; wenn der Datensatztyp "Neu" lautet, dann setze im Formularfeld IDKG folgenden Wert:

- Mit NZ gibt man einen Wert zurück, wenn der Wert des ermittelten Feldes leer sein sollte. Ist das richtig?
- dmax ermittelt den größten Wert ([Ausdruck]->"von Feld IDKG", [Domäne] ->"der Tabelle/Abfrage KG", [Kriterium] -> "Tabellenfeld IDKR = " & Formularfeld!IDKR) Wobei mir die Formatierung des Kritierums nicht klar ist. Wieso würde "IDKR = Me!IDKR" nicht funktionieren?
- Gibt die Null nun den optionalenen Wert an, falls DMax([..]) leer sein sollte?
- und mit "+1" wird der ermittelte höchste Wert um eins addiert.

Falls niemand Lust haben sollte, den Erklärbär zu spielen, bedanke ich trotzdem schonmal bei MzKlMu für die Hilfe.

Gruß
cyorps
- Peripherie: Win XP Prof; Office 2000
- VBA Copy&Paste; ansonsten Dummy

DF6GL

Hallo,

Du beantwortest doch Deine Frage selber mit der Beschreibung des Codes...


wobei:

"Ich glaube das geht nicht. ...   "   Ist doch nur "eventuell" darauf hingewiesen.  Wenn keine Lücken geschlossen werden müssen (was an sich falsch wäre, wie Du selber feststellst) dann vergiß den Hinweis.

"Wieso würde "IDKR = Me!IDKR" nicht funktionieren?"

Wer sagt, denn, dass das nicht geht?  Oder was sprichtst Du damit an?

"Gibt die Null nun den optionalen Wert an"   ja... Das passiert aber eigentlich nur bei "leerer" Tabelle..

"und mit "+1" wird der ermittelte höchste Wert um eins addiert."   ---> ja.


Was ist denn nun unklar?

cyorps

Hallo DF6GL,

ZitatWenn keine Lücken geschlossen werden müssen (was an sich falsch wäre, wie Du selber feststellst) dann vergiß den Hinweis.
Ich war dankbar für diesen Hinweis und hatte freundlich geantwortet, weshalb dies nach meinen Überlegungen nicht kritisch ist. Daran empfinde ich nichts falsches.

Zitat
Zitat von: cyorps"Wieso würde "IDKR = Me!IDKR" nicht funktionieren?"
Wer sagt, denn, dass das nicht geht?  Oder was sprichtst Du damit an?
Wenn du damit suptil andeuten wolltest, dass ich dies ungetestet fragte und daher diese Frage unberechtigt war, gebe ich dir recht. Ich bin einfach davon ausgegangen das es nicht funktioniert! Nun habe ich es getestet und festgestellt, dass es funktioniert. Doch weshalb hat MzKlMu diese Zeile anders aufgebaut? Da steckt doch sicherlich ein Gedanke dahinter. Diesen Gedanken verstehe ich nicht und hoffe, dass mir Unterschied irgendwann klar wird.

ZitatWas ist denn nun unklar?
Mir war unklar, ob ich diesen Code richtig verstehe. Deshalb hatte ich meine Gedanken dazu in der Hoffnung formuliert, dass jemand diese bestätigt oder mich korrigiert bzw. verbessert. Das hast du nun getan, worüber ich mich freue.

Insgesamt verstehe ich nicht, was ich falsch gemacht habe, dass du solch einen aggressiven Unterton anschlägst. Aber ich bin dir für deine Antwort trotzdem dankbar.

Gruß
cyorps
- Peripherie: Win XP Prof; Office 2000
- VBA Copy&Paste; ansonsten Dummy

MzKlMu

Hallo,
irgendwie bin ich etwas irritiert.
Me!IDKG = Nz(DMax("IDKG", "TabellenName", "IDKR = Me!IDKR"),0) + 1
Das funktioniert nicht. Die Variable (in diesem Fall das Formularfeld) muss mit & verkettet werden. Wenn man das weglässt kommt es zu einem Laufzeitfehler.
So muss es gemacht werden:
Me!IDKG = Nz(DMax("IDKG", "TabellenName", "IDKR = " & Me!IDKR),0) + 1
Gruß Klaus

DF6GL

Hallo,

@cyorps


Weitere Frage: Wo siehst Du denn einen aggressiven Unterton?   

Ich habe lediglich Deinen Kommentar (Frage?) kommentiert, bzw. Deine Nachfrage(n) nochmal bestätigt.


Und "Wieso würde "IDKR = Me!IDKR" nicht funktionieren?"  finde ich nirgends hier im Thread....Deshalb meine Frage, wie Du darauf kommst..




Aber egal, das ist jetzt nur ein themaverfehlender  Beitrag...:-X

cyorps

Hallo MzKlMu,

da habe ich mich wohl verwirren lassen. Ich hatte deinen Code nochmal abgeändert und getestet. Du hast recht. Er funktioniert wirklich nicht. Beim bei der ersten Eingabe passiert überhaupt nichts. Es wird weder die Funktion ausgeführt, noch kommt eine Fehlermeldung. Wenn ich den nächsten neuen Datensatz anlege, wird eine Fehlermeldung "Das Objekt enthält nicht das Automatisierungsobjekt 'Me!idkr'' ausgegeben.

Mir ist allerdings nicht klar, warum die Notation ("idkr = " & Me!idkr) nun so aussehen muss. In der VBA-MS-Hilfe finde ich dazu nichts. Existiert im Netz eine Erläuterung, wo ich soetwas nachlesen kann?

Hallo DF6GL,

ich hatte in deiner Antwort halt einen entsprechenden Unterton wahrgenommen. Wenn dies nicht so war, weiß ich Bescheid und war mit meiner Vermutung im Unrecht. Das tut mir leid.

Gruß
cyorps
- Peripherie: Win XP Prof; Office 2000
- VBA Copy&Paste; ansonsten Dummy

MzKlMu

Hallo,
ZitatMir ist allerdings nicht klar, warum die Notation ("idkr = " & Me!idkr) nun so aussehen muss.
dann nimm es halt als Syntaxregel. Mit anderen Worten, es ist halt so.

Dem Befehl muss ja bekannt gemacht werden, dass der Wert aus einer Variablen kommt. Im vorliegenden fall aus einem Formularfeld.Und Variablen müssen nun mal verkettet (=&) werden.
Zu ergänzen wäre noch, dass bei Datentyp Text die Variable noch in Hochkomma eingeschlossen werden muss. Also so:

Zitat,"idkr = '" & Me!idkr & "'")


Aber nur bei Datentyp Text.
Gruß Klaus