Praktik terbaik untuk memindahkan aplikasi MS Access besar ke .Net?

26

Kami memiliki aplikasi MS Access yang sangat besar yang dikembangkan in-house awalnya untuk kebutuhan pribadi kami yang kemudian diubah menjadi perangkat lunak komersial dan berhasil dijual. Perangkat lunak ini adalah semacam "perangkat lunak serba guna untuk bisnis Anda" dan berisi beberapa modul termasuk Sistem Manajemen Dokumen, Perencanaan Sumber Daya Perusahaan, Manajemen Inventaris, Manajemen Hubungan Pelanggan, Analisis Data, dll. Kami cukup puas dengan yang ada saat ini fungsionalitas aplikasi, tetapi untuk memenuhi permintaan dari klien kami, kami menyadari bahwa kami harus pindah ke sesuatu yang baru.

Kami memutuskan untuk secara bertahap memindahkan aplikasi kami ke .Net karena kami dapat tetap menggunakan Visual Basic .Net: meskipun ini adalah bahasa baru bagi sebagian besar pengembang di sini, kami memiliki pengetahuan mendalam tentang VBA dan beberapa lusin proyek kecil yang diimplementasikan di VB6.

Kami sudah mulai memindahkan fungsionalitas lapisan data aplikasi kami ke MS SQL Server, sehingga setiap manipulasi dan pencarian data dilakukan langsung di server.

Apa yang kami cari adalah praktik terbaik untuk secara bertahap memindahkan GUI kami yang luas (sekitar 500-600 bentuk berbeda termasuk subformulir, sekitar 200 laporan dengan dukungan multi-bahasa, dll). Mengikuti permintaan terbaru dari pelanggan potensial kami untuk mengimplementasikan enkripsi data asinkron pada dokumen dalam DMS, kami juga akan dengan senang hati memisahkan bagian ini dari MS Access dan mengimplementasikannya dalam .Net.

Pertanyaannya adalah bagaimana mengintegrasikan aplikasi .Net dengan sistem MS Access yang ada, sehingga kita dapat menjalankannya dengan parameter tertentu (hak pengguna dll.) Dan memungkinkan pertukaran data antara aplikasi ini dan menjalankan aplikasi MS Access.


EDIT:

Kami mencoba menerapkan beberapa praktik dari buku Martin Fowler " Pola integrasi perusahaan " untuk mencapai beberapa integrasi antara aplikasi MS Access dan beberapa utilitas kecil yang kami implementasikan di .Net untuk berbagai kebutuhan. Tetapi kami hanya berhasil menggunakan pola "database bersama" dan tidak benar-benar puas dengan solusi kami.

Misalnya, kami menerapkan utilitas kecil yang berjalan sebagai layanan Windows yang secara otomatis mengunduh semua pesan dari server surat menggunakan koneksi POP3 dan menyimpannya dalam satu tabel, sedangkan semua lampiran disimpan dalam sistem file.

Apa yang kami terutama lakukan adalah kami menggunakan ADO.NET untuk secara langsung mengakses database MS Access dalam format MDB dan mengisi tabel dengan beberapa data yang diproses (seperti data tentang pesan email dari contoh di atas: kami memiliki bidang untuk FROM, TO, CC, BCC, Subjek dan Tubuh).

Sama sekali tidak ada masalah untuk bekerja dengan format data MDB dari .Net , apalagi kita tidak ingin tetap menggunakan MDB dan meningkatkan hampir semuanya menjadi MS SQL Server 2008 - ini memberi kita lebih banyak kebebasan mengenai manajemen data dan skalabilitas.

Masalah utama di sini adalah bahwa kita tidak tahu bagaimana menerapkan semacam "panggilan balik" di Access sehingga kita dapat memicu eksekusi kode VBA tertentu pada pembaruan data.

Kami memiliki harapan besar dengan pembaruan yang mendukung MS Access 2010 dan menyisipkan pemicu untuk tabel data , tetapi ternyata kami hanya bisa menggunakan MS Access Macro untuk pemicu ini dan tidak ada cara untuk menjalankan kode VBA khusus dalam pemicu.

