Neuigkeiten:

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

Mobiles Hauptmenü

Textdatei mit fortlaufender Nummer generieren

Begonnen von TerraAOC, Januar 18, 2021, 11:10:13

⏪ vorheriges - nächstes ⏩

crystal

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. ;)
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

TerraAOC

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?

TerraAOC

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

MzKlMu

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.
Gruß Klaus

TerraAOC

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

TerraAOC

#20
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?

crystal

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
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

TerraAOC

#22
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.

crystal

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.
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

TerraAOC

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

crystal

#25
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
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

TerraAOC

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.

TerraAOC

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.

crystal

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
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...