Grosse Tabelle in kleine Tabelle

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
27 Beiträge • Seite 1 von 2 (current) Nächste
27 Beiträge Seite 1 von 2 (current) Nächste

Grosse Tabelle in kleine Tabelle

Beitrag von LoLo ( / / 0 / 3 ) »
Moin,

dachte, das diese Aufgabenstellung eigentlich trivial sei, habe dann aber festgestellt, dass es doch ein bisschen Nachdenken erfordert.

Eine Tabelle enthält einen Bytestream in "1024-Stücke" (bzw. Zeilen mit Länge 1024)) aufgeteilt (z.B. 45 Zeilen mit "1024-Stücken", die letzte Zeile aber nur 967). Darin enthalten ist der Bytestream einer Datei (z.B. pdf-Datei).

Der Inhalt dieser Tabelle muss nun vollständig in eine andere Tabelle 'überführt' werden. Diese andere Tabelle enthält aber Zeilen, mit einer Länge von 1022.

Ich habe eine Lösung, die ich hier auch noch posten werden, bin aber erstmal auf die Lösungen hier im Forum gespannt.

Ciao, LoLo

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von Gast ( / / 0 / 3 ) »
Warum schreibt ihr nie den Grund dabei?

Will jemand die 1024 Byte einfach nur in ein 1022-Byte Feld, weil er was zu sagen hat oder, einfach nur weil da zwei Byte fehlen oder... Langeweile?


Kürze die erste Tabelle jeweils um Carriage Return und Line Feed oder mach einfach aus einer Zeile, zwei Zeilen..... oder drei oder vier...egal.

Oder nimm eine andere Tabelle :roll:

Ohne Sinn/Ziel .... bringen die ganzen Lösungen nichts.

Beitrag von LoLo ( / / 0 / 3 ) »
Ganz so einfach ist es nicht. Es hat schon einen Sinn und ist durchaus für andere Fälle anwendbar.

Der Anwendungsfall dahinter ist der folgende: Es gibt die Möglichkeit, im MM an eine Bestellung (ME23N ein Attachment zu hängen). Dieses Attachment wird über Archive-Link abgespeichert.

Nun werden die Bestellungen per IDOC in ein anderes System versandt. Über IDOCs lassen sich aber die Attachments nicht versenden, weil in der IDOC-Struktur das nicht vorgesehen wurde. Daher muss man nun zur Bestellung die zughörigen Attachments vom Zielsystem per RFC aus dem Quellsystem holen und die zugehörige Verlinkung im Zielsystem schaffen.

Nun kommt die Problemstellung von oben: Die Attachments (der Bytestream im Quellsystem ist in einer Tabelle mit Zeilen á 1024 Bytes) sollen im Zielsystem (Tabelle mit Zeilen á 1022 Bytes) abgelegt werden.
Ergo, man muss ein die Inhalte von Tabelle-gross in Tabelle-klein transferieren. Um Carriage-Return geht es dabei selbstverständlich nicht, da es sich um einen Byte-Stream handelt, nicht um Textzeilen.

Ciao, LoLo

Beitrag von Gast ( / / 0 / 3 ) »
Warum werden die anderen angeboten Lösungen einfach ignoriert?

Warum SOLLEN die 1024 den in 1022 Byte umgewandelt werden?
Die Attachments (der Bytestream im Quellsystem ist in einer Tabelle mit Zeilen á 1024 Bytes) sollen im Zielsystem (Tabelle mit Zeilen á 1022 Bytes) abgelegt werden.
Diese Begründung fehlt immer noch!

Könnte auch einer kommen und sagen, mein Auto SOLL 7 Räder haben... Grund: weil es so sein SOLL...

Beitrag von Gast ( / / 0 / 3 ) »
Warum SOLLEN die 1024 den in 1022 Byte umgewandelt werden?

Diese Begründung fehlt immer noch!
Ich dachte eigentlich die Begründung steht da: Im Zielsystem gibt es zur Ablage nur eine Tabelle mit Zeilenlänge 1022 Bytes. Wenn es auch anders gehen würde, hätte ich mir den Aufwand erspart.

Ciao, LoLo

Beitrag von black_adept (Top Expert / 4158 / 136 / 959 ) »
Ein Beispiel, das es tun sollte - aber nur um zu sehen was du selber zu bieten hast, nachdem du mich hier schon ganz neugierig gemacht hast.

Allerdings habe ich zur besseren Darstellung die Konstanten 1024 und 1022 mal durch kleinere ersetzt - dann sieht man am Bildschirm (oder im Debugger) was passiert.

Code: Alles auswählen.

