Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Differenz zwischen zwei Datensätzen bilden

80 views
Skip to first unread message

Vera Köhler

unread,
Jan 15, 2004, 10:04:06 AM1/15/04
to
Hallo Newsgroup,

ich möchte in einem Formular im Detailbereich die Differenz eines Feldes
zwischen dem vorherigen und dem aktuellen Datensatz bilden. Konkret: in der
Datenbank gibt es ein Feld "km-Stand". Ich möchte also jetzt im 2. Datensatz
die Differenz zwischen dem Feld im Datensatz 2 und Datensatz 1 bilden, um
die gefahrenen Km ermitteln zu können. Wie mache ich das?

Dank im Voraus!

Vera Köhler

Peter Doering

unread,
Jan 15, 2004, 6:43:58 PM1/15/04
to
On Thu, 15 Jan 2004 16:04:06 +0100, Vera Köhler wrote:

> ich möchte in einem Formular im Detailbereich die Differenz eines Feldes
> zwischen dem vorherigen und dem aktuellen Datensatz bilden. Konkret: in der
> Datenbank gibt es ein Feld "km-Stand". Ich möchte also jetzt im 2. Datensatz
> die Differenz zwischen dem Feld im Datensatz 2 und Datensatz 1 bilden, um
> die gefahrenen Km ermitteln zu können. Wie mache ich das?

FAQ 4.22 (www.donkarl.com)

HTH - Peter

--
Ich beantworte keine Fragen per Email.
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com

Vera Köhler

unread,
Jan 16, 2004, 6:44:11 AM1/16/04
to

"Peter Doering" <nos...@doering.org> schrieb im Newsbeitrag
news:bu78ju$ek9vb$1...@ID-204768.news.uni-berlin.de...

> On Thu, 15 Jan 2004 16:04:06 +0100, Vera Köhler wrote:
>
> > ich möchte in einem Formular im Detailbereich die Differenz eines Feldes
> > zwischen dem vorherigen und dem aktuellen Datensatz bilden. Konkret: in
der
> > Datenbank gibt es ein Feld "km-Stand". Ich möchte also jetzt im 2.
Datensatz
> > die Differenz zwischen dem Feld im Datensatz 2 und Datensatz 1 bilden,
um
> > die gefahrenen Km ermitteln zu können. Wie mache ich das?
>
> FAQ 4.22 (www.donkarl.com)
>
> HTH - Peter
>
Danke für den Tipp, funktioniert aber leider nicht ganz. Ich habe ein neues
Feld angelegt "kmStandVorherigerDatensatz". Dieses Feld wird jetzt immer in
jedem Datensatz verändert, egal ob ich einen neuen Datensatz anlege oder
einen bestehenden ändere. Gibt es noch andere Möglichkeiten?

Gruß Vera

Peter Doering

unread,
Jan 16, 2004, 7:17:33 AM1/16/04
to
On Fri, 16 Jan 2004 12:44:11 +0100, Vera Köhler wrote:

>>> ich möchte in einem Formular im Detailbereich die Differenz
>>> eines Feldes zwischen dem vorherigen und dem aktuellen
>>> Datensatz bilden. Konkret: in der Datenbank gibt es ein
>>> Feld "km-Stand". Ich möchte also jetzt im 2. Datensatz
>>> die Differenz zwischen dem Feld im Datensatz 2 und
>>> Datensatz 1 bilden, um die gefahrenen Km ermitteln zu
>>> können. Wie mache ich das?
>>
>> FAQ 4.22 (www.donkarl.com)
>

> Danke für den Tipp, funktioniert aber leider nicht ganz. Ich habe ein neues
> Feld angelegt "kmStandVorherigerDatensatz". Dieses Feld wird jetzt immer in
> jedem Datensatz verändert, egal ob ich einen neuen Datensatz anlege oder
> einen bestehenden ändere. Gibt es noch andere Möglichkeiten?

