Unicode - Kopieren einer internen Tabelle in Arbeitsbereich

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
10 Beiträge • Seite 1 von 1
10 Beiträge Seite 1 von 1

Unicode - Kopieren einer internen Tabelle in Arbeitsbereich

Beitrag von genua (ForumUser / 29 / 0 / 0 ) »
Hallo Leute,

nachdem wir ein Programm von einem nicht-unicode in ein unicode-basierendes SAP System ECC 6.0 transportiert haben, bekomme ich jetzt Syntaxfehler bei der Überprüfung des ABAP-Codes.

Ich muss dazu sagen, dass ich noch kein erfahrener ABAP-Programmierer bin. Dennoch muss ich das Programm zum Laufen kriegen.

Das Problem hängt mit der Änderung in der Sprache ABAP bzgl. Unicode zusammen und zwar, dass vorher jedes Textzeichen früher genau 1 Byte eingenommen hat und nun heute im Rahmen der Unicode-Einführung diese Länge mehr oder weniger Variabel sein kann. Somit greift wohl nicht mehr der Implizite Kopiervorgang wie in meine Problem wie folgt:

Code: Alles auswählen.

LOOP AT i_povol INTO f_povol.   " Hier kracht es also!!!
 ...
ENDLOOP.

Erklärungen:


Definition von i_povol:

Code: Alles auswählen.

DATA: BEGIN OF i_povol OCCURS 0.
        INCLUDE STRUCTURE zcmd_povol.
DATA: END   OF i_povol.

Definition der Tabelle zcmd_povol:
DATENELEMENT   DATENTYP    LÄNGE
MANDT  CLNT  3
SYSYSID  CHAR  8
LIFNR  CHAR  10
BUKRS  CHAR  4
EKORG  CHAR  4
HWAER  CUKY  5
BUPER  ACCP  6
MC_EFFWR  CURR  15

Definition von f_povol:

Code: Alles auswählen.

DATA: BEGIN OF f_povol,
        sysid  TYPE sysid,  " CHAR 30
        mandt  TYPE mandt, " CLNT 3
        lifnr  TYPE lifnr, " CHAR 10
        bukrs  TYPE bukrs, " CHAR 4
        ekorg  TYPE ekorg, "  CHAR 4
        hwaer  TYPE hwaer, " CUKY 5
        perio  TYPE buper, " ACCP 6
        netwr  TYPE netwr, " CURR 15
END   OF f_povol.
Die Frage nun: WARUM KANN MAN NICHT IN DEN ARBEITSBEREICH KOPIEREN!

Vielen Dank im Voraus!

Viele Grüße
Johannes
Je mehr wir voneinander wissen, um so größer ist unsere Chance zu überleben.

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


Beitrag von Thomas R. (Expert / 755 / 78 / 34 ) »
Hallo Johannes,
schau Dir mal die Definitionen von i_povol und f_povol an. Du wirst Unterschiede feststellen.
Wenn Du f_povol wie folgt definierts dürfte es nicht mehr krachen (zumindest an dieser Stelle)

Code: Alles auswählen.

data:
  f_povol like line of i_povol[].
MfG
Thomas R.

Vielen Dank

Beitrag von genua (ForumUser / 29 / 0 / 0 ) »
Super, Tausend Dank! Es geht jetzt!

Was macht denn genau das

like line?

und was bedeutet:

i_povol[] (also die Klammern dahinter)?

Viele Grüße
Johannes
Je mehr wir voneinander wissen, um so größer ist unsere Chance zu überleben.

Beitrag von khb (Specialist / 184 / 7 / 1 ) »
Hallo Genua,

durch den (optionalen) Zusatz LINE OF werden die Eigenschaften des Zeilentyps der internen Tabelle übernommen.

mit [] wird der Tabellenkörper angesprochen (und nicht nur die eventuell vorhandene Kopfzeile)

lg khb

Re: Unicode - Kopieren einer internen Tabelle in Arbeitsbereich

Beitrag von Kristin (ForumUser / 47 / 2 / 0 ) »
Hallo zusammen,