REPORT zsstest2 .

CONSTANTS: c_s      TYPE i VALUE 10,
           c_l      TYPE i VALUE 26,
           c_double TYPE i VALUE 46.  " 2*max(c_s,c_l)

TYPES: ty_s(c_s)           TYPE c,  " kleines Charakterfeld
       ty_l(c_l)           TYPE c,  " großes Charakterfeld
       ty_double(c_double) TYPE c,
       tyt_s               TYPE STANDARD TABLE OF ty_s
                           WITH NON-UNIQUE DEFAULT KEY,
       tyt_l               TYPE STANDARD TABLE OF ty_l
                           WITH NON-UNIQUE DEFAULT KEY.

DATA: t_s    TYPE tyt_s,    " kleine Tabelle
      t_l    TYPE tyt_l,    " große Tabelle
      wa_s   TYPE ty_s,
      wa_l   TYPE ty_l,
      double TYPE ty_double,
      offset TYPE i.

FIELD-SYMBOLS: <fs>.


END-OF-SELECTION.
**************** Füllen große Tabelle **************************
  DO 10 TIMES.
    APPEND sy-abcde TO t_l.
  ENDDO.

****************  Umwandlung      ******************************
  LOOP AT t_l INTO wa_l.

    double+offset = wa_l.
    ADD c_l TO offset.
    WHILE offset >= c_s.

      SUBTRACT c_s FROM offset.
      wa_s = double(c_s).
      double = double+c_s.
      APPEND wa_s TO t_s.

    ENDWHILE.

    AT LAST.
      WHILE NOT double IS INITIAL.

        wa_s = double(c_s).
        double = double+c_s.
        APPEND wa_s TO t_s.

      ENDWHILE.
    ENDAT.

  ENDLOOP.
****************  Visualisierung  ******************************
  LOOP AT t_l ASSIGNING <fs>.
    WRITE:/ <fs>.
  ENDLOOP.
  ULINE.
  LOOP AT t_s ASSIGNING <fs>.
    WRITE:/ <fs>.
  ENDLOOP.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Gast ( / / 0 / 3 ) »
Habt ihr nur eine Tabelle im Zielsystem :roll:

Konvertiere die Bestellung ins Hexadezimale oder Binäre-Zahlensystem.

Beitrag von LoLo ( / / 0 / 3 ) »
Moin Stefan,

Deine Lösung gefällt mir sehr gut (vor allem sehr elegant). Ich denke habe das zu umständlich angegangen.
Hier mein Coding (konnte ich allerdings noch nicht testen):

Code: Alles auswählen.

    DATA: lv_offs_k TYPE i,
          lv_offs_g TYPE i,
          lv_used_len_k TYPE i,
          lv_leng TYPE i,
          lv_last_row type xfeld.

    CLEAR: lv_offs_k, lv_last_row.

    LOOP AT lt_data_tab INTO ls_data_tab.
      CLEAR lv_leng.
      lv_leng = XSTRLEN( ls_data_tab-line ).
      IF lv_leng = 0.
        if lv_offs_k > 0.
          append ls_content to lt_content.
        endif.
        EXIT.
      elseif lv_leng LT 1024.
       lv_last_row = 'X'.
      ENDIF.

      WHILE lv_offs_g < lv_leng.
        ls_content-line+lv_offs_k = ls_data_tab-line+lv_offs_g.
        lv_used_len_k = XSTRLEN( ls_content-line ).

        lv_offs_g = lv_offs_g + lv_used_len_k - lv_offs_k.

        IF lv_used_len_k = 1022 or ( lv_offs_g eq lv_leng and lv_last_row eq 'X' ).
          CLEAR lv_offs_k.
          APPEND ls_content TO lt_content.
        ELSE.
          lv_offs_k = lv_used_len_k.
        ENDIF.
      ENDWHILE.
    ENDLOOP.
Ciao, LoLo

Beitrag von LoLo ( / / 0 / 3 ) »
Moin Stefan,

Konnte meine 'Lösung' mittlerweile mal testen. Musste aber leider feststellen, dass xstrlen sich nicht so verhält, wie ich das erwartet hatte. (Nebenbei gab es noch zwei kleine Fehler aufgrund fehlender clear-Anweisungen). Es wird nämlich als Länge immer die gesamte Länge des Datenfeldes wiedergegeben (entsprechend der Definition) und nicht die benutzte Länge. Daher kann mit xstrlen nicht gearbeitet werden und die Lösung daher unbrauchbar, zumindest für byte-Felder. Mit charakter-Feldern müsste es gehen (unter Verwendung von strlen).
Muss mal schauen, ob ich noch einen anderen Weg finde. Wenigstens habe ich mit Deinem Ansatz eine Lösung, die funktioniert. Danke an dieser Stelle :-)

