Wann sollte man LIKE verwenden

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

Wann sollte man LIKE verwenden

Beitrag von DRABAP (ForumUser / 30 / 0 / 1 ) »
Man kann eine Typisierung mittels LIKE verwenden, um sein Coding robuster gegenüber zu machen. Oftmals braucht man lokale Hilfsvariablen. Zum Beispeil möchte man über eine Tabelle loopen, die als Parameter in eine Routine eingeht, und benötigt eine Workarea. In diesem Fall kann die Workarea relativ einfach deklarieren:

Code: Alles auswählen.

FROM f USING itab TYP MYTAB.
  DATA wa LIKE LINE OF itab.
  DATA tmp_itab LIKE itab.
  LOOP AT ITAB INTO wa.
    ...
    APEND wa INTO tmp_itab.
  ENDLOOP.

ENDFORM.
Falls sich der Typ der Tabelle itab ändert, bleibt die Implementierung der Routine unbeeinflußt. Der Typ von wa und tmp_itab wird ja "relativ" zum Parameter itab bestimmt.
Dr. ABAP

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


Ja, aber...

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Moin.

Ist ja prinzipiell richtig, aber da der USING-Parameter Deiner FORM eh typisiert ist kannst Du die lokalen Felder ebenfalls typisieren. Der LIKE wäre nur dann sinnvoll, wenn der Parameter untypisiert oder nicht vollständig typisiert wäre. (Wenn ich allerdings untypisierte Parameter in einem Programm sehe könnte ich immer an der Wand hochgehen :? )

Generell sollte man LIKE nicht mehr verwenden, da es im Zusammenhang mit ABAP Objects verboten ist (oder mit einer der nächsten Versionen verboten wird).

Daher also besser:

Code: Alles auswählen.

FORM f USING ut_itab TYPE itab_type.
DATA: ls_wa TYPE LINE OF itab_type
    , lt_itab TYPE itab_type.
...
Gruß,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Re: Ja, aber...

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
Haubi hat geschrieben:Wenn ich allerdings untypisierte Parameter in einem Programm sehe könnte ich immer an der Wand hochgehen .
Die Typisierung von FORM-Schnittstellen wurde zu 3.0 eingeführt, wenn ich mich richtig erinnere.
Zu 3.0 gab es in der SE38 auch noch einen Menüpunkt Hilfsmittel->Typisierung, der das Programm RSPARM30 gestartet hat.
Das Programm untersuchte im angegebenen Rahmenprogramm alle FORMs mit untypisierten Parametern, suchte nach passenden PERFORM-Anweisungen, analysierte die Herkunft und Typisierung der Aktualparameter und generierte Vorschläge f'ür die Typisierung.
In der Liste konnte man dann per Checkbox angeben, welche Typisierung das Programm vornehmen sollte. Beim Sichern hat das Programm automatisch die FORM-Schnittstellen angepaßt.
Aber kaum ein Kunde wußte von dieser Funktion.
Zu 4.0 wollte ich das Programm noch mal verwenden.

Der Menüpunkt war verschwunden, aber das Programm existierte noch.
Im Programm habe ich dann 2 Fehler entdeckt:
1. die Prüfung, ob es externe PERFORMs gibt, war fehlerhaft.
2. Wenn das Programm auf Aktualparameter gestoßen ist, die per STATICS definiert wurden, kam es zum Fehler.
Die falsche Prüfung auf externe Performs hat SAP in einem Patch für 3.1I behoben, das Problem mit STATICS-Anweisungen nicht.
Also habe ich RSPARM30 nach ZSPARM30 kopiert, die Includes, die verändert werden mußten, ebenfalls kopiert und in meinem Rahmenprogramm ersetzt, den Rest übernommen.
Mit irgendeinem späteren Release wurden dann alle Restbestände von RSPARM30 entsorgt, so daß auch mein ZSPARM30 ohne die Includes nicht mehr funktionierte.
Und alles from scratch noch mal zu programmieren war mir dann doch zu viel Aufwand.
Generell sollte man LIKE nicht mehr verwenden, da es im Zusammenhang mit ABAP Objects verboten ist (oder mit einer der nächsten Versionen verboten wird).

