Unicodeproblem: Ersetzung "TRANSLATE FROM CODE PAGE&

Alles Rund um SAP®.
7 Beiträge • Seite 1 von 1
7 Beiträge Seite 1 von 1

Unicodeproblem: Ersetzung "TRANSLATE FROM CODE PAGE&

Beitrag von Hunter (ForumUser / 51 / 0 / 0 ) »
Hi,

ich habe ein Problem bei der Unicodeumstellung:
Folgende Anweisung soll ersetzt werden (da diese nicht mehr erlaubt ist):

Code: Alles auswählen.

TRANSLATE l_h_satz-lasart FROM CODE PAGE '0100' TO CODE PAGE '1110'.
TRANSLATE l_h_satz-laz FROM CODE PAGE '0100' TO CODE PAGE '1110'.
Das erste Feld ist vom TYP C, das Zweite vom Typ X.

Jetzt gibt es da ja die SAP Klassenmethode "CL_ABAP_CONV_X2X_CE".
Jedoch weiß ich nicht so wirklich (trotz Doku) wie ich die zu verwenden habe.

Kann mir da jemand helfen?

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


Beitrag von Hunter (ForumUser / 51 / 0 / 0 ) »
Keiner eine Idee?
Habe es bis heute nicht lösen können :evil:

Beitrag von Hunter (ForumUser / 51 / 0 / 0 ) »
Also ich habs ENDLICH geschafft.
Evtl nicht 100%ig richtig, konnte aber noch keine Fehler feststellen:

Code: Alles auswählen.

FUNCTION zda_unicode_translate. 
*"---------------------------------------------------------------------- 
*"*"Lokale Schnittstelle: 
*"  IMPORTING 
*"     VALUE(I_IN_ENCODING) TYPE  ABAP_ENCOD 
*"     VALUE(I_OUT_ENCODING) TYPE  ABAP_ENCOD 
*"     VALUE(I_DATA_TYPE) TYPE  ABAPTYPE DEFAULT 'C' 
*"  CHANGING 
*"     VALUE(C_DATA_TO_CONVERT) 
*"  EXCEPTIONS 
*"      PARAMETER_IS_MISSING 
*"      WRONG_CONVERT_METHOD 
*"---------------------------------------------------------------------- 
*** Created: Christian Burkhardt - Bit-Creations - *** 
  FIELD-SYMBOLS: <x_intext> TYPE x. 

  DATA: l_convout  TYPE REF TO cl_abap_conv_out_ce, 
        l_convin   TYPE REF TO cl_abap_conv_in_ce, 
        slen       TYPE i, 
        l_input_string TYPE string, 
        convxstring TYPE xstring, 
        l_doing TYPE i, 
        hlp_offset TYPE i, 
        hlp_out TYPE c, 
        hlp_str TYPE string. 

  DATA: ob_desc  TYPE REF TO cl_abap_structdescr, 
        ls_compo TYPE abap_compdescr. 

  FIELD-SYMBOLS: <field> TYPE ANY, 
                 <struc> TYPE ANY. 

*** STARTING *** 
  IF i_in_encoding IS INITIAL OR i_out_encoding IS INITIAL. 
    MESSAGE s208(00) WITH 'ENCODING Parameter fehlt!' RAISING parameter_is_missing. 
  ENDIF. 

* Typ ermitteln 
  PERFORM get_type USING c_data_to_convert CHANGING i_data_type. 
  IF i_data_type = 'C'. 
    DESCRIBE FIELD c_data_to_convert LENGTH l_doing IN CHARACTER MODE. 
  ELSEIF i_data_type = 'S'. 
    l_doing = STRLEN( c_data_to_convert ). 
  ELSEIF i_data_type = 'U'. 
* Falls Struktur übergeben wird, dann in Teilfelder zerlegen und rekursiv Baustein aufrufen 
*    TRY. 
    ob_desc ?= cl_abap_typedescr=>describe_by_data( c_data_to_convert ). 
