rashtamoon
Goto Top

Access2000 Lieferscheindaten aus ASCII Datei importieren

Hi!

Ich möchte Lieferscheindaten aus eine ACII Datei in Access importieren.

Die Ursprungsdateien haben feste Feldlängen wobei erst die Kopfdaten (Datum, LS-Nr., Bestellnr. etc.) und dann 1:N die Detaildaten beinhaltet sind.

Die Kopfdaten sollen in eine Tabelle und die Detaildaten in eine zweite Tabelle importiert werden.

Wie stelle ich das an?

Benötige ich da 2 Importdefinitionen? Wenn ja, wie sage ich der 1. Routine, daß sich nach den Kopfdaten stoppen und wie der 2. Routine, daß sie erst an Stelle xx (nach Ende der Kopfdaten) mit dem einlesen beginnen darf?

Momentan steh ich ganz schön auf dem Schlauch, vielleicht könnt ihr mir helfen.

ciao

Content-Key: 30818

Url: https://administrator.de/contentid/30818

Printed on: April 26, 2024 at 15:04 o'clock

Member: verkehrsberuhigt
verkehrsberuhigt Apr 20, 2006 at 14:37:38 (UTC)
Goto Top
Die Ursprungsdateien haben feste Feldlängen wobei erst die Kopfdaten
(Datum, LS-Nr., Bestellnr. etc.) und dann 1:N die Detaildaten beinhaltet sind.

Wenn Du von festen Feldlängen sprichst muss man davon ausgehen, dass bei den Detaildaten die Kopfdaten jeweils wiederholt werden. Dann ist das doch kein wirkliches Problem. Oder meinst Du, dass die Kopfdaten des ersten Lieferscheins angezeigt werden, danach dessen Detaildaten und dann wieder die Kopfdaten des zweiten Lieferscheins usw.? Dann hast Du keine festen Feldbreiten und ACCESS wird - zumindest ohne VBA - nie wissen/lernen, wann die Kopfdaten zu Ende sind und die Detaildaten beginnen. Vielleicht kannst Du einen Auszug posten?
Member: Rashtamoon
Rashtamoon Apr 20, 2006 at 14:50:30 (UTC)
Goto Top
Hi!

Oder meinst Du, dass die Kopfdaten
des ersten Lieferscheins angezeigt werden,
danach dessen Detaildaten und dann wieder
die Kopfdaten des zweiten Lieferscheins
usw.?

Genau so meine ich das. Jeder Lieferschein kann 1:N Detailsätze enthalten.


Dann hast Du keine festen Feldbreiten
und ACCESS wird - zumindest ohne VBA - nie
wissen/lernen, wann die Kopfdaten zu Ende
sind und die Detaildaten beginnen.

Verstehe ich nicht, warum habe ich deshalb keine festen Feldlängen?

Ich müsste lediglich wissen, wie man Access beibringt mittels einer hinterlegten Importdefinition eine Datei bis zur X. Stelle zu lesen und ab dieser Stelle mit einer anderen Importdefinition weiterzumachen.

Bei EOF muss die 2. dann aufhören.

ciao
Member: verkehrsberuhigt
verkehrsberuhigt Apr 20, 2006 at 16:59:25 (UTC)
Goto Top
Oder meinst Du, dass die Kopfdaten des ersten Lieferscheins angezeigt werden, danach dessen Detaildaten und dann wieder die Kopfdaten des 2ten Lieferscheins usw.?
> Genau so meine ich das. Jeder Lieferschein kann 1:N Detailsätze enthalten.

Aber fangen nach den Detailsätzen des ersten Lieferscheins wirklich wieder die Kopfdaten des zweiten Lieferscheins an? Falls ja gibt es keine Lösung.

Ich müsste lediglich wissen, wie man Access beibringt mittels einer hinterlegten Importdefinition eine Datei bis zur X. Stelle zu lesen und ab dieser Stelle mit einer anderen Importdefinition weiterzumachen. Bei EOF muss die 2. dann aufhören.

Das hört sich allerdings wieder so an, als wenn erst alle Kopfdaten aller Lieferscheine in der Datei stehen und daran anschliessend alle Detaildatensätze aller Lieferscheine. Die in Access angebotenen Importfunktionen helfen Dir nicht weiter. Du kannst weder deren Geltungsbereich auf Datensätze beschränken noch kannst Du innerhalb eines Imports die Definition wechseln.

Ich denke egal wie: Deine Lösung heisst VBA.
Member: olafsteffan
olafsteffan Apr 20, 2006 at 21:27:18 (UTC)
Goto Top
Hallo,

ich kenne das Problem mit unterschiedlichen Satzlängen in Textdateien - allerdings bei SQL-Server. Ich habe das Problem so gelöst, dass ich die Textdatei zuerst komplett in eine Tabelle mit nur einer Spalte importiere (Trennzeichen z.B. TAB, das nicht enthalten ist - Zeilenende CR+LF). Anschließend wird eine oder werden mehrere Tabellen über entsprechendes SQL Befehle befüllt (substring() bzw. bei Access mid()). Das geht schneller und eleganter als ein großer Programmieraufwand.
Bei Access hast du natürlich das Problem, dass ein Feld nur max. 255 Zeichen breit sein kann. Wenn das zu wenig ist, dann definiere einfach mehrere Felder von dieser Breite und füge sie dann notfalls wieder teilweise zusammen.
Ich hoffe, der Tipp war zumindest eine Anregung für neue Ideen.