Kami juga mencoba beberapa solusi dengan mengirim penekanan tombol langsung ke jendela MS Access untuk meniru beberapa permintaan data yang diminta pengguna. Ini bekerja, tetapi kami tidak berpikir ini adalah solusi yang dapat digunakan yang dapat digunakan dalam produksi.

Kami juga melihat ke DDE untuk MS Access, tetapi kami tidak dapat menemukan solusi sampel yang baik mengimplementasikan perintah DDE dan menggunakannya untuk data dalam memori dan pertukaran perintah.

Jadi, masalah utama adalah untuk memiliki MS Access dan aplikasi .Net hidup berdampingan dan berinteraksi satu sama lain.

EDIT2 :

Saya lupa menyebutkan apa yang kami juga mengimplementasikan perpustakaan MSMQ di VBA untuk melewati pesan antara .Net dan MS Access, masalahnya lagi adalah kurangnya callback di sini: kami benar-benar harus polling antrian untuk pesan baru dan mengingat bahwa VBA tidak benar-benar mendukung multi-threading itu bukan solusi yang bagus.

Alexander Galkin
sumber
Sudahkah Anda melakukan aplikasi .NET proof-of-concept kecil untuk melihat seberapa baik Anda dapat membuat kedua bagian bekerja sama? Masalah apa yang Anda temui?
sq33G
Bagaimana cara menyebarkan aplikasi Access Anda? Dan apa teknik otentikasi?
Skrol29
@ sq33G: Saya mengedit pertanyaan saya untuk membahas topik-topik ini.
Alexander Galkin
@ Skrol29: Kami biasanya menggunakannya sebagai MDB (.MDE) yang dikompilasi bersama dengan runtime MS Access. Kami menggunakan Otentikasi Windows yang dikelola melalui Active Directory untuk koneksi dan izin basis data.
Alexander Galkin
3
Pertanyaan bagus Ini adalah masalah yang sangat praktis sehingga banyak perusahaan non-perangkat lunak yang tumbuh dengan cepat sering kali menghadapi dan terlempar ke pangkuan pengembang - ketika database akses "do everything" tidak dapat mengukur kebutuhan mereka yang terus meningkat.
bunglestink

Jawaban:

17

Ini akan menjadi proyek besar dan sangat terlibat. Saya telah bertanggung jawab untuk memigrasi database Access ke .NET berkali-kali, tetapi tidak pernah dalam skala ini. Saya setuju bahwa pendekatan bertahap mungkin akan menjadi yang paling realistis. Mencoba melakukan segala sesuatu dalam satu kesempatan adalah cara mudah untuk gagal.

Seperti dalam jawaban lain, langkah pertama dan paling penting adalah memindahkan semuanya ke SQL Server. Saat melakukan ini, dokumentasikan basis data jika ini belum dilakukan, dan identifikasi area untuk refactoring jika ada. Akses basis data yang tumbuh untuk memenuhi kebutuhan yang berkembang seringkali memiliki model data yang dapat diperbaiki ketika melihat gambaran besar.

Selanjutnya, kenali modul aplikasi yang "lengkap". Karena ini adalah database do-everything, mungkin akan ada modul yang hampir saling terpisah satu sama lain. Setelah bagian-bagian yang terpisah ini, identifikasi salah satu modul yang lebih kecil yang paling diuntungkan dari pembaruan, dan lakukan terlebih dahulu.

Saat bermigrasi ke .NET, jangan hanya melakukan 1 hingga 1 salinan aplikasi sederhana. Kumpulkan masukan dari pengguna untuk mengidentifikasi titik nyeri dengan aplikasi saat ini. Anda ingin unit migrasi pertama Anda menjadi sukses besar untuk mendapatkan pembelian lengkap dari orang lain.

Setelah Anda menyelesaikan unit pertama, lihat apa yang terjadi dalam hal tantangan, kesulitan, dll, dan gunakan ini untuk maju.

Satu hal yang saya akan sangat menyarankan untuk mengimplementasikan modul yang berfungsi sebagian (mis: "kami memigrasikan CRM, tetapi fitur X, Y, Z belum ada dalam sistem baru"). Ini akan menyebabkan pengguna dengan cepat menjadi frustrasi karena memiliki sistem yang tidak lengkap ketika yang lama bagi mereka "baik-baik saja". Pengembangan semacam ini mungkin berfungsi baik untuk domain lain, tetapi tidak di bisnis di mana pengguna melihat "tidak ada yang salah" dengan monolith Access lama dan tidak memahami kebutuhan migrasi.

