Kategorien
Schulung

TicTacToe – Reloaded

Lang ist es her, aber gerne benutze ich den alten Code und lasse ihn auch noch auf einer PDP11 laufen. Im letzten Workshop sprachen wir über die Möglichkeiten der Programmierung eines Reports in ABAP. Wir wissen, das ein Report für die dynamische, interaktive Darstellung von Listen gedacht ist. Als Übung, damit die laufzeitabhängigen Ereignisse eines Reports klar werden, habe ich den original DEC Code des Spiels „Tic Tac Toe“ gegeben der analysiert und in ABAP realisiert werden sollte.

Hier nun eine kurze Vorstellung meiner Musterlösung.

Der Sinn des Spiels ist klar – drei Felder, in einer Reihe, Spalte oder Diagonalen sind zu besetzen. Wir erkennen im Original, in den Zeilen 1090 und folgenden, das die Züge der Maschine per Zufallszahl erzeugt werden.

Das ist auch so in ABAP realisierbar. Es stehen ein Funktionsbaustein aus der Gruppe QF05 (QF05_RANDOM_INTEGER) sowie die Klasse CL_ABAP_RANDOM_INT zur Verfügung.

Expliziet wird der Zug geprüft, nämlich ob das Feld bereits belegt wurde und ob der Zug zum Gewinn der Partie führt. Das Vorgehen, auch gerade mit den im Original verwendeten Befehlen GOTO und GOSUB, ist im Report nicht möglich da er nicht prozedual abläuft. Um nah, wie die Aufgabe lautet, am Original zu bleiben, empfiehlt sich für den Ersatz des GOSUB der Befehl PERFORM.

Um die Sache etwas interessanter zu machen, habe ich zwei Dinge berücksichtig. In der Grundliste des Reports (SY-LSIND = 0) kann „Anzahl Spieler 0“ eingegeben werden. Das Programm spielt dann beide Spieler – wir erinnern uns an den Klassiker „War Games“. Eine Defensivstrategie ermöglicht dem Spieler „SAP“ einen Gewinnzug des Gegners zu verhindern. Taktisch wird nach jedem Zug die Summe der Zeilen, Spalten und Diagonalen errechnet und dem entsprechend ein Zug vereinbart. Dennoch ist es dem User möglich zu gewinnen, nämlich dann, wenn es mehr als eine Gewinnmöglichkeit gibt. Eine Offensivstrategie ist nicht implementiert – das kann als

Zusatzaufgabe verstanden werden. Offensiv heisst, das Programm stellt nicht fest ob oder das der nächste Zug zum Gewinn führt. Gibt es nichts zu verteidigen, wird eine Zufallszahl über den nächsten Zug entscheiden!

Kategorien
Allgemein

Auswirkung der EU DSGVO

Es trifft jeden: Privatmann, Websitebetreiber und Unternehmen. Der EU DSGVO Wahnsinn.

In Deutschland galten auch vorher schon strenge Datenschutzbestimmungen. Viel mehr ist, zum Beispiel für Betreiber einer Website, garnicht zu beachten. CMS Systeme, wie WordPress, bieten ihrem Kunden fertige Seiten an. (Link)

Bekomme ich jetzt weniger SPAMs? Werden meine Daten über mein Surfverhalten nicht mehr verarbeitet? Was bringt die DSGVO effektiv für den Datenschutz im täglichen Umgang mit dem PC?

Nichts! Absolut, rein garnichts!

Die Zeitgenossen, die allzu gerne ihre persönlichen Daten missbrauchen, interessieren keine Verordnungen. Man wird ihnen nicht habhaft, sind nicht festellbar und wenn doch, befinden sie sich ausserhalb des EU Rechtsraums. Aber auch kommerzielle Projekte werden nicht verhindert. Für ein Grossunternehmen werden die Strafgelder schlicht Teil des Marketingbudgets sein.

Die Verordnung schadet Kleinunternehmen. Mehr nicht! Sie verhindert das legitime Interesse des Unternehmers, sich werblich darzustellen.

Kategorien
SAP Schulung

FBL3N versus FAGLL03 Einzelpostenanzeige

Grundsätzlich sollte man, nach Aktivierung der neuen Hauptbuchhaltung, auf die Anwendung alter Reports und den Transaktionen wie zB. FBL3N oder FS10N verzichten. In der Praxis haben sie dennoch ihren Reiz und ich erliege auch oft ihrem Charme und verwende sie.

Wo liegt nun der Zusammenhang mit dem Kennzeichen Einzelpostenanzeige wie sie zB über die Transaktion FS00, in den Steuerungsdaten Kontoverwaltung im Buchungskreis, zu finden ist?