*    catch assign_casting_illegal_cast. 
*    RAISE casting_error. 
*    ENDTRY. 
    LOOP AT ob_desc->components INTO ls_compo WHERE type_kind <> 'X' AND 
                                                    type_kind <> 'I' AND 
                                                    type_kind <> 'P' AND 
                                                    type_kind <> 'F'. 
      ASSIGN COMPONENT ls_compo-name OF STRUCTURE c_data_to_convert TO <field>. 
      IF sy-subrc = 0.   "<field> IS ASSIGNED. 
* Rekursiver Aufruf 
        CALL FUNCTION 'ZDA_UNICODE_TRANSLATE' 
          EXPORTING 
            i_in_encoding     = i_in_encoding 
            i_out_encoding    = i_out_encoding 
          CHANGING 
            c_data_to_convert = <field>. 
        UNASSIGN <field>. 
      ENDIF. 
    ENDLOOP. 
    RETURN. 
  ENDIF. 

*  convstring = c_data_to_convert. 
*  CLEAR c_data_to_convert. 
  DO l_doing TIMES. 

    hlp_offset = sy-index - 1. 

    l_input_string = c_data_to_convert+hlp_offset(1). 
* Falls ein Leerzeichen gemoved wurde, ist das jetzt dummerweise verschwunden 
    IF l_input_string = space. 
      l_input_string = ' x'. 
      TRANSLATE l_input_string USING 'x '. 
    ENDIF. 

    TRY. 
        l_convout = cl_abap_conv_out_ce=>create( 
            encoding = i_in_encoding ). 

        l_convout->convert( 
          EXPORTING 
            data   = l_input_string 
          IMPORTING 
            buffer = convxstring 
            len    = slen ). 

      CATCH cx_root. 
*     Bei der Zeichenkonvertierung ist ein Fehler aufgetreten 
*        c_data_to_convert+hlp_offset(1) = l_input_string(1). 
        CONTINUE. 
*      MESSAGE l_msgstr TYPE 'S'. 
    ENDTRY. 

    TRY. 
        CALL METHOD cl_abap_conv_in_ce=>create 
          EXPORTING 
            encoding = i_out_encoding 
            input    = convxstring 
          RECEIVING 
            conv     = l_convin. 

        CLEAR hlp_out. 

        CALL METHOD l_convin->read 
          EXPORTING 
            n    = 2 
          IMPORTING 
            data = hlp_out. 

        l_input_string = hlp_out. 

      CATCH cx_root. 
*     Bei der Zeichenkonvertierung ist ein Fehler aufgetreten 
        MESSAGE s208(00) WITH 'Konvertierung konnte nicht durchgeführt werden!' RAISING wrong_convert_method. 
    ENDTRY. 

* Bei Strings können keine Offsets verändert werden wenn andere Codepages im Spiel sind 
    IF i_data_type <> 'S'. 
     TRY.
        c_data_to_convert+hlp_offset(1) = l_input_string(1). 
     CATCH cx_sy_range_out_of_bounds.
     ENDTRY.
    ELSE. 
      CONCATENATE hlp_str hlp_out INTO hlp_str. 
    ENDIF. 

  ENDDO. 


  IF i_data_type = 'S'. 
    c_data_to_convert = hlp_str. 
  ENDIF. 


ENDFUNCTION. 

*** FORMS *** 
FORM get_type USING feld CHANGING i_data_type. 

  DATA: otype  TYPE REF TO cl_abap_typedescr, 
        ostruc TYPE REF TO cl_abap_structdescr, 
        otable TYPE REF TO cl_abap_tabledescr, 
        xcomp  LIKE LINE OF ostruc->components. 
* 
  otype = cl_abap_typedescr=>describe_by_data( feld ). 
  CASE otype->type_kind. 
    WHEN 'g'.    " String 
      i_data_type = 'S'. 
    WHEN 'u'.    " Struktur 
      i_data_type = 'U'. 
    WHEN OTHERS.  " wahrscheins Char ;-) 
      i_data_type = 'C'. 
  ENDCASE. 
