Salah satu client terbesar saya saat ini masih menggunakan database Microsoft SQL Server 2008. Suatu ketika, mereka meminta saya untuk memperbarui salah satu aplikasi web yang dulu pernah saya buat untuk client saya ini, dimana aplikasi web tersebut masih menggunakan PHPMaker v2017.
Mereka menginginkan beberapa fitur tambahan pada aplikasi web tersebut. Sekaligus, mereka ingin supaya aplikasi web bisa dijalankan di Cloud, daripada menggunakan infrastruktur server sendiri yang lokasinya ada di Data Center mereka.
Karena sudah banyak sekali peningkatan fitur pada PHPMaker v2023, apalagi selisih dengan versi v2017 sampai 6 versi major, akhirnya saya memutuskan untuk menggunakan PHPMaker v2023. Rasanya sayang sekali kalau tidak menggunakan fitur-fitur canggih di versi 2023.
Semua system requirement untuk aplikasi PHPMaker v2023 dan web server-nya, tentu sudah saya penuhi. Dilanjutkan dengan proses koneksi ke database Microsoft SQL Server 2008, berjalan dengan lancar, tidak ada kendala sama sekali.
Saat proses generate file script, juga berjalan dengan lancar. Semua file script berhasil di-generate tanpa error atau kendala sama sekali.
Hingga tiba saatnya, aplikasi web dijalankan pada server localhost, dan muncullah error berikut:
D:\wamp\www\newsqlserver2023\vendor\doctrine\dbal\src\Driver\API\SQLSrv\ExceptionConverter.php(33): An exception occurred while executing a query: SQLSTATE [42000, 102]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near ‘OFFSET’. SQLSTATE [42000, 153]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid usage of the option NEXT in the FETCH statement. SQLSTATE [42000, 8180]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Statement(s) could not be prepared.
Sedikit kecewa saat itu, lho kok bisa error sih? Sementara dari sisi aplikasi PHPMaker v2023 berhasil terhubung ke database? Tentu ada yang tidak beres, nih!
Kesimpulan awal, aplikasi web yang dihasilkan oleh PHPMaker v2023 tidak kompatibel dengan database Microsoft SQL Server 2008, sekalipun dari sisi aplikasi PHPMaker-nya tidak ada masalah ketika terhubung ke database tersebut.
Kenapa muncul error tersebut ya? Hm, jadi penasaran nih. Oke, kalau begitu, saatnya mencoba aplikasi PHPMaker v2022, eh hasilnya juga sama dengan PHPMaker v2023.
Karena masih penasaran juga, lalu saya coba mundur satu versi major sebelumnya, yaitu v2021, dan ternyata berhasil Saudara-saudara!
Benang merah pun mulai terlihat. Aplikasi web yang dihasilkan oleh PHPMaker v2021 berjalan dengan mulus saat menggunakan database Microsoft SQL Server 2008, sementara tidak berhasil untuk aplikasi web yang dihasilkan oleh PHPMaker v2022 maupun v2023; muncul error yang sama dengan di atas tadi.
Akhirnya saya baca-baca ulang lagi dokumentasi yang menjelaskan perubahan dari versi 2021 ke versi 2022. Di situ dijelaskan bahwa DBAL (Database Abstraction Layer) yang digunakan oleh PHPMaker v2022 telah di-upgrade ke versi 3 dari versi 2.
Apalagi di sana disebutkan bahwa DBAL 3 tidak mendukung database Microsoft SQL Server 2008 dan versi-versi sebelumnya. Wah, semakin kecewa deh jadinya.
Hmmm, tapi tunggu dulu. Jangan cepat menyerah gitu dong. Pasti ada celah nih yang bisa digunakan supaya bisa seperti PHPMaker v2021. Naluri detektif pun muncul kembali.
Langsung saya bandingkan script DBAL yang digunakan oleh aplikasi web yang dihasilkan oleh PHPMaker v2021 dan v2022.
Singkat cerita, dapatlah perbedaannya pada file AbstractSQLServerDriver.php yang lokasinya berada pada folder berikut: D:\wamp\www\phpmaker2021\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\
Coba perhatikan beberapa baris kode di bagian atas file tersebut:
<?php
namespace Doctrine\DBAL\Driver;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Driver;
use Doctrine\DBAL\Driver\DriverException as TheDriverException;
use Doctrine\DBAL\Exception;
use Doctrine\DBAL\Exception\DriverException;
use Doctrine\DBAL\Platforms\SQLServer2005Platform;
use Doctrine\DBAL\Platforms\SQLServer2008Platform;
use Doctrine\DBAL\Platforms\SQLServer2012Platform;
use Doctrine\DBAL\Platforms\SQLServerPlatform;
...
?>
Sengaja saya potong isi file tersebut, dengan menampilkan pada bagian teratas itu saja.
Sekarang perhatikan lagi potongan kode yang berikut:
...
use Doctrine\DBAL\Platforms\SQLServer2005Platform;
use Doctrine\DBAL\Platforms\SQLServer2008Platform;
use Doctrine\DBAL\Platforms\SQLServer2012Platform;
...
Sementara pada aplikasi web yang dihasilkan oleh PHPMaker v2022 dan v2023, tidak ada kode tersebut. Nah, akhirnya mulai ketahuanlah penyebabnya. Pantesan aplikasi web yang dihasilkan oleh v2022 maupun v2023 tidak berhasil.
Berarti, kesimpulannya, versi DBAL yang digunakan oleh PHPMaker v2023 harus di-downgrade ke versi DBAL yang digunakan oleh PHPMaker v2021.
Oke, saatnya untuk mengubah kode berikut pada file template yang bername composer.json pada direktori berikut: C:\Users\{user}\AppData\Roaming\phpmaker2023\node_modules\@phpmaker\php2023.
...
"doctrine/dbal": "^3.4.4",
...
menjadi seperti ini:
...
"doctrine/dbal": "^2.12.1",
...
Itu artinya, kita men-downgrade versi DBAL-nya dari versi 3.4.4. ke versi 2.12.1. Mengapa? Karena PHPMaker v2021 menggunakan DBAL versi 2.12.1.
Setelah file composer.json disimpan, lalu coba generate ulang semua file script dengan PHPMaker v2023. Sambil memperhatikan log generate, ternyata PHPMaker v2023 otomatis meng-upgrade lagi versi DBAL-nya dari versi 2.12.1 ke versi 2.13.9:
...
- Installing doctrine/dbal (2.13.9): Extracting archive
...
Ketika saya cek ke github-nya si dbal, ternyata versi minor terakhir untuk versi 2 memang betul versi 2.13.9. Cukup cerdik juga nih composer-nya. Dia otomatis menyarankan untuk pakai versi minor yang terakhir.
Oke, sampai di sini, berarti proses downgrade dari versi 3 ke versi 2 berjalan dengan lancar.
Setelah semua file script berhasil di-generate, maka tibalah saatnya untuk mencoba aplikasi web yang dihasilkan oleh PHPMaker v2023. Mau tahu hasilnya?
Horeeee… ternyata berhasil Saudara-saudara! Akhirnya, aplikasi web yang dihasilkan oleh PHPMaker v2023, berhasil terhubung ke database Microsoft SQL Server 2008 tanpa error sedikitpun. Wussshh… wusshhh… berjalan dengan lancar.
Rasanya senang, lega, dan puas semuanya bercampur menjadi satu. Plus bonus senyum-senyum sendiri, sambil ngomong dalam hati: oalaaaaah, ternyata begitu saja toh solusinya. Hohoho… 😀
Sebenarnya saya masih curiga. Kok semudah itu ya, Ferguso? Jangan-jangan ini hanya berhasil terhubung ke database dan menampilkan datanya saja. Bagaimana dengan fungsi-fungsi CRUD? Apakah bisa?
Hmm… akhirnya karena masih penasaran, langsung coba dong fungsi-fungsi CRUD-nya…, eeeh ternyata berjalan dengan mulus juga, Saudara-saudara! Keren kan?
Sampai di sini saya memang belum melihat apa saja fitur-fitur di DBAL 3 yang tidak terdapat di DBAL 2. Tapi untuk saat ini, paling tidak kita sudah berhasil membuat PHPMaker v2023 menyapa database Microsoft SQL Server 2008 melalui aplikasi web yang sudah dihasilkan olehnya.
Rasanya sayang untuk dilewatkan begitu saja peristiwa ini. Jadilah artikel ini, siapa tahu ada yang membutuhkan. Paling tidak, kalau di waktu mendatang Penulis mengalami kejadian yang mirip seperti tadi, sudah tahu di bagian mana yang perlu disesuaikan.
Semakin keren aja nih PHPMaker v2023. Ternyata aplikasi web yang dihasilkannya masih bisa menyapa database Microsoft SQL Server 2008.
Semoga fungsi-fungsi lainnya lancar-lancar saja ya, meskipun DBAL yang digunakan di-downgrade dari versi 3 ke versi 2.
Artikel ini diperbarui pada Senin, 14 November 2022 dengan temuan sebagai berikut:
Fungsi CRUD secara umum berjalan dengan normal, data bisa ditampilkan pada halaman List, View, Edit, demikian juga fungsi Add, Edit, dan Delete berjalan lancar.
Ditemukan error [SQL Server]’CONCAT’ is not a recognized built-in function name saat Pengguna Akhir melakukan pencarian pada field yang menggunakan Lookup Table, baik melalui Modal Dialog maupun kotak pencarian di control Select2.
Untuk mengatasi error tersebut, maka satu-satunya cara adalah dengan memodifikasi kode yang sudah di-generate oleh PHPMaker. Kode ini berada di dalam folder models pada nama table yang bertalian. Contoh, kode berikut terdapat di dalam file CbaDetail.php untuk table yang bernama cba_detail.
Kita cukup menyesuaikan parameter ke-16 (terakhir) dari object Lookup di bawah ini, misalnya kita mengganti kode berikut:
$this->Kantor_Tujuan->Lookup = new Lookup('Kantor_Tujuan', 'master_kantor', false, 'Kode_Kantor', ["Nama_Kantor","Kode_Kantor","",""], '', '', [], [], [], [], [], [], '', '', "CONCAT([Nama_Kantor],'" . ValueSeparator(1, $this->Kantor_Tujuan) . "',[Kode_Kantor])");
menjadi seperti ini:
$this->Kantor_Tujuan->Lookup = new Lookup('Kantor_Tujuan', 'master_kantor', false, 'Kode_Kantor', ["Nama_Kantor","Kode_Kantor","",""], '', '', [], [], [], [], [], [], '', '', '');
Mengapa? Karena fungsi CONCAT baru hanya ada di database Microsoft SQL Server 2012, sedangkan di Microsoft SQL Server 2008 belum ada. Oleh karena itu, kita cukup mengganti parameter ke-16 (terakhir) dari object Lookup menjadi string kosong (”).
Alternatif solusi lainnya adalah dengan membuat Database View yang menggabungkan dua field tadi menjadi satu field lalu beri nama alias untuk gabungan kedua field tersebut. Selanjutnya jadikan field gabungan di Database View tadi menjadi Display field #1 saja.
Dengan cara yang terakhir ini, maka kita tidak perlu menyesuaikan kode yang sudah di-generate oleh PHPMaker 2023. Keren, ‘kan? 😉
Diki mengatakan
sungguh pengalaman yang luar biasa om Masino
anda membeberkan segalanya disini seolah-olah hal itu biasa, semoga pencerahan dan pengalaman anda termasuk dalam kategori ibadah yaa.
Tetap berkarya om.
Salam
Masino Sinaga mengatakan
Amiiin. Terima kasih om Diki. 😀