PDA

Vollständige Version anzeigen : Nächster Datensatz (VBA)


Schnuckelhase
16.10.2001, 17:41
Da meine Frage verschwunden ist [wenn man nach Schnuckelhase sucht findet man zwar noch meine Überschrift (VBA - 16.10.01) aber dort landet man dann woanders], also nochmal:

wie kann ich auf den nächsten Datensatz zugreifen ohne erst umständlich movenext und moveprevious benutzen zu müssen:
Also kürzer als

rs.movenext
var1 = rs![Feld1]
rs.moveprevious
rs![Feld2] = var1

THX!

AWSW
16.10.2001, 19:10
Hi,
meinst Du das:

DoCmd.GoToRecord , , acLast 'Letzter DS

DoCmd.GoToRecord , , acFirst 'Erster DS

DoCmd.GoToRecord , , acNewRec 'Neuer DS

DoCmd.GoToRecord , , acPrevious 'Vorheriger DS

DoCmd.GoToRecord , , acNext 'Nächster DS


Ich hoffe das hilft Dir :D

GustavKurz
16.10.2001, 19:16
<font size=2 face="Courier New">Hallo Schnuckelhase,
...ich fürchte, das geht nicht kürzer!

Gruß
Gustav

AWSW
16.10.2001, 19:22
Hi Gustav,
dich denke mal dass ist doch schon "kurz" genug - oder:


DoCmd.GoToRecord , , acNext

Schnuckelhase
16.10.2001, 20:13
Schade, ich habe auf etwa so eine Antwort gehofft:
rs.Fields("Feld2").Value(x) = rs.Fields("Feld1").Value(x+1)

Danke für die Info

GustavKurz
16.10.2001, 20:26
<font size=2 face="courier New"> Hi Axel! :)

bist Du Dir sicher, das das in einem Recordset hinhaut?

Ausserdem ist ja wohl ziemlich offensichtlich, was "Schnuckelhase" machen will:

In einem Recordset soll in einem Datensatz das Feld [Feld1] mit dem Wert des Feldes [Feld2] [i] des nachfolgenden Datensatzes befüllt werden (ev. sogar in einer Schleife über alle Datensätze des Recortsets? - aber das ist nur so ne Vermutung)

Gruß
Gustav

AWSW
16.10.2001, 20:34
Hi,
sorry mit den rs hab ich mich bisher nicht so viel beschäftigt und kann dazu nicht viel sagen, klappt denn der DoCMD Aufruf nicht ???

Schnuckelhase
16.10.2001, 20:35
Jo, so habe ich es gemeint. Zugreifen oder befüllen ohne den "Focus" auf den nächsten Datensatz zu setzen.

Gruss
Schnuckelhase

GustavKurz
16.10.2001, 20:38
<font size=2 face="courier New">
@Axel:
...um ganz ehrlich zu sein, weiß ich es auch nicht so genau!! *g* Ich tippe ehr auf "Nein"

...bei Gelegenheit werde ich das mal austesten.

Gruß
Gustav

Schnuckelhase
16.10.2001, 20:44
Hallo Gustav.
Wen meinst Du jetzt eigentlich, AWSW oder mich?

GustavKurz
16.10.2001, 20:45
<font size=2 face="courier New">Hallo Schnuckelhase,

...der Fokus MUSS auf den nächsten Datensatz, wenn Du den Wert auslesen willst (egal wie). Da wirst Du wohl nicht drumherum kommen.

Aber wenn Du nicht gerade entweder eine lahme Krücke von PC (<50MHZ) hast, oder eine Trillion Datensätze zu durchlaufen, dann dürfte sich die Ausführung des Codes im Zehntelsekundenbereich abspielen...
Gruß
Gustav

Schnuckelhase
16.10.2001, 20:47
Ok, danke. Ich wollte nur nicht so einen bescheuert langen Code schreiben wenn es auch kürzer geht.

AWSW
16.10.2001, 20:50
Hi,
noch mal musste kurz weg irgend so ein Held meinte mich mit nem Trojaner nerven zu müssen - ätsch hab jetzt ne neue IP ;)

Ich denke auch, dass das sehr schnell gehen dürfte. Das wäre aber IMHO eine Aufgabe für unseren ZählerSuperSpaß: ScoreFun :D Der ist in solchen Sachen nach eigener, dankbarer Erfahrung immer klasse :D] Vielleicht findet sich gleich noch ein schlauerer welcher ;)

MarioR
17.10.2001, 06:19
Hallo,

und es geht doch kürzer :p

Wenn Du keine Daten vorwärts übertragen musst, dann kannst Du der/die/das Recordset (wie heisst das eigentlich?) auch rückwärts durchlaufen:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre>...
rs.MoveLast
<span class="TOKEN">Do</span>
rs.Edit
<span class="TOKEN">If</span> <span class="TOKEN">Not</span> var1 = ??? <span class="TOKEN">Then</span>
rs![Feld1] = var1
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
var1 = rs![Feld2]
rs.Update
rs.MovePrevious
<span class="TOKEN">Loop</span> <span class="TOKEN">Until</span> rs.BOF
...</pre></div>

Schnuckelhase
17.10.2001, 08:43
Danke, MarioR. So wie ich mein Problem vereinfacht dargestellt habe, ist es die perfekte Lösung.

(Aber ich muß doch movenext und moveprevious benutzen, da ich mit dem aktuellen und dem nächsten Datensatz arbeiten muß und noch nicht vorher weiß welcher verändert werden soll.)

Falls es jemanden interessieren sollte, so sieht mein gelöstes Problem aus: Do While rs.EOF = False
Mat1 = rs![MATNR]
Wert1 = Wertigkeit(rs![VERWE], rs![STATU])
rs.MoveNext
If rs.EOF = True Then
GoTo ende
End If
Mat2 = rs![MATNR]
Wert2 = Wertigkeit(rs![VERWE], rs![STATU])
If Mat1 = Mat2 Then
If Wert1 > Wert2 Then
rs.Delete
rs.MovePrevious
Else
rs.MovePrevious
rs.Delete
rs.MoveNext
End If
End If
Loop
ende:

MarioR
17.10.2001, 09:21
Ja, das wird wohl nicht viel kürzer werden.

Vielleicht noch paar Schönheitskorrekturen :D

Do While Not rs.EOF
...
If rs.EOF Then Exit Do
...
Loop

Schnuckelhase
17.10.2001, 22:24
Hab Exit Do in meinen VBA-Sprachschatz aufgenommen.

erwin
18.10.2001, 09:33
@schnuckelhase

es war nicht nur das exit do alleine, auch bei logischevariable = True/False fühle ich immer ein gewisses Kribbeln im Bauch... :D

Eine detaillierte Abhandlung findest du in <a href="http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=50302">anklicken Feld erscheint</a>

so long erwin...

Schnuckelhase
18.10.2001, 10:08
Schon klar, fand ich bloß nicht der Rede wert.
Hatte bis jetzt "do while rs.eof ... loop" immer per Copy und Paste übernommen und nicht weiter über den unnötigen Vergleich nachgedacht.