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,

hab noch ne kleine Änderung vorgenommen und die Verarbeitung flutscht mit beiden Dateien. Wobei in einer ein DS mit einer leeren Sachnummer vorkommt. Da solltest du mal die Qualität 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,

erst einmal vielen Dank.

habe schon mal ein kurzen Blick rein geworfen. Sieht SEHR GUT aus. Werde mir dein Code
mal zur Brust nehmen und analysieren, was da genau gemacht wird, bzw. passiert.

Das mit dem Artikel ohne Sachnummer wurde schon an die/den entsprechenden Konstrukteur[in] / Entwickler[in] weitergegeben. Kommt aber nur sehr selten vor.

Die Arbeit ist jetzt ein sehr großen Schritt voran gekommen. Jetzt heißt es Daten in andere Tabellen
transferieren und mit einer entsprechenden ID und VaterID versehen. Abgleichen mit den gemachten Bestellungen und dann ein Bericht erzeugen mit den noch zu bestellenden Artikeln.

Nochmals vielen Dank.

Gruss
Atuatuca

Atuatuca

Moin Jürgen,

versuche gerade den Wert für Stückliste bei für Level = 1 per User-Eingabe im Formular zu realisieren,
leider funktioniert es irgendwie nicht.

Habe es in der qry_Set_Level1 versucht mit:

UPDATE tbl_Import_final SET tbl_Import_final.Stl_Ist = [Formulare]![frmDialogImport]![txt_Stueckliste]
WHERE (((tbl_Import_final.Level)=1));


frmDialogImport ist das gleiche wie frmImport nur eben mit einen Textfeld mit den Namen txt_Stueckliste

als Ereignis für das txt_Stueckliste, nach Aktualisieren, habe ich

Private Sub txt_Stueckliste_AfterUpdate()
        txt_Stueckliste = stl_import
End Sub


Es kommt eine Fehlermeldung:
Laufzeiten Fehler 3061
1 Parameter wurde erwarte, aber es wurden zu wenig Parameter übergeben

Wenn ich in der Abfrage qry_Set_Level1 dann

UPDATE tbl_Import_final SET tbl_Import_final.Stl_Ist = 'stl_import'
WHERE (((tbl_Import_final.Level)=1));


eingebe, wird der Text "stl_import" in den Datensätze eingetragen unter Stl, wo Level =1,
jedoch nicht die Variable "stl_import.

Ich verstehe nur Bahnhof.


Gruss
Atuatuca

Atuatuca

Moin Jürgen,

konnte das Problem jetzt doch selber lösen. Habe in ein Modul

Public Sub Set_Level_Eingabe()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim 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 rs.Fields("Stl_Ist") = "123456" Then
                    rs.Edit
                    rs.Fields("Stl_Ist") = [Forms]![frmDialogImport]![txt_Stueckliste]
                    rs.Update
                End If
               
               
                rs.MoveNext
            Loop
        rs.Close: Set rs = Nothing

Set db = Nothing

End Sub


eingegeben

und das Modul wird wiederum per Schaltfläche ausgeführt (call Set_Level_Eingabe)

Learning by doing :-)

Gruss
Atuatuca

el_gomero

Moin,

das mag ja funktionieren, eleganter und performanter wäre das mit einer Aktualisierungsabfrage zu lösen. Hatte ich wohl auch schon so in der db eingebaut.

Public Sub Set_Level_Eingabe()
Dim db As DAO.Database
Dim strSQL As String

SET db = currentdb

    strSQL = "UPDATE tbl_Import_final " & _
                   "SET Stl_Ist=" & [Forms]![frmDialogImport]![txt_Stueckliste] & " " & _
                   "WHERE Stl_Ist=123456"
    db.execute strSQL

SET db = nothing

End Sub
Gruß
Jürgen


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

Atuatuca

Hallo Jürgen,

versuche es auf direktem Wege, aber er sagt mir immer:

"1 Parameter wurde erwartet, aber zu wenig Parameter übergeben"

SQL in der Aktualisierungsabfrage qry_Set_Level1

UPDATE tbl_Import_final SET tbl_Import_final.Stl_Ist = [Forms]![frmDialogImport]![txt_Stueckliste]
WHERE (((tbl_Import_final.Level)=1));


Gruss
Atuatuca

el_gomero

hmmm,

ist das Formular denn zur Laufzeit der Abfrage offen und enthält txt_Stueckliste einen gültigen Wert?
Gruß
Jürgen


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

Atuatuca

Hallo Jürgen,

Hier der Code hinter der Schaltfläche

Private Sub cmd_Uebernehmen_Click()
       
    Call Import_File                                                'modul mod_Import ausführen

    Set db = CurrentDb
    db.Execute "DELETE * FROM tbl_Import_final"                     'tbl_Import_final leeren
    db.Execute "qry_tbl_Stueckliste_final", dbFailOnError           'Abfrage qry_tbl_Stueckliste_final durchführen
    Set db = Nothing
   
    CurrentDb.Execute "qry_Set_Level1", dbFailOnError               'Abfrage qry_Set_Leverl1 durchführen
   
    Call Set_Stueckliste                                            'modul mod_Set_Stueckliste ausführen
   
    'Call Set_Level_Eingabe                                          'modul mod_Set_Level_Eingabe ausführen
   
    DoCmd.SetWarnings False                                         'Warnungen ausschalten
    SQLdelete = "delete * from tbl_Import_Stuecklisten_raw"         'Tabelle tbl_Import_Stuecklisten_raw leeren
    DoCmd.RunSQL SQLdelete
    SQLdelete = "delete * from tmp_Hierarchie"                      'Tabelle tmp_Hierarchie leeren
    DoCmd.RunSQL SQLdelete
    DoCmd.SetWarnings True                                          'Warnungen einschalten
   