Gruß
Olaf
Member: Biber
Biber Apr 21, 2006 at 07:19:26 (UTC)
Goto Top
...ich verstehe das Szenario anders...
Nach meinem Verständnis sind in der Importdatei 2 Satzarten mit jeweils fester Feldlänge/Satzlänge enthalten.
Ist dem so, könnte es einfacher sein, die Quelldaten vorher auf CMD-Ebene nach Satzart "Kopfdaten" und Satzart "Detaildaten" zu trennen - garnatiert ist irgendwo die Information bzgl. Satzart im Satzformat enthalten.
Das dürfte dann - mit zwei Import-Definionen in zwei Tabellen schneller und wartbarer laufen als Olafs (auch funktionierender) Ansatz.

Gruß
Biber
Member: Rashtamoon
Rashtamoon Apr 21, 2006 at 09:27:10 (UTC)
Goto Top
Hallo zusammen,

vielen Dank für eure Hilfe.

Biber hat das Thema richtig formuliert, sorry für meine umständliche Darstellung.

Es handelt sich um 2 Satzarten (1 mal Kopfsatz, N mal Detailsatz) mit festen Feld/Satzlängen und in der Datensatzdefinition ist auch jeweils ein Qualifier definiert.

Ich muss mir jetzt mal die etwas unorthodoxe Datensatzdefinition reinziehen und herausfinden, ob der Qualifier auch eindeutig ist (Ich hab zwar eine Felddefinitionsliste die enthält aber keine Beschreibung der Inhalte (Zähler etc.)).

Wenn dem so ist, wie steuert man die Importroutinen dann, daß nur die Datensätze mit dem entsprechenden Qualifier integriert werden?

ciao
Rashtamoon
Member: Rashtamoon
Rashtamoon Apr 21, 2006 at 09:45:30 (UTC)
Goto Top
Hallo noch mal,

Lt. Definition hab ich im Kopfsatz als Qualifier "LIEF" und in den Detailsätzen eine laufende, Nummer (1, 2, 3 etc.) jeweils auf Position 1.

Also zumindest den Kopfsatz kann ich eindeutig erkennen zuordnen.

Wie bring ich das Access jetzt bei?

ciao
Member: Rashtamoon
Rashtamoon Apr 21, 2006 at 11:43:51 (UTC)
Goto Top
Hi nochmal,

ich bin ein Stück weiter:

Ich erstelle 2 Importroutinen, die erste liest nur die Kopfdaten ein und in der zweiten markiere ich die Kopfdaten mit "überspringen".

Funktioniert so ganz gut, leider wird halt nur der erste Detaildatensatz eingelesen, dann ist Schluss mit lustig....

Wie bringe ich das Ganze jetzt dazu weiterzumachen wenn noch weitere Detaildatensätze da sind?

Ich stelle mir das so vor, daß man abfragt ob noch Datensätze da sind (EOF oder so) und wenn ja die Spezifikation manipuliert (Startpos etc. hochsetzen) und dann noch mal laufen lässt.

Oder läuft das anders?

Wenn mir jetzt bitte noch jemand sagen kann, wie man gespeicherte Importspezifikationen im Nahhinein noch ändern kann wäre mir sehr geholfen.

Jedesmal wenn ich eine gespeicherte ändere und neu speichern will verwirft er mir meine Änderungen.

Vielen Dank noch mal für eure Unterstützung.

ciao
Member: Rashtamoon
Rashtamoon Apr 21, 2006 at 14:38:24 (UTC)
Goto Top
Hallo Jürgen face-smile

Ich habe mich offensichtlich zu unklar ausgedrückt.

Pro Lieferschein wird eine Datei übertragen.

Die Lieferscheine haben eine unterschiedliche Anzahl an Positionen (Detaildaten).

Ich bin jetzt schon soweit, daß ich den Kopfsatz und die erste Lieferscheinposition importieren kann.

Mein Problem ist momentan das einlesen von eventuell vorhandenen weiteren Positionen.

Ich habe 2 Importroutingen geschrieben, die erste für die Kopfdaten und die zweite für die Detaildaten welche erst an Stelle 624 (nach den Kopfdaten) anfängt zu lesen.

Funktioniert alles.

Nur, weitere, eventuell vorhandene Detailsätze werden nicht integriert weil in der Importspezifikation ja ganz klar die Startposition eingetragen wird welche dann nicht mehr stimmt.

Ich denke mir, daß man die Importspezifikation in VBA in einer Schleife bis zum EOF laufen lassen muss und die Startpositionen jeweils um 624 hochzählt.

Aber wie das gehen soll ist mir im Moment leider völlig schleierhaft.

Kann man Importspezifikationen aus VBA manipulieren oder muss mann das ganze dann in VBA neu schreiben?

Gibt's da irgendwo Beispiele dafür? Ich würd mich da schon reinpfriemeln.

ciao & schönes Wochennede