Quantcast
Channel: Tricktresor
Viewing all 214 articles
Browse latest View live

Umwandlung Struktur CSV

$
0
0

Für den Datenaustausch werden CSV-Dateien immer noch gerne verwendet, weil sie einfach zu erstellen und zu verwenden sind. Bei der Erstellung und beim Einlesen gibt es jedoch Tücken, die man am besten umgeht, in dem man Standardfunktionen verwendet.

Eine unkomplizierte Standardbibliothek ist die Klasse CL_RSDA_CSV_CONVERTER.

Folgend ein kleines Verwendungsbeispiel

Code

REPORT.

DATA gr_conv TYPE REF TO cl_rsda_csv_converter.
DATA gs_t000 TYPE t000.
DATA gv_csv TYPE c LENGTH 1000.

START-OF-SELECTION.

 SELECT SINGLE * FROM t000 INTO gs_t000 WHERE mandt = '066'.

 gr_conv = cl_rsda_csv_converter=>create( i_delimiter = '"' i_separator = ';' ).

 gr_conv->structure_to_csv( EXPORTING i_s_data = gs_t000
 IMPORTING e_data = gv_csv ).

 WRITE / gv_csv.

 

image_pdfimage_print

Auf Abwegen [AutoIt]

$
0
0

Zur Abwechslung dieses Mal nichts aus der Rubrik ABAP. Das Thema ist AutoIT. AutoIt ist ein Freeware BASIC-Dialekt, von dem Stefan mir bereits einige Male erzählt hat. Er hat sogar SAP und AutoIt verbunden: SCN-Artikel.

Der Grund, weswegen ich AutoIt brauchte, ist der folgende: Von einer internen Internetseite wollte ich Daten (Artikel + Dokumente) automatisiert übernehmen. ABAP kommt da erst mal nicht in Frage... Also erinnerte ich mich an AutoIt. BASIC-Programmierung ist nicht schwer (dachte ich) und die Funktionen sind sehr gut und mit Beispielen dokumentiert (wusste ich von Stefan).

Also ran ans Werk.

Voraussetzungen

Die von uns verwendete Community von der ich die Daten sammeln wollte, bietet eine einfache Möglichkeit, einen Artikel als PDF abzuspeichern: An die URL muss lediglich die Endung ".pdf" gehängt werde und der Artikel wird in eine PDF-Datei umgewandelt und direkt angezeigt.

Leider werden als URLs nur Nummern verwendet, wie z.B. "DOC-1234". Ich wollte die Datei natürlich nicht nur als DOC-1234.pdf speichern, sondern den Titel des Dokumentes als Dateiname verwenden.

Automatisieren wollte ich die Ermittlung aller vorhandenen Dokumente und das Speichern der Datei unter einem sprechenden Namen.

Quelle: RSS

Durch Zufall bin ich darauf gestoßen, dass die Seite einen RSS-Feed mit den relevanten Informationen zur Verfügung stellt: URL + Titel.

Die Idee war also, den RSS-Stream von allen Dokumenten zu speichern und dann in diesem mit Hilfe von AutoIt nach den entsprechenden Tags zu durchsuchen.

Erste Berührung mit AutoIt

Ich war darauf gefasst, dass ich bestimmte Aktionen mittels Rekorder aufzeichnen müsste um diese dann wieder abzuspeichern:

  • Aufruf URL
  • Markieren des Titels
  • STRG-C um den Titel in den Zwischenspeicher zu kopieren
  • Bewegen der Maus an den Bildschirmrand, damit das Speichern-Symbol erscheint
  • Klick auf "Speichern"
  • STRG-V um den Titel als Dateiname wieder einzufügen

Nach ein paar Stunden Recherche und Ausprobieren war alles viel einfacher und es entstand ein kurzes AutoIt-Skript.

Kurz zur Funktionsweise:

Mit der Funktion FileOpen wird der abgespeicherte RSS-Feed eingelesen.

Mittels _StringBetween konnte ich die URLs in ein einfaches Array laden. Für den Titel benutzte ich ein zweites Array.

Die vorhandene Funktion inetget war wie für mich gemacht: Sie speichert eine übergebene URL als Datei.

Ein Loop drum herum (FOR-NEXT, wir sind ja in BASIC!) und fertig war das Klau-äähhh-Migrations-Skript.

Direkter ist perfekter

Den Umweg über die Datei hätte ich mir sparen können, denn der folgende Code liest den RSS-Stream direkt in eine Variable:

Local $dRSS = inetread("http://www.website.de/feed/")
Local $sRSS = BinaryToString($dRSS)

Arrays

Die Arbeit mit Arrays ist anders, als mit "internen Tabellen". AutoIt bietet eine Menge Funktionen an, um Arrays zu füllen und zu bearbeiten.

Eine Datei kann zum Beispiel sehr einfach in ein Array geladen werden:

#include <File.au3>
Dim $arCSV
$csvFile = "muster.csv"
_FileReadToArray($csvFile, $arCSV)

Das eingelesene Array kann zu Kontrollzwecken mit _ArrayDisplay einfach angezeigt werden:

2016-01-31_00-05-21

Erfahrungen

Natürlich bin ich erst über ein paar Umwege und mit tatkräftiger Unterstützung von Stefan dahin gekommen, aber ich muss sagen, dass mir AutoIt ausnehmend gut gefallen hat! Einfaches Dateihandling, viele Stringfunktionen, eine sehr gute Dokumentation mit Beispielen machten es mir wirklich einfach, mein Problem zu lösen.

Nachdem ich mich daran gewöhnt habe, dass es bei BASIC IF-THEN heißt, und nicht nur einfach IF, ging die Arbeit mit AutoIt leicht von der Hand.

Ich habe mich nur auf die Aufgabe konzentriert und wenig links und rechts geguckt. Was ich allerdings beim Recherchieren und Ausprobieren der Beispielprogramme gesehen habe: Es scheint schier unendliche Möglichkeiten zu geben, das Windows-System zu steuern. Einzelne Fenster von laufenden Applikationen können gesucht und "übernommen" werden. Auf viele Funktionen kann direkt zugegriffen werden.

Probleme gab es mit der _IE-Bibliothek zur Steuerung des Internet Explorers auf meinem Rechner. Ich musste erst den "sicheren Modus" abschalten, damit die Bibliothek ihren Dienst tun konnte. Letztendlich habe ich sie nicht benötigt, denn inetget ist die Perfekte Lösung, aber mit den _IE-Funktionen hätte ich dem Internet Explorer "Beine machen können".

Editor

Der Editor ist einfach zu bedienen und bietet Syntax Highlighting, Autovervollständigung, eine Tidy-Code-Funktion und vieles Mehr.

2016-01-30_23-47-14

Insgesamt hat mit AutoIt sehr beeindruckt und ich werde es in Zukunft sicherlich öfter als Problemlösungswaffe in Betracht ziehen.

AutoIt-Skript

Folgend das erarbeitete Skript, das aus einem gespeicherten RSS-Feed die URLs aufruft und als Datei speichert.

#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>
#include <String.au3>
#include <Array.au3>
#include <InetConstants.au3>
Example()
Func Example()
 Local Const $sFilepath = "D:\temp\feed.xml"
 Local $hFileOpen = FileOpen($sFilepath, $FO_READ)
 If $hFileOpen = -1 Then
 MsgBox($MB_SYSTEMMODAL, "", "An error occurred when reading the file.")
 Return False
 EndIf
; Read the contents of the file using the handle returned by FileOpen.
 Local $sFileRead = FileRead($hFileOpen)