*  CASE otype->type_kind. 
*endcase. 
*cx_root 
ENDFORM.                    "get_type 
Zuletzt geändert von Hunter am 16.05.2006 10:46, insgesamt 1-mal geändert.

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

bei diesem Stück Coding bin ich sehr skeptisch:

Code: Alles auswählen.

      ASSIGN COMPONENT ls_compo-name OF STRUCTURE c_data_to_convert TO <field>. 
      IF <field> IS ASSIGNED. 
Wenn der ASSIGN für ein früheres Feld funktioniert hat, dann wird durch den erneuten ASSIGN das Feldsymbol nicht UNASSIGNed. Dafür steht dann aber SY-SUBRC auf ungleich 0. Daher müsste die Prüfung korrekterweise so lauten:

Code: Alles auswählen.

      ASSIGN COMPONENT ls_compo-name OF STRUCTURE c_data_to_convert TO <field>. 
      IF sy-subrc EQ 0. 
QED

Ansonsten sieht es sehr interessant aus. Danke für das Ablegen Deines Codes.
Gruß
Ereglam


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

Beitrag von Hunter (ForumUser / 51 / 0 / 0 ) »
ein früheres Feld kann nicht drinstehen, da ich beim rekursiven Aufruf nur noch Datentypen außer X, I, P und F zulasse. In diesen Abarbeitungsblock kommt man ja nur wenn eine Struktur übergeben wurde
(skeptisch bin ich persönlich bei verschachtelten Strukturen, die wurden früher meines Wissens nach vom TRANSLATE auch ignoriert wurden... Habe so einen Fall bisher nicht, evtl. muß da noch angepaßt werden).

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

da Du einen LOOP über eine Struktur machst, kann es sehr wohl passieren, dass mehr als eine Feld der Struktur umgesetzt werden soll. Daher ist das Symbol <field> dann bereits ASSIGNed, wenn Du zum nächsten relevanten Feld kommst.

Korrekterweise sollte der ASSIGN nicht erfolglos sein können, denn Du LOOPst ja über die Feldliste.
Dennoch bin ich der Meinung, dass Du auf SY-SUBRC statt auf IS ASSGINED prüfen solltest, um diesen potentiellen Fehler nicht zu ignorieren.
Die Prüfung auf IS ASSIGNED wird ja nur beim ersten Fehler funktionieren...

Alternativ würde es dann wieder korrekt sein, wenn Du am Ende des IF-Blocks ein UNASSIGN <field> benutzt. Damit würde es wieder richtig funktionieren...
Gruß
Ereglam


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

Beitrag von Hunter (ForumUser / 51 / 0 / 0 ) »
Yo, hast Recht... Hab das noch nicht so genau geprüft. Ändere es gleich mal.

Seite 1 von 1

Vergleichbare Themen

3
Antw.
4659
Views
Unicodeproblem - Datentypen nicht kompatible
von RiffRaff » 24.09.2007 10:14 • Verfasst in ABAP® Core
0
Antw.
1294
Views
IT2010 Entgeltbelege erweitern zur Ersetzung Lohnartentext
von kojak1000 » 02.07.2008 09:06 • Verfasst in Human Resources
2
Antw.
1320
Views
translate
von barbara » 11.05.2006 13:24 • Verfasst in ABAP® für Anfänger
9
Antw.
6524
Views
Translate Zeichenfolge
von sgevolker » 01.12.2016 14:38 • Verfasst in ABAP® für Anfänger
4
Antw.
2450
Views
Fehleranzeige in SLIN beim Befehl TRANSLATE
von kbit100 » 20.05.2008 18:25 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Regex in where
vor 2 Stunden von tar 8 / 181
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1489

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.

Aktuelle Forenbeiträge

Regex in where
vor 2 Stunden von tar 8 / 181
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1489

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9822