bunglestink
sumber
1
Mampu mendukung banyak bahasa akan jauh lebih mudah. Meskipun Anda harus membuat keputusan desain yang memungkinkan mendukung banyak bahasa, Anda harus berkonsentrasi seperti yang disarankan bunglestink pada elemen tertentu. Saya juga akan datang dengan tata letak dan aliran untuk semua formulir, jelas menghindari menghubungkan ke bentuk apa pun yang tidak 100% lengkap, ini menghindari fungsi parsial.
Ramhound
7

Berikut adalah semacam rencana untuk mengubah aplikasi MS Access Anda menjadi aplikasi VB.Net secara mutasi.

Ini bukan rencana umum, rencana berikut ini tergantung pada proyek yang telah Anda jelaskan.

Langkah 1: memigrasi semua data ke SQL Server

Jangan gunakan ODBC untuk koneksi Akses ke SQL Server, gunakan Access Project (ADP) sebagai gantinya. Access Project adalah file Access dengan ekstensi .adp, ia memiliki fitur Access penuh (Makro, Formulir, Laporan, Modul) tetapi koneksi langsung pada database SQL Server alih-alih file MDB. File ADP sangat kompatibel dengan file MDB. Mereka tampaknya tidak didukung di Access 2010, sementara pada kenyataannya fitur ini disembunyikan tetapi didukung dengan sangat baik. Seperti MDE, file ADP dapat "dikompilasi" menjadi file ADE.

Bermigrasi ke SQL Server akan membutuhkan beberapa modifikasi dalam struktur data dan kode, tetapi semuanya cukup mudah untuk dimigrasi. Dan itu adalah target akhir.

Lupakan tentang memicu peristiwa basis data ke kode VBA atau VB.Net. Ini secara teknis dapat dilakukan dengan menggunakan SQL Server Extended Stored Procedures, tetapi merupakan trik yang sangat buruk. Proyek Anda memiliki masa depan, jadi lebih baik untuk menegakkan struktur datanya dengan menghindari jembatan yang merusak seperti itu. Secara umum, mengalah dengan pemicu basis data, itu cerdas tetapi cukup sulit untuk dipertahankan.

Langkah 2: buat seragam otentikasi

Ini adalah hal yang baik bahwa aplikasi Anda tidak berdasarkan pada keamanan akses (file MDW).

Buat rencana untuk otentikasi target untuk aplikasi VB.Net, dan kemudian tentukan cara untuk memigrasi otentikasi akses ke target ini untuk memiliki otentikasi seragam antara kedua aplikasi.

Karena otentikasi melintang dalam arsitektur aplikasi, ini akan lebih mudah untuk mengiris antara versi Access ke versi VB.Net.

Langkah 3: siapkan fitur token untuk membuat jembatan antara Access dan VB.Net

Anda mengatakan, Access UI harus membuka UI VB.Net dengan beberapa parameter yang akurat dan juga otentikasi. Dan Anda mungkin harus melakukan hal yang sama dengan cara lain.

Solusi yang baik adalah membangun fitur token kecil berdasarkan tabel token: kolom bisa berupa token id (integer), kunci token (string panjang), tanggal token, dan daftar parameter (string atau teks panjang). Setiap kali Access perlu membuka layar VB.Net, lalu menyimpan token di database dengan parameter, dan kemudian buka aplikasi VB.Net Anda hanya dengan token id dan kunci token. VB.Net terbuka, cari id token di database, periksa kunci (ini berlaku sebagai otentikasi) dan baca parameternya. Kemudian terbuka ke formulir yang sesuai, dan melakukan apa yang diperlukan. Jangan lupa untuk memberi durasi pada token, dan untuk membersihkan token lama.

Jika Anda perlu melakukan panggilan balik dari VB.Net ke Access (Anda mungkin akan), maka saya pikir mungkin untuk mengaktifkan beberapa kode VBA pada file MDB Access yang dibuka, menggunakan OLE.

Langkah 4: memigrasi UI dan Modul layar demi layar, modul demi modul

Sekarang persiapan besar sudah selesai. Anda dapat mulai memigrasikan antarmuka pengguna dari Ms Access ke VB.Net.