das Thema ist zwar schon älter, aber es passt zu meinem Problem. Ich habe die Lösungen umgesetzt, habe aber nun das Problem, dass er jeden Datensatz in der Tabelle überschreibt. Vllt bin ich auch einfach nur zu verbissen, um den evtl Mini-Fehler zu sehen. Seid gnädig mit mir, bin Anfänger :) Habe die Aufgabe bekommen alle alten Programme in Unicode umzuschreiben, dabei bin ich auf den "download" gestoßen. Da dieser mit Unicode nur noch über "GUI-download" geregelt wird, stimmt das halbe Programm nicht mehr. Ich hab schon ein bischen angefangen:

Also Beispiel:
VORHER
data: begin of tab occurs 1000,
txt(999) type c.
data: end of tab.

call function 'WS_DOWNLOAD'
EXPORTING
filename = filename
filetype = 'ASC'
mode = ' '
TABLES
data_tab = tab

form ms_project_kopf.
refresh tab.
clear tab.
move 'Einmalige_Nr;Name;Notizen;Dauer;Vorgänger' to tab.
append tab.

form file.
clear tab.
SHIFT t-dzeit LEFT DELETING LEADING '0'.
SHIFT t-zaehl LEFT DELETING LEADING '0'.
SHIFT h_vorgaenger LEFT DELETING LEADING '0'.
CONCATENATE t-dzeit ' Tage' INTO t_dzeit22.
concatenate t-zaehl ';' t-bezei ';' h_text ';' t_dzeit22 ';' h_vorgaenger into tab.
clear t_dzeit22.
append tab.


NACHHER
TYPES: begin of pc_tab,
text(999) type c,
end of pc_tab.
data: tab TYPE STANDARD TABLE OF pc_tab.
data: pc LIKE LINE OF tab[].

CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = filename
filetype = 'ASC'
dat_mode = ' '
changing
data_tab = tab

form ms_project_kopf.
refresh tab.
clear tab.
move 'Einmalige_Nr;Name;Notizen;Dauer;Vorgänger' to pc.
append pc to tab.

form file.
clear tab.
SHIFT t-dzeit LEFT DELETING LEADING '0'.
SHIFT t-zaehl LEFT DELETING LEADING '0'.
SHIFT h_vorgaenger LEFT DELETING LEADING '0'.
CONCATENATE t-dzeit ' Tage' INTO t_dzeit22.
concatenate t-zaehl ';' t-bezei ';' h_text ';' t_dzeit22 ';' h_vorgaenger into pc.
clear t_dzeit22.
append pc to tab.


Ich hoffe ihr könnte mit den Ausschnitten was anfangen.
Bevor ich "LIKE LINE OF" eingesetzt habe, stand an der Stelle "data: pc TYPE tab." Das hat gar nicht funktioniert. Beim Debugging seh ich nun zumindest die richtigen Zeilen, aber sie werden immer überschrieben. Vllt erkennt jemand mein Problem? Vielen lieben Dank! Grüße Kristin

Re: Unicode - Kopieren einer internen Tabelle in Arbeitsbereich

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Kristin hat geschrieben:...

Code: Alles auswählen.

form file.
  clear tab. "<<<==== falsch! Richtig ist CLEAR pc.
    SHIFT t-dzeit LEFT DELETING LEADING '0'.
    SHIFT t-zaehl LEFT DELETING LEADING '0'.
    SHIFT h_vorgaenger LEFT DELETING LEADING '0'.
    CONCATENATE t-dzeit ' Tage' INTO t_dzeit22.
    concatenate t-zaehl ';' t-bezei ';' h_text ';' t_dzeit22 ';' h_vorgaenger into pc.
    clear t_dzeit22.
  append pc to tab.
...
so, ein Fehler besteht schon einmal darin, dass tab nun der Name einer Tabelle _ohne_ Kopfzeile ist. Somit löscht 'CLEAR tab.' die Tabelle, da es keine gleichnamige Kopfzeile mehr gibt.

