Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Vorgänger dynamisch suchen

Begonnen von TomTom2903, Juni 14, 2012, 08:50:14

⏪ vorheriges - nächstes ⏩

TomTom2903

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

DF6GL

#1
Hallo,

Beispiele helfen da wohl am Besten:

http://www.dbwiki.net/wiki/Datei:AccSampleTreeView.zip   ff.


PS: die Tabellenstruktur ist eher suboptimal...
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Jonny

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

TomTom2903

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

TomTom2903

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]

Wurliwurm

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.

TomTom2903

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... :-/

Wurliwurm

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.

TomTom2903

Ja klar. Dafür bin ich dir super dankbar!

Freu mich auch drauf, mal wieder was im Code dazu zu lernen.

Danke dir!

Wurliwurm

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.

TomTom2903

Super. Ich probiers und falls ich hänge melde ich mich wieder.
Danke

TomTom2903

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

Wurliwurm

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.ä.