Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Spookykid
Code: Alles auswählen.
REPORT.
DATA: dref TYPE REF TO data,
keys TYPE STANDARD TABLE OF fieldname,
where_en TYPE string,
where_de TYPE string.
FIELD-SYMBOLS: <t_en> TYPE HASHED TABLE,
<t_de> TYPE HASHED TABLE,
<row_en> TYPE ANY,
<row_de> TYPE ANY.
*parameters: p_table type tabname OBLIGATORY DEFAULT 'MAKT'.
DATA: p_table TYPE tabname VALUE 'MAKT'.
START-OF-SELECTION.
* ALLE Schlüsselfelder von der zu suchenden Tabelle einfügen AUSSER dem Sprachfeld
APPEND 'MANDT' TO keys.
APPEND 'MATNR' TO keys.
* APPEND 'SPRAS' TO keys.
CREATE DATA dref TYPE HASHED TABLE OF (p_table) WITH UNIQUE KEY (keys).
ASSIGN dref->* TO <t_en>.
where_en = `SPRAS = 'E'`.
CREATE DATA dref TYPE HASHED TABLE OF (p_table) WITH UNIQUE KEY (keys).
ASSIGN dref->* TO <t_de>.
where_de = `SPRAS = 'D'`.
SELECT *
INTO TABLE <t_en>
FROM (p_table)
WHERE (where_en).
SELECT *
INTO TABLE <t_de>
FROM (p_table)
WHERE (where_de).
* Prüfen ob zu jedem deutschen Eintrag ein engl. da ist
LOOP AT <t_de> ASSIGNING <row_de>.
READ TABLE <t_en> FROM <row_de> ASSIGNING <row_en>.
IF sy-subrc <> 0.
WRITE:/ 'Eintrag fehlt',
<row_de>.
ELSE.
* Löschen der Schlüsselfelder in <row_en> und <row_de> ( diesmal inkl. Sprachfeld )
* Schauen, ob der Rest nun gleich ist, da du das ja auch nicht haben willst
* if gleich.
* write:/ 'Eintrag identisch',
* <row_de>.
* endif.
ENDIF.
ENDLOOP.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Spookykid
Code: Alles auswählen.
class-methods filltable importing t_name type tabname
REFERENCE(otab) type abap_sortorder_tab
REFERENCE(ls_lang) type tabname.
Code: Alles auswählen.
method filltable.
data: dref type ref to data,
keys TYPE STANDARD TABLE OF fieldname,
key TYPE fieldname,
where_rlang type string,
where_clang type string.
data error type ref to cx_root.
field-symbols: <t_rlang> type hashed table,
<t_clang> type hashed table,
<row_rlang> type any,
<keys> type abap_sortorder,
<row_clang> type any.
* Wenn kein Sprachfeld vorhanden, muss die Tabelle nicht überprüft werden.
if ls_lang is INITIAL.
return.
endif.
* Tabelle mit Keyfields befüllen.
loop at otab ASSIGNING <keys>.
key = <keys>-name.
append key to keys.
clear key.
endloop.
call selection-screen 100.
if sy-subrc ne 0.
leave program.
else.
*Referenzsprache-Tabelle erstellen, befüllen und sortieren.
create data dref type hashed table of (t_name) with unique key (keys).
assign dref->* to <t_rlang>.
concatenate ls_lang ` = ` p_rlang into where_rlang. ""Sprachstring für select Statement zusammensetzen.
try.
select *
into table <t_rlang>
from (t_name)
where (where_rlang).
catch CX_SY_DYNAMIC_OSQL_SEMANTICS into error.
message error type 'I' DISPLAY LIKE 'E'.
endtry.
* Sollte die Tabelle leer sein, kann die nächste aufgerufen werden.
if sy-subrc = 4.
return.
endif.
sort <t_rlang> by (otab).
*Customizingsprach-Tabelle erstellen, befüllen und sortieren.
create data dref type hashed table of (t_name) with unique key (keys).
assign dref->* to <t_clang>.
concatenate ls_lang ` = ` p_clang into where_clang. ""Sprachstring für select Statement zusammensetzen.
try.
select *
into table <t_clang>
from (t_name)
where (where_clang).
catch CX_SY_DYNAMIC_OSQL_SEMANTICS into error.
message error type 'I' DISPLAY LIKE 'E'.
endtry.
sort <t_clang> by (otab).
* Prüfen ob zu jedem deutschen Eintrag ein engl. da ist
loop at <t_clang> assigning <row_clang>.
read table <t_rlang> from <row_clang> assigning <row_rlang>.
if sy-subrc <> 0.
write:/ 'Eintrag fehlt',
<row_clang>.
else.
* Löschen der Schlüsselfelder in <row_en> und <row_de> ( diesmal inkl. Sprachfeld )
* Schauen, ob der Rest nun gleich ist, da du das ja auch nicht haben willst
* if gleich.
* write:/ 'Eintrag identisch',
* <row_de>.
* endif.
endif.
endloop.
endif.
endmethod.
' <- Conversions Routine ISOLA wird korrekt angewendet.Could not interpret the value 'D
Code: Alles auswählen.
concatenate ls_lang ` = '` p_clang `'` into where_clang.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Spookykid
Code: Alles auswählen.
concatenate ` ... ` 'test' ` ... ` into ld_string.
* ==> ' ... test ... '
concatenate ' ... ' 'test' ' ... ' into ld_string.
* ==> ' ...test ...'
concatenate ' ... ' 'test' ' ... ' into ld_string respecting blanks.
* ==> ' ... test ... '
Eigentlich genau umgekehrt.Spookykid hat geschrieben:jo, dank dir... funktioniertIn der Art hab ich auch schon gedacht. Wie war das?
`` sind für chars und ' ' für Strings?
Grüße und Dank
Spookykid
Code: Alles auswählen.
* Prüfen ob zu jedem deutschen Eintrag ein engl. da ist
LOOP AT <t_de> ASSIGNING <row_de>.
READ TABLE <t_en> FROM <row_de> ASSIGNING <row_en>.
IF sy-subrc <> 0.
WRITE:/ 'Eintrag fehlt',
<row_de>.
ELSE.
* Löschen der Schlüsselfelder in <row_en> und <row_de> ( diesmal inkl. Sprachfeld )
* Schauen, ob der Rest nun gleich ist, da du das ja auch nicht haben willst
* if gleich.
* write:/ 'Eintrag identisch',
* <row_de>.
* endif.
ENDIF.
ENDLOOP.
Code: Alles auswählen.
* Tabelle mit Keyfields (zur Sortierung) befüllen und zusäzlich das Spaltenstatement zur Datenbankabfrage befüllen.
loop at otab assigning <keys>.
key = <keys>-name.
concatenate keycolstring <keys>-name into keycolstring separated by space.
append key to keys.
clear key.
endloop.
Wie kann ich denn aus einer bestehenden Tabelle ganze Felder löschen?Löschen der Schlüsselfelder in <row_en> und <row_de> ( diesmal inkl. Sprachfeld )
* Schauen, ob der Rest nun gleich ist, da du das ja auch nicht haben willst
Am Di 17 Mai 11 10:44 hast du genau diese Gleichheit als 2. Merkmal des "Nichtübersetzseins" definiert.Spookykid hat geschrieben: [...]
Zum ersten Teil des Codes:
Die Logik dient ja weniger um herauszufinden, welcher Eintrag fehlt, als dass identische Datensätze herausgefunden werden können.
<row_de> enthält den kompletten Datensatz inkl. Text, dieser sollte ja in den beiden Tabellen auf Grund des Sprachenschlüssels identisch sein. Wird beim bei read Befehl das field-symbol assigned muss ja quatsch gecustomized worden sein.
[...]
Sorry, ich war etwas verwirrt wie der READ TABLE <itab> FROM <wa> <result> Befehl funktioniert. Ich dachte er würde sich einen eigenen Schlüssel aus dem kompletten Datensatz bilden. Diesen haben wir jedoch bei der Erstellung der Tabelle als unique key mitgegeben.black_adept hat geschrieben:DELETE