; Close the handle returned by FileOpen.
 FileClose($hFileOpen)
 Local $aArray = _StringBetween($sFileRead, "<link>", "</link>", $STR_ENDISSTART)
 Local $aArray_descr = _StringBetween($sFileRead, "<title>", "</title>", $STR_ENDISSTART)
 For $index = 0 To _ArrayMaxIndex($aArray)
  $url = $aArray[$index]
  If StringLeft($url, 5) = "https" Then
   inetget($url & ".pdf", "D:\temp\jive\" & $aArray_descr[$index] & ".pdf")
   Sleep(1000)
  EndIf
 Next
EndFunc ;==>Example
image_pdfimage_print

Eigene Transaktionen – Eigener Ordner im SAP Menü. Ordnung muss sein

$
0
0

Im Laufe eines Projektes sammeln sich ja gewöhnlich diverse Z-Transaktionen an. Diese werden dann in den Favoriten gespeichert und spätestens bei neuen Mitarbeitern vergessen.
Sauberer ist es, wenn man im Projekt eine eigene Menü Struktur ins SAP Standard Menü einbaut.

Transaktion SE43 bzw. die neue SE43N

Eigenes Bereichsmenü

zuerst wird ein neues Bereichsmenü angelegt

 Ordner und Transaktionen einbindenMenü ausprägen

in diesem werden die gewünschten Ordner und Transaktionen hinterlegt

S000 Menü erweitern

Im Anschluss wird dieses Menü an das S000 SAP Standard Menü angehängt

Eigenes Menü in S000 einbinden

Das fertige Ergebnis:

Ergebnis

19.04.2015 AWI, SAP MM

 

image_pdfimage_print

MD04 Start/Freigabedatum anzeigen

$
0
0

In der Bedarfs/Bestandsliste stehen alle Banfen und Planaufträge. Schön nach Datum sortiert mit dem Hinweis wann das Material im Werk sein soll.
Speziell bei plangesteuerter Disposition - mit Bedarfen in der Zukunft - stellt sich aber oftmals die Frage wann man denn die Banf in eine Bestellung umwandeln muss.

Hierzu kann man die im Standard ausgeblendete Spalte "Start-/Freigabedatum" einblenden lassen.
Dort steht dann das Datum des Bedarfstermins minus der Wiederbeschaffungszeit, also der Tag an dem die Banf spätestens umgesetzt werden soll.

MD04

Zum Einblenden muss man mit dem Mauszeiger genau zwischen 2 Spalten bis sich der Mauszeiger von "verschieben/Größe ändern" zu "einblenden" ändert.
(2 parallele Balken mit Pfeilen nach links und rechts) (neben dem Feld "Dispoelement"). Dieses Vorgehen muss 2 mal wiederholt werden, bis die Spalte "Start-/Freigabedatum" erscheint.

Danach kann das Layout gespeichert werden.

Layout speichern MD04

wie immer "aktivieren" und schon wird die Spalte dauerhaft eingeblendet.

Layout aktivieren

Kleiner Trick - große Hilfe :-)

AWI, 06/2015

Transaktionen

MD04

image_pdfimage_print

Tabellen grafisch darstellen

$
0
0

Jeder ABAP Entwickler hegt und pflegt wohl seine kleine SAP Tabellen-Liste. Trotzdem ist man immer wieder auf der Suche nach der einen oder anderen Tabelle.
In der SE11 versteckt sich ein nettes Werkzeug mit dessen Hilfe man sich die Zusammenhänge der Tabellen grafisch darstellen lassen kann.

se11_1

Zuerst springt man in der SE11 in die Datenbanktabelle.

se11_2

Dort dann die grafische Darstellung auswählen

SE11_3

Und irgend eine bekannte Tabelle im Umfeld auswählen

Se11_4

Über den Button "Fremdschlüssel" gelangt man endlich zu den Tabellen die irgendwie mit der ausgewählten Tabelle in Verbindung stehen.

Se11_5

In diesem Beispiel findet man anhand der Liste schon alle relevanten Tabellen. EKKN, EKET, EKPO, EBAN usw.
Um die Beziehung näher zu untersuchen, werden wieder die gewünschten Elemente ausgewählt.

SE11_6

und grafisch dargestellt. Per Doppelklick auf die Beziehung zwischen den Tabellen, sieht man die verwendeten Schlüsselfelder.

 

AWI, 19.05.2015

 

image_pdfimage_print

Iterator [Design Pattern]

$
0
0

Es bleibt mir eigentlich nur das Abschreiben von ABAP-Guru Naimesh: Iterator Pattern

Ich kann kein UML, deswegen verweise ich auf die exzellent aufbereitete Seite von Naimesh.

Aber damit ich auch was dazu lerne, habe ich mit yEd das Diagramm einfach mal abgezeichnet:

dp_iterator

Was macht der Iterator?

Der Iterator - Wiederholer - ist ein Entwurfsmuster, das dazu verwendet werden kann, mehrere identische Objekte zu verwalten. Der Zugang zu den einzelnen Objekten erfolgt inder Regel über die Methode GET_NEXT in einer Schleife um alle Elemente abzuarbeiten. Der Zugriff kann ebenfalls über eine Index erfolgen. Ob ein Iterator noch zu bearbeitende Elemente hat, wird über die Methode HAS_NEXT abgefragt.

Verwendungsmöglichkeiten

Das Iterator-Pattern lässt sich immer dann gut verwenden, wenn ein Objekte mehrere Unterobjekte enthält, deren Anzahl unterschiedlich sein kann. Das Open-Source-Projekt ABAP2XLS verwendet den Iterator beispielsweise für die Verwaltung von Sheets, Styles oder Ranges.

Der Iterator lässt sich also immer dann gut benutzen, wenn ein Objekt eine unterschiedliche Anzahl von Objekten hat. Neue Objekte werden dann mittels add( object ) zu einer Collection hinzugefügt.

Unterstützung durch SAP

SAP unterstützt die Verwendung des Iterator Pattern durch die Klassen CL_OBJECT_COLLECTION_ITERATOR und CL_OBJECT_COLLECTION. Die beiden Klassen werden in dem Beispielprogramm verwendet.

Im Gegensatz zu Naimesh denke ich jedoch nicht, dass die von SAP zur Verfügung gestellten Klassen nutzlos sind. Sie lassen sich sehr gut verwenden, wie das unten gezeigte Beispiel beweist.

Beispiel

In dem folgenden Beispiel habe ich ein Objekt für einen Buchungskreis definiert (LCL_BUKRS) und alle Buchungskreise aus der Tabelle T001 eingelesen und zu einer Collection hinzugefügt. Die Abarbeitung erfolgt dann über eine Schleife, die Abfragt, ob noch Elemente vorhanden sind.

Der Iterator besitzt keine Methode um den Index wieder auf "1" zu setzen. Um das zu erreichen, muss ein aktuelles ITERATOR-Objekt geholt werden.

Weitere Informationen

Ein Beispiel im SAP-Standard ist das Programm TCL_ITERATOR_EXAMPLE

Das Beispiel benutzt eigene Klassen für die Iteratoren.

*&---------------------------------------------------------------------*
*& This program is a short introduction in using the ABAP Foundation
*& classes CL_TCL_AGGREGATE and CL_TCL_ITERATOR.
*& The development of this classes was inspired by the book
*& "Design Patterns, Elements of Reusable Object-Oriented Software".
*& This example demonstrates the power of the Iterator design pattern
*& (and ABAP Objects too :-). Using the Iterator design pattern you are
*& able to design and develop robust programs with ability of easy
*& functionalty improvements. High performance programms with the main
*& focus to save every possible microsecond should use other concepts,
*& if the OOO (Object Orientation Overhead ;-) is an issue.
*&---------------------------------------------------------------------*

Code

REPORT zz_dp_iterator.

CLASS lcl_bukrs DEFINITION.

 PUBLIC SECTION.
 DATA ms_t001 TYPE t001.
 METHODS constructor IMPORTING bukrs TYPE bukrs.
 METHODS get_info RETURNING VALUE(t001) TYPE t001.

ENDCLASS.

CLASS lcl_bukrs IMPLEMENTATION.
 METHOD constructor.
 SELECT SINGLE * FROM t001 INTO ms_t001 WHERE bukrs = bukrs.
 ENDMETHOD.
 METHOD get_info.
 t001 = ms_t001.
 ENDMETHOD.