Im wesentlichen ist zu sagen, das mit setzen des Kennzeichens u.a. eine zusätzliche Tabelle ( BSIS ) geführt wird, in der die Verbindung Belegposition und Konto geführt wird. Ausserdem sind die Tabellen BSIS und BSAS für die OP Verwaltung wichtig. Die SAP Dokumentation gibt umfassend Auskunft. In diesem Kontext aber, sind die Stichworte Erfassungs- und Hauptbuchsicht entscheidend.

Die Transaktion FAGLL03 führt, in der Standardvariante, immer zu einer Einzelpostenliste – auch ohne Kennzeichen „Einzelpostenanzeige“. Warum ist das so?

Es ist Augenwischerei! Es ist die Betrachtungssicht zu beachten. Die Betrachtung der Einzelpostenliste, aus Sicht des Sachkontos, ist eine andere als die aus Sicht des Hauptbuchs. Die Transaktion FAGLL03 beginnt in der Standardvariante mit der Einzelpostenliste Hauptbuchsicht – die Transaktion FBL3N mit der Einzelpostenliste Erfassungssicht.

Das Kennzeichen „Einzelpostenanzeige“ in den Steuerungsdaten des Sachkontos ist also sehr wichtig wenn es um die Anzeige der Belegaufteilungen in der Erfassungssicht geht. Das Kennzeichen, wenn es denn vergessen wurde zu aktivieren, lässt sich auch nachträglich aktivieren.

Über die FS00 ist das Kennzeichen für das betreffende Konto zu setzen. Danach muss das Konto gesperrt werden ( Systemfunktionsleiste –> Sachkonto/Sperren ). Mit dem Aufruf des Reports RFSEPA01 (SA38) wird die Tabelle BSIS nachträglich generiert.

Die echte Einzelpostenanzeige, also die Sachkonteneinzelpostenliste in der Erfassungssicht, steht zur Verfügung.

Kategorien
Allgemein

MOBOTIX Cam über Apache Proxy

Eine für mich exotische Aufgabe war, mehrere Überwachungskameras über eine Website verfügbar zu machen. Eine Cam über eine URL mit dem Apache Server zu installieren ist keine besondere Sache. Zahlreiche Anleitungen existieren, wie die Direktive „ProxyPass“ einzusetzen ist.

Interessanter ist es, beliebig viele Cams über eine URL – nur durch Path unterschieden – im Apache zu realisieren.

Das Userinterface der MOBOTIX Cam setzt direkte  und relative Links, weshalb das Umleiten über den Proxy schwierig ist. Der Proxy muss mit dem Wechsel der Art und Weise zurecht kommen.

Es soll also über eine URL, mit den Paths /CAM1/, /CAM2/ ….. usw. das Kamerainterface, Bild und Livestream dem User zur Verfügung gestellt werden. Das Menuesystem, jeder CAM ist in seiner Struktur zwei bis drei Stufen tief. Das ist zu beachten, da jeder User auch mehrere CAMs geöffnet haben kann.

Wie in dem Listing zu sehen, wird ein Mapping und Rewriting der Proxydaten vorgenommen. Sobald der User aber mehrere Funktionen oder Ebenen der Menüstruktur aufruft, fügt das Substitute mehrmals, je nach dem ob der Link relativ oder direkt ist, den Path hinzu. Hier steuere ich mit Substitute „s|/CAM1/CAM1/|/CAM1/|i“ gegen. Als so zu sagen“letzte“ Regel, verhindere ich die Path Kaskadierung der vorherigen Umschreibung.

Diese Konfiguration läuft für beliebig viele CAMS und durch alle Ebenen der Menüs.

<VirtualHost *:443>
 ..........

ProxyRequests off
ProxyPreserveHost Off
ProxyHTMLInterp On
ProxyPass         /CAM1/ http://URL.CAM1.INTERN/
ProxyPass         /CAM2/ http://URL.CAM2.INTERN/

ProxyHTMLURLMap http://URL.CAM1.INTERN/ /CAM1
ProxyHTMLURLMap http://URL.CAM2.INTERN/ /CAM2

<Location /CAM1/>
 RequestHeader unset Accept-Encoding
 setOutputFilter proxy-html
 AddOutputFilterByType SUBSTITUTE text/html

 Substitute "s|/admin/|/CAM1/admin/|i"
 Substitute "s|/cgi-bin/|/CAM1/cgi-bin/|i"
 Substitute "s|/control/|/CAM1/control/|i"
 Substitute "s|/decor/|/CAM1/decor/|i"
 Substitute "s|/help/|/CAM1/help/|i"
 Substitute "s|/record/|/CAM1/record/|i"
 Substitute "s|/webcam/|/CAM1/webcam/|i"
 Substitute "s|/server/|/CAM1/server/|i"
 Substitute "s|/CAM1/CAM1/|/CAM1/|i"

 ProxyHTMLURLMap / /CAM1/
 ProxyHTMLURLMap /CAM1 /CAM1
 ProxyPassReverse /
 </Location>

