aximand
Goto Top

Verständnisfrage zu einer Collection

Hallo zusammen, ich hoffe ihr könnt mir mal wieder etwas helfen.

Kann ich eine Collection verschachtelt durchlaufen, bzw. aufrufen? oder würde aufgrund des ersten Next irgendwas durcheinander kommen? Ich versuche mal zu schreiben was ich meine:


For each oDetail in oArtikelDetail

if Treffer then
For each oDetail in oArtikel
such irgendwas
next oDetail

next oDetail

Content-Key: 378178

Url: https://administrator.de/contentid/378178

Printed on: April 26, 2024 at 14:04 o'clock

Member: SeaStorm
SeaStorm Jun 25, 2018 at 13:11:10 (UTC)
Goto Top
warum benennst du das denn nicht einfach eindeutig? Dann gibts da auch keine Probleme.

Was willt du am Ende damit erreichen? Ich habe so das gefühl, als würdest du hier einen Lambda brauchen, um das zu erreichen, was du willst
Member: emeriks
emeriks Jun 25, 2018 at 14:59:22 (UTC)
Goto Top
Hi,
theoretisch geht das. Aber sowas würde ich mir gar nicht erst angewöhnen. In jedem Fall wäre nach der inneren Schleife die Referenz auf das Objekt der äußeren Schleife weg. Du könntest also in der äußeren Schleife nicht mehr mit dieser Variable oDetail arbeiten, es sei denn, es ist gewünscht hier mit dem letzten geladenen Wert/Referenz der inneren Schleife zu arbeiten. So oder so: Das ist Murks. Nimm für die 2. Schleife eine eigene Laufvariable und gut ist.

E.
Member: Aximand
Aximand Jun 26, 2018 at 05:22:20 (UTC)
Goto Top
Ah danke! Genau dieses Verhalten hatte ich beobachtet. Springe ich aus der 2. Schleife (Sub) raus zurück in die erste, kommt die Fehlermeldung.
Was ich erreichen will?
Ich habe im SQL-Server einen passenden View erstellt und möchte nun diese für mich relevanten Datensätze in eine Art Array holen. Dafür wollte ich zum ersten mal die Collection ausnutzen.
Enthalten ist z.B. die Artikelnummer
Daraus möchte ich dann folgendes realisieren: Wenn es noch kein Tabellenblatt mit der Artikelnummer gibt, dann leg es an und benenne es "Artikelnummer". Ist der Artikel "inaktiv (0/-1)", dann blende das Tabellenblatt aus. Genutzt dafür wird die Variable oDetail.strArtikelnummer und oDetail.bAktiv aus dem Objekt oArtikelDetail.

Zu jeder Artikelnummer gibt es mehrere Varianten mit passenden Lagerbeständen.
Nachdem also nun jedes Tabellenblatt erstellt wurde, möchte ich in jedem Tabellenblatt die passenden Varianten des Artikels mit den Lagerbeständen auflisten. Genutzt wird oDetail.lngVariantenID und oDetail.lngBestand.

Das Problem:
Ich will "for each oDetail in oArtikelDetail" durchlaufen um erst einmal die Tabellenblätter anlegen zu können und würde jetzt gerne bei der Anlage des Tabellenblattes in ein Sub "fülle Daten" springen und dieses Tabellenblat mit oDetail.lngVariantenIR und oDetail.lngBestnad befüllen.
Dann raus aus der Sub und das nächste oDetail.

Wenn ich oDetail auf Public stelle, dann sind die Variablen sicherlich global verfügbar. Wie komme ich aber dann an die Werte von sinngemäß
Zeige jedes oDetail.VariantenID und oDetail.Bestand wenn oDetail.Artikelnummer = Tabellenblattname

Mir ist im Grunde nicht ganz klar, wie ich die einzelnen Items abgreifen kann die in dieser Collection liegen.
Member: emeriks
emeriks Jun 26, 2018 updated at 06:01:54 (UTC)
Goto Top
Sehr verwirrend. Fangen wir hinten an.
Mir ist im Grunde nicht ganz klar, wie ich die einzelnen Items abgreifen kann die in dieser Collection liegen.
Das hast Du doch schon herausgefunden. Mit dem
For each oDetail in oArtikelDetail
rufst Du doch schon Element für Element der Collection auf.
und würde jetzt gerne bei der Anlage des Tabellenblattes in ein Sub "fülle Daten" springen
Dein eingangs genannter Code nutzt aber keine Sub. Da hast Du nur 2 verschachtelte For-Next-Schleifen. Mit Sub geht das in etwa so
Sub Aussen
  For each oDetail in oArtikelDetail
    Call Sub Innen(oDetail.strArtikelnummer, oDetail.bAktiv)
  Next
End Sub

Sub Innen(Parameter1, Parameter2)
   'Tue etwas mit den übergebenen Parametern  
   'Parameter1 in diesem Bsp. jetzt oDetail.strArtikelnummer  
   'Parameter2 in diesem Bsp. jetzt oDetail.bAktiv  
.....
End Sub
Member: Aximand
Aximand Jun 26, 2018 at 07:07:38 (UTC)
Goto Top
Danke.

Ich möchte ja nicht for each Detail sondern die Details eines Datensatzes bezogen auf das Filterkriterium sehen.

Ich habe doch jeweils einen Datensatz in dem
oDetail.A bis oDetail.Z enthalten sind?

Genau diesen einen Datensatz möchte ich abgreifen wenn eine Bedingung erfüllt ist, zb oDetail.Z = "test"

ob ich das verständlich rüberbringen kann, keine Ahnung face-smile
Member: emeriks
emeriks Jun 26, 2018 at 08:26:18 (UTC)
Goto Top
Ich denke schon dass ich Dich verstehe, nur schreibst/fragst Du jedes Mal auch irgendwie irgendwas anderes.

Du redest immer von "Datensatz". Wohjer komnmt denn dieser? Aus einer SQL- oder Access-DB oder woher? Falls eine DB, dann filtert man am einfachsten schon bei der Abfrage der DB. Also in der Select-Anweisung.

Ich habe doch jeweils einen Datensatz in dem oDetail.A bis oDetail.Z enthalten sind?
Du hast offenbar "eine Collection von Datensätzen". Ein Datesatz hat i.A. Spalten (Felder).

Genau diesen einen Datensatz möchte ich abgreifen wenn eine Bedingung erfüllt ist, zb oDetail.Z = "test"
Ohne zu wissen, was das für "Datensätze" sind, kann man dazu nichts sagen. LINQ kenn VBA nicht. Wenn die Daten schon im VBA als Objekte vorliegen, welche Elemete einer Collection sind, dann kannst Du in VBA nur diese Elemente der Reihe nach durchlaufen und mit IF die einzelnen Eigenschaften der Objekte vergleichen. Und bei Treffer mit diesem Objekt etwas machen. Aber dieses Prinzip hattest Du doch schon erkannt ...
Sub Main
  For each oDetail in oArtikelDetail
    Treffer = (oDetail.Z = "test")  
    if Treffer then
      call DetailBehandlung(oDetail)
    End if
  next oDetail
End Sub 

Sub DetailBehandlung(oDetailSub)
  msgbox oDetailSub.Z
End Sub
Warum fragst Du also noch danach?