ENDCLASS.

CLASS lcl_main DEFINITION.
 PUBLIC SECTION.
 METHODS start.
 METHODS get_iterator RETURNING VALUE(itERATOR) TYPE REF TO CL_OBJECT_COLLECTION_ITERATOR.
 METHODS GET_OBJECT IMPORTING INDEX TYPE I
 RETURNING VALUE(OBJECT) TYPE REF TO OBJECT .

 PROTECTED SECTION.
 DATA MR_OBJECT_COLLECTION TYPE REF TO CL_OBJECT_COLLECTION.
ENDCLASS.

CLASS lcl_main IMPLEMENTATION.

 METHOD start.
 DATA lr_bukrs TYPE REF TO lcl_bukrs.
 DATA lt_bukrs TYPE STANDARD TABLE OF bukrs.
 DATA lv_bukrs TYPE bukrs.
 SELECT bukrs FROM t001 INTO TABLE lt_bukrs.
 CREATE OBJECT mr_object_collection.

 LOOP AT lt_bukrs INTO lv_bukrs.
 CREATE OBJECT lr_bukrs EXPORTING bukrs = lv_bukrs.
 mr_object_collection->add( lr_bukrs ).

 ENDLOOP.
 ENDMETHOD.

 METHOD get_iterator.
 iterator = mr_object_collection->if_object_collection~get_iterator( ).
 ENDMETHOD.

 METHOD get_object.
 object = mr_object_collection->get( index ).
 ENDMETHOD.

ENDCLASS.

DATA gr_main TYPE REF TO lcl_main.

START-OF-SELECTION.
 CREATE OBJECT gr_main.

 DATA gr_iterator TYPE REF TO cl_object_collection_iterator.
 DATA gr_bukrs TYPE REF TO lcl_bukrs.
 DATA gv_butxt TYPE string.
 DATA gv_index TYPE i.
 DATA gv_bukrs TYPE bukrs.

 gr_main->start( ).
 gr_iterator = gr_main->get_iterator( ).
 WHILE gr_iterator->has_next( ).
 gr_bukrs ?= gr_iterator->get_next( ).
 gv_butxt = gr_bukrs->get_info( )-butxt.
 WRITE: / gv_butxt.
 IF gv_butxt = 'SAP A.G.'.
 gv_index = gr_iterator->get_index( ).
 ENDIF.
 ENDWHILE.


 IF gv_index IS NOT INITIAL.
 gr_bukrs ?= gr_main->get_object( gv_index ).
 gv_bukrs = gr_bukrs->get_info( )-bukrs.
 WRITE: / gv_bukrs COLOR COL_GROUP.
 ENDIF.

 gr_iterator = gr_main->get_iterator( ).

 WHILE gr_iterator->has_next( ).
 gr_bukrs ?= gr_iterator->get_next( ).
 gv_butxt = gr_bukrs->get_info( )-butxt.
 WRITE: / gv_butxt.
 IF gv_butxt = 'SAP A.G.'.
 gv_index = gr_iterator->get_index( ).
 ENDIF.
 ENDWHILE.

 

image_pdfimage_print

Werte aus Excel per DOI (unsichtbar)

$
0
0

Desktop-Office-Integration - kurz DOI - ermöglicht das Bearbeiten von Office-Dokumenten innerhalb einer SAP-Anwendung. Auf Wunsch kann dies auch inplace passieren. Mit den von SAP zur Verfügung gestellten Klassen lassen sich die gängigsten Arbeiten erledigen. Allerdings erfordern diese auch immer eine Anzeige des Office-Dokumentes.

Ich möchte euch einen Trick vorstellen, bei dem zwar DOI verwendet wird, ihr aber nichts davon mitbekommt...

Bereichsleiter

Ich stelle euch unten ein Programm vor, das eine Excel-Datei einliest und die Daten abgreift. Der Zugriff erfolgt dabei über Bereiche. In meinem Beispiel-Excel habe ich ein paar Bereich benannt:

2016-02-05_16-13-08

Gibt es in dem Excel keine Bereiche, so muss ein Bereich definiert werden.

Die Daten werden in einer Tabelle geliefert mit den Feldern:

  • ROW
  • COLUMN
  • VALUE

Mit einem Zugriff können mehrere Bereiche angefordert werden. In der Bereichstabelle wird zwar übermittelt, wie viele Zeilen und Spalten je Bereich enthalten waren. Leider gibt es in der Wertetabelle keinen Bezug mehr zu den Bereichen.

Hier die Rückgabe der Bereiche:

2016-02-05_16-19-26

Und hier die Werte dazu:

2016-02-05_16-19-56

Wenn du sicher gehen möchtest, welcher Bereich mit welchen Werten gefüllt ist, dann solltest du je Bereich eine Abfrage machen.

Achtung! DOI kann nur maximal 9999 Spalten und Zeilen verwalten! Das liegt an der internen Verwendung von CHAR4-Typen für die Speicherung der Zeilen und Spalten.

Wenn du also mehr benötigst, musst du mit mehreren Bereichen arbeiten.

Ablauf

Die Desktop-Office-Integration wird über Interfaces abgebildet. Alles beginnt jedoch mit einem konkreten Erbauer:

c_oi_container_control_creator=>get_container_control

Dieser erzeugt ein Container-Control für das Dokument. Das Control muss an einen Container gebunden werden. Das geschieht bei der Initialisierung:

lr_control->init_control( ... ).

Danach kann man sich das Dokument über eine allgemeine Dokumentenschnittstelle holen. Alle Funktionen, die hier angeboten sind, gelten für Excel- als auch für Word-Dokumente:

lr_control->get_document_proxy( ... ).

Um direkt auf Excel-Funktionen zugreifen zu können, müssen wir uns das konkrete Dokument-Objekt holen:

lr_document->get_spreadsheet_interface( IMPORTING sheet_interface = lr_spreadsheet ).

Mit dieser Klasse haben wir nun endlich Excel-spezifische Funktionen, wie zum Beispiel der Zugriff auf die Tabellenzellen:

lr_spreadsheet->get_ranges_data( ... ).

Anzeige unterdrücken

Es gibt bei diesem Verfahren meines Wissens keine Möglichkeit, die Nutzung unsichtbar für den Benutzer ablaufen zu lassen. Mit einem Trick gelingt es dennoch...

Das Dynpro, das in Listen Verwendet wird, ist normalerweise das Dynpro CL_GUI_CONTAINER=>SCREEN0. Wenn du also etwas in diesen Container einhängst, dann wird er Bildschirmfüllend angezeigt: Beitrag SCREEN0.

Für verschiedene Anwendungsfälle gibt es jedoch weitere SCREENS. Ich glaube, mit jedem Popup-Level wird der SCREEN hochgezählt. Das können wir uns zu nutze machen, in dem wir das DOI-Control einfach an einen Screen hängen, der nicht angezeigt wird: CL_GUI_CONTAINER=>SCREEN9

CALL METHOD lr_control->init_control
  EXPORTING
    inplace_enabled       = 'X'
    no_flush              = 'X'
    r3_application_name   = 'Test DOI'
    parent                = cl_gui_container=>screen9
  IMPORTING
    error                 = error
  EXCEPTIONS
    OTHERS                = 1.

Wir können also trotzdem eine WRITE-Ausgabe machen. Die Ausgabe erfolgt also quasi parallel.

2016-02-05_16-26-04

Den kompletten Quelltext findest du hier.

image_pdfimage_print

WMHelp – XMLpad-Editor [Tool]

$
0
0

Nachdem ich nach einer Neuinstallation meines Notebooks wieder lange nach einem XML-Editor gesucht habe, hier ein Merker für mich und für euch:

WMHelp - XMLpad

Ich muss gelegentlich XML-Dateien sichten und analysieren. Dafür brauche ich kein riesiges Tool aber Notepad reicht auch nicht mehr aus. Nach langem Suchen bin ich auf WMHelp XMLpad gestoßen. Er hat mir sehr gut gefallen und bietet jede Menge Features und Ansichten.

