[JavaScript] Array sortieren

// https://www.w3schools.com/jsref/jsref_sort.asp

// einfaches Sortieren
let arr = ['rot', 'grün', 'blau'];
arr.sort();
console.log(arr);

// über compare-Funktion sortieren
let arr = [20, 10, 1, 4, 8, 70];
// aufsteigend
arr.sort(function(a, b) { return a-b; } );
console.log(arr);

let arr = [20, 10, 1, 4, 8, 70];
// absteigend
arr.sort(function(a, b) { return b-a; } );
console.log(arr);

[JavaScript] DOM: Buttonklick realisieren

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0;">
  <title>Beispiel 1</title>
  <script>
	// Strict mode
	'use strict';

	// https://wiki.selfhtml.org/wiki/JavaScript/Module_und_Kapselung
	// private Scope deklarieren
	// anonyme Funktion 1
	(
	    // anonyme Funktion 2
		function ()
		{
			// Initialisierung
			function init() {
				let btn = document.getElementById('btnTestButton');

				if (btn) {
					btn.addEventListener(
						"click",
						function () { txtout(); }
					);
				}
			}

			// Textausgabe
			function txtout() {
				let txt = document.getElementById("textfeld");
				if (txt) {
					txt.innerHTML = "Test1";
				}
			}

			// Event-Listener
			document.addEventListener(
				"DOMContentLoaded",
				function () { init(); }
			);
		}
		
		// Aufruf der inneren anonymen Funktion 2
		()
	);
  </script>
</head>
<body>
    <p>Button klicken!</p>
    <button type="button" id="btnTestButton">Klick!</button>
    <div id="textfeld"></div>
</body>
</html>

[JavaScript] Fortgeschrittene Objektdefinition: Revealing Module Pattern (Kapselung plus öffentliche Schnittstelle)

// https://wiki.selfhtml.org/wiki/JavaScript/Module_und_Kapselung

// Klasse / Modul definieren
// Grundmodul
let oModule = (function() {
  // private
  let priv1 = 100;
  let priv2 = 200;
   
  function priv_func1(var1, var2) {
    return var1 + var2 + priv1;
  }
 
  function priv_func2(var1, var2) {
    return var1 + var2 + priv2;
  }
   
  // public 
  return {
    public_func1: function(var1, var2) {
      return priv_func1(var1, var2) + priv_func2(var1, var2);
    }
  };
 
})();

// Erweiterung des Grundmoduls um public und private Methoden
(function (module) {
  // private
  let priv3 = 200;
  
  function priv_func3(var1, var2) {
    return var1 + var2 + priv3;
  }
  
  // public
  module.public_func2 = function(var1, var2) {
    return priv_func3(var1, var2);
  };
})(oModule);

// ok -> 306
console.log(oModule.public_func1(1, 2));
// ok -> 203
console.log(oModule.public_func2(1, 2));
// undefined
console.log(oModule.priv1);
// undefined
console.log(oModule.priv3);
// "error"
console.log(oModule.priv_func1(1, 2));
// "error"
console.log(oModule.priv_func3(1, 2));

[JavaScript] Klassendeklaration über „function“

Variante 1 (public)

// https://www.phpied.com/3-ways-to-define-a-javascript-class/
// https://developer.mozilla.org/de/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript

// Klasse Person über "function" abbilden
function Person(vorname, nachname, alter) {
  this.Vorname = vorname;
  this.Nachname = nachname;
  this.Alter = alter;
  this.getText = function(type){
    var text = "";
     
    switch (type) {
      case "1":
        text = this.Vorname;
        break;
      case "2":
        text = this.Nachname;
        break;
      case "3":
        text = this.Alter;
        break;
      default:
        text = "-";
        break;
    }
     
    return text;
  };
}

var p = new Person("Udo", "Mustermann", 30);

// Datenausgabe
console.log(p.getText("1"));

Variante 2 (private und public)

function User() {

  // private
  a = 1;
  
  function private() {
    return a;
  }

  // public
  this.b = 2;

  this.public = function() {
    return this.b;
  };
}

let u = new User();
// error
//u.private();
// undefined
console.log(u.a);
// 2
console.log(u.b);
// 2
console.log(u.public());

[JavaScript] Einfache Objektdefinition

einfache Objektdefinition mit Literalen

// https://www.phpied.com/3-ways-to-define-a-javascript-class/

let person = {
  Vorname: "Horst",
  Nachname: "Mustermann",
  Alter: 65,
  getText: function(type){
    let text = "";
    
    switch (type) {
      case "1":
        text = this.Vorname;
        break;
      case "2":
        text = this.Nachname;
        break;
      case "3":
        text = this.Alter;
        break;
      default:
        text = "-";
        break;
    }
    
    return text + "\n";
  }
};