Tidak ada alat otomatis yang baik untuk melakukan ini. VBA dan .Net terlalu berbeda. Anda harus menyiapkan pekerjaan Anda untuk migrasi semacam itu. Mulai dengan formulir kecil, seperti kotak "Tentang", dan lanjutkan dari formulir sederhana ke formulir rumit. Tentu saja Anda harus menggabungkan dan menjadwalkan beberapa migrasi, tetapi Anda akan secara bertahap memigrasikan layar, laporan, dan pustaka Anda dari Ms Access ke VB.Net.

Skrol29
sumber
1

Saya kagum Anda melakukan semua itu dengan Access. Ada pertanyaan yang sangat penting yang tidak Anda tanyakan. Formulir Windows NET atau .NET WPF. WPF memiliki kurva belajar yang lebih curam, tetapi menurut saya lebih kuat dengan UI yang lebih baik. Kami baru-baru ini mengonversi aplikasi komersial kami dari Formulir ke WPF dan kami sudah mendapatkan lebih banyak penjualan. Kami juga menambahkan fitur baru tetapi WPF UI lebih seksi. Tinjau desain meja Anda dan bersihkan - sekarang saatnya. Pastikan Anda mendeklarasikan semua Anda sebagai FK. Di Access, Anda dapat menambahkan barang dengan cepat beberapa kali barang tergelincir. Jika ini adalah WPF UI pertama Anda buat beberapa prototipe. Kita bisa memasukkan lebih banyak ke WPF bahwa aplikasi baru memiliki lebih banyak fitur, lebih sedikit layar, dan lebih sedikit kode lebih sedikit. Anda akan beralih dari membenci XAML ke betapa mencintainya. Pertimbangkan struktur seperti MVVM.

paparazzo
sumber
Kami telah mengembangkan beberapa aplikasi .Net kecil menggunakan WinForms, WPF dan Silverlight (keduanya sebagai RIA dan out-of-browser) dan saya setuju bahwa WPF (dan Silverlight) memberikan tampilan dan nuansa yang jauh lebih seksi untuk aplikasi.
Alexander Galkin
0

Karena Anda sudah memiliki pemahaman yang baik tentang model objek Access, saya akan berpikir bahwa Anda ingin menggunakan Access Interop dari aplikasi .NET Anda. Seharusnya (lebih atau kurang) memungkinkan Anda untuk mengotomatiskan kontrol aplikasi Access, tanpa kekaburan dari DDE.

sq33G
sumber
Meskipun saya pikir ini adalah ide yang bagus, jika mereka menggunakan versi Access yang lebih lama, mereka mungkin tidak memiliki tingkat fungsionalitas yang mereka butuhkan.
jfrankcarr
-1

Saya tidak tahu pengetahuan mendalam tentang lapisan logika bisnis Anda, tetapi Anda juga dapat mengakses database MS Access di aplikasi .NET Anda. Jika ini bukan hanya tentang mengambil data, Anda dapat menerapkan koneksi TCP / IP antara program Anda (aplikasi VB6 dan VB.NET). Silakan lihat artikel di CodeProject .

Osman Turan
sumber
"... aktifkan pertukaran data antara aplikasi ini dan menjalankan aplikasi MS Access." jika pernyataan itu tidak terkait dengan jawaban saya. Maka saya juga tidak tahu apa-apa.
Osman Turan
Baik. Permintaan maaf saya. Penghapusan unduhan dihapus.
Arseni Mourzenko
@MainMa: Tidak masalah.
Osman Turan
1
Saya pikir, jawaban saya masih valid setelah Anda edit. Saya menyebutkan tentang dua cara. Salah satunya akses langsung yang tidak berguna setelah diedit, dan yang lainnya adalah membuat aplikasi N-Tier. Saya pikir, Anda harus menerapkan protokol TCP / IP antara aplikasi Anda. Saya terutama merekomendasikan metode ini bahkan jika Anda ingin menjalankan aplikasi Anda di mesin yang sama. Karena, dalam pengalaman lama saya, saya menemukan bahwa DDE tidak terlalu dapat diandalkan untuk penggunaan seperti itu dan itu sangat menjengkelkan. Satu pendekatan lain untuk aplikasi lokal dapat menggunakan pesan sistem khusus (pesan jendela).
Osman Turan
1
Sepertinya Anda memiliki masalah yang lebih besar daripada yang terlihat :) Karena, setelah setiap komentar saya, Anda mengungkapkan sesuatu yang baru. Saya tidak terbiasa dengan MSMQ BTW. Maaf.
Osman Turan
-1