Ihr seht eine einfache XML-Datei, die in Wikipedia als Beispiel verwendet wird:

2016-02-17_19-27-56

Auf Knopfdruck lässt sich ein DTD zur Datei erzeugen. Das XML kann auf Fehler geprüft werden. Im Viewer kann direkt auf einzelne Knoten zugegriffen werden.

Sehr schön finde ich die Ansichten Grid View und Table View:

2016-02-17_19-28-14

2016-02-17_19-28-25

Das Programm ist Freeware und kann hier herunter geladen werden:

http://xmlpad-mobile.com/wp-content/uploads/2014/03/XmlPad_3.0.4.1.zip

image_pdfimage_print

Debugger-Scripting (1)

$
0
0

Lange habe ich mich vor den umfangreichen Funktionen es Debugger-Scripting gedrückt. Durch das sensationelle Buch von Paul Harding "ABAP To The Future" habe ich mich nun endlich getraut.

Mein erstes Debugger-Skript

Es passiert des Öfteren, dass einem Authority-Checks in den Weg geworfen werden. Einem einzelnen kann man schnell Herr werden, in dem man sich einen Break-Point auf die Anweisung "AUTHORITY-CHECK" setzt, F5 (Einzelschritt) drückt, den SY-SUBRC auf "0" ändert und dann weiter macht.

Wenn es mehrere Checks sind, kann es schnell nerven.

Mein erstes Debugger-Skript habe ich genau hierfür geschrieben. Es macht genau das, was ich eben beschrieben habe.

METHOD script.

  debugger_controller->debug_step( 
       p_command = cl_tpda_script_debugger_ctrl=>debug_step_over ).

  cl_tpda_script_data_descr=>change_value(
         p_new_value = '4'
         p_varname = 'SY-SUBRC' ).

ENDMETHOD. "script

Damit das Skript funktioniert, musst du an geeigneter Stelle den Debugger anschalten (/h, geht auch vor dem Aufruf einer Transaktion!!) und zum Tab "Script" wechseln.

Dort setzt du einen Break-Point bei der Anweisung AUTHORITY-CHECK:

2015-12-03_17-55-27

Dann musst du nur noch das oben vorgestellte Coding in der Methode SCRIPT einfügen.

"Skript starten" und auf einmal werden alle Berechtigungsprüfungen wahr...

Leider...

funktioniert der Trace bei dieser Methode nicht. Normalerweise kann man das aktuelle Ereignis tracen:

trace->add_src_info( ).

Entweder ist ein AUTHORITY-CHECK kein Ereignis, oder es funktioniert aus anderen Gründen nicht.

Wahrscheinlich letzteres, denn auch ein eigener Eintrag in den Trace bleibt erfolglos:

 DATA trace_entry TYPE tpda_trace_custom.
 trace_entry-value = 'hier steht was...'.
 trace->add_custom_info( p_trace_entry = trace_entry ).

Wer hier noch Tipps hat: Immer her damit in die Kommentare!

Wizard

Wer das Debugger-Skripting weiter erforschen möchte, kann das sehr komfortabel über den Wizard machen:

2015-12-03_18-01-43

Alle möglichen Befehle werden hier als Muster eingefügt. Alle möglichen Konstanten, die in diesem Zusammenhang möglich sind, werden als Kommentar eingebunden:

*************************************************
* debugger commands (p_command):
* Step into(F5) -> CL_TPDA_SCRIPT_DEBUGGER_CTRL=>DEBUG_STEP_INTO
* Execute(F6) -> CL_TPDA_SCRIPT_DEBUGGER_CTRL=>DEBUG_STEP_OVER
* Return(F7) -> CL_TPDA_SCRIPT_DEBUGGER_CTRL=>DEBUG_STEP_OUT
* Continue(F8) -> CL_TPDA_SCRIPT_DEBUGGER_CTRL=>DEBUG_CONTINUE
*************************************************
****************************************************************
*Interface (CLASS = CL_TPDA_SCRIPT_DEBUGGER_CTRL / METHOD = DEBUG_STEP )
*Importing
* REFERENCE( P_COMMAND ) TYPE I
****************************************************************

*TRY.
DEBUGGER_CONTROLLER->DEBUG_STEP( P_COMMAND = P_COMMAND ).
* CATCH cx_tpda_scr_rtctrl_status .
* CATCH cx_tpda_scr_rtctrl .
*ENDTRY.

Speichern & Laden

Die Skripts können - inklusive erstellter Breakpoints!! - gespeichert werden. Entweder direkt im System im ABAP-Repository oder lokal auf dem Rechner.

Da es sich bei den Skripten um "normale" Programme handelt (Programmtyp "Subroutinenpool"), ist es sinnvoll, sich an Namenskonventionen zu halten. Alle SAP-eigenen vorgefertigten Skripte beginnen mit "RSTPDA_SCRIPT".

image_pdfimage_print

Kundenfelder in BAPI-Struktur füllen

$
0
0

Das Befüllen von Kundeneigenen Feldern in einem BAPI stellt einen häufig vor Probleme. Ich stelle dir hier eine kurze Doku mit Beispielcoding vor, um Kundenfelder korrekt und beschwerdefrei übergeben zu können.
Als Beispiel verwenden ich den BAPI_SALESORDER_CREATEFROMDAT2 zum Anlegen von Kundenaufträgen.

Vorbedingung BAPE_VBAK

Alle kundeneigenen Felder, die mittels APPEND an die Kopfstruktur VBAK angehängt wurden, müssen ebenfalls in einem APPEND an die Struktur BAPE_VBAK appendiert werden. Hierbei ist es wichtig, dass die Felder zeichenartig sein müssen! Es dürfen also keine Felder vom Typ FLOAT, DEC oder INT verwendet werden! Entweder müssen diese Felder außen vor gelassen werden (sie können dann nicht mittels BAPI geändert werden), oder es muss ein eigenes zeichenartiges Datenelement spezielle für den BAPI angelegt werden.

Beispiel

Die Umwandlung einer Struktur in einen "Container" braucht man immer, wenn man Kundenfelder in BAPIs verwenden möchte. In vielen BAPIs gibt es einen EXTENSION-Parameter, dem alle Kundenfelder übergeben werden. In diesem speziellen Fall ist es die Übergabetabelle EXTENSIONIN.

Die Anweisung zum Füllen der EXTENSIONIN sieht klassischerweise in etwa so aus:

DATA ls_bape_vbak  TYPE bape_vbak.
DATA ls_extension  TYPE bapiparex.
DATA lt_extensions TYPE STANDARD TABLE OF bapiparex.

ls_bape_vbak-zzfeld1    = '1'.
ls_bape_vbak-zzfeld2    = 'ABCD'.

ls_extension-structure  = 'BAPE_VBAK'.
ls_extension+30(960)    = ls_bape_vbak. "(bapiparex-valuepart1 - 4)
APPEND ls_extension TO lt_extensions.

Abgesehen davon, dass die Unterteilung der Kundenfelder in VALUEPART1 bis VALUEPART4 absoluter Schwachsinn ist, ist es unter Unicode nicht mehr einfach möglich, die Strukturen zuzuweisen. Im ABAP-Editor erhälst du dann die Meldung:

"LS_EXTENSION+30(960)" und "LS_BAPE_VBAK" sind in einem
Unicode-Programm nicht ineinander konvertierbar.

Casting notwendig

Entweder bedient man sich des Tricks mit dem X-Casting oder man verwendet die entsprechende Klasse von SAP: CL_ABAP_CONTAINER_UTILITIES.
Mit dieser Klasse - und speziell der Methode FILL_CONTAINER_C - ist es möglich, die typgerechte Umwandlung vorzunehmen.
CALL METHOD cl_abap_container_utilities=>fill_container_c
  EXPORTING
    im_value     = ls_bape_vbak
  IMPORTING
    ex_container = ls_extension+30(960)
  EXCEPTIONS
    illegal_parameter_type = 1
    OTHERS = 2.