End Sub


Formular frmDialogImport ist geöffnet und im Textfeld wird eine Zahl eingetragen.
Bild vom Formular im Anhang.

Gruss
Atuatuca

el_gomero

verbesserter code:

Private Sub cmd_Uebernehmen_Click()
' Option Explicit einschalten !!! dann muss zB SQLDelete deklariert werden
Dim Set db AS DAO.Database, SQLDelete as String
Set db = CurrentDb

' ruft eigenständige Prozedur auf
    Call Import_File                                                'modul mod_Import ausführen

' ausführen mit dem Currentdb -Objekt
    db.Execute "DELETE * FROM tbl_Import_final"                     'tbl_Import_final leeren
    db.Execute "qry_tbl_Stueckliste_final", dbFailOnError           'Abfrage qry_tbl_Stueckliste_final durchführen

'   Set db = Nothing
   
    db.Execute "qry_Set_Level1", dbFailOnError               'Abfrage qry_Set_Leverl1 durchführen
   
    Call Set_Stueckliste                                            'modul mod_Set_Stueckliste ausführen
   
    'Call Set_Level_Eingabe                                          'modul mod_Set_Level_Eingabe ausführen
   ' überflüssig
   'DoCmd.SetWarnings False                                         'Warnungen ausschalten

' Import-Tabellen leeren
   SQLdelete = "DELETE * FROM tbl_Import_Stuecklisten_raw"         'Tabelle tbl_Import_Stuecklisten_raw leeren
   ' warum DoCmd?
   'DoCmd.RunSQL SQLdelete
   db.Execute SQLdelete
    SQLdelete = "DELETE * FROM tmp_Hierarchie"                      'Tabelle tmp_Hierarchie leeren
   db.Execute SQLdelete
     
End Sub
Gruß
Jürgen


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

Atuatuca

Hallo Jürgen,

habe es jetzt so versucht, aber immer noch die gleiche Fehlermeldung. Er hängt bei

db.Execute "qry_Set_Level1", dbFailOnError               'Abfrage qry_Set_Leverl1 durchführen

Option Compare Database
Option Explicit

Private Sub cmd_Uebernehmen_Click()

' Option Explicit einschalten !!! dann muss zB SQLDelete deklariert werden
Dim db As DAO.Database
Dim SQLDelete As String

Set db = CurrentDb

   ' ruft eigenständige Prozedur auf
    Call Import_File                                                'modul mod_Import ausführen

   ' ausführen mit dem Currentdb -Objekt
    db.Execute "DELETE * FROM tbl_Import_final"                     'tbl_Import_final leeren
    db.Execute "qry_tbl_Stueckliste_final", dbFailOnError           'Abfrage qry_tbl_Stueckliste_final durchführen
  db.Execute "qry_Set_Level1", dbFailOnError               'Abfrage qry_Set_Leverl1 durchführen
   
    Call Set_Stueckliste                                            'modul mod_Set_Stueckliste ausführen

   ' Import-Tabellen leeren
   SQLDelete = "DELETE * FROM tbl_Import_Stuecklisten_raw"         'Tabelle tbl_Import_Stuecklisten_raw leeren
   db.Execute SQLDelete
    SQLDelete = "DELETE * FROM tmp_Hierarchie"                      'Tabelle tmp_Hierarchie leeren
   db.Execute SQLDelete
     
End Sub


qry_Set_Level1
UPDATE tbl_Import_final SET tbl_Import_final.Stl_Ist = [Forms]![frmDialogImport]![txt_Stueckliste]
WHERE (((tbl_Import_final.Level)=1));


Gruss Atuatuca

MaggieMay

Hallo,

eine mögliche Lösung könnte diese sein:
UPDATE tbl_Import_final
SET tbl_Import_final.Stl_Ist = EVAL("[Forms]![frmDialogImport]![txt_Stueckliste]")
WHERE (((tbl_Import_final.Level)=1));
Freundliche Grüße
MaggieMay

ebs17

Du könntest auch eine vollständig formulierte Parameterabfrage verwenden ...
PARAMETERS
   [$Eintrag$] INT
;
UPDATE
   tbl_Import_final
SET
   Stl_Ist = [$Eintrag$]
WHERE
   Level = 1
;


... und diese wie folgt verwenden:
ExecuteParamQdf "qry_Set_Level1", Forms!frmDialogImport!txt_Stueckliste

Die verwendete Hilfsfunktion findest Du hier:
Insert oder Update als Parameter-Abfrage
Mit freundlichem Glück Auf!

Eberhard

Atuatuca

Hallo MaggieMay,

dein Code funktioniert.

Vielen Dank.


Gruss
Atuatuca

MaggieMay

Hi,
Zitatdein Code funktioniert.
wobei der Ansatz von ebs17 natürlich höheres Nutzungspotenzial in sich trägt.
Freundliche Grüße
MaggieMay