Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

strukturierte Stückliste importieren und per VBA mit Datenfüllen

Begonnen von Atuatuca, Oktober 10, 2015, 21:16:18

⏪ vorheriges - nächstes ⏩

el_gomero

Hallo,

also wenn ich mit deiner 123456_original.xlsx den Import anschubse, werden regelmässig die Level mit den vorangestellten Punkten nicht importiert - auch wenn die Tabelle schon vorhanden ist und das Feld als Text deklariert wurde. Klappt der Import bei dir? Weitere Frage - gibt es nur diese 3 Level oder können im Echtbetrieb weitere vorkommen? Der Import wird wahrscheinlich öfter benötigt, da du die Auswahl über den Filedialog steuerst?
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Atuatuca

Hallo Jürgen,

in der Tabelle muss die Spalte "Level" auf "Text" gesetzt werden, war "Standard" drin.
Dann klappt es auch mit dem Import.

Die "Level" sollten unbegrenzt sein. Beim aktuellen Projekt habe ich schon Level 11 gesehen
und es ist einer der kleineren Projekte.

Ich doktere auch immer noch an der Routine für die Erzeugung der Werte in der Spalte Stückliste.
Vielleicht irgend was mit DLookup(Ausdruck, Domäne [, Kriterien]) oder rs.find

Ich meine zu wissen, dass bei Dloopup es auch ein vorwärts und rückwärts definition gibt.
Syntax bekomme ich aber nicht mehr zusammen.

Gruss
Atuatuca

el_gomero

Moinsen,

Zitat
in der Tabelle muss die Spalte "Level" auf "Text" gesetzt werden, war "Standard" drin.
Dann klappt es auch mit dem Import.

Die "Level" sollten unbegrenzt sein. Beim aktuellen Projekt habe ich schon Level 11 gesehen
und es ist einer der kleineren Projekte.

naja, der Import klappt jetzt - ist es denn gewährleistet, dass die Eigenschaft künftig immer auf Text steht? Und welche Spielarten (Nachkomma, ... , usw) gibt es denn noch???

Zitat
Ich doktere auch immer noch an der Routine für die Erzeugung der Werte in der Spalte Stückliste.

Erst mal die primären Punkte klären, dann geht es an die nächste Baustelle ...
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Atuatuca

Hallo Jürgen,

die Spalte Level kommt aus der Quelle als Textspalte.


Gruss
Atuatuca

el_gomero

Zitat
die Spalte Level kommt aus der Quelle als Textspalte.

interpretiere ich jetzt mal wohlwollend, dass dies für die Zukunft so gegeben ist ...

Wie sehen die Werte für die weiteren Level aus?
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Atuatuca


el_gomero

Moin,

Zitat
1
.2
..3
...4
....5
usw.....

in der Beispieldatei stehen aber Werte wie 1 0,2 ..3

Sei's drum, ich gehe jetzt davon aus, dass deine künftigen Daten im geschilderten Format kommen - falls nicht musst du eben die Werte abfangen.

Werde mir die Geschichte heute abend nochmal ansehen.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Atuatuca

Moin Jürgen,

Du hast recht. Die Quelle gibt folgende Werte in Spalte "Level" aus:

1
0,2
..3
...4
....5
.....6
......7
usw....

Grus
Atuatuca

el_gomero

ich hab mir mal die Tabellen angesehen und komme noch nicht damit klar wie die Regel aussehen soll.

Für mein Verständnis fehlt in den zur Verfügung gestellten Tabellen ein Sortiermerkmal (hast du wohl in der letzten Version als Autowert eingefügt) oder eben die Stücklistennummer.

Die Sortierung soll dann imo nach der Autowertnummer erfolgen, bei Level1 wird jeweils der Wert 123456 gesetzt. Dann wird die Tabelle durchlaufen, ändert sich der Level auf >1 wird die Sachnummer des vorherigen Level in Feld Stückliste geschrieben. Hat der nächste DS den Level 1 beginnt das Spiel von vorne. Soweit richtig? Falls ja, lade nochmal eine vollständige Beispieltabelle hoch.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Atuatuca

Hallo Jürgen,

die Spalte "autowert" stammt nicht aus der Quelle, ich habe sie selbst eingefügt. (zur Kontrolle der Reihenfolge). Ich gehe davon aus das Acces die Zeilen der Excel-Tabelle einzeln einliest und den Autowert einträgt. Somit ist die richtige Reihenfolge, sofern Access der Spalte Autowert aufsteigend sortiert, gegeben.

ZitatDie Sortierung soll dann imo nach der Autowertnummer erfolgen, bei Level1 wird jeweils der Wert 123456 gesetzt. Dann wird die Tabelle durchlaufen, ändert sich der Level auf >1 wird die Sachnummer des vorherigen Level in Feld Stückliste geschrieben. Hat der nächste DS den Level 1 beginnt das Spiel von vorne. Soweit richtig?