Wann wird denn die Routine file aufgerufen?
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Re: Unicode - Kopieren einer internen Tabelle in Arbeitsbereich

Beitrag von Kristin (ForumUser / 47 / 2 / 0 ) »
danke schon mal ;) aber hat nichts verändert...

at user-command.
case sy-ucomm.
when 'DOWN'.
perform uebernehmen.
clear v.
refresh v.
* Hilfstabelle Vorgänger füllen
loop at t where mark = 'X'.
append t to v.
endloop.
perform ms_project_kopf.
loop at t where mark = 'X'.
perform vorgaenger_ermitteln.
perform file.
endloop.
perform download.
endcase.

nur dort wird es aufgerufen... nach der ganzen selection... ist ein riesenprog.
ich hoffe es bringt dich weiter...

hier mal der komplette ausschnitt von "form file":

Code: Alles auswählen.

 select single * from  makt
          where  matnr       = t-matnr
          and    spras       = sy-langu.
  move t-matnr+10 to t-bezei.
  replace '"'  with ' ' into makt-maktx.

  move makt-maktx to t-bezei+09.
  move 'Sub-Nr.:'  to t-bezei+72.
  move p_belnr+5(5) to t-bezei+82.
  move p_posnr+3(3) to t-bezei+89.
  move t-mtart to t-bezei+95.

  data: h_vorgaenger(999) type c.
  data: a(4) type n.
  clear h_vorgaenger.
  a = 1.

  loop at vor.
    at first.
      move ' " ' to h_vorgaenger+0(1).
    endat.
    move vor-vorgaenger to h_vorgaenger+a(4).
    a = a + 4.
    move ' ; ' to h_vorgaenger+a(1).
    a = a + 1.
    at last.
      a = a - 1.
      move ' " ' to h_vorgaenger+a(1).
    endat.
  endloop.

  clear h_text.
  move 'Target-Preis:' to h_text.
  write t-preis to h_text+15(11) currency 'EUR'.
  move 'Kalk-Preis:' to h_text+50.
  write t-pkalk to h_text+65(11) currency 'EUR'.
  move 'Differenz:' to h_text+100.
  write t-differ to h_text+115(11) currency 'EUR'.
  move 'Mtart:' to h_text+160.
  move t-mtart to h_text+167.

  clear tab.
  DATA t_dzeit22 TYPE string.
  clear pc.
    SHIFT t-dzeit LEFT DELETING LEADING '0'.
    SHIFT t-zaehl LEFT DELETING LEADING '0'.
    SHIFT h_vorgaenger LEFT DELETING LEADING '0'.
    CONCATENATE t-dzeit ' Tage' INTO t_dzeit22.
    concatenate t-zaehl ';' t-bezei ';' h_text ';' t_dzeit22 ';' h_vorgaenger into pc.
    clear t_dzeit22.
  append pc to tab.
endform.                    " file

nochmals vielen vielen dank... ich bin am verzweifeln...

P.S. hier ist auch der komplette "Kopf"-Bereich (habe dort auch alle "tab" gegen "pc" getauscht, aber dann bekomm ich bei "refresh" ne Fehlermeldung, dass pc keine interne tabelle sei):

Code: Alles auswählen.

form ms_project_kopf.
 refresh tab.
  clear tab.

  move 'Einmalige_Nr;Name;Notizen;Dauer;Vorgänger' to pc.
  append pc to tab.
  clear tab.

  move '1;;;;' to pc.
  append pc to tab.
  clear tab.
endform.                    " MS_project_kopf
Zuletzt geändert von Jan am 08.01.2009 14:34, insgesamt 1-mal geändert.
Grund: Sourcecode als coding formatiert

Re: Unicode - Kopieren einer internen Tabelle in Arbeitsbereich

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Kristin,

ne, an dem Coding kann ich jetzt so nicht feststellen, wann und warum die Tabelle tab gelöscht/überschrieben wird.
Halt: und was ist damit?

Code: Alles auswählen.

...
  move t-mtart to h_text+167.

  clear tab. "was macht das CLEAR hier?
  DATA t_dzeit22 TYPE string.
  clear pc.