Broughton – Die todsichere Hilfe für geschwollene Formulierungen!!!

$
0
0

Die todsichere Hilfe für geschwollene Formulierungen!!!

Auf dem Prinzip der Kombination von Einzelbestandteilen, die einen ebenso witzigen wie unsinnigen Zusammenhang geben, basiert das folgende Verfahren:

Philip Broughton, Beamter im US-Gesundheitsdienst, der sich jahrelang durch verschlüsselte Texte hindurchkämpfen musste, hat eine bombensichere Methode gefunden, wie man seinerseits Wörter zusammensetzen kann.

Sein "automatisches Schnellformuliersystem" führt zu Ergebnissen, die sehr eindrucksvoll wirken, dafür aber nichts bedeuten. Broughton veralbert hier die geschwollene Redeweise der Politiker, Wirtschaftsbosse und anderer wichtiger Menschen im öffentlichen Leben. Er zeigt mit seinem System zugleich, wie einfach es ist, mit einer solchen Sprache umzugehen.

Sein System stützt sich auf eine Liste von 30 sorgfältig ausgesuchten Schlüsselwörtern. Die Ausdrücke verleihen praktisch jedem Bericht eine von Fachwissen geprägte Autorität. "Es wird zwar keiner auch nur im entferntesten wissen, wovon Sie reden" sagt Broughton, "aber keiner wird wagen, es zuzugeben. Und das ist entscheidend."

konzertierte      Führungs-          struktur
integrierte       Organisations-     flexibilität
permanente        Identifikations-   ebene
systematisierte   Drittgenerations-  tendenz
progressive       Koalitions-        programmierung
funktionelle      Fluktuations-      konzeption
orientierte       Übergangs-         phase
synchrone         Wachstums-         dynamik
qualifizierte     Aktions-           problematik
ambivalente       Interpretations-   kontingenz
invertierte       Hierarchie-        äquivalenz
strukturelle      Säuberungs-        beanspruchung
individuelle      Verhaltens-        thematik
fixierte          Strukturierungs-   Usurpation

ABAP OO Freak Show

Projektsystem: Hierarchie PSP-Element ändern

$
0
0

Eine Projektstruktur ist zwangsläufig eine Hierarchie. Einzelne PSP-Elemente können ebenfalls hierarchisch angeordnet sein. Eine einfache Struktur sieht beispielsweise so aus:

2016-05-26_17-26-05

Die Projektstruktur wird im SAP-Standard mit der Transaktion CJ20n bearbeitet.
Mit dem kleinen Hierarchieänderungsprogramm soll die Struktur nun dahingehend geändert werden, dass das PSP-Element 43 unter das PSP-Element Nummer 42 gehängt wird. Der Aufruf sieht folgendermaßen aus:

2016-05-26_18-30-54

Die Übergabetabelle LT_HIERARCHY:

2016-05-26_18-32-09

Das Ergebnis ist glücklicherweise wie erwartet:

2016-05-26_17-27-35

Hinweis

Wenn die Hierarchie geändert werden soll, dann kann dies leider nicht beliebig passieren. In jedem Fall muss immer die Hierarchie aller beteiligten PSP-Elemente definiert werden. Soll das PSP-Element Nummer 43 wieder "heraufgestuft" werden, dann müssen Nr. 42 und Nr. 43 jeweils mit "UP = P-0000004"  und "DOWN = space" an den Baustein übergeben werden. Nr. 4 muss ebenfalls übergeben werden. Hier der Aufruf für Nr. 43. Eigentlich müsste auch hier Nr. 42 berücksichtigt werden, da es ebenfalls beteiligt ist, denn es "verliert" ja sein Kind:

2016-05-26_18-36-46

Dies ist das Ergebnis:

2016-05-26_17-41-13

Wie du siehst, ist die Reihenfolge vertauscht: Erst kommt Element 43, danach 42. Eine Sortierung gibt es nicht. Die "Geschwister" müssen genau definiert werden (LEFT und RIGHT). Soll die Reihenfolge anders herum sein, also erst 42, dann 43, dann muss die Übergabetabelle folgendermaßen aussehen:

2016-05-26_17-53-09

Die Geschwister müssen nicht immer definiert werden. Manchmal funktioniert eine Operation jedoch nur dann, wenn auch die Geschwister korrekt angegeben werden.

Am besten ist es, die Hierarchie 100%ig genau zu definieren. Wann sich der Baustein unvollständigen Definitionen tolerant verhält und wann nicht, ist für mich nicht nachvollziehbar.

Fehler "Wurzelelement der Hierarchie darf nicht verschoben werden"

Fehler 469(CJ)

Bei der Änderung der Hierarchie müssen alle beteiligten Elemente definiert werden! Wenn aus der Ausgangsposition "43 ist 42 untergeordnet" die Änderung "42 ist 43 untergeordnet" erfolgen soll, dann muss das ROOT-Element P-0000004 erwähnt werden. Das passiert in dem Demoprogramm, allerdings zeige ich den Fehler hier auf, weil er nicht auf die Fehlerursache schließen lässt.

2016-05-26_18-21-16

Code

 PARAMETERS p_projn  TYPE ps_pspid DEFAULT 'K-0000001'.
 PARAMETERS p_root   TYPE ps_posid DEFAULT 'P-0000004'.
 PARAMETERS p_parent TYPE ps_posid DEFAULT 'P-00000042'.
 PARAMETERS p_child  TYPE ps_posid DEFAULT 'P-00000043'.
 
 START-OF-SELECTION.
 
   PERFORM go.
 
 *&---------------------------------------------------------------------*
 *&      Form  go
 *&---------------------------------------------------------------------*
 FORM go.
 
   DATA ls_project_def      TYPE bapi_project_definition.
   DATA ls_project_def_upd  TYPE bapi_project_definition_up.
   DATA lt_messages         TYPE STANDARD TABLE OF bapi_meth_message.
   DATA ls_message          TYPE bapi_meth_message.
   DATA ls_return           TYPE bapireturn1.
   DATA lt_methods          TYPE STANDARD TABLE OF bapi_method_project.
   DATA ls_method           TYPE bapi_method_project.
   DATA lt_hierarchy        TYPE STANDARD TABLE OF bapi_wbs_hierarchie.
   DATA ls_hierarchy        TYPE bapi_wbs_hierarchie.
 
   ls_project_def-project_definition p_projn.
 
 
   ls_method-method     'Create'.
   ls_method-objecttype 'WBS-Hierarchy'.
   APPEND ls_method TO lt_methods.
 
 
   CLEAR ls_method.
   ls_method-method     'SaveAndWait'.
   APPEND ls_method TO lt_methods.
 
   CLEAR ls_hierarchy.
   ls_hierarchy-project_definition p_projn.
   ls_hierarchy-wbs_element        p_root.
   ls_hierarchy-down               p_parent.
   APPEND ls_hierarchy TO lt_hierarchy.
 
 
   CLEAR ls_hierarchy.
   ls_hierarchy-project_definition p_projn.
   ls_hierarchy-wbs_element        p_parent.
   ls_hierarchy-down               p_child.
   ls_hierarchy-up                 p_root.
   APPEND ls_hierarchy TO lt_hierarchy.
 
   IF p_child IS NOT INITIAL.
     CLEAR ls_hierarchy.
     ls_hierarchy-project_definition p_projn.
     ls_hierarchy-wbs_element        p_child.
     ls_hierarchy-up                 p_parent.
     APPEND ls_hierarchy TO lt_hierarchy.
   ENDIF.
 
 
   CALL FUNCTION 'BAPI_PROJECT_MAINTAIN'
     EXPORTING
       i_project_definition     ls_project_def
       i_project_definition_upd ls_project_def_upd
     IMPORTING
       return                   ls_return
     TABLES
       e_message_table          lt_messages
       i_method_project         lt_methods
       i_wbs_hierarchie_table   lt_hierarchy.
 
   WRITE/ ls_return-message.
   LOOP AT lt_messages INTO ls_message.
     WRITE/ ls_message-message_text.
   ENDLOOP.
 
   CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
     EXPORTING
       wait abap_true.
 
 ENDFORM.                    "go