Soweit richtig und das solange wie der Wert in der Spalte Level sich nicht ändert. Gleiches gilt auch wenn der Wert in Spalte "Level" steigt (strlevel+1). Kompliziert wird es wenn der Wert in Spalte "Level" fällt (strlevel-1), dann soll er rückwärts suchen bis er ein Datensatz findet wo der Wert in Spalte "Level" = strlevel-1 und den Wert aus der Spalte Sachnummer nehmen oder rückwärts Suche bis im Datensatz level = strlevel und dann zu den Datensatz zurück gehen wo er hergekommen ist (isnull(RS.Stückliste)) oder dlookup forward only.

Siehe hierzu den Kommentaren in der Tabelle 123456_soll.xlsx

Gruss
Atuatuca

el_gomero

Zitat
die Spalte "autowert" stammt nicht aus der Quelle, ich habe sie selbst eingefügt. (zur Kontrolle der Reihenfolge). Ich gehe davon aus das Acces die Zeilen der Excel-Tabelle einzeln einliest und den Autowert einträgt.

Da gehst du falsch aus ... In einer Datenbank werden die Datensätze eher willkürlich abgelegt, die Ausgabe erfolgt dann mit gewünschter Sortierung. Insofern ist es also wichtig die gewünschte Reihenfolge nachvollziehen zu können, in dem Fall über den Autowert, der eine laufende Nummer enthält.

In der Anlage hab ich dir eine Musterlösung eingebaut.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Atuatuca

Moin Jürgen,

erst schon mal vielen danke, für deine Mühen.

Gucke mir gerade deine "Arbeit" an. Leider kann ich Modul "mod_Code" nicht testen.
Er bleibt stehen bei dem roten Text. Desweiten ist noch ein kleiner Fehler im Modul "mod_import".
Private Sub anstatt Sub Mir ist auch aufgefallen das manche Sachnummer doppelt vorkommen, vielleicht hast Du mehrmals "durchlaufen" lassen?

Werde mir den Code nochmal genauer angucken, hoffentlich kann ich einiges verstehen, was da genau passiert.


Option Compare Database
Option Explicit

Sub Set_Stueckliste()
Dim db As DAO.Database, rs As DAO.Recordset, strSQL As String
Set db = CurrentDb

    Set rs = db.OpenRecordset("Select * From tbl_Import_final Order by Autowert")
    rs.MoveFirst
    Do Until rs.EOF
        If IsNull(rs!sachnummer) Then rs.MoveNext
        If rs!Level = 1 Then
            db.Execute "DELETE * FROM tmp_Hierarchie"
            strSQL = "INSERT INTO tmp_Hierarchie ( [Level], Stl ) " & _
                     "Select 1 AS L, " & rs!sachnummer & " AS Snr"
            [color=red][b][u]db.Execute strSQL[/u][/b][/color]
        Else
            strSQL = "INSERT INTO tmp_Hierarchie ( [Level], Stl ) " & _
                     "Select " & rs!Level & " AS L, " & rs!sachnummer & " AS Snr"
            db.Execute strSQL
            rs.Edit
            rs!Stl_Ist = DLookup("Stl", "tmp_Hierarchie", "Level=" & rs!Level - 1)
            rs.Update
        End If
        rs.MoveNext
    Loop
    rs.Close: Set rs = Nothing

Set db = Nothing

End Sub


Gruss und bis später
Atuatuca von der Ostsee

el_gomero

die beiden Subs Import_File und Set_Stueckliste müssen Public deklariert, stimmt, da war ein kleiner Fehler. Also nicht Private Sub ... sondern Public Sub ...

Der Code ist bei mir einwandfrei durchgelaufen. Wenn er bei dir an der markierten Stelle hängen bleibt, kannst du dir per ?strSQL  im Direktfenster das Statement ausgeben lassen und prüfen.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Atuatuca

Moin Jürgen,

habe nochmal getestet. Jetzt klappt es aus mit db.Execute strSQL. Keine Ahnung, warum er vorher gemeckert hat.

Noch 2 falsche Werte drin (ich erkenne dahinter keine Logik/Regelmäßigkeit)

Zeile 50 (Stl_ist: 6907300; Stl_soll: 6907301)
Nimmt den Wert der Spalte Sachnummer von Zeile 30

Zeile 111 (Stl_ist: 6908511; Stl_soll: 6908512)
Nimmt den Wert der Spalte Sachnummer von Zeile 109

Werde es auch nochmal mit den tatsächlichen Daten testen. Kann aber ein wenig dauern.

Gruss
Atuatuca

Atuatuca

Moin Jürgen,

habe mir noch mal ein paar "original" Daten gezogen und getestet.
Es scheint ein Problem zugeben, wenn der Wert in der Spalte "Level"
"3" ist.

Habe dein Code noch ergänzt, sodass er am Ende der Konvertierung
alle Tabellen außer der "Finale" geleert werden.

Anbei nochmal meine abgespeckte DB mit 2 Excel-Files zum importieren.

Ich gucke mir dein Code im Modul "mod_Code" nochmal an, vielleicht
fällt mir da was auf, aber da ich ein Newbie bin wohl eher nicht.
Aber auch ein blindes Huhn findet manchmal ein Korn :-)

Gruss
Atuatuca