Friday, 30 August 2019

SAP ABAP - POST Data From SAP to Firebase Using Node js



ABAP Program

REPORT ZSAPTOFIREBASE.

DATA IT_DATA TYPE TABLE OF SFLIGHT.
DATA :
  LO_HTTP_CLIENT 
TYPE REF TO IF_HTTP_CLIENT,
  JSON_DATA      
TYPE STRING,
  JSON_POST      
TYPE XSTRING.


START-OF-SELECTION.
  
PERFORM F_POST_DATA.

FORM F_POST_DATA.
  
DATA LV_STATUS TYPE CHAR50.
  
REFRESH IT_DATA.

  
SELECT FROM SFLIGHT INTO TABLE IT_DATA UP TO ROWS.

  JSON_DATA 
/UI2/CL_JSON=>SERIALIZEDATA IT_DATA COMPRESS ABAP_TRUE PRETTY_NAME /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ).

  
CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL(
    
EXPORTING
      URL                
'http://10.100.101.28:4000/sap'   "API - URL
    
IMPORTING
      
CLIENT             LO_HTTP_CLIENT
    
EXCEPTIONS
      ARGUMENT_NOT_FOUND 
1
      PLUGIN_NOT_ACTIVE  
2
      INTERNAL_ERROR     
3
      
OTHERS             ).

"  User Authentication.
  
CALL METHOD LO_HTTP_CLIENT->AUTHENTICATE(
    
EXPORTING
      
CLIENT   '400'
      USERNAME 
'USER01'
      PASSWORD 
'123456'
      
LANGUAGE ''
  
).

  
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
    
EXPORTING
      
TEXT   JSON_DATA
    
IMPORTING
      
BUFFER JSON_POST.

  LO_HTTP_CLIENT
->REQUEST->SET_METHOD'POST' ).
  LO_HTTP_CLIENT
->REQUEST->SET_CONTENT_TYPE'application/json' ).
  LO_HTTP_CLIENT
->REQUEST->SET_DATAJSON_POST ).

" Mengirim Request ke API
  LO_HTTP_CLIENT
->SEND(
      
EXCEPTIONS
        HTTP_COMMUNICATION_FAILURE 
1
        HTTP_INVALID_STATE        
).

" Menerima Response dari request
  LO_HTTP_CLIENT
->RECEIVE(
    
EXCEPTIONS
      HTTP_COMMUNICATION_FAILURE 
1
      HTTP_INVALID_STATE        
2
      HTTP_PROCESSING_FAILED    
).

" Cek Response dari request.
  
DATA LV_RESPONSE TYPE STRING.
  LV_RESPONSE 
LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).

ENDFORM.


__________________________________________________________________________________________ 


Node JS

const express    = require('express');
const bodyParser = require('body-parser');
var firebase     = require("firebase");
const app        = express();

const config = {
    apiKey: "AIzaSyA71hPWUdEqgymNFTHg462yFJ_bWDAkHcA",
    authDomain: "exam-aff8f.firebaseapp.com",
    databaseURL: "https://exam-aff8f.firebaseio.com",
    projectId: "exam-aff8f",
    storageBucket: "",
    messagingSenderId: "133123398372"
  };
firebase.initializeApp(config);

var fdatabase = firebase.database();
var ref = fdatabase.ref("/sap");

app.use(bodyParser.json());
app.listen(4000, () => console.log('Server berjalan di port 4000'));

//Route untuk menangkap data dari SAP
app.post('/sap', (request, response) => {
    let sapdata = request.body;

    ref.set({
        sapdata
    })
    console.log(sapdata);
    response.json('Success');
})


Demo result :


Full source code ABAP & Node JS
 

Thursday, 29 August 2019

Nodejs#2 : Membuat CRUD Dengan Nodejs MySQL


Melanjutkan Postingan Sebelumnya tentang nodejs untuk pemula, pada postingan ini saya akan sharing membuat CRUD sederhana dengan nodejs - mysql

pertama kita buat database dulu di localhost/phpmyadmin dengan nama db_nodejs setelah itu kita buat table dengan nama tbl_siswa seperti berikut :



selanjutnya kita buka project yang sudah dibuat di postingan Sebelumnya dan jalankan command berikut :

npm init


jika sudah tekan enter dan didalam project akan tercreate file baru dengan nama package.json dan folder baru node_modules 

setelah itu kita install express, mysql, dan body-parser :