Daher also besser:

Code: Alles auswählen.

FORM f USING ut_itab TYPE itab_type.
DATA: ls_wa TYPE LINE OF itab_type
    , lt_itab TYPE itab_type.
...
Auch ohne ABAP Objects kann es schon zu 4.6 zu Problemen kommen, wenn man LIKE verwendet.
Ich hab das mal beim Upgrade von 4.6B auc 4.6C gesehen.
In Kundenprogrammen, in denen z.B.

Code: Alles auswählen.

DATA: feld LIKE ddicstruct-feld.
vorkam, gab es einen Syntaxfehler, nachdem SAP an die DDIC-Struktur weitere Komponenten angehängt hatte, so daß die Struktur plötzlich keine flache Struktur mehr war.
(Das verwendete Feld selbst war aber nach wie vor CHAR.)

Ist jemand "mutig" und definiert eine APPEND-Struktur für SYST, in der dann ein Tabellentyp als Komponente verwendet wird?
Wie oft kommt wohl DATA: rc LIKE SYST-SUBRC und ähnliches in Programmen vor?
Und ob der Fehler auch auf LIKE SY-SUBRC durchschlägt?
Neugierig bin ich ja. Noch möchte ich mir mein WAS Linux TestDrive aber nicht kaputtmachen.
Evtl. zerlege ich aber demnächst das MiniWAS. Dann berichte ich mal.

Frank

Beitrag von DRABAP (ForumUser / 30 / 0 / 1 ) »
@Haubi: Ich dachte nicht an eine Änderung von itab_type, sondern daran, dass man den Typ des Parameters von itab_type in einen anderen Typ ändert - z.B. itab_type2. In diesem Fall müsste man bei Deiner Lösung alle Typisierungen ändern.
Man kann sich mit LIKE nicht auf generische Variablen beziehen. Jedenfalls gilt dies für lokale Variablen. Variablen (keine Referenzparameter, Feldsymbole etc.) müssen immer einen konkreten - also nicht generischen - Typ besitzen, da ABAP ja den Speicherplatz reservieren muß.

@Haubi, Frank: Es ist keinesfallss so, dass LIKE in ABAP Objects verboten ist. Warum auch, es ist ein sehr sinvolles Feature. Früher war es jedoch möglich sich auf DDIC-Typen sowohl mit LIKE als auch mit TYPE zu beziehen. Dies widerspricht kedoch der allgemeinen Auffassung, dass man sich mit TYPE auf Typen und mit LIKE auf Variablen bezieht. Da man nicht jeden LIKE-Bezug auf einen DDIC-Typ im Nachhinein verbieten konnte, hat man dies nur für "tiefe" DDIC-Typen verboten. Diese waren zu 4.6 noch sehr neu, so dass ein Verbot noch möglich war. Im Kontext von ABAP Objets jedoch sind LIKE-Bezüge auf DDIC-Typen generell verboten.
Dr. ABAP

Beitrag von black_adept (Top Expert / 4158 / 136 / 959 ) »
Auszug aus der F1-Hilfe zum TYPE-Befehl (Zusatz 2 ... like F )
Hinweis
In vielen Fällen ist es sehr empfehlenswert, diesen Zusatz zu verwenden. Typänderungen von Feldern, auf die man sich bezieht, bekommt das Programm automatisch mit. Außerdem werden ggf. keine unnötigen und evtl. auch ungewollten Konvertierungen durchgeführt.
bzw. fast genauso der Hinweistext in der F1-Hilfe zum DATA-Befehl:
Wann immer sinnvoll, sollte man diesen Zusatz verwenden. Typänderungen von Feldern, auf die man sich bezieht, werden vom ABAP-Laufzeitsystem automatisch berücksichtigt. Außerdem werden keine unnötigen und evtl. auch ungewollten Konvertierungen durchgeführt.
wobei hier natürlich zu fragen ist, was genau mit "Wann immer sinnvoll" wohl gemeint ist.