Das ist schon der richtige Weg. Du hast wahrscheinlich statt .DefaultValue
nur .Value angegeben. Aendere das auf DefaultValue und es wird tun, was du
erwartest. Wenn's nicht hilft, poste mal den Code.

Gruss - Peter

Vera Köhler

unread,
Jan 16, 2004, 11:33:57 AM1/16/04
to

"Peter Doering" <nos...@doering.org> schrieb im Newsbeitrag
news:bu8kou$f2779$1...@ID-204768.news.uni-berlin.de...

Habe ich gemacht, hilft aber nicht. Hier der Code:

Private Sub kmStand_AfterUpdate()
Me!kmStandVorherigerDatensatz.DefaultValue = Me!kmStand
End Sub

Der Wert aus dem Feld [kmStand] von Datensatz 1 soll übernommen werden in
das Feld [kmStandVorherigerDatensatz] in Datensatz 2. Das Feld
[kmStandVorherigerDatensatz] habe ich dazu neu angelegt.

Hoffe, hier steckt irgendwo ein Fehler, damit ich weiterkomme!

Gruß Vera


Peter Doering

unread,
Jan 16, 2004, 12:11:53 PM1/16/04
to
On Fri, 16 Jan 2004 17:33:57 +0100, Vera Köhler wrote:

>> Das ist schon der richtige Weg. Du hast wahrscheinlich statt .DefaultValue
>> nur .Value angegeben. Aendere das auf DefaultValue und es wird tun, was du
>> erwartest. Wenn's nicht hilft, poste mal den Code.
>>
>> Gruss - Peter
>
> Habe ich gemacht, hilft aber nicht. Hier der Code:
>
> Private Sub kmStand_AfterUpdate()
> Me!kmStandVorherigerDatensatz.DefaultValue = Me!kmStand
> End Sub
>
> Der Wert aus dem Feld [kmStand] von Datensatz 1 soll übernommen werden in
> das Feld [kmStandVorherigerDatensatz] in Datensatz 2. Das Feld
> [kmStandVorherigerDatensatz] habe ich dazu neu angelegt.
>
> Hoffe, hier steckt irgendwo ein Fehler, damit ich weiterkomme!

Im Befehl ist kein Fehler drin!

Aber hast du eigentlich dein neues Feld kmStandVorherigerDatensatz an ein
Feld gebunden (Datenherkunft)? Es muss das gleiche Feld wie [kmStand] sein.
Ansonsten hast du den Effekt, dass in jeder Zeile der gleiche Wert
angezeigt wird.

Vera Köhler

unread,
Jan 16, 2004, 2:02:30 PM1/16/04
to
> > Habe ich gemacht, hilft aber nicht. Hier der Code:
> >
> > Private Sub kmStand_AfterUpdate()
> > Me!kmStandVorherigerDatensatz.DefaultValue = Me!kmStand
> > End Sub
> >
> > Der Wert aus dem Feld [kmStand] von Datensatz 1 soll übernommen werden
in
> > das Feld [kmStandVorherigerDatensatz] in Datensatz 2. Das Feld
> > [kmStandVorherigerDatensatz] habe ich dazu neu angelegt.
> >
> > Hoffe, hier steckt irgendwo ein Fehler, damit ich weiterkomme!
>
> Im Befehl ist kein Fehler drin!
>
> Aber hast du eigentlich dein neues Feld kmStandVorherigerDatensatz an ein
> Feld gebunden (Datenherkunft)? Es muss das gleiche Feld wie [kmStand]
sein.
> Ansonsten hast du den Effekt, dass in jeder Zeile der gleiche Wert
> angezeigt wird.
>
Nein, das Feld war ungebunden. Ich hab's jetzt an das Steuerelement
[kmStand] gebunden. Mit dem Effekt, daß nun im Feld
[kmStandVorherigerDatensatz] der gleiche Wert wie im Feld [kmStand]
erscheint. Woher soll denn ACCESS auch wissen, daß über den DefaultValue der
vorherige Datensatz angesprochen werden soll??

Gruß Vera


Peter Doering