SAP-Demoprogramme

$
0
0

Demoprogramme der SAP. CALENDAR_CONTROL CONTEXT_MENU_DYNPR CONTEXT_MENU_LIST CUSTOM_CONTROL DIALOGBOX_CONTROL DOCKING_CONTROL DRAG_DROP_EDIT_TREE DRAG_DROP_TREE_MULTI DROPDOWN_LISTBOX HTML_VIEWER HTML_VIEWER_WORKSHOP PICTURE_CONTROL SAP_LIST_TREE SPLITTER_CONTROL SUBSCREEN TABLE_CONTROL TOOLBAR_DIALOGBOX

Viele DEMO-Programme finden sich im Paket SLIS!

Toolbar

  • RSDEMO_TOOLBAR_DIALOGBOX
  • SAPTOOLBAR_IN_SPLITTER
  • SAPTOOLBAR_DEMO1
  • BCALV_GRID_07

ALV-Grid

  • BCALV*
  • BCALV_VERIFY_DATATYPES
    Das Mega-Test-Programm für jegliche Optionen des ALV-Grid
  • BCALV_TEST_SUITE
    Viele Funktionen in einem Programm

ALV-Tree

  • SAPSIMPLE_TREE_CONTROL_DEMO
  • R_ALV_TREE_TOOLBAR_MANAGER
  • BCALV_GRID_DND_TREE
  • BCALV_GRID_DND_TREE_SIMPLE
  • BCALV_TEST_COLUMN_TREE
  • BCALV_TEST_SIMPLE_TREE
  • BCALV_TREE_01
  • BCALV_TREE_02
  • BCALV_TREE_03
  • BCALV_TREE_04
  • BCALV_TREE_05
  • BCALV_TREE_06
  • BCALV_TREE_DEMO
  • BCALV_TREE_DND
  • BCALV_TREE_DND_MULTIPLE
  • BCALV_TREE_EVENT_RECEIVER
  • BCALV_TREE_EVENT_RECEIVER01
  • BCALV_TREE_ITEMLAYOUT
  • BCALV_TREE_MOVE_NODE_TEST
  • BCALV_TREE_SIMPLE_DEMO
  • Doku:
    http://help.sap.com/printdocu/core/print46b/de/
    data/de/pdf/BCCITREE.pdf

Dialogbox

  • RSDEMO_DIALOGBOX_CONTROL
  • RSDEMO_TOOLBAR_DIALOGBOX

Drawer (Vertikales Tabstrip)

  • RSBPT_CONTAINER_BAR_3

Context Menu

  • RSDEMO_CONTEXT_MENU_DYNPR
  • RSDEMO_CONTEXT_MENU_LIST
  • R_ALV_TREE_TOOLBAR_MANAGER

Grafik

  • GRAPHICS_GUI_CE_DEMO

Drag and Drop

  • RSDEMO_DRAG_DROP_EDIT_TREE
  • RSDEMO_DRAG_DROP_TREE_MULTI
  • SAPTEXTEDIT_DEMO_DRAGDROP
  • BCALV_GRID_DND_TREE
  • BCALV_GRID_DND_TREE_SIMPLE
  • SAPCALENDAR_DRAG_DROP
  • BCALV_TEST_DRAG_DROP_02
  • SAPTEXTEDIT_TEST_EVENTS

Textedit

  • SAPTEXTEDIT_DEMO_1
  • SAPTEXTEDIT_DEMO_3
  • SAPTEXTEDIT_DEMO_DRAGDROP
  • SAPTEXTEDIT_TEST_1
  • SAPTEXTEDIT_TEST_2
  • SAPTEXTEDIT_TEST_EVENTS
  • SAPBTFEDITOR_DEMO Demonstriert die Verwendung des BTF-Editors

HTML

  • SAPHTML_SCRIPT_DEMO
  • RSDEMO_HTML_VIEWER
  • RSDEMO_HTML_VIEWER_WORKSHOP
  • RSTXHTML
  • SAPHTML_DEMO_CN
  • SAPHTML_DEMO1
  • SAPHTML_EVENTS_DEMO
  • SAPHTML_LONGTEXT_DEMO
  • SAPHTML_R3HTTP_DEMO
  • SAPHTML_R3HTTP_XML
  • SAPHTML_SCRIPT_DEMO
  • SAPHTML_SET_GUI_CHARSET
  • SAPHTML_SSO_DEMO
  • SAPHTML_UI_DEMO
  • SAPHTML_USE_DEFAULT_CHARSET
  • SAPHTMLPAGEEDITOR_DEMO1

Dynamische Dokumente/ ABAP-Renderer

  • SALV_FORM_DEMO_LAYOUT_FLOW
Demonstriert die Verwendung der Element FLOW des Gestaltungsobjekts
  • SALV_FORM_DEMO_LAYOUT_GRID
  • SALV_FORM_DEMO_LAYOUT_GRID_1
  • SALV_FORM_DEMO_LAYOUT_GRID_2
Demonstriert die Verwendung der Element GRID des Gestaltungsobjekts
  • SALV_FORM_TEST
 Testprogramm für das ALV Gestaltungsobjekt

Mail

  • RSSOHTMLGIF (Sehr schönen Beispiel, um eine HTML Seite mit eingebundenen Bildern zu versenden)

Calendar

  • RSDEMO_CALENDAR_CONTROL
  • SAPCALENDAR_DRAG_DROP

Sonstige

  • RSDEMO_CUSTOM_CONTROL
  • RSDEMO_EVENT_ON_FIELD
  • RSDEMO_DOCKING_CONTROL
  • RSDEMO_DROPDOWN_LISTBOX
  • RSDEMO_EASY_SPLITTER_CONTROL
  • RSDEMO_PICTURE_CONTROL
  • RSDEMO_SAP_LIST_TREE
  • RSDEMO_SPLITTER_CONTROL
  • TEST_FRONTEND_SERVICES

Old-Fashioned

  • RSDEMO_SUBSCREEN
  • RSDEMO_TABLE_CONTROL
  • RSDEOM02 (Table Control)

Grafik

2016-05-31_10-13-35