dan satu lagi yang akan kita install di project yaitu nodemon, nodemon ini berfungsi untuk menjalankan local server aplikasi nodejs kita, dengan nodemon ini kita tidak perlu melakukan restart server ketika ada perubahan source code di server nodejs kita, nodemon ini akan otomatis melakukan restart server setiap ada perubahan source code di sisi server




dan di file package.json ini akan menjadi seperti berikut :




selanjutnya kita buat folder baru dengan nama public dan didalamnya kita buat file index.html dan script.js, sehingga tampilan struktur project akan seperti berikut :



kemudian buat file index.html menjadi seperti berikut :
<!doctype html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.css">
    <title>CRUD | Nodejs - MySql </title>
</head>
<body>

    <div class="container">
        <div class="card">
            <div class="card-header" style="background: #343a40;color: white;align-content: center;">
                CRUD | Nodejs - MySql
            </div>

            <button type="button" class="btn btn-primary btnTambahData mt-1" data-toggle="modal" data-target="#exampleModal" data-zurl="<?= BASEURL; ?>">
                Tambah Mahasiswa
            </button>
            <hr>
            <table class="table">
                <thead class="thead-dark">
                    <tr>
                        <th scope="col">#</th>
                        <th scope="col">Nis</th>
                        <th scope="col">Nama</th>
                        <th scope="col">Alamat</th>
                        <th scope="col">Hobi</th>
                        <th scope="col"></th>
                    </tr>
                </thead>
                <tbody id="databody">
                    
                </tbody>
            </table>

        </div>
    </div>

    <!-- Modal -->
    <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="exampleModalLabel">Tambah Mahasiswa</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">
                    <div class="card-body">
                        <div class="form-group">
                            <label for="nis">Nomor Induk Siswa</label>
                            <input type="text" class="form-control" id="nis" placeholder="Masukkan Nomor Induk Siswa" autocomplete=off>
                        </div>
                        <div class="form-group">
                            <label for="nama">Nama</label>
                            <input type="text" class="form-control" id="nama" placeholder="Masukkan Nama" autocomplete=off>
                        </div>
                        <div class="form-group">
                            <label for="alamat">Alamat</label>
                            <input type="text" class="form-control" id="alamat" placeholder="Masukkan Alamat" autocomplete=off>
                        </div>
                        <div class="form-group">
                            <label for="hobu">Hobi</label>
                            <input type="text" class="form-control" id="hobi" placeholder="Masukkan Hobi" autocomplete=off>
                        </div>
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                    <button type="button" class="btn btn-primary" id="btn_save">Simpan</button>
                </div>
            </div>
        </div>
    </div>

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.3.2/jquery-confirm.min.js"></script>
    <script src="script.js"></script>
</body>
</html>


dan script.js seperti berikut :
getData();
async function getData(){
    const response = await fetch('/read');
    const json = await response.json();
    console.log(json);
    showData(json);
}

const btnSave = document.getElementById('btn_save');
btnSave.addEventListener('click', async event => {

    const action = btnSave.textContent;

    const nis    = document.getElementById('nis').value;
    const nama   = document.getElementById('nama').value;
    const alamat = document.getElementById('alamat').value;
    const hobi   = document.getElementById('hobi').value;

    let data = {
        nis : nis,
        nama : nama,
        alamat : alamat,
        hobi : hobi,
        action : action
    }

    const options = {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(data)
    };
    const response = await fetch('/api', options);
    const json = await response.json();
    console.log(json);
    
    getData();

    $('#exampleModal').modal('hide');

    if(action === 'Simpan'){
        $.alert('Data Berhasil ditambah!');
    }else{
        $.alert('Data Berhasil dirubah!');
    }
});