unread,
Jan 16, 2004, 3:21:52 PM1/16/04
to
On Fri, 16 Jan 2004 20:02:30 +0100, Vera Köhler wrote:

>>> Me!kmStandVorherigerDatensatz.DefaultValue = Me!kmStand


>>
>> Im Befehl ist kein Fehler drin!
>>
>> Aber hast du eigentlich dein neues Feld kmStandVorherigerDatensatz an ein
>> Feld gebunden (Datenherkunft)? Es muss das gleiche Feld wie [kmStand]
>> sein.
>> Ansonsten hast du den Effekt, dass in jeder Zeile der gleiche Wert
>> angezeigt wird.
>
> Nein, das Feld war ungebunden.

Also, JA, das Feld war ungebunden.

> Ich hab's jetzt an das Steuerelement
> [kmStand] gebunden. Mit dem Effekt, daß nun im Feld
> [kmStandVorherigerDatensatz] der gleiche Wert wie im Feld [kmStand]
> erscheint.

Also ist jetzt alles in Ordnung.

> Woher soll denn ACCESS auch wissen, daß über den DefaultValue der
> vorherige Datensatz angesprochen werden soll??

Soll er nicht. Es wird der Wert des /aktuellen/ Datensatzes zum
Standardwert des Feldes gemacht, so dass der /neue/ Datensatz einen Wert
erhalten kann.

Die Problembeschreibung in FAQ 4.22 erklaert es eigentlich schon.

Vera Köhler

unread,
Jan 17, 2004, 2:55:00 PM1/17/04
to
> >>> Me!kmStandVorherigerDatensatz.DefaultValue = Me!kmStand
> >>
> >> Im Befehl ist kein Fehler drin!
> >>
> >> Aber hast du eigentlich dein neues Feld kmStandVorherigerDatensatz an
ein
> >> Feld gebunden (Datenherkunft)? Es muss das gleiche Feld wie [kmStand]
> >> sein.
> >> Ansonsten hast du den Effekt, dass in jeder Zeile der gleiche Wert
> >> angezeigt wird.
> >
> > Nein, das Feld war ungebunden.
>
> Also, JA, das Feld war ungebunden.
>
> > Ich hab's jetzt an das Steuerelement
> > [kmStand] gebunden. Mit dem Effekt, daß nun im Feld
> > [kmStandVorherigerDatensatz] der gleiche Wert wie im Feld [kmStand]
> > erscheint.
>
> Also ist jetzt alles in Ordnung.

Schön, daß ist ja schon mal gut.


>
> > Woher soll denn ACCESS auch wissen, daß über den DefaultValue der
> > vorherige Datensatz angesprochen werden soll??
>
> Soll er nicht. Es wird der Wert des /aktuellen/ Datensatzes zum
> Standardwert des Feldes gemacht, so dass der /neue/ Datensatz einen Wert
> erhalten kann.

Aber was nutzt mir das, wenn der Wert im neuen Datensatz wieder
überschrieben wird, sobald der NEUE Datensatz der AKTUELLE Datensatz
geworden ist, dadurch, daß Daten eingegeben werden. Dadurch habe ich
zwischen den beiden Felder immer eine Differenz =0, sobald das
AfterUpdate-Ereignis greift. Und das Ereignis kann ich schließlich nicht
löschen, da mir sonst der Standartwert im neuen Datensatz nicht vorgegeben
wird. Es ist ein endloser Kreis, zuerst steht der "richtige" Wert im neuen
Datensatz drin, aber er wird sofort wieder mit dem dann "falschen" (weil
gleichen) Wert überschrieben. Wie kann ich denn jetzt bloß die gefahrenen km
in einem Datensatz ermitteln??

Gruß Vera


Peter Doering

unread,
Jan 17, 2004, 7:03:47 PM1/17/04
to
On Sat, 17 Jan 2004 20:55:00 +0100, Vera Köhler wrote:

