{"id":33822,"date":"2021-06-30T09:14:00","date_gmt":"2021-06-30T07:14:00","guid":{"rendered":"https:\/\/www.blue.works\/?p=33822"},"modified":"2024-05-22T10:17:50","modified_gmt":"2024-05-22T08:17:50","slug":"33822","status":"publish","type":"post","link":"https:\/\/www.blue.works\/de\/33822\/","title":{"rendered":"ALM Kaffekra\u0308nzchen I &#8211; mit tp und die b\u00f6sen \u00dcberholer"},"content":{"rendered":"\n<p>Wie das ABAP Transportsystem funktioniert&nbsp;<\/p>\n\n\n\n<p>Seit SAP 1992 mir R\/3 das ABAP Transportsystem aus der Taufe hob, herrschen einige Unklarheiten wie es tats\u00e4chlich funktioniert.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der \u00c4nderungsantrag&nbsp;<\/h2>\n\n\n\n<p>Ein offener, \u00e4nderbarer \u00c4nderungsantrag (Transport Request, TR) ist nichts anderes als eine St\u00fcckliste. Die automatische Aufzeichnung von \u00c4nderungen f\u00fcgt die <strong>Schl\u00fcssel<\/strong> der ge\u00e4nderten Objekte (Artefakte neuerdings) in ein paar Tabellen (siehe View E071V und Tabelle E071K), nicht aber die Objekte selbst. Die Haupt-Programm-ID ist \u201eR3TR\u201c, sie besitzt \u00fcber 1000 unterschiedliche Objekte, die teilweise eigene Sonderlocken beim Transport beinhalten oder das Transportsystem sogar auf den Kopf stellen (zum Beispiel generieren \u201eCondition Techniques\u201c Tabellen im Zielsystem) \u2013 ich beneide nicht die Entwicklerinnen des tp!&nbsp;&nbsp;<\/p>\n\n\n\n<p>\u00dcbrigens, die K\u00fcrzel \u201eLIMU\u201c und \u201eTABU\u201c gehen auf glorreiche R\/2 Zeiten zur\u00fcck: SAPLIMU war das Assemblerprogramm f\u00fcr Workbench-Objekte und SAPTABU das PG, das die SAP.ATAB pflegte, die generische Tabellendatei.&nbsp;<\/p>\n\n\n\n<p>Daher ist das \u00c4nderungsdatum eines offenen TRs rein dokumentarisch und hat keine technische Bedeutung. Und die Sperren sorgen daf\u00fcr, dass jede weitere \u00c4nderung in keinem anderen TR aufgezeichnet werden wird.\u00a0<\/p>\n\n\n\n<p>Spannend wird es erst, wenn man einen TR freigibt. Dabei wird das Betriebssystemprogramm tp aufgerufen, das mit Hilfe vom Programm R3trans gem\u00e4\u00df der Schl\u00fcssel die Objekte in der gerade aktiven oder aktuellen Version in eine Datei auf Platte kopiert. Der TR ist ab jetzt nicht mehr \u00e4nderbar, und es werden zwei Zeitstempel gesetzt (<a href=\"https:\/\/blogs.sap.com\/2011\/04\/04\/play-it-again-sam\/\" target=\"_blank\" rel=\"noreferrer noopener\">SAP tut immer alles doppelt<\/a>)\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1035\" height=\"621\" src=\"https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-6.png\" alt=\"\" class=\"wp-image-33823\" srcset=\"https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-6.png 1035w, https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-6-1024x614.png 1024w, https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-6-768x461.png 768w\" sizes=\"(max-width: 1035px) 100vw, 1035px\" \/><figcaption class=\"wp-element-caption\">Abbildung 1 Wer genau hinschaut, merkt, dass Uneinigkeit bez\u00fcglich der Zeitzone herrscht&nbsp;<\/figcaption><\/figure>\n\n\n\n<p>\u00dcbrigens, die TR Export History existiert, sie ist nur sehr gut versteckt: Transaktion STMS_QUEUES\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1138\" height=\"537\" src=\"https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-7.png\" alt=\"\" class=\"wp-image-33829\" srcset=\"https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-7.png 1138w, https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-7-1024x483.png 1024w, https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-7-768x362.png 768w\" sizes=\"(max-width: 1138px) 100vw, 1138px\" \/><\/figure>\n\n\n\n<p>Ab jetzt ist so ein TR eine Zeitbombe, denn er enth\u00e4lt die Objekte im Stand des Exportzeitpunkts. Je l\u00e4nger man mit dem Import in das Folgesystem wartet, desto gef\u00e4hrlicher wird es. <strong>Denn es gilt die eiserne Regel: Die Import-Reihenfolge muss identisch sein wie die Export-Reihenfolge. Sonst drohen sogenannte \u00dcberholer (SAP spricht hier auch von \u201eDowngrade\u201c), also j\u00fcngere TRs mit denselben Objekten, die vor dem \u00e4lteren TR importiert wurden. Wenn jetzt irgendwann der \u00e4ltere TR doch importiert wird, dann \u00fcberschreibt er mit seinem \u00e4lteren Stand den neueren.&nbsp;<\/strong>&nbsp;<\/p>\n\n\n\n<p>Selten, dass man das will.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wie arbeitet tp wirklich?&nbsp;<\/h2>\n\n\n\n<p>Ein Import besteht aus vielen einzelnen Schritten: Grob gesagt, die St\u00fcckliste wird Importiert, dann (wir konzentrieren uns auf Workbench-TRs, die sind spannender) werden die DDIC Objekte importiert und generiert, dann erst erfolgt der Hauptimport, schlie\u00dflich werden im Rahmen der After-Import-Methoden die Objekte syntaktisch \u00fcberpr\u00fcft und generiert.&nbsp;<\/p>\n\n\n\n<p>Man kann dies sehr sch\u00f6n in der Transport-History sehen: STMS_IMPORT <em>-> Men\u00fc -> Goto -> Import History<\/em>. Wenn man in der Import History <em>Men\u00fc -> Extras -> Personal Settings<\/em> aufruft und in dem Settings-Pop-Up das Flag \u201eDisplay All Import Steps\u201c einschaltet:\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"386\" height=\"414\" src=\"https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-8.png\" alt=\"\" class=\"wp-image-33832\"\/><\/figure>\n\n\n\n<p>dann kann man die einzelnen Schritte und deren Return-Code sehen:\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1529\" height=\"222\" src=\"https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-9.png\" alt=\"\" class=\"wp-image-33835\" srcset=\"https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-9.png 1529w, https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-9-1024x149.png 1024w, https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-9-768x112.png 768w\" sizes=\"(max-width: 1529px) 100vw, 1529px\" \/><\/figure>\n\n\n\n<p>Wenn man mit dem Cursor auf die kleinen Buchstaben klickt, erh\u00e4lt man in der Nachrichtenleiste die Kurz-Beschreibung des Schrittes. Am Interessantesten sind \u201eH Dictionary Import\u201c und \u201eI Main Import\u201c. Der Gesamt-Returncode in der \u201eeinfachen\u201c, zusammenfassenden History-Liste ist \u00fcbrigens ein errechneter, der ist nirgendswo gespeichert. Nur die Einzelschritte haben einen Returncode. Dieser errechnete Gesamt-RC wird dann von tp in die Importqueue eingetragen.&nbsp;<\/p>\n\n\n\n<p><strong>Viele denken nun, dass wenn <\/strong><strong>tp<\/strong><strong> mehrere TRs <\/strong><strong>gleichzeitig<\/strong><strong> importiert, dass er dann f\u00fcr jeden TR einzeln in der Reihenfolge der Import Queue diese Import-Schritte durchf\u00fchrt, so als ob man jeden TR einzeln markieren und einzeln importieren w\u00fcrde.<\/strong>&nbsp;<\/p>\n\n\n\n<p>Dem ist aber nicht so.&nbsp;<\/p>\n\n\n\n<p>Was der tp beim Import von mehreren TRs auf einmal macht, ist in Wirklichkeit genau anders herum. Zuerst f\u00fchrt er f\u00fcr alle TRs in einem Aufruf den Import der St\u00fcckliste durch, dann f\u00fcr alle TRs in der Liste den Import der DDIC Objekte und deren Generierung, dann f\u00fcr alle TRs den Hauptimport und schlie\u00dflich f\u00fcr alle TRs den Syntaxcheck und die Generierung.&nbsp;<\/p>\n\n\n\n<p>Und: All diese Schritte werden nur ausgef\u00fchrt, wenn sie <strong>neu<\/strong> sind. Wenn sie bereits ausgef\u00fchrt wurden, werden sie f\u00fcr den jeweiligen TR \u00fcbersprungen.&nbsp;<\/p>\n\n\n\n<p>Der entscheidende Vorteil bei dieser Technik: Ist ein TR mit RC=8 \u201e<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">rot<\/mark>\u201c, so steht er automatisch weiterhin f\u00fcr den Import an.\u00a0<\/p>\n\n\n\n<p>Dies wird \u00fcber den tp-Parameter REPEATONERROR gesetzt (STMS_DOM <em>-> Selektion System<\/em>)\u00a0<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"505\" height=\"603\" src=\"https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/image-10.png\" alt=\"\" class=\"wp-image-33838\"\/><\/figure>\n\n\n\n<p><strong>Wenn man jetzt einen Korrektur-Transport nachliefert, so muss man beide, den fehlerhaften und den neuen TR gleichzeitig im selben Schritt importieren. tp wird alle Schritte (St\u00fcckliste, DDIC, Hauptimport) nur f\u00fcr den neuen durchf\u00fchren, da sie ja f\u00fcr den fehlerhaften alten bereits durchgef\u00fchrt wurden.<\/strong> Der neue TR wird dabei Objekte des \u00e4lteren mit der hoffentlich korrigierten Version \u00fcberschreiben. Da der letzte Schritt (Syntax-Check und Generierung) f\u00fcr den alten noch nicht erfolgreich durchgef\u00fchrt wurde, wird er nachgeholt, der alte TR wird damit (hoffentlich) \u201e<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">gr\u00fcn<\/mark>\u201c.\u00a0<\/p>\n\n\n\n<p>Und denkt daran: Der ChaRM (und damit auch Focused Build) sorgen automatisch f\u00fcr dieses korrekte Verhalten.&nbsp;<\/p>\n\n\n\n<p>Viel Spass beim Nachvollziehen der Theorie bei euch im System und bis zum n\u00e4chsten Kaffeekr\u00e4nzchen.\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie das ABAP Transportsystem funktioniert\u00a0<\/p>\n<p>Seit SAP 1992 mir R\/3 das ABAP Transportsystem aus der Taufe hob, herrschen einige Unklarheiten wie es tats\u00e4chlich funktioniert.<\/p>\n","protected":false},"author":16,"featured_media":33807,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[344],"tags":[336],"class_list":["post-33822","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-alm-kaffeekraenzchen-das-alm-magazin","tag-kaffeekraenzchen"],"acf":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/www.blue.works\/wp-content\/uploads\/2023\/10\/pexels-benjamin-suter-3617450-1-scaled.jpg","_links":{"self":[{"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/posts\/33822","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/comments?post=33822"}],"version-history":[{"count":5,"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/posts\/33822\/revisions"}],"predecessor-version":[{"id":35630,"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/posts\/33822\/revisions\/35630"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/media\/33807"}],"wp:attachment":[{"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/media?parent=33822"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/categories?post=33822"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blue.works\/de\/wp-json\/wp\/v2\/tags?post=33822"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}