<Location /CAM2/>
 ..........

</Location>

### Livestreams

ProxyPass /CAM1STREAM http://URL.CAM1.INTERN/cgi-bin/faststream.jpg?stream=full&html
ProxyPass /CAM2STREAM http://URL.CAM2.INTERN/cgi-bin/faststream.jpg?stream=full&html

</VirtualHost>
Kategorien
SAP

SAP terminiert

Der SAP Basis Administrator achtet auf den Speicherverbrauch des Systems – Ist nicht mehr genug Platz verfügbar, terminiert sich das System „wortlos“. Gerne kommt es im Log Bereich zum Überlauf.

Die Logs automatisch zu bereinigen, ist bei Systemen die die MaxDB Datenbank nutzen denkbar einfach. Entsprechende Einstellungen finden sich im DBCOCKPIT. Das Anfassen des Systems auf Ebene des Betriebssystems ist nicht notwendig.

Anders bei Nutzung der ORACLE Datenbank. Schnelle Abhilfe bei einem Überlauf des Log Bereichs –> Lösche den Inhalt des Ordners ORAARCH. Das ist gefahrlos auch während des Betriebs möglich.

Unserem Schulungssystem muss ich mehr Plattenspeicher gönnen.

Kategorien
Allgemein Schulung

Journale selbst erstellt

Etwas umständlich ist die Suche nach Belegen und Buchungen im Tryton ERP System. Will man nicht in Views herum klicken und bei der Suche nach Buchungsnummer oder Fremdbelegnummer gar in verschiedenen Listen suchen, muss sich die Auswertung selbst anlegen.

LibreOffice kann hier helfen. Es besitzt im Programm „Base“ bereits alle nötigen Schnittstellen zu vielen Datenbanken – so auch zu Postgresql, welche Tryton nutzt. Mit etwas Geduld findet man die entsprechenden Tabellen die Belegnummer, Buchungsatznummer, Abstimmung und Fremdbelegnummer beinhalten. Achte auf die LEFT OUTER JOIN Bedingungen, da nicht alle Buchungssätze unbedingt Fremdbelegnummern besitzen. (Link)

Eingebunden in LibreOffice CALC oder Microsoft Excel lässt sich die Liste jetzt nach allem filtern und sortieren. In der Revision unglaublich hilfreich, wenn Konten gruppiert und Belegnummern schnell gefunden werden können.

Kategorien
Schulung

SAP Domain Links im Transportsystem

Eine interessante Entdeckung kann man machen, wenn man SAP Systeme mit der Transaktion STMS miteinander verbindet. Ich habe das IDES System mit der Development Version NSP verbunden um Pakete auszutauschen. Anleitungen dazu existieren (Link).

Was aber erstaunlich ist, die möglicher Weise existierende Konfiguration eines Services – in meinem Fall die des SMTP Port – werden mit den Daten des exportierenden Systems ergänzt.

Hier war es so, dass die Konfiguration des Services (SICF) im IDES System geändert und neu aktiviert werden musste. Pakte können aber problemlos zwischen beiden Systemen transportiert werden.

Kategorien
SAP Schulung

BAS Datenimport Beispiel

Möglichkeiten, Daten aus Altsystemen in SAP zu importieren, gibt es reichlich. LSWM, SHDB sind die wichtigsten Transaktionen die auch sehr gut dokumentiert sind. Sie basieren auf der Technik des Batch-Input – also des „abspielens“, des simulierens einer Benutzeraktion mit Dateneingabe. Im Fall des Adressimports, genauer: Adressdatensätze der Geschäftspartner – ist dieses Vorgehen sehr umständlich, sehr Ressourcenaufwendig und führte, bei meinen Versuchen, zu einem Speicherüberlauf da nicht nur die BUP1 Transaktion angesprochen wird, sondern zeitgleich mehrere Prozesse angestossen werden die für die Sache eigentlich nicht nötig sind. Es sollte unbedingt darauf verzichtet werden und den Import über Code und den entsprechenden Verbucher-Funktionsbausteinen der BAS zu realisieren. Hilfreich ist diese Seite zu der Funktionsgruppe SZA1.