Ciao, LoLo

Beitrag von Gast ( / / 0 / 3 ) »
Du hast doch geschrieben, du hättest bereits eine Lösung :roll: :roll:
Ich habe eine Lösung, die ich hier auch noch posten werden, bin aber erstmal auf die Lösungen hier im Forum gespannt.

Ciao, LoLo

Beitrag von LoLo ( / / 0 / 3 ) »
@Gast: Wenn Du noch etwas anderes beizutragen hast, evtl. auch einen Lösungsansatz, dann wäre das wirklich klasse. Darauf wäre ich wirklich gespannt. Wenn nicht, kann ich auf Deine Beiträge auch ganz gut verzichten. Weitergebracht und weitergeholfen haben sie bisher nämlich nicht.

Ciao, LoLo

Beitrag von gast ( / / 0 / 3 ) »
Es wurden doch mehrer Lösungen angeboten, die Du aber einfach nur ignorierst.
Scheinen Dir nicht kompliziert genug zu sein?

Warum schreibst du sowas:
Ich habe eine Lösung, die ich hier auch noch posten werden, bin aber erstmal auf die Lösungen hier im Forum gespannt.

Ciao, LoLo
wenn es nicht stimmt :roll:

Auch darauf gibt es keine Antwort von Dir.

Beitrag von LoLo ( / / 0 / 3 ) »
Die einzige Lösung, die ich bisher gesehen habe, ist die von Stefan alias black adept.
Ich dachte ich hätte eine Lösung. Warum sie nicht funktioniert bzw. nur im Falle von C-Feldern habe ich dargelegt. Was ich von Dir gelesen habe, waren bisher keine Lösungen, sondern Kommentare, die für mich leider unnütz sind und mich kein bisschen weiterbringen. Ich wäre Dir für eine Lösung sehr dankbar. Wenn Du keine hast, dann wäre ich Dir genauso dankbar, auf Kommentare wie die bisherigen zu verzichten. Dankeschön.

Beitrag von Gast ( / / 0 / 3 ) »
Dann lass Dir meine Posting vorlesen... wenn du es selber nicht kannst.

Er gross rumprallen, du hättest eine Lösung ...und nun doch nicht.

Beitrag von black_adept (Top Expert / 4158 / 136 / 959 ) »
Lieber Gast,

sicher ist es häufig sinnvoll den Grund zu erfahren warum jemand eine Frage stellt - aber nötig ist das m.E. nicht. Je allgemeiner die Frage desto häufiger wird die Antwort andwendbar sein. Und folgerichtig sind die abstrakten Fragen ohne jeglichen Bezug wohl auch diejenigen, die für viele Anwendungen anwendbar sein werden.

Weiterhin ist der Sinn dieses Forums (zumindest in meiner Sichtweise) der, hier Fragen zu stellen und zu hoffen qualifizierte Antworten zu erhalten.
Und leider muss ich mal bemerken, dass deine Anworten in diesem Thread hier darauf hindeuten, dass du
a) entweder von ABAP bzw. R/3 kaum oder gar keinen Schimmer hast oder den Inhalt der Frage nicht schnallst
Habt ihr nur eine Tabelle im Zielsystem
Konvertiere die Bestellung ins Hexadezimale oder Binäre-Zahlensystem.
Kürze die erste Tabelle jeweils um Carriage Return und Line Feed oder mach einfach aus einer Zeile, zwei Zeilen..... oder drei oder vier...egal.

Oder nimm eine andere Tabelle
und
b) einfach nur flamen willst
Dann lass Dir meine Posting vorlesen... wenn du es selber nicht kannst.

Er gross rumprallen, du hättest eine Lösung ...und nun doch nicht.
Ich möchte LoLo hier mal ganz explizit zustimmen, wenn sie dir die Abwesenheit deiner Kommentare dankt. ( Auch wenn ich ihr/ihm nicht zustimme, wenn sie Kommentare nicht begrüßt die sie/ihn nicht weiterbringen - es kommt darauf an zu versuchen hilfreich zu sein )
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

1
Antw.
3080
Views
Grosse von Interne Tabelle
von autohandel7 » 10.07.2018 10:24 • Verfasst in ABAP® für Anfänger
20
Antw.
5221
Views
2 kleine fragen
von dkast » 06.12.2017 09:40 • Verfasst in ABAP® für Anfänger
5
Antw.
4965
Views
1
Antw.
4620
Views

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.