Anda meminta praktik terbaik tentang cara melakukan hal yang salah. Tidak ada. Praktik terbaik mencakup cara membuat sistem yang dapat dipelihara secara efektif, sehingga meskipun bus mengalami kecelakaan dan tim yang sama sekali baru perlu kedinginan, pengembangan dan dukungan dapat dilanjutkan. Sistem yang Anda gambarkan akan mengirim sebagian besar pengembang berjalan ke bukit. Anda memiliki produk yang dibangun dengan teknologi usang dan ingin berinteraksi dengan teknologi saat ini. Dan Anda ingin melakukannya dengan mengatasi salah satu pola anti yang telah Anda jelaskan untuk produk inti. Pengembang yang bersedia menangani itu kemungkinan tidak mau melakukannya dengan kondisi yang Anda usulkan.

Namun bus Anda belum mogok sehingga Anda dapat memanfaatkan tim yang ada yang memahami sistem. Cara terbaik untuk berkembang secara bertahap yang saya temukan adalah menggunakan Metodologi Agile. Ini mendukung proses berulang yang membahas persyaratan risiko tinggi sejak dini dan menangani kebutuhan bisnis dengan baik.

SoylentGray
sumber
-2

Kami memutuskan untuk secara bertahap memindahkan aplikasi kami ke .Net

Seringkali sebuah kesalahan. Praktik terbaik adalah jangan mencoba "secara bertahap".

meskipun ini adalah bahasa baru bagi sebagian besar pengembang di sini, kami memiliki pengetahuan mendalam tentang VBA dan beberapa lusin proyek kecil yang diimplementasikan di VB6.

Bukan dasar yang sangat baik untuk mengambil keputusan. Jika Anda ingin belajar bahasa baru, jangan belajar VB. Pelajari C # atau sesuatu yang lebih baik seperti Java.

"bahasa baru untuk sebagian besar pengembang di sini, kami memiliki pengetahuan mendalam tentang VBA" adalah ungkapan kode umum untuk "kami memiliki Guru VBA yang tidak ingin kami jengkel". Itu juga sesuatu yang mungkin buruk.

Apa yang kami cari adalah praktik terbaik untuk secara bertahap memindahkan GUI kami yang luas

Praktik terbaik tidak melibatkan "Bertahap". Mereka melibatkan "Buang Sepenuhnya".

Migrasi bertahap yang saya lihat telah rusak karena sangat sulit.

Anda lebih baik melakukan ini.

  1. Pertahankan aset yang paling berharga . Data. Pindahkan semua data ke SQL Server. Semua itu. Menulis ulang semua MS-Access untuk menggunakan koneksi ODBC ke SQL Server. Sekarang juga.

  2. Memecat siapa pun yang membuat tabel atau data sementara atau apa pun di MS-Access. Semua data harus hidup dalam database di luar MS-Access. Data di MS-Access adalah penyebab masalah, jadi berhentilah sekarang dan pastikan semua orang setuju. Jika mereka tidak setuju, cari mereka pekerjaan baru yang tidak melibatkan peretasan di MS-Access saat Anda mencoba untuk menyingkirkan MS-Access.

  3. Temukan kerangka kerja pelaporan yang secara otomatis akan menghasilkan laporan yang mendekati yang Anda miliki sekarang. Tanpa pemrograman. Berikan saja meja atau tampilan dan bang! selesai.

  4. Hitung semua 500 laporan. Partisi menjadi laporan yang mudah dibuat dengan alat dan laporan yang lebih sulit. Prioritaskan yang sulit menjadi "Harus Memiliki", "Harus Dimiliki", Bisa Memiliki "dan" Tidak Akan Dilakukan Sampai Kemudian "Ganti laporan otomatis dan yang harus ada laporkan alat pelaporan ini sepenuhnya di luar MS-Access.

    Pengalaman saya adalah bahwa tampilan basis data sering digunakan kembali dalam sekitar 20 atau lebih laporan. Dari situ, saya kira Anda memiliki 25 pandangan yang relevan dari mana 500 laporan berasal. Alat apa pun yang dapat mengotomatisasi produksi laporan harus menangani sebagian besar pelaporan Anda dari sekumpulan kecil tampilan SQL yang dikerjakan dengan baik. Beberapa laporan akan terlalu rumit atau sulit untuk alat otomatis.

  5. Temukan kerangka kerja pengembangan yang membangun transaksi CRUD secara otomatis.

  6. Partisi 200 formulir Anda menjadi formulir CRUD (yang dapat dibangun secara otomatis) dan formulir non-CRUD. Di antara non-CRUD, prioritaskan menggunakan aturan MoSCoW (Harus, Harus, Bisa, Tidak akan).

    Seringkali, 60-80% formulir aplikasi sederhana, formulir CRUD otomatis. 20-40% lebih kompleks dan membutuhkan pemrograman yang lebih terampil. Berdasarkan ini, Anda memiliki 120 hingga 160 formulir CRUD yang tidak perlu Anda tulis ulang, cukup otomatiskan. Anda memiliki 40-80 transaksi yang sangat rumit.

  7. Bangun formulir CRUD dan formulir non-CRUD Must-have.

  8. Evaluasi kesenjangannya. Prioritaskan kembali dan mulailah mengerjakan bagian terpenting dari daftar "Yang Harus Dimiliki".