Report RGRAPALL listet die folgenden Grafikbeispiele auf:

  • BARCBO01 Demoprogramm: Balkenplan im Anzeigemodus
  • BARCBO02 Demoprogramm: Balkenplan im Pflegemodus
  • BARCBO03 Demoprogramm: Balkenplan im Pflegemodus (Plantafel)
  • BARCBO04 Demoprogramm: Gegenseitiges Aktualisieren von Balkenplan und Dynpro
  • BARCOCX1 Demoprogramm: Balkenplancontrol
  • DEMO_GFW_PRES_SHOW Anwendungsbeispiel für den Funktionsbaustein GFW_PRES_SHOW
  • DEMO_GFW_PRES_SHOW_MULT Anwendungsbeispiel für den Funktionsbaustein GFW_PRES_SHOW_MULT
  • GFW_DEMO_HIER1 GFW: Demonstration einer einfachen Hierarchiegrafik mit SAP-Tree
  • GFW_DEMO_HIER2 GFW: Demonstration einer Hierarchiegrafik (4 in Splitter, Drag&Drop)
  • GFW_DEMO_HIER3 GFW: Demonstration einer Hierarchie-/Präsentationsgrafik (Drag&Drop)
  • GFW_DEMO_PRES GFW: Demonstration von GFW mit sichtbarem Datencontainer
  • GFW_DEMO_PRES1 GFW: Demonstration von Präsentationsgrafiken mit GFW
  • GFW_PROG_BAR GFW: Programmierbeispiel für ein Balkendiagramm
  • GFW_PROG_COLUMNS_AND_TI GFW: Programmierbeispiel für ein Balkendiagramm mit Zeitachse
  • GFW_PROG_HISTOGRAM GFW: Programmierbeispiel für ein Histogramm
  • GFW_PROG_LABELS GFW: Programmierbeispiel für dieselben Beschriftungen, lange Beschr.
  • GFW_PROG_MTA GFW: Programmierbeispiel für eine Meilensteintrendanalyse
  • GFW_PROG_PIE GFW: Programmierbeispiel für ein Kreisdiagramm
  • GFW_PROG_POINT_WITH_LAB GFW: Programmierbeispiel für Diagramm mit gekennzeichnetem Punkt
  • GFW_PROG_TIME_AXIS GFW: Programmierbeispiel für ein Punktdiagramm mit Zeitachse
  • GFW_PROG_TUTORIAL GFW: Programmierbeispiel für eine einfache PräsGrafik = GFW-Tutorial
  • GRBMAT_1 Demoprogramm: Pushbuttongrafik
  • GRBMAT_2 Demoprogramm: Pushbuttongrafik / 2
  • GRBUSG_1 Demoprogramm: SAP-Präsentationsgrafik 2D
  • GRBUSG_2 Demoprogramm: SAP-Präsentationsgrafik 3D
  • GRBUSG_3 Demoprogramm: Präsentationsgrafik Umsatzvergleich
  • GRBUSG_4 Demoprogramm: Präsentationsgrafik 2D - 3D - 4D
  • GRCNETC1 Demoprogramm: Ansteuern des Clustereditors im Anzeigemodus
  • GRCNETC2 Demoprogramm: Ansteuern des Clustereditors (erweiterte Version)
  • GRGANT_2 Demoprogramm: Gantt-Diagramm / 2
  • GRHIER_1 Demoprogramm: Hierarchiegrafik
  • GRHIER_2 Demoprogramm: Hierarchie
  • GRHPGL_1 Demoprogramm: HPGL-Display
  • GRPORT_0 Demonstration Portfolio-Grafik
  • GRSTAT_1 Demoprogramm: Trigonometrische Funktionen mit der Statistikgrafik
  • GRSTAT_2 Demoprogramm: Funktionsdarstellung mit der Statistikgrafik
  • HIER_BO1 Demoprogramm: Hierarchiegrafik im Anzeigemodus
  • HIER_BO2 Demoprogramm: Hierarchiegrafik im Pflegemodus
  • NETZOCX1 Demoprogramm: Netzplancontrol
  • NETZOCX2 Demoprogramm: Netzplancontrol mit Callbackverarbeitung
  • NETZ_BO1 Demoprogramm: Netzplangrafik im Anzeigemodus
  • NETZ_BO2 Demoprogramm: Netzplangrafik im Pflegemodus
  • NETZ_BO3 Demoprogramm: Netzplangrafik im Pflegemodus (erweiterte Form)

3D-Text

$
0
0

Jeder kennt wahrscheinlich die 3D-Stereo-Bilder. Bei diesen Bildern entwicklt sich aus einem Rauschen ein dreidimensionales Bild, wenn man etwas "schielt". Hier ist ein Text, bei dem der gleiche Effekt zu beobachten ist.

Hinweise gibt es zu den Stichworten "Stereobilder" oder direkt hier:

http://stereoauge.de/kreuzblick-methode/

Viel Spaß!

lude the as include the as include the as include the as include the as include
ute a right minute a right minute a right minute a right minute a right minute
wn year left down year left down year left down year left down year left down y
mpiler error compiler error compiler error compiler error compiler error compil
econd month i second month i second month i second month i second month i secon
using face her using face her using face her using face her using face her usin
they stop tart they stop tart the stop start the stop start the stop start the
it at wasting pit at wasting pit a wasting spit a wasting spit a wasting spit a
an hast your lean hast your lean has your clean has your clean has your clean h
ead cars time lead cars time lead car time plead car time plead car time plead
 i my go bottom i my go bottom i my go bottom i my go bottom i my go bottom i m
get over frogs get over frogs get over frogs get over frog get hover frog get h
n a pore old and a pore old and a pore old and a pore old an a spore old an a s
rt life rink fart life rink fart life rink fart life rink far life drink far li
server my date server my date server my date server my date server my date serv
back ever fort back ever fort back ever fort back ever fort back ever fort back
 this is filler this is filler this is filler this is filler this is filler thi
up into out of up into out of up into out of up into out of up into out of up i
l never act will never act will never act will never act will never act will ne
lly in the totally in the totally in the totally in the totally in the totally
em a look problem a look problem a look problem a look problem a look problem a
anyone is hide anyone is hide anyone is hide anyone is hide anyone is hide anyo
and distribute and distribute and distribute and distribute and distribute and

                               R              R

Copyright (C) 1994, Ray Butterworth

3D-Text abap

$
0
0

Ein kurzer 3D-Text mit "abap"...

abap abap abap abap abap abap abap abap abap abap abap abap abap
abap abap abap abap abap abap abap abap abap abap abap abap abap
abap abap abap abap abap abap abap abap abap abap abap abap abap
abap abap abap abap abap abap abap abap abap abap abap abap abap
abap abap abap abap abap abap abap abap abap abap abap abap abap
abap  abap  abap  abap  abap  abap  abap  abap  abap  abap  abap
abap  abap   abap   abap   abap   abap   abap   abap  abap  abap
abap  abap    abap    abap    abap    abap    abap   abap   abap
abap  abap    abap    abap    abap    abap    abap   abap   abap
abap  abap    abap    abap    abap    abap    abap   abap   abap
abap  abap    abap    abap    abap    abap    abap   abap   abap
abap  abap   abap   abap   abap   abap   abap   abap  abap  abap
abap  abap  abap  abap  abap  abap  abap  abap  abap  abap  abap
abap abap abap abap abap abap abap abap abap abap abap abap abap
abap abap abap abap abap abap abap abap abap abap abap abap abap
abap abap abap abap abap abap abap abap abap abap abap abap abap
abap abap abap abap abap abap abap abap abap abap abap abap abap
abap abap abap abap abap abap abap abap abap abap abap abap abap
abap abap abap abap abap abap abap abap abap abap abap abap abap
abap abap abap abap abap abap abap abap abap abap abap abap abap

Aus Versehen eine Getränkemarke gegründet…

$
0
0

2016-06-16_23-01-02

In einer Welt von Youtube, Facebook, Twitter & Co. gibt es wenig, was einen noch überraschen kann. Das meiste hat man inzwischen irgendwo irgendwie schon einmal gesehen. Traurige Tierstories, Sensationelle Erfolgsstories, unerwartete Reaktionen, Streiche, Witze, Konzepte. Es gibt also relativ wenig, was jemanden, der häufig online ist, noch in Erstaunen versetzt.

Manchmal allerdings schaffen es Leute, genau dies zu tun. Bei mir hat es Uwe Lübbermann (Twitter: @luebbermann) geschafft. Uwe hat einen Überraschungsvortrag auf dem SAP Inside Track in Hamburg am 11. Juni 2016 gehalten. Für Uwe war sein Vortrag natürlich keine Überraschung, aber für alle Anwesenden... An dieser Stelle möchte ich gerne den Organisatoren des SAP Inside Track in Hamburg dafür danken, dass sie diesen Ausnahmeunternehmer für einen Vortrag eingeladen haben. Vielen Dank

2016-06-16_22-23-52Premium-Cola.de

Uwe hat seinen Vortrag unter dem Stichwort Hacking Capitalizm gehalten. Ich war wahrscheinlich nicht der einzige, der dachte: "Was ist das denn für einer...?!". Uwe stand, leicht schüchtern und auf Socken, mit einer kurzen Jogginghose, vor dem gelben Ambiente von Sturmfreie Bude, als er seinen Vortrag begann. Viele waren noch - oder schon - mit ihren Handys beschäftigt, um via Twitter das Kommende zu dokumentieren.

 

