Hallo Zusammen,
habe eine für mich knifflige Aufgabe und noch keinen wirklichen Ansatz. Und zwar möchte ich den Vorgesetzen dynamisch berechnen können. Gerne auch mit VBA und darin eine SQl-Anweisung.
Problemstellung:
Artikelgruppe 0 hat keinen Vorgänger, Artikelgruppe 01 hat Vorgänger 0 (Artikelgruppe 0 mit ID 1). Das kann ich berechnen in dem ich einfach immer die hinterste Nummer weg lasse. Bringt mir allerdings weiter unten nichts. Z.B. bei ID 148 Artikelgruppe 03516A ist der Vorgänger mit der Methode "03516", dass ist aber falsch. Hier müßte der Vorgänger 035 sein. Artikegruppe 03516 existiert nämlich nicht. Ich bräcuhte an dieser Stelle einfach eine Prüfung, ob Vorgänger exisitiert.
Wie kann man eine dynamische Abfrage basteln, die immer überprüft ob ein Vorgänger exisitert. Klar mit einer Schleife, aber wie...
Ich bin dankbar für eure Unterstützung!
Achso, ich brauch das um einen Treebaum rekursiv zu füllen...
id ArtikelGruppe Vorgesetzter
1 0
2 01 0
3 011 01
14 012 01
29 013 01
31 014 01
44 015 01
53 016 01
54 02 0
55 021 02
61 022 02
69 023 02
75 024 02
97 025 02
98 026 02
99 03 0
100 031 03
113 032 03
123 033 03
128 034 03
147 035 03
148 03516A 03516
149 03516C 03516
150 03516D 03516
151 03516M 03516
152 03517A 03517
153 03517C 03517
154 03517D 03517
155 03518A 03518
156 03518C 03518
157 03518D 03518
158 03518M 03518
159 03519A 03519
160 03519C 03519
161 036 03
Hallo,
Beispiele helfen da wohl am Besten:
http://www.dbwiki.net/wiki/Datei:AccSampleTreeView.zip ff.
PS: die Tabellenstruktur ist eher suboptimal...
Hallo,
da fällt mir nur eine Schleife ein.
Dim Gefunden as boolean, Zwstring as string
gefunden = false
Zwstring = left(ArtikelGruppe) ' Hier die Artikelgruppe mit eine Stelle weniger
while gefunden = false
rs.findfirst "ArtikelGruppe = '" & ZwString & "'"
if not rs.nomatch then
Vorgesetzer = Artikelgruppe
gefunden = true
else
Zwstring = left(ArtikelGruppe) ' Hier die Artikelgruppe mit eine Stelle weniger
end if
wend
Ist nur ein Ansatz und nicht getestet.
Gruß
Johann
Hallo Johann,
werde das morgen mal probieren. Mit der DB-Wiki kann ich nicht wirklich was anfangen. Da müßte ich eine Tabelle neu erzeugen und das möchte ich nicht.
Melde mich dann wieder...
THX @ both
Gruß
Thomas
Hallo Franz,
Hallo Johann,
habe jetzt mal die Datei mit hochgeladen. Ich komme immer in eine Endlosschleife und komme auch nicht weiter.
Mein ziel ist es ja alle "Vater-Codes" für die einzelnen Artikelgruppen zu berechnen und diese in die gleiche Tabelle zu schreiben, um damit im Anschluss einen TreeView zu füllen. Evtl. schreibe ich den Vater auch nicht in die Tabelle und mache das während ich den TreeView fülle. Erstmal das eine fertig machen und dann das andere erledigen.
Durch die schleife möchte ich die Väter der einzelnen Artikelgruppen berechnen, das Problem ist allerdings, dass ich mit der FindFirst Methode nicht weiter komme. Ich habe einen Code geschrieben der nicht endlich ist... Sondern immer wieder Datensatz 2 aufruft. Ich bräuchte eigentlich an der Stelle die makiert ist nur folgendes. Vergleiche die Spalte Artikelgruppe mit dem gerade ausgewählten recordset. Aber genau hier komme ich nicht weiter.
Der Vorgänger wird ja dann als rst makiert und durch rst.movenext lande ich wieder in dem gleichen, den ich ja bereits schon abgearbeitet habe.
Do While Not rst.EOF
gefunden = False
Debug.Print "Datensatz: " & rst!Id & " Bezeichnung: " & rst!Bezeichnung
Vater = Left(rst!Artikelgruppe, (Len(rst!Artikelgruppe) - 1))
Do While gefunden = False
rst.FindFirst "Artikelgruppe like '" & Vater & "'"
If Not rst.NoMatch Or Vater = "" Then
Vorgesetzter = rst!Artikelgruppe
gefunden = True
Debug.Print "Vorgesetzter: " & Vater & " - " & rst!Bezeichnung
Else
Vater = Left(Vater, Len(Vater) - 1)
Stop
End If
Loop
Am besten mal den Code ausführen und ihr wisst was gemeint ist.
Vielen Dank für Eure Hilfe!
Gruß
[Anhang gelöscht durch Administrator]
Zitat von: TomTom2903 am Juni 27, 2012, 11:07:55
Do While Not rst.EOF
gefunden = False
Debug.Print "Datensatz: " & rst!Id & " Bezeichnung: " & rst!Bezeichnung
Vater = Left(rst!Artikelgruppe, (Len(rst!Artikelgruppe) - 1))
Do While gefunden = False
rst.FindFirst "Artikelgruppe like '" & Vater & "'"
If Not rst.NoMatch Or Vater = "" Then
Vorgesetzter = rst!Artikelgruppe
gefunden = True
Debug.Print "Vorgesetzter: " & Vater & " - " & rst!Bezeichnung
Else
Vater = Left(Vater, Len(Vater) - 1)
Stop
End If
Loop
Am besten mal den Code ausführen und ihr wisst was gemeint ist.
Vielen Dank für Eure Hilfe!
Gruß
Leider kann ich mir das nicht genauer anschauen, weil ich gleich in ein Meeting muß.
Das Problem ist aber, daß Du nie EOF erreichst, wenn Du innerhalb der Schleife im Recordset anders positionierst mit FindFirst. Du äußere Schleife muß Satz für Satz durchlaufen werden. Du solltest ein zweites Recordset nehmen, wo Du den Vater suchst innerhalb der Schleife.
Hallo Wurliwurm,
da liegt mein Problem. Dass das aus dem Grund nicht funktioniert, wie du super beschrieben hast.
allerdings hab ich keinen Plan, wie ich hier ein zweites Recordset einbringen kann. Habe hier auch schon probiert und auch nach gelesen...
Aber leide rnicht das richtige gefunden... :-/
Zitat von: TomTom2903 am Juni 27, 2012, 13:48:59
allerdings hab ich keinen Plan, wie ich hier ein zweites Recordset einbringen kann. Habe hier auch schon probiert und auch nach gelesen...
Wen Du 1, 2 Std. Geduld hast, kann ich das in der mdb ausbessern und hochladen.
Ja klar. Dafür bin ich dir super dankbar!
Freu mich auch drauf, mal wieder was im Code dazu zu lernen.
Danke dir!
Hallo Tomtom,
leider kann ich die Struktur nicht so genau anschauen, weil ich Termindruck habe. Es gibt afaik auch in DAO die Möglichkeit ein recordset zu klonen und darin unabhängig vom Originalrecordset zu navigieren.
Alternative: Ich habe auf die Schnelle eine kleine Funktion geschrieben, welche zu einer Artikelgruppe die Artikelgruppe liest. Nur als Anregung, wie man den Code aufteilen könnte. Diese Funktion kann auch rekursiv verwendet werden, so daß Du dich bis zur Wurzel damit durchhangeln könntest.
Sub Vaterfinden()
Dim db As DAO.Database
Dim rst As DAO.Recordset2
Dim Vater As String
Dim Vorgesetzter As String
Set db = CurrentDb
Set rst = db.OpenRecordset("tbl_Artikelgruppe", dbOpenDynaset)
Do While Not rst.EOF
Vater = getVater(rst!Artikelgruppe)
Debug.Print rst!Artikelgruppe & " / Bezeichnung: " & rst!Bezeichnung & " " & _
"Vorgesetzter: " & Vater
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
Private Function getVater(ByVal strArtikelgruppe As String) As String
Dim strVater As String
strVater = Left(strArtikelgruppe, (Len(strArtikelgruppe) - 1))
Dim rs As DAO.Recordset2
Dim strSQL As String
strSQL = "SELECT ID FROM tbl_Artikelgruppe WHERE Artikelgruppe LIKE '" & strVater & "'"
Debug.Print strSQL
Set rs = CurrentDb.OpenRecordset(strSQL)
If rs.BOF = True And rs.EOF = True Then
getVater = ""
Else
getVater = rs!ID
End If
rs.Close
Set rs = Nothing
End Function
Mehr als das so schnell hinschreiben kann ich leider nicht soory, aber vielleicht kommst Du damit weiter.
Super. Ich probiers und falls ich hänge melde ich mich wieder.
Danke
Hallo Wurliwurm,
also der Tip mit dem Recordset Clone war der durchbruch. Kurz nachgelesen, gewußt wie es geht und siehe da es funktioniert. Vielen Dank. Jetzt gehts weiter mit Füllen des Treebaums...
Code von dir war im übrigen auch hilfreich.
Grüße
Tom
Zitat von: TomTom2903 am Juni 27, 2012, 16:28:36
Vielen Dank. Jetzt gehts weiter mit Füllen des Treebaums...
Immer gerne. :-)
Wenn Du mal Hilfe mit dem Tree-Control brauchen solltest, kann ich Dir auch helfen, da habe ich auch schon viel gekämpft damit. Es kann schon knifflig werden, wenn Du Sachen wie Drag and Drop mit Umhängen machen willst o.ä.