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.
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???
artikel bagus, ikutan nyoba bro
Yup, tampilan sms per nomor bisa makai di atas.
Untuk tampilan utama sms bisa ngambil dari sini : Menampilkan Menu SMS seperti di smartphone
artikelnya yang bagus, ikutan nyoba bro