>>> Woher soll denn ACCESS auch wissen, daß über den DefaultValue der
>>> vorherige Datensatz angesprochen werden soll??
>>
>> Soll er nicht. Es wird der Wert des /aktuellen/ Datensatzes zum
>> Standardwert des Feldes gemacht, so dass der /neue/ Datensatz einen Wert
>> erhalten kann.
>
> Aber was nutzt mir das, wenn der Wert im neuen Datensatz wieder
> überschrieben wird, sobald der NEUE Datensatz der AKTUELLE Datensatz
> geworden ist, dadurch, daß Daten eingegeben werden. Dadurch habe ich
> zwischen den beiden Felder immer eine Differenz =0, sobald das
> AfterUpdate-Ereignis greift. Und das Ereignis kann ich schließlich nicht
> löschen, da mir sonst der Standartwert im neuen Datensatz nicht vorgegeben
> wird. Es ist ein endloser Kreis, zuerst steht der "richtige" Wert im neuen
> Datensatz drin, aber er wird sofort wieder mit dem dann "falschen" (weil
> gleichen) Wert überschrieben. Wie kann ich denn jetzt bloß die gefahrenen km
> in einem Datensatz ermitteln??

Das ist bei Saldo-Vortraegen in Endlosformularen auch garnicht so einfach,
wenn du mit sauberem Datenmodell arbeitest (was du im Moment tust). Weil
Access die Bindung zum Datensatz braucht, um die unterschiedlichen Felder
anzeigen zu koennen, muesstest du hier mit den Regeln brechen und ein
zusaetzliches Feld Anfangsstand in die Tabelle aufnehmen.

Beispiel:
Anfangsstand gefahren Endstand
(DefaultValue) (Eingabe) (Berechnung[1])
0 10 10
10 5 15

[1] Berechnung: =Anfangsstand+gefahren

Alternativ kannst du den Endstand eingeben und errechnest [gefahren]. Den
Anfangsstand koenntest du spaeter vergessen, er haette kaum noch
Aussagekraft.

HTH - Peter

Ahmed Martens

unread,
Jan 17, 2004, 7:36:01 PM1/17/04
to
Hallo Vera,

hast Du schon mal versucht nicht die Default-Eigenschaft zu verwenden,
sondern die Wert-Eigenschaft (engl. Tag) Deines Kilometerstandfeldes.
Hier könntest Du den vorherigen Kilometerstand eintragen und diesen
dann in einem anderen Feld mit der
Funktion: KilometerAltfeld=Wert(DeinKilometerfeld.Marke).

Einzige Schwierigkeit (?) ist die, dass Du beim Formularaufruf jedesmal
alle Datensätze durchgehen müsstest und Dir die Kilometer des
vorherigen Datensatzes merken und in die Tag-Eigenschaft des
nachfolgenden Datensatzes eintragen.

Mit der so versorgten Feld, welches ungebunden ist, kannst Du ganz
normal weiterrechen.

Zum Beispiel: DeinErgebnisfeld: DeinKilometerfeld-KilometerAltfeld

Gruß Ahmed


Peter Doering

unread,
Jan 17, 2004, 8:51:39 PM1/17/04
to
On Sun, 18 Jan 2004 01:36:01 +0100, Ahmed Martens wrote:

> hast Du schon mal versucht nicht die Default-Eigenschaft zu verwenden,
> sondern die Wert-Eigenschaft (engl. Tag) Deines Kilometerstandfeldes.
> Hier könntest Du den vorherigen Kilometerstand eintragen und diesen
> dann in einem anderen Feld mit der
> Funktion: KilometerAltfeld=Wert(DeinKilometerfeld.Marke).
>
> Einzige Schwierigkeit (?) ist die, dass Du beim Formularaufruf jedesmal
> alle Datensätze durchgehen müsstest und Dir die Kilometer des
> vorherigen Datensatzes merken und in die Tag-Eigenschaft des
> nachfolgenden Datensatzes eintragen.
>

> Mit der so versorgten Feld, welches ungebunden ist, ...

... bekommt sie in jedem Datensatz des Endlosformulars den gleichen Wert
angezeigt. Ungebunden wuerd' ich deshalb sein lassen.

