Hallo, ich möchte, wenn ein User Werte in Textfelder einträgt und danach zur Bestätigung einen Button drückt, das dieser Button die Werte aus dem Textfeld mit deren Bezeichnung exportiert und mit einer fortlaufenden Nummer generiert. Im Style einer CSV
also zb:
Bestellnummer;BE1234567;Artikelnummer;12345678;Menge;1;Lagerort;A4B3C
und dann soll es gespeichert werden als 1.txt und der nächste dann als 2.txt usw.
Weiß leider gar nicht wo ich da wie anfangen soll.
Die Tabelle mit den Textfeldern existiert bereits, der Button auch muss nur gucken, wie ich den Button programmiere.
Ich hab da auf die schnelle auch nichts bei Google gefunden, da das mMn sehr speziell ist und ich auch nicht weiß, welche Schlagwörter ich verwenden kann.
Außer das: https://access-basics.de/index.php/Textdateien_exportieren_und_einlesen.html
Damit hab ich das Problem mit dem Button noch, aber immerhin ein Anfang, nur leider darf ich dort nicht weiterlesen und kaufe mir nicht für 69€ irgendwelche Dinge.
Danke für eure Hilfe im Voraus.
Hallo,
in dem Artikel ist alles beschrieben was Du brauchst, da musst Du nix kaufen.
Jetzt solltest du mal Dein Problem mit dem Button beschreiben.
Zitat von: MzKlMu am Januar 18, 2021, 12:05:32Jetzt solltest du mal dein problem mit dem button beschreiben.
Ich habe einen Button, nennen wir ihn mal btnBestätigung
Wenn ich diesen Button klicke, sollen alle Werte aus den einzelnen Textfeldern
txtBestellnummer, txtArtikelnummer, txtMenge und txtLagerort
in eine .txt Datei exportiert werden, diese soll einen fortlaufenden Namen bekommen.
Von diesen 4 Textfeldern sind 3 schon ausgefüllt wenn das Formular betreten wird (vorgegeben von Abfrage) und das dritte
txtMenge trägt der User per Hand ein
Hallo,
das Formular ist doch an eine Tabelle gebunden und diese Tabelle muss exportiert werden, nicht die Formularfelder.
Da gibt es aber noch einiges zu klären.
Wird immer die komplette Tabelle exportiert ?
Die LfdNr muss bereits beim Anlegen des Datensatzes erzeugt und in der Tabelle gespeichert werden.
Bitte beschreibe mal das komplette Vorhaben.
Zitat von: MzKlMu am Januar 18, 2021, 12:18:56Bitte beschreibe mal das komplette Vorhaben.
Ein User liest einen Auftrag bei uns in die Datenbank ein (Auftrag aus WaWi)
Danach öffnet sich ein Formular das anzeigt wo dieser Artikel im Lager liegt, wieviel benötigt wird usw.
Danach geht der User zu dem Lagerfach, sieht nach wieviel dort von diesem Artikel liegen. Also zb.
der User benötigt 2 im Auftrag und die Datenbank zeigt auch 2 an, im Regal liegt aber nur eine. Dann soll der User in das Textfeld Menge in dem Formular die tatsächliche Menge eintragen(auch wenn die Menge stimmt)
daraufhin soll, wenn alle Artikel in dem Auftrag bearbeitet sind, eine Textdatei mit allen Daten generiert werden, die später wieder ins WaWi eingelesen wird.
Besser kann ich es nicht erklären
Ich verstehe dich aber so, das ich ein leeres Feld in meiner Tabelle habe, zb MengeIst und dieses Feld wird nur befüllt durch Eingabe in die Textbox in dem Formular und dann wird die Tabelle exportiert in eine .txt
Dann bleibt nur noch das Problem mit der LfdNr und wie ich durch klick auf den Bestätigen Button automatisch die Tabelle exportiere
Edit: Nachdem ich nochmal kurz drüber nachgedacht habe, kann das so gar nicht funktionieren, da ich eine Abfrage brauche für das Formular, da die Tabelle gefiltert werden muss auf eine Abteilung.
Hallo,
soll die LfdNr bei jedem Export wieder bei 1 beginnen ?
Was willst Du überhaupt mit einer LfdNr das WaWi kann ja damit nichts anfangen, die ist ja dort unbekannt.
Hallo,
- wird im WaWi kein Lager verwaltet oder ist Dein Lager identisch dem des WaWi?
- ist Dein Lager das einzige, auf welches zugegriffen wird oder ist das ein Zwischenlager,
welches aus einem Zentrallager zwecks schnellerem Zugriff die Artikel geliefert bekommt
und diese als Konzessionslager verwaltet?
- Jedenfalls ist ungeklärt, welcher Anwender(User) welche Artikel zu welchem Zeitpunkt aus dem Lager entnimmt.
- Es ist auch ungeklärt, wer das Lager auffüllen darf.
Insgesamt wird wohl eine kleine Lagersoftware die Lösung sein.
Aus der kann man dann jederzeit herausfiltern, zu welchem Auftrag, welche Lagerbewegungen stattgefunden haben.
Also ganz so einfach wird's nicht werden. Mit einer step by step Erstellung ist das aber ohne weiteres bewältigbar.
Deine gewünschte Lösung ist jedenfalls insgesamt etwas wackelig im Sinne von sauberer Datenbankverwaltung.
Hallo,
ich nehme an, dass dem WaWi die Datei-Namen eigentlich egal sind. Es liest vermutlich einfach nur das ein, was in ein dafür bestimmtes Verzeichnis gelegt wird und schaut zu bestimmten Zeitpunkten oder durch User-Aktion nach, ob es dort neue Dateien gibt. Ich glaube nicht, dass das WaWi die Nummer im Datei-Namen irgendwie auswertet, allenfalls für die Reihenfolge. Eine simple fortlaufende Nummerierung wird da ohnehin Probleme bereiten, da die Sortierung der Dateien wohl nicht numerisch, sondern alphabetisch erfolgt, so dass 10.txt vor 2.txt käme - da müsste man schon führende Nullen einbauen.
Statt einer laufenden Nummer könnte man deshalb vielleicht auch Datum/Uhrzeit als Namen benutzen, damit die Datei-Namen eindeutig werden und die richtige Reihenfolge der Vorgänge erhalten bleibt.
Ich hoffe, das hilft. Ansonsten frag doch erstmal die WaWi-Admins, was sie brauchen und wie sie es verarbeiten können.
Gruß,
crystal
Ergänzung:
Es gibt in VBA die Möglichkeit, variablen STATIC zu definieren. Das bewirkt, dass der aktuelle Wert der Variablen über das Ende der Prozedur, die ihn setzt, erhalten bleibt - so lange, bis Access beendet wird (dann beginnt es wieder bei Null).
Dazu müsstest du beim Start von Access eine Variable mit STATIC definieren; in der Ereignis-Prozedur "Beim Klicken" deines Buttons wird dann diese Variable einfach um Eins hochgezählt. Der daraus resultierende Wert bleibt bestehen, wenn deine Ereignis-Prozedur beendet wird.
Siehe hierzu
https://www.herber.de/mailing/vb/html/vastmstatic.htm
was eine leicht korrigierte Version eines Original-Microsoft-Textes ist (google "vba static").
Aber Vorsicht: wenn du so einfach eine laufende Nummer generierst und eine Datei schreibst, ohne vorher nachgeschaut zu haben, ob es diese Datei schon gibt, werden die alten Daten einfach überschrieben. Schade eigentlich. Also müsstest du die Nummer solange hochzählen, bis es keine bestreffende Datei bereits gibt. Alles viel zu mühsam - die Idee mit einem Timestamp als Namen, z. B. nach dem Muster JJJJMMTTHHMMSS, halte ich für besser und einfacher (notfalls auch noch mit Zehntel- und Hundertstel-Sekunden der aktuellen Systemzeit).
Zitat von: derArb am Januar 18, 2021, 14:57:26- wird im WaWi kein Lager verwaltet oder ist Dein Lager identisch dem des WaWi?
- ist Dein Lager das einzige, auf welches zugegriffen wird oder ist das ein Zwischenlager,
welches aus einem Zentrallager zwecks schnellerem Zugriff die Artikel geliefert bekommt
und diese als Konzessionslager verwaltet?
- Jedenfalls ist ungeklärt, welcher Anwender(User) welche Artikel zu welchem Zeitpunkt aus dem Lager entnimmt.
- Es ist auch ungeklärt, wer das Lager auffüllen darf.
- identisch, es behandelt Artikel und Aufträge aus dem Lager.
- das einzige
- Warum? Er(der user) nimmt den Auftrag an (wie auch immer das aussehen mag) und wenn er im betreffenden Formular ist und die Artikelnummer mit dem Lagerort und der Menge vor sich hat, geht er hin und nimmt den Artikel aus dem Lager
-Nicht der User der DB, dafür gibt es andere Leute
Zitat von: crystal am Januar 18, 2021, 15:08:28ich nehme an, dass dem WaWi die Datei-Namen eigentlich egal sind. Es liest vermutlich einfach nur das ein, was in ein dafür bestimmtes Verzeichnis gelegt wird und schaut zu bestimmten Zeitpunkten oder durch User-Aktion nach, ob es dort neue Dateien gibt. Ich glaube nicht, dass das WaWi die Nummer im Datei-Namen irgendwie auswertet
Richtig, dem WaWi ist egal wie die Dateien heißen, das ich lediglich für die Übersicht im Ordner
Zitat von: MzKlMu am Januar 18, 2021, 14:24:46soll die LfdNr bei jedem Export wieder bei 1 beginnen ?
Nein, fortlaufend beginnend bei 1 ohne Ende
Zitat von: crystal am Januar 18, 2021, 15:41:17die Idee mit einem Timestamp als Namen, z. B. nach dem Muster JJJJMMTTHHMMSS, halte ich für besser und einfacher (notfalls auch noch mit Zehntel- und Hundertstel-Sekunden der aktuellen Systemzeit).
Das klingt auch gut. Wie würde man das am einfachsten Umsetzen?
Ich hab das ganze mal sehr grob angelegt so wie ich mir das vorstelle, Artikelnummer und Lagerort sind aus dem Grund Kombifelder, weil es mehrere Artikelnummern im Auftrag geben kann und ein Artikel an verschiedenen Orten liegen kann.
Nach dem Klick auf den Button, soll nun das ganze in der dazugehörigen Tabelle gespeichert werden und dann soll diese Tabelle exportiert werden, danach können die Einträge aus der Tabelle gelöscht werden, denn es gibt ja die .txt Datei.
(https://i.imgur.com/RzzHbr9.png)
Hallo,
und wo ist da jetzt die LfdNr ?
Zitat von: MzKlMu am Januar 18, 2021, 16:16:15Hallo,
und wo ist da jetzt die LfdNr ?
Warum soll die da eingetragen werden? Diese ist doch nur für die exportierte Datei interessant.
Edit: Habe gerade nochmal darüber nachgedacht, würde es funktionieren wenn ich jedem DS in der Tabelle eine LfdNr zuweise(Auto-ID vielleicht?)
und dieses dann als dynamisches Bezeichnungsfeld in mein Formular integriere?
Zitat von: crystalZitat von: crystal am Heute um 15:41:17
die Idee mit einem Timestamp als Namen, z. B. nach dem Muster JJJJMMTTHHMMSS, halte ich für besser und einfacher (notfalls auch noch mit Zehntel- und Hundertstel-Sekunden der aktuellen Systemzeit).
Das klingt auch gut. Wie würde man das am einfachsten Umsetzen?
strFileName = "c:\transfer\" & Format(Now, "yyyymmdd-hhmmss") & ".txt"
Hallo,
Diese ist doch nur für die exportierte Datei interessant.
Es wird aber die Tabelle exportiert, also muss die LfdNr in den Datensatz.
Nimm wie angedacht den Autowert.
PS:
Was willst Du jetzt eigenlich genau, einen DAteinamen für den Export erzeugen oder jeden Datensazu nummerieren ?
So wie Du es beschrieben hast:
Zitatwenn ich jedem DS in der Tabelle eine LfdNr zuweise(Auto-ID vielleicht?)
Eigentlich doch klar:
Nicht die Tabelle insgesamt oder in Teilen soll exportiert werden, sondern jeweils nur der eine aktuelle Datensatz, der im Formular bearbeitet wird (daher der Button "Bestätigen").
Die Idee, jedem Datensatz per se eine laufende Nummer zu verpassen, ist/war nur dazu gedacht, diese später für den Datei-Namen benutzen zu können.
All diese Überlegungen zur Nummerierung sind hinfällig, wenn man sich das angedachte Formular und den Aktions-Button "Bestätigen" ansieht bzw. die ursprüngliche Frage durchliest.
Ein Timestamp als Datei-Name wird mit größter Wahrscheinlichkeit die beste und einfachste Lösung sein, um die Datensätze einzeln an das WaWi zu senden. Die Eindeutigkeit der Datei-Namen wäre damit mit einfachsten Mitteln zu gewährleisten (sofern es nicht parallel mehrere User gibt, die zur selben Sekunde "Bestätigen" drücken - aber auch das wäre noch einfach zu lösen).
Übrigens ist ja die Systemzeit bereits eine laufende Nummer - allerdings mit Lücken. ;)
Zitat von: crystal am Januar 18, 2021, 17:52:38Nicht die Tabelle insgesamt oder in Teilen soll exportiert werden, sondern jeweils nur der eine aktuelle Datensatz, der im Formular bearbeitet wird (daher der Button "Bestätigen").
Genau, vielen Dank für deine Hilfe ich geh mal davon aus das in deinem gesendeten Code-Schnipsel das "c:\transfer\ beliebig geändert werden kann? Auch auf Netzplatten?
Ich habe jetzt mein Labelfeld lblLfdNr mit dem ich bei jedem DS den Autowert anzeigen möchte, aber er zeigt mir nur immer 1 an obwohl ich mit 5 Dummy Datensätzen teste.
Private Sub Form_Current()
Me.lblLfdNr.Caption = DLookup("[ID]", "Testtabelle")
End Sub
Muss es nicht in Form_Current? Form_Load gibt mir das gleiche Ergebnis
Grüße
Hallo,
warum ein Labelfeld?
Nimm ein normales Textfeld und binde es an das Autowertfeld, wie die anderen Felder auch.
Dlookup liefert immer nur einen Wert aus einem Datensatz und ist hier völlig fehl am Platz.
Zitat von: MzKlMu am Januar 19, 2021, 09:52:25Nimm ein normales Textfeld und binde es an das Autowertfeld, wie die anderen Felder auch.
keine Ahnung warum ich da ein Labelfeld genommen habe, das ist ja super einfach mit einem Textfeld. Das läuft. Jetzt muss ich noch
strFileName = "c:\transfer\" & Format(Now, "yyyymmdd-hhmmss") & ".txt"
an meinen Button binden, bzw an einen Export
Cool. Der Export klappt mit dem Button. Wie kann ich denn nun die Eingaben in dem Feld bestätigen und nach dem Export die Daten wieder löschen? Wie in meinem anderen Beitrag beschrieben.
Private Sub btnBestätigung_Click()
Dim strFilename As String
strFilename = "Q:\Testexport\" & Format(Now, "yyyymmdd-hhmmss") & ".txt"
DoCmd.TransferText acExportDelim, "Testtabelle Exportspezifikation", "Testtabelle", strFilename
End Sub
Außerdem würde ich gerne meine Komboboxen sinnvoll nutzen, es gibt die Möglichkeit das ein Artikel an verschiedenen Orten liegt oder eine Bestellung mehrere Artikel enthält, deswegen wäre es cool, wenn ich alle Möglichkeiten in meiner Kombobox sehen kann.
In meinem Fall hat ID 4 und 5 die gleiche Artikelnummer und die gleiche Bestellnummer. Aber die Kombobox ist leer wenn ich die ausklappe. Kann mir jemand sagen wie ich die füllen kann?
Hallo TerraAOC,
also einmal abgesehen davon, dass das ganze etwas skurril ist...
Um zu beantworten, wie du Komboboxen füllen kannst, müsstest du schon beschreiben, aus welcher Quelle die Daten kommen sollen.
Warum möchtest du "die Daten" wieder löschen?
Du erhälst vom WaWi Daten, die du in Access einliest. Erweitere diese Tabelle um ein simples Feld "Erledigt" mit Standardwert "Nein"/False.
In deinem Formular kannst du dann dieses Feld zufügen (ggf. unsichtbar) und in btnBestätigung_Click hinzufügen, z. B.:
me.Erledigt = True
Nichts für ungut, aber ich denke, dass du dir zunächst einige Grundlagen der Daten-Verarbeitung und insbes. über den Einsatz von Datenbanken aneignen solltest.
Bei allem Respekt: ich fürchte, dass du konzeptionell noch nicht richtig überlegt hast und einige Access-Grundlagen noch nicht kennst (s. a. deine andere Frage hier im Forum).
Wie soll der User dein Formular aufrufen?
Kann der User sich durch die offenen WaWi-Aufträge "durchhangeln" ("Blättern")?
Übrigens: statt zum Export "TransferText" zu bemühen, solltest du schlicht eine Textdatei öffnen und die paar Werte hineinschreiben. Denn deine Exportspezifikation bezieht sich auf die Tabelle und nicht auf den aktuellen Datensatz. Deshalb wohl auch der Wunsch, die Daten wieder zu löschen.
Du bist neu eingestiegen in Access und hast ein paar Ideen testweise umgesetzt, wie die WaWi-Aufträge sinnvoll bearbeitet werden könnten. Du möchtest den Arbeits-Ablauf sinnvoller und einfacher gestalten. Du bist auf einem guten Weg, aber es fehlt m. E. noch ein schlüssiges Konzept.
Du scheinst mit simulierten Daten zu experimentieren (s. Tabellenname "Testtabelle"). Vielleicht ist in deiner Testtabelle sogar nur ein einziger Datensatz vorhanden. Denke etwas anders: du erhälst vom WaWi Datensätze ("Aufträge"), die bearbeitet werden sollen. Die landen in deiner Datenbank als "offen/noch zu erledigen". Aus diesen Datensätzen könntest du z. B. auch "ToDo-Listen" erstellen und die Ergebnisse nach erfolgtem Gang ins Lager erfassen und zurückmelden. Dazu musst du keine Daten löschen, sondern nur ein Kennzeichen "Erledigt" setzen. So könntest du auch im Nachhinein feststellen, wer den Auftrag wann bearbeitet und erledigt hat. Du könntest sogar Bearbeitungs-Zeiten erfassen und anonym (Datenschutz) auswerten.
Was geschieht im realen Betrieb? Wie viele WaWi-Aufträge kommen jeden Tag? Wie viele Leute gibt es, die im Lager nach den Waren suchen sollen? Wer will/soll die WaWi-Aufträge bearbeiten? Wie sollen/können sich Kollegen/Kolleginnen einen oder mehrere Aufträge "schnappen"?
Die Rückmeldung an das WaWi per Datei ist nur ein letzter Schritt und mir scheint das Konzept für die Schritte davor und danach zu fehlen...
Gruß
crystal
Guten Morgen,
Zitat von: crystal am Januar 19, 2021, 22:11:30Um zu beantworten, wie du Komboboxen füllen kannst, müsstest du schon beschreiben, aus welcher Quelle die Daten kommen sollen.
Aus der Tabelle. Oder was meinst du?
Zitat von: crystal am Januar 19, 2021, 22:11:30Wie soll der User dein Formular aufrufen?
Wenn die DB geöffnet wird, sehen die User ein Hauptmenü mit verschiedenen Möglichkeiten.
Zitat von: crystal am Januar 19, 2021, 22:11:30Du scheinst mit simulierten Daten zu experimentieren
Ja, diese Daten sind aber genauso aufgebaut wie sie aus der WaWi kommen.
Zitat von: crystal am Januar 19, 2021, 22:11:30Vielleicht ist in deiner Testtabelle sogar nur ein einziger Datensatz vorhanden
Nein, 5 Datensätze davon sind 2 mit der gleichen Bestellnummer und 2 mit der gleichen Artikelnummer um zu sehen wie sich das Formular mit gleichen bzw. ähnlichen Werten verhält.
Zitat von: crystal am Januar 19, 2021, 22:11:30Was geschieht im realen Betrieb? Wie viele WaWi-Aufträge kommen jeden Tag?
Das kann man nicht sagen, das ist immer unterschiedlich. Je nach Betrieb, ich würde vermuten so 5-10 am Tag, vielleicht ein wenig mehr.
Zitat von: crystal am Januar 19, 2021, 22:11:30Wie viele Leute gibt es, die im Lager nach den Waren suchen sollen? Wer will/soll die WaWi-Aufträge bearbeiten? Wie sollen/können sich Kollegen/Kolleginnen einen oder mehrere Aufträge "schnappen"?
Alle die damit arbeiten, suchen sich auch Ihre eigene Ware. Maximal einen Auftrag zur Zeit, ansonsten ist das zuviel Arbeit das in Back und Frontend aufzuteilen für Mehrbenutzerbetrieb.
Die Werte vom Textfeld mit dem Klick auf den Button in die Tabelle zu übertragen ist einfach zu erledigen mit SQL, genauso wie die Werte löschen, eine ähnliche SQL Aktion hab ich schon in meiner DB. Ich muss nur noch wissen, wie ich die Komboboxen unabhängig voneinander "befülle", den Rest bekomme ich selber hin.
Edit: Mit unabhängig voneinander meine ich, das wenn ich zb. DS1 ausgewählt habe, das in der Artikelnummer Kombobox nur Artikelnummern stehen, die zu der Bestellnummer passen, aber in der Bestellnummer Kombobox alle Bestellnummern stehen. Wenn das möglich ist.
Hallo.
Also hier ist wohl einiges ziemlich falsch.
Du erhälst vom WaWi Datensätze mit Auftrags- bzw. Bestell-Nummer, Artikel, Lagerort und Soll-Menge.
Wie speicherst du diese DS? Gibt es in deiner Access-Tabelle dafür einen zusätzlichen Primärschlüssel (Autowert)?
Du stellst in deinem "Testformular" einen Auftrag dar und willst nun per Kombobox z. B. Artikel dieses Auftrags auswählen (inkl. Lagerort und Sollmenge)? Das geht so nicht, denn es würde ja den Wechsel auf einen anderen Datensatz bedeuten.
Wenn das WaWi zu einem Auftrag mehrere DS schickt, weil mehrere Artikel bestellt werden, bleibt doch jede dieser einzelnen "Meldungen" eindeutig durch die Kombination Auftrag+Artikel. Das wäre eine normale 1:n-Beziehung: 1 Auftrag, n Artikel. Aber leider wird diese 1:n-Beziehung durch die Einzel-Datensätze zerstört, weil alles "irgendwie" in einer Tabelle gespeichert wird.
In deiner DB-Tabelle gibt es zu EINEM Auftrag MEHRERE Datensätze mit jeweils unterschiedlicher Artikel-Nummer. Das könntest du an der Oberfläche mit einem Unterformular darstellen: du wählst EINEN Auftrag aus und zeigst im Unterformular an, welche Artikel zu diesem Auftrag gehören inkl. Lagerort und Menge - alles aus einer einzigen Tabelle.
Meine Frage, wie der User dein Formular aufruft, war so gemeint: welche Suchkriterien werden herangezogen? Jetzt wird mir auch langsam klar, warum du "bestätigte" Datensätze löschen willst...
Die einzige Möglichkeit, die mir einfällt, wäre ein ungebundenes Formular, in dem zuerst nach Auftrags-Nummer selektiert werden kann (z. B. per Kombobox). Der Inhalt der nachfolgenden Kombobox (Artikel) müsste dann per VBA so gesetzt werden: zeige mir alle Positionen zu Auftrag <vorher ausgewählt>. Nach Selektion des gewünschten Artikels müssten dann auch Lagerort und Menge per VBA aus dem betreffenden Datensatz gelesen und angezeigt werden. Die Eingabe der Ist-Menge könnte dann rein optisch im Formular erfolgen, um nach Klicken von "Bestätigen" die Textdatei zu erzeugen und den zugrunde liegenden Datensatz zu löschen. Dann müsste die "Artikel-Kombobox" neu geladen werden, weil ja eine Artikel-Position "erledigt" wurde.
Naja - alles sehr skurril (wie schonmal gesagt). Es wäre wohl einfacher, das im WaWi direkt zu machen, als Access dazwischen zu schalten.
Moin,
Zitat von: crystal am Januar 20, 2021, 15:53:11Es wäre wohl einfacher, das im WaWi direkt zu machen
Dazu kann ich nichts sagen, mein Chef möchte das gerne in Access machen.
Kannst du mir wenigstens sagen wie ich meiner Kombobox jetzt diesen Wert zuweise?
Brauche ich dafür mehrere Tabellen oder kann ich das nur mit meiner einen Tabelle machen?
Zitat von: crystal am Januar 20, 2021, 15:53:11Die einzige Möglichkeit, die mir einfällt, wäre ein ungebundenes Formular, in dem zuerst nach Auftrags-Nummer selektiert werden kann (z. B. per Kombobox). Der Inhalt der nachfolgenden Kombobox (Artikel) müsste dann per VBA so gesetzt werden: zeige mir alle Positionen zu Auftrag <vorher ausgewählt>. Nach Selektion des gewünschten Artikels müssten dann auch Lagerort und Menge per VBA aus dem betreffenden Datensatz gelesen und angezeigt werden. Die Eingabe der Ist-Menge könnte dann rein optisch im Formular erfolgen, um nach Klicken von "Bestätigen" die Textdatei zu erzeugen und den zugrunde liegenden Datensatz zu löschen. Dann müsste die "Artikel-Kombobox" neu geladen werden, weil ja eine Artikel-Position "erledigt" wurde.
Kannst du mir genau sagen wie das funktioniert? Wäre echt super nett.
Schönes Wochenende
Hallo!
Jaja - die Chefs...
Zunächst einmal sollest du nachfragen, was Cheffe noch im Sinn hat. Will er vielleicht nachschauen können, welche Aufträge offen sind oder in Bearbeitung? Will er im Nachhinein wissen, wie lange es gedauert hat?
Ich beschreibe nachfolgend ein kleines Konzept, wie du dein Problem lösen könntest, ohne Daten zu löschen. Das Konzept beruht nicht auf praktischen Tests, die du schon selbst machen solltest, sondern beschreibt nur das Vorgehen.
Was du vorhast, ist, die Daten nach erfolgter Aktion zu löschen - statistische Auswertungen sind dann natürlich nicht mehr möglich. Ich tendiere deshalb dazu, die Datensätze nicht zu löschen, sondern auf "erledigt" zu setzen. Das ginge mit eine J/N-Feld in der Import-Tabelle oder mit einem Zahlenfeld "AStatus", Standardwert 0 (=offen), 1 (in Bearbeitung), 2 (erledigt) etc.
Deine Import-Tabelle muss außerdem einen Primärschlüssel erhalten (Autowert).
Nun erstelle einfach ein leeres Formular und füge dort als erstes eine Kombobox ein. Dieser Kombobox verpasst du schlicht alle Aufträge, die noch nicht erledigt sind, also z. B.:
select AuftrNr from ImportTabelle where AStatus = 0;
Das kannst du nun erstmal probieren. Mit deinen Testdaten solltest du in der Kombobox nun Aufträge sehen (evtl. mehrfach), die noch offen sind. Mehrfach solltest du eben die Aufträge sehen, die mehrere Artikel umfassen.
Um dies für den User verständlicher darzustellen, könntest du die Artikel-Nummer als zweite Spalte zufügen, also
select AuftrNr, ArtikelNr from ImportTabelle where AStatus = 0
Wenn nun der User in dieser Kombobox irgendeine Auftragsnummer auswählt, soll ja der nächste Schritt folgen (Artikel auswählen). Dafür gibt es das Ereignis "Bei Änderung".
Füge deinem Formular also eine zweite Kombobox hinzu. In Das Ereignis "Bei Änderung" der ersten Kombobox schreibst du etwa:
select AuftragsID, AuftragsNr, ArtikleNr from ImportTabelle where AuftragsNr = Kombobox1.column(0)
(wär schön, geht aber nur indirekt), also:
strSQL = "select AuftragsID, AuftragsNr, ArtikleNr from ImportTabelle where AuftragsNr = " & kombobox1.columnn(0) & ";"
Kombobox2.Recordsource = strSQL
Kombobox2.Requery
Wozu die AuftragsID? Ganz einfach: wenn in deiner Import-Tabelle mehrere Datensätze mit identischer AuftragsNr existieren können, musst du sie unterscheiden können - eben anhand der AuftragsID. Da diese nur ein internes DB-Feld ist, kannst du sie für den User unsichtbar machen (Spaltenbreite 0).
Diese zwei Schritte könntest du natürlich auch in einer Kombobox kombinieren:
Select AuftragsID, AuftragsNr, ArtikelNr, LagerOrt, ...
Also irgendwie hat der User nun genau einen Datensatz gewählt. Jetzt musst du aus diesem Datensatz die anderen Werte holen (Lagerort, Sollmenge) und im Formular darstellen.
Und wie? Da es nur 2 Datenfelder sind, könntest du sie mit Dlookup holen und in entspr. Textfeldern darstellen. Oder du müsstest ein Recordset per ADO oder DAO öffnen und abfragen (wohl zu kompliziert).
Du könntest diese Felder auch gleich in die Kombobox integrieren (Spaltenbreite ggf. auf Null setzen). Das würde die Sache vereinfachen und dann z. B.
txtLagerort = KomboBox2.column(3)
txtSollmenge=KomboBox2.column(4)
Wichtig: im Ereignis "Bei Änderung" von Kombobox2 steht der Primärschlüssel für weitere Aktionen (Zugriff auf die Import-Tabelle) in Spalte 0.
(Habe kein Access auf diesem Laptop und liege im Krankenhaus. Alles daher aus dem Gedächtnis.)
Nachdem du nun also EINEN Datensatz deiner Import-Tabelle ausgewählt und die zusätzlichen Daten in entspr. Textfeldern dargestellt hast, brauchst du nur noch ein Textfeld "Ist-Menge" und deinen Button "Bestätigen".
Im "Bei Klick"-Event des Buttons prüfst du nun die Eingabe, schreibst die TXT-Datei und danach musst du nur noch den betreffenden Auftrags-Datensatz updaten. Etwa so:
strSQL="update ImportTabelle Set Istmenge, AStatus = Values(" & Istmenge & ", 2") where AuftragsID = " & Kombobox2.column(0)
Das setzt dann auch den AuftragsStatus auf 2 (erledigt).
Abschließend könntest du dann alle Felder deines Formular leeren und zur ersten Kombobox zurückkehren.
Das ist nicht so einfach für einen Anfänger und noch schwieriger ist es, das zu beschreiben, da ich gerade kein Access habe und im Krankenhaus liege. Aber es sollte dir doch genügend Hinweise geben, um dein Problem zu lösen. Vielleicht haben andere Forums-Teilnehmer Lust, das Vorgehen genauer zu beschreiben oder eine einfache Test-Applikation zu basteln.
Ansonsten bist DU gefordert, dich zu den einzelnen Schritten kundig zu machen und zu probieren!!!
Gruß,
crystal
guten morgen,
wow crystal, vielen dank für deine ausführlichen Antworten!
ich werde das alles nach und nach durchtesten diese Woche, je nachdem wie ich Zeit dafür finde(vielleicht erst Freitag)
Aber das sieht schon mal sehr vielversprechend aus.
Moin Crystal, sehr ausführlich erklärt, habe einiges Umgesetzt. allerdings sind mir einige Punkte noch unklar, wie zb. :
ZitatNachdem du nun also EINEN Datensatz deiner Import-Tabelle ausgewählt und die zusätzlichen Daten in entspr. Textfeldern dargestellt hast, brauchst du nur noch ein Textfeld "Ist-Menge" und deinen Button "Bestätigen".
ZitatAbschließend könntest du dann alle Felder deines Formular leeren und zur ersten Kombobox zurückkehren.
Mach ich das händisch?
Eine Beispiel Anwendung wäre echt klasse, sieht aber nicht so aus das jemand dafür Zeit hat, auch nicht schlimm. Ich verabschiede mich jetzt erstmal ins Wochenende und wünsche allen ein schönes Wochenende.
Hallo.
Natürlich machst du das nicht "händisch", sondern am Ende deiner Sub, die vom Button "Bestätigen" aufgerufen wird.
Die Eingabe im Textfeld "Ist-Menge" speicherst du per SQL-Update in die Tabelle (zusätzliches Feld), ebenso den neuen Status (z. B. 2). Dann schreibst du deine Transfer-Textdatei. Wenn das erfolgt ist, leerst du einfach alle Felder deines Formulars, indem du den Wert entweder auf "" setzt oder die Recordsource der Kombiboxen auf "" setzt - bis auf die ersten Kombobox - die kann ihren SQL-String behalten; allerdings solltest du dann ein Requery anstoßen (warum wohl?). Und als letztes: Kombobox1.Setfocus und alles kann von vorne beginnen.
Ich denke, ich habe dir für dein Vorhaben ein sehr ausführliches Gerüst geliefert, das die übernommenen Auftragsdaten nicht löscht, sondern um "Ist-Menge" und "Status" ergänzt (weitere Daten möglich, z. B. Datum/Uhrzeit), so dass "Chef" Auswertungen machen könnte.
Ich denke weiter, dass du dich mit diesem Prinzip etwas mehr befassen solltest. Ich glaube nicht, dass hier jemand bereit ist, eine Beispiel-Anwendung zu bauen, denn dieses Forum will Hilfe zur Selbsthilfe leisten.
Notfalls versuche mal so zu denken: du bekommst vom WaWi einen gedruckten Zettel, den ein Kollege nimmt und damit ins Lager geht. Es bringt dann nicht viel, einfach nur die geholte Ware auf den "Erledigt-Tisch" zu stellen, was ja prinzipiell dein ursprünglicher Plan war (Daten löschen).
Gruß aus dem Krankenhaus
crystal