@Frank:
Dein Beispiel mit dem Problem einer LIKE-Referenzierung nachdem SAP ein Standardfeld geändert hat ist wohl berechtigt, aber meinst du nicht, dass genau dasselbe Problem auftauchen kann, wenn SAP (oder man selber) in einem Tabellenfeld das Datenelement ändert, z.B. von integer nach numc oder die Länge eines C-Feldes ein wenig erweitert?

Und auch wenn ich mich hier zum Anfänger erkläre: Ich krieg es einfach nicht hin das im folgenden Coding liegende LIKE durch ein äquivalentes TYPE zu ersetzen. :(

Code: Alles auswählen.

REPORT  zzztest .

TYPES: BEGIN OF type1,
         x1,
         x2,
         x3,
       END OF type1.

DATA: dt TYPE STANDARD TABLE OF type1.


TYPES: BEGIN OF t2,
         t1 LIKE dt,
         t2,
         t3,
       END OF t2.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von DRABAP (ForumUser / 30 / 0 / 1 ) »
Das Problem in deinem Beispiel ist, dass Typangaben bei DATA und TYPES leicht unterschiedlich interpretiert werden.
Bei Data dürfen keine generischen Typen angegeben werden. Fehlen Angaben (wie beispielsweise eine Länge oder ein Schlüssel, so werden Defalutwerte ergänzt).
Bei TYPES ist dies nicht der Fall. Fehlen Angaben, so handelt es sich um einen generischen (da unvollständigen Typ). Dazu ein kleines Beispiel:

Code: Alles auswählen.

DATA x TYPE C
legt eine Varable vom Typ C(1) an.

Code: Alles auswählen.

TYPE tx TYPE C
legt einen Typ C mit unspezifierter Länge an.

Code: Alles auswählen.

TYPE tx TYPE C(1)
legt einen Typ an, der C(1) entspricht.
Um auf Dein Beispiel zurückzukommen:

Code: Alles auswählen.

DATA: dt TYPE STANDARD TABLE OF type1.

erzeugt eine interne Standardtabelle mit Defaultkey.
Innerhalb einer TYPES-Anweisung wird jedoch die fehlende Angabe zum Schlüssel nicht mit WITH DEFAULT KEY ergänzt. Es handelt sich also um einen generischen Typ, da der Schlüssel unspezifiert bleibt. Genrische Typen sind jedoch für Strukturkomponenten nicht gestattet. Du solltest Dein Beispiel also wie folgt formulieren:

Code: Alles auswählen.

TYPES: BEGIN OF t2, 
         t1 TYPE STANDARD TABLE OF type1 WITH DEFAULT KEY, 
         t2, 
         t3, 
END OF t2. 
Dr. ABAP

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

endlich mal jemand der mich erleuchtet. :)

Die Info ist so interessant, dass mich eigentlich noch mehr interessiert, wo das denn in der Doku steht - normalerweise frage ich solche Fragen nämlich nicht sondern suche die Antwort selber, aber da hatte ich nix gefunden.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Seite 1 von 1

Vergleichbare Themen

2
Antw.
1775
Views
Vernwedungsnachweis verwenden
von SaskuAc » 27.04.2017 12:54 • Verfasst in ABAP® für Anfänger
1
Antw.
1177
Views
Mehrere Funktionsbausteine verwenden
von tekko » 04.12.2019 12:13 • Verfasst in ABAP® für Anfänger
0
Antw.
2128
Views
BAPI_ACC_BILLING_REV_POST richtig verwenden
von thomas.klammer » 17.08.2018 11:52 • Verfasst in Financials
1
Antw.
1293
Views
Exceptionklassen klassenlokal verwenden
von cosmo » 10.12.2008 09:16 • Verfasst in ABAP Objects®
2
Antw.
1444
Views
BREAK-POINT-IDs verwenden
von ralf.wenzel » 20.11.2017 11:03 • Verfasst in ABAP® Core

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.