Da Du schreibst, 'jede' Tabellenzeile würde überschrieben, deutet das auf die Verwendung von MODIFY hin. Hast Du eine solche Stelle im Programm? Oder meinst Du doch eher: die Tabelle wird immer wieder vollständig gelöscht?

Dazu müsstest Du Dir das mal im Debugger ansehen, wo genau die Tabelle geändert/überschrieben wird.

Nachtrag zu Deiner Ergänzung:
REFRESH löscht eine Tabelle, unabhängig davon, ob sie eine Kopfzeile hat. Daher muss es auch weiterhin 'REFRESH tab.' heißen (SAP empfiehlt statt dessen 'CLEAR tab[].'... kann man sich drüber streiten, was besser ist :-(... ).
Der direkt anschließende CLEAR muss 'CLEAR pc' heißen, wie auch die weiteren Stellen.

PS:
es ist in ABAP kein guter Stil, Variablen dann erst zu deklarieren, wenn sie benötigt werden.
Statt dessen sollten Deklarationen am Anfang von FORM, FUNCTION oder METHOD stehen, oder globale Variablen am Anfang des Programms bzw. im 'TOP'-Include, dessen 'INCLUDE xxxTOP.' die erste Anweisung sein sollte.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Re: Unicode - Kopieren einer internen Tabelle in Arbeitsbereich

Beitrag von Kristin (ForumUser / 47 / 2 / 0 ) »
hey hey guten morgen ;)

thank you!! hat funktioniert... das clear hab ich einfach auskommentiert -> Tabelle sieht nun aus wie gewünscht ;)

zu P.S. also ja das hab ich im grundkurs auch so gelernt und bei meinen progs halte ich mich auch daran, nur sind das ca. 700 alte programme, die ich korrigieren muss und dabei konzentrier ich mich vorerst nur darauf, dass sie richtig laufen ;) wer das vorher wie aufgebaut hat ist mir da relativ egal... was ja auch verständlich ist oder? :)

also vieleeeen dank nochmal!

Re: Unicode - Kopieren einer internen Tabelle in Arbeitsbereich

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Kristin hat geschrieben:hey hey guten morgen ;)

thank you!! hat funktioniert... das clear hab ich einfach auskommentiert -> Tabelle sieht nun aus wie gewünscht ;)
gern geschehen...
Kristin hat geschrieben:zu P.S. also ja das hab ich im grundkurs auch so gelernt und bei meinen progs halte ich mich auch daran, nur sind das ca. 700 alte programme, die ich korrigieren muss und dabei konzentrier ich mich vorerst nur darauf, dass sie richtig laufen ;) wer das vorher wie aufgebaut hat ist mir da relativ egal... was ja auch verständlich ist oder? :)

also vieleeeen dank nochmal!
ja, klar. Hast recht. Bei Altprogrammen sollte man nur umstellen, wo es notwendig ist.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Seite 1 von 1

Vergleichbare Themen

8
Antw.
3305
Views
datenbanktabelle und arbeitsbereich sind nicht unicode-konvertibel
von Geny » 12.01.2021 17:09 • Verfasst in ABAP® für Anfänger
3
Antw.
3566
Views
Daten zwischen 2 internen Tabellen kopieren
von kaufmann123 » 25.02.2018 11:55 • Verfasst in ABAP® für Anfänger
3
Antw.
25661
Views
Daten zwischen internen Tabellen kopieren
von Basler84 » 24.05.2012 09:47 • Verfasst in ABAP® für Anfänger
2
Antw.
2756
Views
Loop - Arbeitsbereich - Interne Tabelle
von KleinerEisbaer » 09.03.2008 13:46 • Verfasst in ABAP® für Anfänger
10
Antw.
9400
Views
interne Tabelle als Arbeitsbereich nicht erlaubt?!
von Thanatos82 » 13.09.2012 14:09 • Verfasst in ABAP Objects®

Über diesen Beitrag


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.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 2 Tagen von Bright4.5 1 / 744
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2368
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8954