// Datenausgabe
document.write(person.getText("1"));
document.write(person.getText("2"));
document.write(person.getText("3"));

einfache Objektdefinition mit new Object

let person = new Object();

person.Vorname = "Horst";
person.Nachname = "Mustermann";
person.Alter = 65;
person.getText = function(type){
  let text = "";
    
  switch (type) {
    case "1":
      text = this.Vorname;
      break;
    case "2":
      text = this.Nachname;
      break;
    case "3":
      text = this.Alter;
      break;
    default:
      text = "-";
      break;
  }
    
  return text + "\n";
};

// Datenausgabe
document.write(person.getText("1"));
document.write(person.getText("2"));
document.write(person.getText("3"));

alternative Objektdefinition mit new Object + Literalen

let person = new Object({
  Vorname : "Horst",
  Nachname : "Mustermann",
  Alter : 65,
  getText : function(type){
    let text = "";
     
    switch (type) {
      case "1":
        text = this.Vorname;
        break;
      case "2":
        text = this.Nachname;
        break;
      case "3":
        text = this.Alter;
        break;
      default:
        text = "-";
        break;
    }
     
    return text;
  }
});

// Datenausgabe
console.log(person.getText("1"));
console.log(person.getText("2"));
console.log(person.getText("3"));

[ABAP] Übersicht SAP-Programmerweiterungen

Übersicht

Typ                         Objekt                Transaktion       Bemerkung

User-Exit                   Unterprogramm (FORM)  SPDD, SPAM, SPAU  Modifikation
Customer-Exit               Funktionsbaustein     SMOD, CMOD        Erweiterung
Business Transaction Event  Funktionsbaustein                       Erweiterung
Business Add In (BAdI)      Interface, Klasse     SE18, SE19        Erweiterung
Enhancement Points          Interface, Klasse     SE18, SE19        Erweiterung, Verwaltung durch Enhancement Framework (+neue und alte BAdIs)

User-Exit

PERFORM userexit_<name>.

* z.B. Include MV45AFZB (vom SAP-Entwickler bereitgestellt)
FORM userexit_<name>.
ENDFORM.

Customer-Exit

Infos zu Customer-Exits: Link

CALL CUSTOMER-FUNCTION '001'
  EXPORTING
    ...
  IMPORTING
    ...

* Aufruf Include mit Quelltext
FUNCTION-POOL XYZ.
  FUNCTION exit_<programm_name>_001.
    ...
    INCLUDE zxaaau01.
    ...
  ENDFUNCTION.

BAdI

Infos zu BAdIs: Link

* Objektreferenz für Methoden des BAdI-Interfaces
CL_EXITHANDLER=>GET_INSTANCE( )
* Methoden der BAdI-Erweiterung aufrufen
o_badi->method_abc( )

* Tabellen
* SXS_ATTR (Feld EXIT_NAME, ACTIVE = 'X')
* SXC_ATTR (Feld EXIT_NAME)
* SXS_ATTRT (Feld EXIT_NAME)
* SXC_EXIT (Feld EXIT_NAME, IMP_NAME)

Enhancement-Points

Infos zu Enhancement-Points: Link
Infos zu BADI_SORTER: Link

* keine Import/Export-Schnittstelle
* implizit: automatisch vorhandene Absprungpunkte (z.B. Anfang/Ende des Quellcodes)
*           im Menu einblendbar
* explizit: von SAP vorbereitete Absprungpunkte
* Abarbeitungsrreihenfolge über Implementierung von BADI_SORTER erzwingen
ENHANCEMENT-POINT EP_A SPOTS ESPOT_X.
  ...

ENHANCEMENT-SECTION ES_B SPOTS ESPOT_X.
  ...
END-ENHANCEMENT-SECTION.

[ABAP] Funktionsbaustein: Eigenschaften anzeigen

Es gibt mehrere Möglichkeiten sich die Eigenschaften eines Funktionsbausteines anzuzeigen (Link):

  • im Quellcode Doppelklick auf den Funktionsnamen hinter CALL FUNCTION
  • Blick in die Tabellen TFDIR und TFTIT
  • Aufruf SE37 (Function Builder) mit Funktionsbaustein: $Name
  • Aufruf SE84 (Repository Infosystem) -> Repository Infosystem -> Programmbibliothek -> Funktionsbausteine

[ABAP] Mit Datumswerten rechnen

DATA: dt TYPE sy-datum.

CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'  " Funktionsbaustein zur Datumsrechnung aufrufen
  EXPORTING
    date      = sy-datum                  " Eingangswert ist Systemdatum
    days      = 0                         " 0 Tage
    months    = 0                         " 0 Monate
    signum    = '-'                       " Operator, hier '-' für Werte abziehen
    years     = 1                         " 1 Jahr
  IMPORTING
    calc_date = dt.                       " Rückgabewert in 'dt' speichern