Ahmed Martens

unread,
Jan 18, 2004, 4:25:58 AM1/18/04
to
Hallo Peter,

Peter Doering wrote:
> On Sun, 18 Jan 2004 01:36:01 +0100, Ahmed Martens wrote:
>
>> hast Du schon mal versucht nicht die Default-Eigenschaft zu
>> verwenden, sondern die Wert-Eigenschaft (engl. Tag) Deines
>> Kilometerstandfeldes. Hier könntest Du den vorherigen
>> Kilometerstand eintragen und diesen dann in einem anderen Feld mit
>> der
>> Funktion: KilometerAltfeld=Wert(DeinKilometerfeld.Marke).
>>
>> Einzige Schwierigkeit (?) ist die, dass Du beim Formularaufruf
>> jedesmal alle Datensätze durchgehen müsstest und Dir die Kilometer
>> des vorherigen Datensatzes merken und in die Tag-Eigenschaft des
>> nachfolgenden Datensatzes eintragen.
>>
>> Mit der so versorgten Feld, welches ungebunden ist, ...
>
> ... bekommt sie in jedem Datensatz des Endlosformulars den gleichen
> Wert angezeigt. Ungebunden wuerd' ich deshalb sein lassen.
>
> Gruss - Peter

stimmt ja. Es handelt sich ja immer um die selbe Tag-Eigenschaft des
ein und desselben Feldes.

Ein anderer Vorschlag.
Also angenommen Sie hat einen Primärschlüssel angelegt mit Autowert,
dann kann Sie den Wert des vorhergenden Datensatzes wie folgt auslesen:
=DomWert("[fldKilometerstand]";"tblKilometer";"[fldZähler]=[fldZwischen
wert]")

Sie benötigt noch einen Zwischenwert der die vorhergehende Zählernummer
ermittelt. fldZwischenwert.Wert: =fldZähler-1

Bei mir hat es jetzt funktioniert. Vorraussetzung ist aber, dass der
Zähler lückenlos ist. Sie darf also keine Datensätze löschen oder aber
Sie nimmt keinen Autowert, sondern Sie befüllt das fldZähler beim
Formularaufruf jedesmal selber um die Lückenlosigkeit zu garantieren.

Ansonsten gehen mir langsam die Ideen aus. ;-(

Gruß Ahmed


Martin Peeck

unread,
Jan 26, 2004, 5:58:12 PM1/26/04
to
Vera Köhler <vera.k...@t-online.de> schrieb in im Newsbeitrag:
bu6a57$avl$07$1...@news.t-online.com...

Hallo Vera,

ich habe den anderen Zweig zu deiner Antwort nur überflogen, aber die
letztendliche Lösung scheint nicht dabei gewesen zu sein. (Ich habe
allerdings noch nicht in der FAQ nachgesehen...)

Anderer Ansatz:
Du hast Datensätze, in denen ein KM-Stand enthalten ist. dieser sollte ja
kontinuierlich steigend sein --oder?

Dann erstelle doch eine Abfrage wie folgt:

SELECT KMStand.KMStand, Max(KMStand_1.KMStand) AS [Max von KMStand],
KMStand.KMStand - Max(KMStand_1.KMStand) AS Diff
FROM KMStand LEFT JOIN KMStand AS KMStand_1 ON KMStand.KMStand >
KMStand_1.KMStand
GROUP BY KMStand.KMStand;

Dann hast du alle Daten, kannst aber nicht mehr Editieren :-(
Deshalb:
Speichere diese Abfrage (z.B. unter dem Namen "KMStand1"), und erstelle dann
eine weitere Abfrage, die wie folgt aussieht:

SELECT KMStand.*, DLookUp("[Diff]","kmstand1","[kmstand]=" & [kmstand]) AS
Diff
FROM KMStand;

Ich hoffe, das war was du suchst ...

Mit freundlichem Gruß
Martin Peeck
________________________

Martin Peeck
Lindhöft
eMail: mpe...@aol.com
________________________

0 new messages