In der Schulung gehen wir einmal den Weg eines Batch-Inputs der grundsätzlich sehr gut ist.

In der Transaktion SHDB starten wir eine neue Aufzeichnung mit der Transakton BUP1 und legen einen Kunden „Mustermann“ an. Wenn die Aufzeichnung nach dem speichern des Kunden beendet ist, sieht man eine lange Liste der ausgeführten Aktionen auf dem Screen.

Mit dieser Aufzeichnung lässt sich einiges anstellen: Als Vorlage für den Import mit der Transaktion LSMW, als eigenständiger Report oder als Funktionsbaustein. Letzteren wollen wir einmal ausprobieren.

Hier zeigt sich schon der ernorme Ressourcenverbrauch. In meinem Beispiel importiere ich eine CSV Datei mit 4000 Sätzen. Es wird 4000 mal der Input in die Transaktion BUP1 erzeugt. Man sollte darüber kurz nachdenken, bevor man F8 drückt! In der Realität würde ich mit Sicherheit den Verbucherbaustein direkt mit einem COMMIT WORK AND WAIT aufrufen.

Es funktioniert, wenn auch sehr langsam trotzdem. Unser Batch-Input wird Positiv quittiert.

 

Datemimport ist eine einmalige Sache, bei der man schon den zu betreibenden Aufwand berücksichtigen muss. Über den Batch-Import ist aber immer gewährleistet, nur gültige Daten importiert zu haben. Andere Ideen, wie der Import in das BAS schöner gestaltet werden kann, sind willkommen und werden veröffentlicht!

Kategorien
Schulung

Buchungen löschen in Tryton

Es kommt immer wieder vor, das Buchungen falsch erfasst wurden. Richtig ist es, diese Buchung durch eine Gegenbuchung zu stornieren. Genau so wie es gesetzlich vorgeschrieben ist, in den Bücher keine Radierung vor zu nehmen, ist auch in der elektronischen Buchhaltung eine Stornierung immer nachvollziehbar. Sollte so sein.

Kategorien
SAP Schulung

NETWEAVER Entwickler Schlüssel

Entwickeln und lernen macht in der Gruppe mehr Spass. SAP stellt ein Basis-System für Entwicklungsarbeit kostenlos zur Verfügung von denen wir zwei Systeme in Betrieb halten. Zum einen ein Netwaeaver 702 auf einem Windows Terminalserver und ein Netweaver 750 System auf meinem Linux PC. Ein gravierender Unterschied fiel mir auf, den das System 702 zum idealen Entwicklungssystem für Gruppen kürt.

Neben den Änderungen der Syntax im ABAP Befehlssatz (Artikel) ist der Entwicklerschlüssel, der zur Erzeugung von Code im System berechtigt, nun digital signiert und setzt einen installierten Lizenzschlüssel voraus!

Wir wissen, bei der ersten Inbetriebnahme wird zunächst ein temporärer Lizenzschlüssel generiert, der sich bei der Berechnung der Gültigkeit zunächst an der Systemuhr zum Zeitpunkt des Starts orientiert. Im Netweaver 702 konnte es nun passieren, das man das System mit einem gültigen, sehr lange gültigen, temporären Lizenschlüssel in Betrieb nimmt und der Entwicklerschlüssel auch gültig ist.

Dieser Fehler, den man fairer Weise niemals nicht nie ausnutzen sollte, wurde in der Version 750 korrigiert – eben durch Signierung des Entwicklerschlüssels mit der signierten Programmlizenz, so das hier alle 90 Tage die Lizenz erneuert werden muss.

In beiden Versionen ist der Entwicklerschlüssel immer nur einmal gültig! Das heisst: Mag man auch so viele Benutzer und Mandanten anlegen können, wie man möchte, gibt es nur einen Entwickler. Ungünstig, wenn mit mehrer Entwicklern an einem Projekt gearbeitet werden soll.

Schalten wir doch vor Eingabe des Entwicklerschlüssels einmal den Debugger ein und verfolgen die Programmlogik. Wir sehen, dass ein Funktionsbaustein aus der Funktionsgruppe SKEY benutzt wird. Im ablaufenden Include Programm wird die Funktion

„DEVELOPER_KEY_CHECK“ nach der Güligkeit des Schlüssels befragt, die mit entsprechenden Rückgabewert SY-SUBRC den Entwickler zulässt oder eben nicht. Hier können wir eine impliziten Erweiterung vornehmen, nämlich derart, das der Rückgabewert der Funktion immer „0“ also gültig ist. Beliebig viele Benutzer können nun mit dem einen gültigen Entwicklerschlüssel Code erzeugen.

Viel Spass. Happy coding