Wednesday, 21 October 2020

SAP ABAP Create Text File and Read Text File on Application Server

*&---------------------------------------------------------------------*
*& Report ZTEXTFILE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEXTFILE.

TYPES :
  BEGIN OF T_EKKO,
    EBELN TYPE EBELN,
    BUKRS TYPE EKKO-BUKRS,
    BSART TYPE EKKO-BSART,
    AEDAT TYPE EKKO-AEDAT,
    BEDAT TYPE EKKO-BEDAT,
    LIFNR TYPE EKKO-LIFNR,
    WAERS TYPE EKKO-WAERS,
    ZTERM TYPE EKKO-ZTERM,
    WKURS TYPE EKKO-WKURS,
    ERNAM TYPE EKKO-ERNAM,
  END OF T_EKKO.

DATA :
  LT_EKKO   TYPE T_EKKO   OCCURS WITH HEADER LINE,
  LS_EKKO   TYPE T_EKKO,
  TAB       TYPE VALUE CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB,
  FILE      LIKE RLGRAP-FILENAME,
  RESULT    TYPE STRING,
  V_TMP     TYPE STRING,
  LS_STRING TYPE STRING.

FIELD-SYMBOLS <FS> TYPE ANY.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS : P_INCHES(10) TYPE C.
SELECTION-SCREEN COMMENT 1(19TEXT-002.
SELECTION-SCREEN POSITION 20.
PARAMETERS P_RAD1 RADIOBUTTON GROUP G1 DEFAULT 'X'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(19TEXT-003.
SELECTION-SCREEN POSITION 20.
PARAMETERS P_RAD2 RADIOBUTTON GROUP G1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK B1.

START-OF-SELECTION.

  IF P_RAD1 'X'.
    PERFORM F_CREATE_TEXT_FILE.
  ELSEIF P_RAD2 'X'..
    PERFORM F_READ_TEXT_FILE.
  ENDIF.

FORM F_CREATE_TEXT_FILE.
  SELECT INTO CORRESPONDING FIELDS OF TABLE LT_EKKO
    FROM EKKO UP TO 10 ROWS.

  FILE '/usr/sap/upload/ekko2.txt'.
  OPEN DATASET FILE FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
  LOOP AT LT_EKKO.
    CLEARRESULT.
    DO.
      ASSIGN COMPONENT SY-INDEX OF
             STRUCTURE LT_EKKO TO <FS>.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
      V_TMP <FS>.
      CONCATENATE RESULT V_TMP TAB INTO RESULT.
    ENDDO.

    TRANSFER RESULT TO FILE.
  ENDLOOP.
  CLOSE DATASET FILE.
  MESSAGE 'Text file created' TYPE 'S' DISPLAY LIKE 'S'.
ENDFORM.

FORM F_READ_TEXT_FILE.
  REFRESH LT_EKKO.
  FILE '/usr/sap/upload/ekko2.txt'.
  OPEN DATASET FILE FOR INPUT IN TEXT MODE ENCODING DEFAULT.
  IF SY-SUBRC NE 0.
  ELSE.
    DO.
      CLEARLS_STRINGLS_EKKO.
      READ DATASET FILE INTO LS_STRING.
      IF SY-SUBRC NE 0.
        EXIT.
      ELSE.
        SPLIT LS_STRING AT TAB INTO LS_EKKO-EBELN
                                    LS_EKKO-BUKRS
                                    LS_EKKO-BSART.
*        MOVE-CORRESPONDING ls_ekko TO WA_RECORD.
        APPEND LS_EKKO TO LT_EKKO[].
      ENDIF.
    ENDDO.
  ENDIF.
  CLOSE DATASET FILE.

  LOOP AT LT_EKKO.
    WRITE:/     SY-VLINE,
           (10LT_EKKO-EBELNSY-VLINE,
           (10LT_EKKO-BUKRSSY-VLINE,
           (10LT_EKKO-BSARTSY-VLINE.
  ENDLOOP.
ENDFORM.


Selection Screen



output read file



Tuesday, 5 May 2020

NodeJS# Membuat RestFull API Dengan NodeJS

Semangat menjalankan ibadah puasa...

Postingan kali ini saya akan share sedikit pengetahuan dari hasil belajar membuat RestFull API dengan NodeJs dan MySQL. Ok langsung saja pertama kita buat project baru dengan nama node-api-mysql.

jika teman2 belum tau cara membuat project baru di NodeJs bisa lihat DISINI .
setelah selesai membuat project baru, kita perlu menambahkan beberapa library yaitu :
- mysql
- body-parser
- cors
- rootpath 
- nodemon

lalu buat file baru dengan nama server.js dan isikan source code berikut :


require('rootpath')();
const express    = require('express'),
      port       = process.env.PORT || 7000,
      bodyParser = require('body-parser'),
      cors       = require('cors'),
      basicAuth  = require('./app/auth/basic-auth'),
      routes     = require('./app/routes');
      const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(basicAuth);
app.use(cors());
routes(app);

app.get('/', (reqres=>{   
    res.json({'status':true,'message':'Node JS API V.01'});
})

app.listen(port);
console.log('NodeJS-API running in port : ' + port);

struktur project bisa dilihat seperti berikut :



Authentication
untuk authentication disini saya menggunakan basic auth, berikut source code pada folder auth :

- basic-auth.js

const userService = require('./user.service');
module.exports = basicAuth;
async function basicAuth(reqresnext) { 
    if (req.path === '/users/authenticate') {
        return next();
    }
    // check basic auth
    if (!req.headers.authorization || req.headers.authorization.indexOf('Basic ') === -1) {
       const data = {
            'status' : false,
            'message' : 'You are not authorized'
        };
        return res.status(401).json(data);
    }    

    //Verifikasi auth
    const base64Credentials =  req.headers.authorization.split(' ')[1];
    const credentials = Buffer.from(base64Credentials'base64').toString('ascii');
    const [usernamepassword] = credentials.split(':');
    const user = await userService.authenticate({ usernamepassword });
    if (!user) {
        const data = {
            'status' : false,
            'message' : 'Invalid Authentication Credentials'
        };
        return res.status(401).json(data);
    }else{       
    }    
    req.user = user
    next();
}


- user.service.js 

// users hardcoded for simplicity, store in a db for production applications
const users = [
        { id: 1username: 'test'password: 'test'firstName: 'Test'lastName: 'User' },
        { id: 2username: '+6287763098298'password: '12345678'firstName: 'Test'lastName: 'User' }
    ];

const userLogin = [];    

module.exports = {
    authenticate
};

async function authenticate({ usernamepassword }) {
       const user = users.find(u => u.username === username && u.password === password);
    if (user) {
        const { password, ...userWithoutPassword } = user;
        return userWithoutPassword;
    }
}


lalu index.js yang ada didalam folder routes, nanti semua routing akan dimasukkan disini, sebagai contoh disini saya membuat satu routing yaitu siswa

'use strict';

module.exports = function(app) {
    var dataSiswa = require('../controller/masterdata/siswaController');
    
    //Route Siswa
    app.route('/siswa').get(dataSiswa.getSiswa);

    
};



Controller
di dalam controller->masterdata tambahkan siswaController.js

'use strict';

const response   = require('../../response');

exports.getSiswa = async function(reqres){
    response.ok('Data siswa'res)
};

siswaController.js ini dipanggil dari routing


tambahkan file response.js

'use strict';

exports.ok = function(valuesres) {
  var data = {
      'status': true,
      'data': values
  };
  res.json(data);
  res.end();
};

exports.error = function(messageres){
    const data = {
      'status' : false,
      'message' : message
    };
    res.json(data);
    res.end();
};
 

jika sudah coba jalankan server dengan command : nodemon server.js, maka akan terlihat seperti berikut : 

untuk mencoba API-nya jalankan menggunakan postman



klik send 

 
Jika menggunakan password atau username yang belum ada maka response-nya seperti berikut :


untuk proses pembuatan CRUD akan saya share di postingan selanjutnya.

Terimakasih :D

Belajar SAP ABAP RAP

  Belajar SAP ABAP RAP: Pengenalan dan Konsep Dasar Restful ABAP Programming Model Kalau kamu seorang ABAPer yang mulai terjun ke dunia SAP...