Schnell wurde klar, dass Uwe eine spannende Geschichte zu erzählen hat. Ich möchte gar nicht zu viel verraten, sondern möchte dich stattdessen animieren, direkt die unten verlinkten Videos zu schauen.

premium_cola

Lessons learnt?

Das ist wirklich schwer zu beantworten... In einer Welt, in der immer mehr Mega-Konzerne Megagewinne machen und man sich fragt, wie eine Firma in den Händen von relativ wenigen so dermaßen viel Geld haben kann, kommen sicherlich dem Einen oder Anderen - wie auch mir - Gedanken über die Gerechtigkeit der Welt. Uwe verändert das mit Sicherheit nicht, aber er ist ein kleiner Hoffnungsschimmer, ein kleines Indiz dafür, dass es auch anders gehen könnte.

Das Konzept Konsensdemokratie in einer Firma kann sicherlich funktionieren, wie Uwe und seine Mitstreiter beeindruckend beweisen. Allerdings kann das wohl nur schlecht für andere Firmen und Geschäfte gelten. Uwe hat seine Nische gefunden. Aber wer weiß, vielleicht braucht es nur wieder jemanden, der den Mut aufbringt, dies umzusetzen. Eine Firma, die dies bereits getan hat, ist die Firma SWAK, die Zahnpflegeprodukte vertreibt.

Für mich ist Uwe Lübbermann jedenfalls einer der wenigen Querdenker. Es gibt viele sogenannte und selbsternannte Querdenker. Vielen von denen sind für mich jedoch nur Schwätzer, Traumtänzer oder Fantasten. Uwe ist jemand, der wirklich den Namen Querdenker verdient. Auf die Frage, ob er sich selbst als Querdenker sieht, hat er geantwortet:

wird mir ab und zu nachgesagt, ich find aber eher geradeausdenker, so gefühlt für mich 🙂

Ich möchte mit den Worten Worten schließen, die mir bei Uwe's Vortrag besonders in Erinnerung geblieben sind:

Es ist so unfassbar geil, für's Nettsein auch noch bezahlt zu werden, davon leben zu können und die Welt 'n bisschen zu ändern, dass ich's immer noch nicht glauben kann. Auch nicht nach zehn Jahren.

Videos

Sonstige Links

7 Fragen an: Uwe Lübbermann, Premium Cola

2016-06-16_22-47-52

Lübbermann twittert auch gerne

2016-06-16_22-46-00

2016-06-16_22-45-07

2016-06-16_22-44-48

Generic Programming

$
0
0

Alles, was irgendwie mit universeller Programmierung zu tun hat. RTTI, RTTS, RTTC, Create Data, Create Table, Field-Symbols, CL_ABAP_TYPEDESCR, CL_ABAP_TYPEDESCR, CL_ABAP_STRUCTDESCR, CL_ABAP_COMPLEXDESCR, CL_ABAP_REFDESCR, CL_ABAP_ELEMDESCR, CL_ABAP_DATADESCR, CL_ABAP_OBJECTDESCR, CL_ABAP_INTFDESCR, CL_ABAP_CLASSDESCR

Generic class for inserting, updating and deleting records

Purpose of this class is to store and process records that need to be modified in database tables. When the user is working on an object that contains header and detail records, a 'Save' means that records need to be modified in different tables. Imagine that the application shows a grid where the user can insert, update and delete records; the logic for saving these changes can be a bit complex.

This class should provide the necessary functions for this kind of functionality. It holds a table with the database tables and records that we need to update. Methods are available to add entries to this table and this means that during a process, the required database updates are collected until the actual database update takes place. When the application has finished the process, it calls the method that performs the database update.

http://wiki.sdn.sap.com/wiki/display/Snippets/ABAP+OO+-+Generic+class+for+inserting%2C+updating+and+deleting+records

Advanced and Generic Programming in ABAP

Weiterführende Links und Hilfen findest du unter den Stichworten

  • RTTI - Run Time Type Information
  • RTTS - Run Time Type Services
  • RTTC - Run Time Type Creation

http://zevolving.com/2008/09/dynamic-internal-table-creation/

SAPLogon Shortcuts wiederherstellen

$
0
0

Mit der Einführung des SAP Logon 7.40 wurde die Art, wie die Konfigurationsdaten abgelegt werden, verändert. Gab es früher die Dateien saplogon.ini mit den SAP Systemen und sapshortcuts.ini mit den persönlichen Verweisen zu den häufig benötigten SAP Systemen, so sind diese Dateien nun zusammengefasst in einer einzigen XML Datei namens SapUiLandscape.xml.

2016-06-28_14-40-04

Die Beschreibung

Hier geht es zur ausführlichen Beschreibung: SAPlogon_shortcuts_story

Das Programm

Hier der Link zum gezippten XLSM: SAPlogon_Shortcuts_xlsm

 

Ernst Kofler hat diesen Trick zur Verfügung gestellt. Vielen Dank dafür!!

Selektion für MD04/ MD06 + MS04/06 eingrenzen

$
0
0

Je nach Größe und aufkommen in Werk und Dispobereich dauert die Auswertung in den Transaktionen recht lange. Die Standardselektion erlaubt es leider nur sehr begrenzt die Ergebnismenge einzugrenzen – Select-Options vermisst man gänzlich. Der Benutzer wird oft gezwungen die komplette Liste aufzubauen und anschließend mit Filtern die Datenmenge einzugrenzen.
Zum Glück bietet die SAP uns hier die Möglichkeit die Situation mittels BAdI MD_EXCLUDE_MATERIAL zu verbessern. Der BAdI erlaubt es im Einstiegsbild einen zusätzlichen Reiter „Zusatzselektion“ einzubinden und dort ein eigenes Dynpro mit einem Selektionsbild einzubinden.

Link zur SAP-Doku

https://help.sap.com/erp_hcm_ias_2013_01/helpdata/de/45/188147e1235d79e10000000a11466f/content.htm

„SAP empfiehlt, sich stark an der Beispielimplementierung zu orientieren und einen speziellen kundenspezifischen Report analog dem Report RMD07_BADI_SCREEN_EXTENSION01 mit Selektionsscreen 347 und Auswahl-Formroutine zu definieren. Der Selektions-Subscreen muss dann in der Screen-Erweiterung den leeren Subscreen 347 ersetzen, während die Auswahl-Formroutine innerhalb der Methode EXCLUDE_MATERIAL_EVAL aufgerufen werden muss.“

Demoreport der SAP

Report RMD07_BADI_SCREEN_EXTENSION01

Beispiel

Beispielsweise könnte das wie folgt aussehen:

Erweiterung der Selektionsoptionen bei MD04

Erweiterung der Selektionsoptionen bei MD04

Vor der Auswertung der Dispositionsdaten wird dann für jedes Material im Dispobereich die BAdI-Methode gerufen und die Möglichkeit gegeben das Material aus der Auswertung auszuschließen.
Unbefriediegend dabei ist, dass die „Speichern“ Funktion des Standards die Eingabewert im Subscreen nicht mit speichert und entsprechend beim Start der Transaktion nicht wiederherstellt. Zum Glück erlaubt uns das Sel-Screen Eventing die entsprechenden Zeitpunkte ebenfalls abzuhandeln und das so zu ermöglichen. *** Einmalig beim Start der Transaktion gespeicherte Daten wiederherstellen via FuBa RS_SUPPORT_SELECTIONS

CASE sy-ucomm. 
  WHEN 'YES'. 
*** Wiederherstellen Selektionsbild via FuBa RS_SUPPORT_SELECTIONS wenn 
*** der Benutzer zurück aus der Auswertung kommt. 
  WHEN 'SAVP'. 
*** Speichern des Selektionsbild via FuBa RS_REFRESH_FROM_SELECTOPTIONS 
*** und RS_CHANGE_CREATED_VARIANT_255 bzw. RS_CREATE_VARIANT_255 
ENDCASE.
Viewing all 214 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>