Mungkin paling mudah untuk membuang akses sepenuhnya. Hindari gradualisme.

Anda akan menghabiskan semua uang pada akhirnya.

Anda juga bisa menganggarkan dan membelanjakannya sekarang.

Mencoba melakukan ini secara bertahap mungkin sebenarnya lebih mahal karena kompleksitas mencoba mengelola koeksistensi.

S.Lott
sumber
9
Ini semua bagus, tetapi tidak realistis. Terutama bagian dengan "menembak siapa pun" dan "membuang seluruhnya". Kita tidak bisa begitu saja membuang semuanya dan mulai dari bidang hijau, baik dari sudut pandang finansial, strategis dan pribadi.
Alexander Galkin
8
-1 Pengalaman Anda bukan jumlah total alam semesta. Sementara kita semua ingin hidup di dunia yang sempurna di mana kita dapat mengubah budaya segera yang bukan kenyataan. Selain itu, bias Anda terhadap beberapa teknologi yang telah terbukti meredam kemampuan Anda untuk melihat solusi potensial lainnya. Anda telah menjabarkan cara terbaik bagi ANDA untuk menyelesaikan masalah bukan untuk OP.
SoylentGray
4
Maaf harus -1 ini untuk Sering kesalahan. Praktik terbaik adalah jangan mencoba "secara bertahap". - Apakah Anda memiliki kutipan untuk 'praktik terbaik' ini? Karena kebanyakan orang akan mengatakan sebaliknya - joelonsoftware.com/articles/fog0000000069.html
MattDavey
2
"Karena kebanyakan orang akan mengatakan sebaliknya". Kebanyakan orang lebih pintar dari pelanggan yang pernah bekerja sama dengan saya. Baik untuk mereka. Sayangnya, saya harus bekerja dengan sejumlah pelanggan dengan aplikasi MS-Access yang besar dan buruk yang membutuhkan penulisan ulang grosir karena mereka tidak dapat secara bertahap melakukan migrasi. Ini pengalaman saya. Itu kutipan saya. Maaf, pengalaman saya tampaknya unik.
S.Lott
4
@ S.Lott Saya pikir ini ekstrem untuk mengatakan bahwa kode lebih merupakan liabilitas daripada nilai. Tidak ada kata OP yang mengindikasikan bahwa itu tidak bekerja atau memenuhi kebutuhan bisnis - bahkan "Kami cukup puas dengan fungsionalitas aplikasi saat ini" . Tampaknya tidak ada kebutuhan mendesak untuk bin kode yang berfungsi dengan baik - tidak ada kanker untuk dipotong. Namun OP telah mengidentifikasi bahwa untuk melakukan perbaikan di masa depan ia perlu menerobos langit-langit kaca yang diberlakukan oleh Access - ini bisa menjadi proses bertahap.
MattDavey