#SMSGateway Menampilkan Percakapan SMS seperti Chatting

3
2994
Halaman:
Sertakan sumber dengan jelas jika ingin mencopy. Selalu cek tanggal, karena mungkin ada beberapa artikel lama yang belum disesuaikan dengan fakta terbaru

Menampilkan Percakapan SMS seperti Chatting. Hai sob, kali ini saya akan membahas "Bagaimana menampilkan pesan sms (Inbox dan Sentitems) Layaknya percakapan seperti chatting".

Tampilan SMS seperti percakapan/chatting sudah ada untuk smartphone, namun untuk handphone jadul SMS masih ditampilkan per item, dimana pesan paling baru ditampilkan paling atas.
Secara default database gammu sudah tersedia table inbox dan sentitems. Namun tidak serta merta bisa langsung menampilkan SMS seperti chatting.


General Information  dan Minimum Requirement Menampilkan Percakapan SMS seperti Chatting

  • Tested on MySQL 5.xx
  • Mengerti perintah query mysql (Create, insert dan Select)
  • Mengerti fungsi IF (kondisional)
  • Mengerti fungsi UNION
  • Database Default Gammu (Inbox n Sentitems with data) kalo belum ada di isi dulu datanya, pake manual insert

Kita mulai dari yang paling mudah

Query menampilkan semua pesan masuk :




 SELECT * FROM `inbox`;

Query menampilkan pesan terkirim:

SELECT * FROM `sentitems`;

Query menampilkan pesan masuk dan pesan terkirim

SELECT *
FROM `inbox` a
  JOIN `sentitems` b
    ON `a`.`SenderNumber` = `b`.`DestinationNumber`
WHERE `a`.`SenderNumber` = `number`;

Query diatas tidak bisa dipakai untuk menampilkan data inbox dan sentitems seperti percakapan layaknya chatting karena ada perintah "join".  Baris inbox akan digabung dengan baris sentitems dalam 1 baris. Padahal untuk menampilkan percakapan baris inbox dan baris sentitems tidak digabung jadi satu baris, namun diurutkan berdasarkan waktu.

MySQL menyediakan perintah "UNION" untuk hal tersebut

SELECT * FROM
(subquery1
UNION
subquery2) a where `number` =`number`;

Sehingga querynya menjadi sebagai berikut :

SELECT *
FROM (SELECT
        `ID`,
        `DestinationNumber`  AS `Number`,
        `SendingDateTime`    AS `Time`,
        `TextDecoded`        AS `Pesan`
      FROM `Sentitems`
      WHERE `DestinationNumber` = '+6289647425433'
      UNION 
      SELECT
    `ID`,
        `SenderNumber`,
        `ReceivingDateTime`,
        `TextDecoded`
      FROM `inbox`
      WHERE `SenderNumber` = '+6289647425433') a
ORDER BY TIME DESC;

Query tersebut akan menampilkan hasil seperti berikut :

+------+----------------+---------------------+---------------------------------+
| ID   | Number         | Time                | Pesan                           |
+------+----------------+---------------------+---------------------------------+
| 5251 | +6289647425433 | 2014-09-23 14:16:34 | yo ndang mangkat                |
|  501 | +6289647425433 | 2014-09-23 14:16:28 | Aku tak mrono                   |
| 5255 | +6289647425433 | 2014-09-17 07:26:07 | Angkringane pak slamet?         |
|  493 | +6289647425433 | 2014-09-17 07:25:30 | Ngopi po?                       |
| 5252 | +6289647425433 | 2014-09-16 09:51:32 | apik ae ndes                    |
|  493 | +6289647425433 | 2014-09-15 12:12:49 | Piye john                       |
+------+----------------+---------------------+---------------------------------+
6 rows in set (0.00 sec)

Perhatikan   kolom ID, yang 3 digit diambil dari sentitems, sedangkan yang 4 digit diambil dari inbox. Kolom id bisa juga sama bila beda table, misal sentitems.ID nilainya 101, bisa jadi inbox.id nilainya juga 101. ID tidak menjadi patokan untuk query percakapan seperti ini. ID akan dipakai dan dijadikan "keyword" bila menampilkan detail pesan tersebut.

Artikel Terkait :  #SMSGateway Tes Modem dengan Hyperterminal SMS Gateway Bag-1

Terkadang baris sentitems dan inbox juga tidak selalu bergantian, tapi tergantung tanggalnya ("ORDER BY Time desc").
Nama field/kolom  subquery 2 tidak ditampilkan, namun masuk ke field subqyery1, sesuai urutan fieldnya.

Perhatikan lagi, perintah subquery2

SELECT
  `ID`,
  `SenderNumber`,
  `ReceivingDateTime`,
  `TextDecoded`
FROM `inbox`
WHERE `SenderNumber` = '+6289647425433'

SenderNumber, ReceivingDateTime dan TextDecoded masing-masing masuk field subquery 1.

Untuk membedakan mana pesan masuk dan pesan terkirim bisa ditambahkan field yang nilainya itu pasti dan tidak berubah,  misalnya StatusError dari SentItems dan dari inbox bisa diambil field mana saja. Pastinya menggunakan kondisional "IF".

Nilai dari field tersebut nantinya yang akan membedakan mana inbox mana sentitems.
Querynya menjadi sebagai berikut:

SELECT *
FROM (SELECT
        `ID`,
        `DestinationNumber`  AS `Number`,
        `SendingDateTime`    AS `Time`,
        `TextDecoded`        AS `Pesan`, 
        IF (`StatusError`='-1', 'Sentitems', 'Inbox') AS `Folder` /* Standar Database Gammu StatusError nilainya pasti '-1' */
      FROM `Sentitems`
      WHERE `DestinationNumber` = '+6289647425433'
      UNION 
      SELECT
    `ID`,
        `SenderNumber`,
        `ReceivingDateTime`,
        `TextDecoded`, IF (`SenderNumber` <> '-1', 'Inbox', 'SentItems') AS `Folder` /* Field bebass, yang penting nilainya tidak '-1' */
      FROM `inbox`
      WHERE `SenderNumber` = '+6289647425433') a
ORDER BY TIME DESC;

Dan hasilnya tadaaaa :

+------+----------------+---------------------+-------------------------+----------------+
| ID   | Number         | Time                | Pesan                   | Folder         |
+------+----------------+---------------------+-------------------------+----------------+
| 5251 | +6289647425433 | 2014-09-23 14:16:34 | yo ndang mangkat        | Sentitems      |
|  501 | +6289647425433 | 2014-09-23 14:16:28 | Aku tak mrono           | Inbox          | 
| 5255 | +6289647425433 | 2014-09-17 07:26:07 | Angkringane pak slamet? | Sentitems      |
|  493 | +6289647425433 | 2014-09-17 07:25:30 | Ngopi po?               | Inbox          |
| 5252 | +6289647425433 | 2014-09-16 09:51:32 | apik ae ndes            | Sentitems      |
|  493 | +6289647425433 | 2014-09-15 12:12:49 | Piye john               | Inbox          |
+------+----------------+---------------------+-------------------------+----------------+
6 rows in set (0.00 sec)

Ada pertanyaan???

3 COMMENTS

Jangan lupa tinggalkan komentar ya gais

This site uses Akismet to reduce spam. Learn how your comment data is processed.