function showData(json){
    let tr = '';
    $('#databody').html('');
    let no;
    for (let i = 0; i < json.length; i++) {
        no = i + 1;
        tr = $('<tr/>');
        tr.append("<td>" + no + "</td>");
        tr.append("<td>" + json[i].nis + "</td>");
        tr.append("<td>" + json[i].nama + "</td>");
        tr.append("<td>" + json[i].alamat + "</td>");
        tr.append("<td>" + json[i].hobi + "</td>");
        tr.append(`
            <td>
                <button type="button" class="badge badge-primary badge-pill btnEdit" data-nis="`+ json[i].nis +`">
                    Edit
                </button>
                <button type="button" class="badge badge-danger badge-pill btnHapus" data-nis="`+ json[i].nis +`">
                    Hapus
                </button>
            </td>`
        );
        $('#databody').append(tr);
    }

    //Jquery Selector
    $(function(){
        $('.btnTambahData').on('click', function(){
            document.getElementById('nis').readOnly = false;
            document.getElementById('nis').value = '';
            document.getElementById('nama').value = '';
            document.getElementById('alamat').value = '';
            document.getElementById('hobi').value = '';

            $('#exampleModalLabel').html('Tambah Data Siswa');
            $('.modal-footer button[id=btn_save]').html('Simpan');
        });

        $('.btnEdit').on('click', async function(){
            let nis = $(this).data('nis');
            console.log(nis);


            const url = `readbynis/${nis}`;
            const response = await fetch(url);
            const json = await response.json();
            console.log(json[0].nis);

            document.getElementById('nis').readOnly = true;
            document.getElementById('nis').value = json[0].nis;
            document.getElementById('nama').value = json[0].nama;
            document.getElementById('alamat').value = json[0].alamat;
            document.getElementById('hobi').value = json[0].hobi;

            $('#exampleModalLabel').html('Ubah Data Siswa');
            $('.modal-footer button[id=btn_save]').html('Ubah Data');
            $('#exampleModal').modal('show');
        });

        $('.btnHapus').on('click', async function(){
            let nis = $(this).data('nis');

            $.confirm({
                title: 'Hapus Data Siswa',
                content: 'Apakah Anda Yakin...???',
                buttons: {
                    ya: {
                        text: 'YA',
                        btnClass: 'btn-blue',
                        action: async function(){
                            const url = `hapus/${nis}`;
                            const response = await fetch(url);
                            const json = await response.json();
                            $.alert('Data Berhasil dihapus!');
                            getData();
                        }
                    },
                    tidak: function () {
                        
                    }
                }
            });
        });
    })
}


kemudian rubah file server.js seperti berikut :
const express    = require('express');
const bodyParser = require('body-parser');
const mysql      = require('mysql');
const app        = express();


//Koneksi ke mysql database
const conn = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '',
  database: 'db_nodejs'
});

//connect ke database
conn.connect((err) =>{
  if(err) throw err;
  console.log('Koneksi berhasil');
});

app.use(bodyParser.json());
app.listen(4000, () => console.log('Server berjalan di port 4000'));
app.use(express.static('public'));

//Baca Semua Data
app.get('/read',(req, res) => {

  let sql = "SELECT * FROM tbl_siswa";
  let query = conn.query(sql, (err, results) => {
    if(err) throw err;
    res.json(results);
  });
});

//Baca Data Berdasarkan NIS
app.get('/readbynis/:nis', async (req, res) =>{
    const nis = req.params.nis;
    console.log(nis);

    let sql = "SELECT * FROM tbl_siswa Where nis = "+ nis +"";
      let query = conn.query(sql, (err, results) => {
        if(err) throw err;
        res.json(results);
      });
});

//route untuk insert data
app.post('/api', (req, res) => {
    let action = req.body.action;
    let data = {nis: req.body.nis, nama: req.body.nama, alamat: req.body.alamat, hobi: req.body.hobi};
    let sql;

    if(action === 'Simpan'){
        sql = "INSERT INTO tbl_siswa SET ?";    
    }else{
        sql = `UPDATE tbl_siswa SET nama='`+req.body.nama+`', 
                alamat='`+req.body.alamat+`', hobi='`+ req.body.hobi +`' 
                WHERE nis='`+req.body.nis+`';`
    }
    
    console.log(sql);
    let query = conn.query(sql, data,(err, results) => {
       if(err) throw err;
       res.json(results);
       console.log(results);
    });
});

//Baca Data Berdasarkan NIS
app.get('/hapus/:nis', async (req, res) =>{
    const nis = req.params.nis;
    console.log(nis);

    let sql = `DELETE FROM tbl_siswa Where nis = '`+ nis +`';`
      let query = conn.query(sql, (err, results) => {
        if(err) throw err;
        res.json(results);
      });
});

jika sudah coba jalankan server dengan command berikut :

nodemon server.js

dan kita buka web browser dan jalankan localhost:4000


Tambah Data


 


Edit Data



Hapus Data



 
Sekian sharing kali ini, semoga bermanfaat,, full source code-nya bisa di dowload DISINI

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...