{"id":68116,"date":"2011-10-04T22:25:31","date_gmt":"2011-10-04T15:25:31","guid":{"rendered":"https:\/\/bahtera.jp\/com-interface\/"},"modified":"2025-03-20T09:42:21","modified_gmt":"2025-03-20T02:42:21","slug":"com-interface","status":"publish","type":"post","link":"https:\/\/bahtera.jp\/id\/com-interface\/","title":{"rendered":"Perluasan Fungsi Asprova Melalui Antarmuka COM"},"content":{"rendered":"<p>Penjadwal Produksi Asprova mempublikasikan antarmuka COM, yang memungkinkan perluasan fungsi melalui file EXE atau plugin (DLL). Anda dapat memperoleh objek proyek yang telah dimuat di memori dari file EXE atau DLL, serta mengakses objek tabel bawahan Asprova.<br \/>\nAsprova sendiri menyediakan Hook untuk menjalankan plugin pada waktu terjadinya suatu peristiwa, dan kunci plugin yang mewakili akses poin untuk peristiwa ini setara dengan hook do_action atau apply_filters di WordPress.<br \/>\n\t\t\t\t<a href=\"https:\/\/bahtera.jp\/id\/penjadwal-produksi\/\" class=\"st-cardlink\" aria-label=\"Production Scheduler di Indonesia\">\r\n\t\t\t\t<div class=\"kanren st-cardbox\" >\r\n\t\t\t\t\t\t\t\t\t\t<dl class=\"clearfix\">\r\n\t\t\t\t\t\t<dt class=\"st-card-img\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/bahtera.jp\/wp-content\/uploads\/2020\/12\/1-18-150x150.png\" class=\"attachment-st_thumb150 size-st_thumb150 wp-post-image\" alt=\"\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2\u306e\u751f\u7523\u30b9\u30b1\u30b8\u30e5\u30fc\u30e9\u30fc\u307e\u3068\u3081\" srcset=\"https:\/\/bahtera.jp\/wp-content\/uploads\/2020\/12\/1-18-150x150.png 150w, https:\/\/bahtera.jp\/wp-content\/uploads\/2020\/12\/1-18-100x100.png 100w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/dt>\r\n\t\t\t\t\t\t<dd>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"st-cardbox-t\">Production Scheduler di Indonesia<\/p>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"st-card-excerpt smanone\">\r\n\t\t\t\t\t\t\t\t\t<p>Di dalam pekerjaan manajemen produksi di pabrik-pabrik massal berbasis perakitan yang banyak ditemukan dalam industri roda dua dan roda empat di Indonesia, rencana produksi dan rencana beban memiliki hubungan yang saling terkait erat. Karena rencana produksi disusun berdasarkan jumlah, maka ada permintaan kuat untuk melihat rencana beban juga berdasarkan jumlah per mesin. Secara umum, rencana produksi dan rencana beban diharapkan disusun dalam satuan hari atau shift. Di dalam pikiran perencana Indonesia, ada pola pikir seperti: \u201cHari ini (atau dalam shift ini), berapa unit yang akan diproduksi oleh mesin ini? Jika ada kelebihan kapasitas sebanyak sekian unit, kapan unit tersebut akan &#8230; <\/p>\n\t\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"cardbox-more\">\u7d9a\u304d\u3092\u898b\u308b<\/p>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/dd>\r\n\t\t\t\t\t<\/dl>\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<\/a>\r\n\t\t\t\t<\/p>\n<h2>Apa itu Antarmuka COM<\/h2>\n<p>Asprova memiliki mekanisme untuk mempublikasikan data internal dan prosesnya melalui COM (Component Object Model), memungkinkan penambahan fungsi dari plugin (file ActiveX DLL: pemanggilan fungsi dari Asprova) atau klien otomasi (file EXE Standar: akses ke Asprova dari program eksternal).<br \/>\nFile DLL ditempatkan di folder yang sama dengan EXE Asprova dan akan dimuat secara otomatis oleh Asprova saat startup.<br \/>\nDLL terdaftar sebagai perintah internal Asprova, sehingga dapat dilampirkan ke menu yang ditentukan pengguna untuk memanggil DLL dari Asprova. Namun, dalam kasus EXE, proyek aktif diperoleh dengan membuka file proyek yang ditentukan namanya.<\/p>\n<h2>Lokasi Penempatan DLL<\/h2>\n<p>DLL harus ditempatkan di lokasi berikut relatif terhadap EXE yang dijalankan:<\/p>\n<div class=\"graybox\">\n<div class=\"maruno\">\n<ol>\n<li>Tempatkan EXE dan DLL di direktori yang sama.<\/li>\n<li>Jalankan EXE dengan direktori DLL sebagai direktori saat ini.<\/li>\n<li>Tempatkan DLL di direktori system32.<\/li>\n<li>Tempatkan DLL di direktori Windows.<\/li>\n<li>Tetapkan direktori tempat DLL berada ke variabel lingkungan Path.<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<h2>Pengaturan Referensi Lingkungan Pengembangan (Menggunakan Pustaka Asprova dari Dalam Plugin)<\/h2>\n<p>Pengaturan referensi disimpan dalam file proyek (.vbp) untuk memanfaatkan pustaka tipe objek ActiveX tanpa GUI dalam proyek, memungkinkan plugin (DLL yang dikompilasi dari file proyek) mengakses pustaka Asprova melalui antarmuka COM.<br \/>\nDengan pengaturan referensi, Anda dapat menggunakan tipe objek tersebut saat mendeklarasikan variabel Dim atau membuat instance dengan operator new.<\/p>\n<div class=\"graybox\">\n<div class=\"maruno\">\n<ol>\n<li>Kelas Proyek Asprova<br \/>\nDim project As aslib.ASBProject<\/li>\n<li>Daftar objek yang terkait dengan kunci plugin yang digunakan dalam DLL plugin ekstensi<br \/>\nDim ArgList As ASPArgList<\/li>\n<li>Kelas Item<br \/>\nDim item As ASBItem<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<p>Saat mereferensikan pustaka Asprova dari plugin, daftarkan dua pustaka kelas Asprova berikut dari pengaturan referensi lingkungan pengembangan:<\/p>\n<div class=\"graybox\">\n<div class=\"maruno\">\n<ol>\n<li>As 1.1 Type Library<\/li>\n<li>AsPlugInManager 1.0 Type Library<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<h2>Struktur File Proyek Plugin<\/h2>\n<p style=\"text-align: left;\">Dalam kasus plugin, fungsi yang dipanggil dari Asprova didaftarkan ke metode AutoRegistration pada kelas ASDefault.<\/p>\n<p style=\"text-align: left;\">Jika plugin telah didaftarkan sebagai &#8220;informasi plugin&#8221; di Asprova, fungsi AutoRegistration akan dipanggil secara otomatis saat Asprova dimulai, dan diimplementasikan dalam objek proyek.<\/p>\n<p><img decoding=\"async\" class=\"alignleft wp-image-6398 size-full\" title=\"projectfile\" src=\"https:\/\/bahtera.jp\/wp-content\/uploads\/projectfile.jpg\" alt=\"COM\u30dd\u30fc\u30c82\" width=\"350\" height=\"276\" srcset=\"https:\/\/bahtera.jp\/wp-content\/uploads\/projectfile.jpg 350w, https:\/\/bahtera.jp\/wp-content\/uploads\/projectfile-300x236.jpg 300w\" sizes=\"(max-width: 350px) 100vw, 350px\" \/><\/p>\n<p style=\"text-align: left;\">Untuk EXE Standar (klien otomasi), kelas ASDefault tidak diperlukan.<\/p>\n<p>Plugin didaftarkan dengan meneruskan empat argumen ke metode AddASPlugIn pada pengelola plugin Asprova (fungsi pendaftaran plugin), yang berarti: &#8220;Saya adalah proyek bernama Factory, memiliki metode AddOverTime (fungsi masuk) di kelas Overtime, jadi panggil saya pada waktu kunci plugin KeyHookGeneric.&#8221;<\/p>\n<div style=\"clear: both;\"><\/div>\n<h2>Pemetaan Hook dan Fungsi yang Sesuai dengan Kunci Plugin (Akses Poin)<\/h2>\n<p>Asprova menyediakan hook untuk menjalankan plugin pada setiap peristiwa tertentu.<br \/>\nAkses poin yang mewakili setiap peristiwa ini disebut kunci plugin. Misalnya, KeyHookGeneric adalah &#8220;penambahan perintah&#8221;, yaitu akses poin pada saat perintah yang ditambahkan dijalankan, yang memicu eksekusi plugin dengan menjalankan perintah tersebut.<\/p>\n<pre><code class=\"prettyprint linenums\">Option Explicit  \r\nPublic Function AutoRegistration(plugInManager As ASPPlugInManager, module As ASPModule) As Boolean  \r\n    'Mengatur komentar untuk modul ini  \r\n    module.Comment = \"APS Extended Functionality PlugIns (VB)\"  \r\n    'Mendefinisikan variabel untuk menyimpan objek plugin  \r\n    Dim plugIn As ASPPlugIn  \r\n    ' ---------------------------------------------------------------------------------------------  \r\n    'Memanggil pengelola plugin untuk mendaftarkan plugin baru. Nama metode yang dipanggil adalah AddASPlugIn  \r\n    ' Param ke-1: Nama tampilan plugin  \r\n    ' Param ke-2: ProgID yang mewakili modul dan kelas tempat plugin diimplementasikan  \r\n    ' Param ke-3: Nama fungsi masuk plugin (nama panggilan)  \r\n    ' Param ke-4: Nama kunci yang mewakili konteks penggunaan plugin  \r\n\r\n    '(1) Menghitung lembur atau kerja Sabtu secara otomatis dan menetapkannya ke tabel kalender  \r\n    Set plugIn = plugInManager.AddASPlugIn(\"Memasukkan lembur ke dalam lembur dan kerja Sabtu\", \"Factory1.OverTime\", \"AddOverTime\", ASPlugInKeyName.KeyHookGeneric)  \r\n    'Mengatur komentar dll. untuk plugin ini.  \r\n\r\n    plugIn.Comment = \"Mengalokasikan lembur menjadi 2 jam lembur di hari kerja dan 2 shift kerja di hari Sabtu.\"  \r\n    'Urutan pemanggilan plugin (untuk kasus beberapa plugin dengan kunci plugin yang sama)  \r\n    plugIn.Order = 1  \r\n    'Mengembalikan True untuk menunjukkan pendaftaran otomatis berhasil.  \r\n    AutoRegistration = True  \r\nEnd Function<\/code><\/pre>\n<p>Saat Asprova dimulai dan memuat plugin secara otomatis, &#8220;nama tampilan fungsi masuk&#8221; (argumen pertama saat memanggil pengelola plugin) akan ditampilkan pada plugin perintah internal.<br \/>\nPlugin didaftarkan dengan memanggil pengelola plugin Asprova dari dalam plugin dan meneruskan empat argumen.<br \/>\n<img decoding=\"async\" class=\"aligncenter wp-image-6399 \" title=\"HookGeneric\" src=\"https:\/\/bahtera.jp\/wp-content\/uploads\/HookGeneric.jpg\" alt=\"COM\u30dd\u30fc\u30c83\" width=\"541\" height=\"538\" srcset=\"https:\/\/bahtera.jp\/wp-content\/uploads\/HookGeneric.jpg 590w, https:\/\/bahtera.jp\/wp-content\/uploads\/HookGeneric-150x150.jpg 150w, https:\/\/bahtera.jp\/wp-content\/uploads\/HookGeneric-300x298.jpg 300w, https:\/\/bahtera.jp\/wp-content\/uploads\/HookGeneric-36x36.jpg 36w, https:\/\/bahtera.jp\/wp-content\/uploads\/HookGeneric-115x115.jpg 115w\" sizes=\"(max-width: 541px) 100vw, 541px\" \/><\/p>\n<h2>Konsep yang Sama dengan Port COM (Communication Port)<\/h2>\n<p>Sekadar informasi, COM pada port COM dan antarmuka COM adalah hal yang berbeda, tetapi dalam arti standar antarmuka eksternal, port COM dan antarmuka COM memiliki kesamaan.<br \/>\nPerangkat lunak atau perangkat keras memiliki antarmuka (port) yang menstandarkan metode pertukaran data untuk input\/output dengan eksternal. Misalnya, port untuk server POP dan SMTP, atau port saat menghubungkan ke DB, semuanya adalah port TCP\/IP.<br \/>\nKomputer standar dilengkapi dengan antarmuka seperti port PS\/2, port USB, dan port LAN (Ethernet) untuk menghubungkan perangkat periferal seperti keyboard.<br \/>\nDalam perangkat lunak, metode standar untuk mengelola pengiriman dan penerimaan data dengan perangkat eksternal atau jaringan komunikasi disediakan oleh OS atau lainnya, dan port digunakan untuk mengidentifikasi mitra komunikasi.<br \/>\nDi Windows, mekanisme &#8220;port COM&#8221; disediakan untuk memungkinkan aplikasi mengakses modem, printer, atau pemindai gambar dengan cara yang seragam. Aplikasi hanya perlu mengetahui port COM mana yang digunakan oleh perangkat target untuk menangani input\/output dengannya.<br \/>\nMisalnya, saat menghubungkan barcode USB, COM13 mungkin ditetapkan, tetapi karena secara fisik tidak ada 13 antarmuka di PC, port COM13 hanyalah port virtual.<br \/>\nDalam komunikasi jaringan menggunakan TCP\/IP, &#8220;nomor port&#8221; dari 0 hingga 65535 digunakan sebagai alamat tambahan di bawah alamat IP yang dimiliki perangkat komunikasi atau komputer individu.<br \/>\nIni memungkinkan satu komputer menyediakan beberapa layanan atau berkomunikasi dengan beberapa komputer secara bersamaan. Istilah &#8220;port&#8221; sering kali merujuk pada nomor port TCP\/IP ini.<\/p>\n<h2>Memetakan Nilai Field Recordset ke Definisi Field Crystal Report melalui File ttx<\/h2>\n<p>Tabel kerja Asprova diekspor ke Access untuk menerbitkan tiket stok.<br \/>\nMeskipun sudah lama, Crystal Report 9 memiliki Parameter Field, jadi saya pikir VB akan mengirimkan parameter, tetapi ternyata cukup melempar Record Set, dan itu akan secara otomatis mengambil nilai dari field, sehingga laporan dapat ditampilkan di dalam Crystal Report Viewer, sebuah komponen ActiveX gratis.<\/p>\n<pre><code class=\"prettyprint linenums\">    CrRep.Database.SetDataSource rs, 3, 1  \r\n    CRViewer91.ReportSource = CrRep  \r\n    CRViewer91.ViewReport<\/code><\/pre>\n<p>Bagian ini menunjukkannya. Argumen ketiga, 1, mewakili Nomor Tabel.<\/p>\n<pre><code class=\"prettyprint linenums\">    'Mendapatkan ORDERCOD dari combo yang dipilih  \r\n    result = Combo1.List(Combo1.ListIndex)  \r\n\r\n    'Mengirim parameter dari VB6 ke CR menggunakan CRAXDRT  \r\n    Dim CrApp As CRAXDRT.Application  \r\n    Dim CrRep As CRAXDRT.Report  \r\n\r\n    'Mendapatkan recordset ORDERCOD dari ORDERTBL  \r\n    Dim conn As New ADODB.Connection  \r\n    Dim rs As ADODB.Recordset  \r\n\r\n    Dim mySQL As String  \r\n\r\n    cn.Open _  \r\n        \"Provider = Microsoft.Jet.OLEDB.4.0; \" &amp; _  \r\n            \"Data Source = \" &amp; CurDir &amp; \"\\NNA.mdb\"  \r\n\r\n    Set CrApp = New CRAXDRT.Application  \r\n    Set CrRep = CrApp.OpenReport(App.Path &amp; \"\\reports\\TravelSheet.rpt\", &amp; _  \r\n                    crOpenReportByTempCopy)  \r\n\r\n    CrRep.DiscardSavedData  \r\n\r\n    If result &lt;&gt; \"ALL\" Then  \r\n        mySQL = \"SELECT * FROM OPERATIONTBL WHERE ORDERCOD='\" &amp; _  \r\n            Combo1.Text &amp; \"' ORDER BY ORDERCOD\"  \r\n    Else  \r\n        mySQL = \"SELECT * FROM OPERATIONTBL ORDER BY ORDERCOD\"  \r\n\r\n    End If  \r\n    With rs  \r\n        .ActiveConnection = cn  \r\n        .CursorLocation = adUseServer  \r\n        .CursorType = adOpenKeyset  \r\n        .LockType = adLockOptimistic  \r\n        .Properties(\"IRowsetIdentity\") = True  \r\n\r\n        .Open mySQL  \r\n    End With  \r\n    CrRep.Database.SetDataSource rs, 3, 1  \r\n    CRViewer91.ReportSource = CrRep  \r\n    CRViewer91.ViewReport  \r\n<\/code><\/pre>\n<p>Namun, aplikasi pengembangan yang menggunakan komponen non-standar seperti Crystal Report Viewer di Win7 kemungkinan besar bermasalah di XP, dan crviewer9.dll sering menyebabkan masalah di PC lama. Jadi, pertama-tama saya downgrade ke CR8.5 dan mengubah kode seperti di bawah ini.<br \/>\nCR8.5 dibatasi hanya untuk tata letak formulir, jadi definisi field dibuat di file ttx, dan recordset dari VB dilemparkan untuk dipetakan ke formulir sesuai definisi field di file ttx.<\/p>\n<pre><code class=\"prettyprint linenums\">Dim result As String  \r\n\r\n    'Mendapatkan ORDERCOD dari kotak combo yang dipilih  \r\n    result = Combo1.List(Combo1.ListIndex)  \r\n\r\n    'Mendapatkan recordset ORDERCOD dari ORDERTBL  \r\n    Dim conn As New ADODB.Connection  \r\n    Dim rs As ADODB.Recordset  \r\n\r\n    Dim mySQL As String  \r\n\r\n    cn.Open _  \r\n        \"Provider = Microsoft.Jet.OLEDB.4.0; \" &amp; _  \r\n            \"Data Source = \" &amp; CurDir &amp; \"\\DNN.mdb\"  \r\n\r\n    If result &lt;&gt; \"ALL\" Then  \r\n        mySQL = \"SELECT * FROM OPERATIONTBL WHERE ORDERCOD='\" &amp; _  \r\n                    Combo1.Text &amp; \"' ORDER BY ORDERCOD\"  \r\n\r\n    Else  \r\n        mySQL = \"SELECT * FROM OPERATIONTBL ORDER BY ORDERCOD\"  \r\n\r\n    End If  \r\n\r\n    rs.Open mySQL, cn, adOpenKeyset, adLockOptimistic  \r\n\r\n    With rptControl  \r\n        .WindowTitle = \"Travel Sheet\"  \r\n        .ReportFileName = App.Path &amp; \"\\Reports\\TravelSheet.rpt\"  \r\n\r\n        .SetTablePrivateData 0, 3, rs  \r\n        .WindowShowPrintBtn = True  \r\n        .WindowShowPrintSetupBtn = True  \r\n\r\n        .RetrieveDataFiles  \r\n        .WindowState = crptMaximized  \r\n        .Destination = crptToWindow  \r\n        .Action = 1  \r\n    End With<\/code><\/pre>\n<p>Jika Anda menentukan file ttx (rpt.ttx) di Report Expert pada file CR, nilai field dari recordset dalam kode akan secara otomatis dipetakan ke field di file CR.<br \/>\n<img decoding=\"async\" class=\"aligncenter wp-image-9326 size-full\" src=\"https:\/\/bahtera.jp\/wp-content\/uploads\/reportexpert.jpg\" alt=\"reportexpert\" width=\"579\" height=\"442\" srcset=\"https:\/\/bahtera.jp\/wp-content\/uploads\/reportexpert.jpg 579w, https:\/\/bahtera.jp\/wp-content\/uploads\/reportexpert-300x229.jpg 300w, https:\/\/bahtera.jp\/wp-content\/uploads\/reportexpert-100x76.jpg 100w, https:\/\/bahtera.jp\/wp-content\/uploads\/reportexpert-320x244.jpg 320w\" sizes=\"(max-width: 579px) 100vw, 579px\" \/><br \/>\nMetode mendefinisikan nama field, atribut, dan panjang dalam file ttx dengan pemisah tab mungkin sudah dianggap klasik di Jepang, tetapi di Indonesia masih sangat digunakan.<\/p>\n<pre><code class=\"prettyprint linenums\">ORDERCOD\tstring\t100  \r\nPROCNO\tnumber  \r\nRESOURCE\tstring\t100  \r\nITEM\tstring\t100  \r\nQTY\tnumber  \r\nSTARTDATE\tstring\t100  \r\nENDDATE\tstring\t100  \r\nWORKTIME\tstring\t100  \r\nPARENTITEM\tstring\t100  \r\nCLASS\tnumber<\/code><\/pre>\n<h2>Mengakses Jet Database Engine dari VB<\/h2>\n<p>Tambahkan &#8220;Microsoft ActiveX Data Objects 2.1 Library&#8221; dari pengaturan referensi.<\/p>\n<pre><code class=\"prettyprint linenums\">Dim conn As New ADODB.Connection  \r\nDim rs As New ADODB.Recordset  \r\nconn.Open _\r\n    \"Provider = Microsoft.Jet.OLEDB.4.0; \" &amp; _\r\n\"Data Source = C:\\Users\\Toshiba\\Desktop\\ERP\\VB\\LinkWithERP.mdb\"  \r\n'DELETE\r\nDim query1 As String\r\nquery1 = \"DELETE * FROM ORDER_SOURCE\"\r\nrs.Open query1, cn, adOpenKeyset, adLockOptimistic  \r\n'SELECT\r\nDim query2 As String\r\nquery2 = \"SELECT * FROM ORDER_SOURCE\"\r\nrs.Open query2, cn, adOpenKeyset, adLockOptimistic  \r\nDo Until rs.EOF\r\n    X1 = rs!Order_Code\r\n    X2 = rs!Order_Item\r\n    X3 = rs!Order_Qty  \r\n\r\nrs.MoveNext  \r\n\r\nLoop<\/code><\/pre>\n<p>ADO dan ODBC adalah middleware untuk memanfaatkan Jet Database Engine (MDB).<br \/>\nFile MDB dalam format MS-Access sebenarnya adalah file Jet Database Engine (mesin basis data relasional yang dikembangkan oleh Microsoft), yaitu hanya kontainer penyimpanan data, dan terpisah dari aplikasi Microsoft Access yang menyediakan GUI.<br \/>\nIni berarti file MDB dapat digunakan bahkan di lingkungan di mana MS-Access tidak terinstal.<br \/>\nAnda dapat memanipulasi tabel menggunakan ADO di Excel VBA pada PC tanpa MS-Access terinstal, atau mengunduh Runtime dari situs MS untuk membukanya, dan ini tidak melanggar batasan lisensi.<br \/>\nRuntime adalah &#8220;program yang mengambil hanya fungsi eksekusi dari perangkat lunak yang memiliki fungsi pengembangan dan eksekusi, dengan fungsi pengembangan dihilangkan.&#8221; Dengan kata lain, &#8220;lingkungan eksekusi tanpa lingkungan pengembangan.&#8221;<\/p>\n<div class=\"graybox\">\n<div class=\"maruck\">\n<ul>\n<li>http:\/\/www.microsoft.com\/ja-jp\/download\/details.aspx?id=4438<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>Notepad adalah utilitas untuk mengedit file teks, tetapi bukan satu-satunya aplikasi yang bisa mengedit file teks\u2014logikanya sama persis.<br \/>\nKoneksi dari sistem ke DB (RDB) biasanya menggunakan salah satu dari ADO atau ODBC, dengan perbedaan sebagai berikut:<\/p>\n<div class=\"graybox\">\n<div class=\"maruck\">\n<ul>\n<li>ADO adalah antarmuka untuk mengoperasikan OLEDB sebagai kontrol ActiveX.<\/li>\n<li>ODBC adalah antarmuka dalam OLEDB yang menyediakan RDB.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>Ada penyedia ODBC di dalam OLEDB yang menghubungkan ke RDB, tetapi pengembang dapat mengakses OLEDB melalui antarmuka ADO.<br \/>\nPergi dari &#8220;pengembang \u21d2 ODBC \u21d2 OLE (RDB, Excel, dll.)&#8221; melalui jalan biasa ke Cikarang memakan waktu 3 jam, tetapi menggunakan &#8220;pengembang \u21d2 ADO \u21d2 OLE (RDB, Excel, dll.)&#8221; melalui Tol (jalan tol) hanya butuh 1,5 jam\u2014sama saja lol.<br \/>\nMengenai metode pembuatan objek koneksi dan objek recordset, terserah mana yang Anda pilih.<br \/>\nGunakan fungsi CreateObject untuk membuat variabel objek baru dan tetapkan referensi ke objek dengan Set.<\/p>\n<pre><code class=\"prettyprint linenums\">Dim conn As Variant  \r\nDim rs As Variant  \r\nSet conn = CreateObject(\"ADODB.Connection\")  \r\nSet rs = CreateObject(\"ADODB.Recordset\")<\/code><\/pre>\n<p>Penetapan referensi objek menggunakan New membuat objek baru dengan Set dan New, lalu menetapkan referensi objek ke variabel objek.<\/p>\n<pre><code class=\"prettyprint linenums\">Dim conn As ADODB.Connection  \r\nDim rs As ADODB.Recordset  \r\nSet conn = New ADODB.Connection  \r\nSet rs = New ADODB.Recordset<\/code><\/pre>\n<h2>Mengakses MySQL dari VB<\/h2>\n<p>Meskipun PC menggunakan Windows 64-bit, lingkungan pengembangan VB6 adalah 32-bit, jadi gunakan MySQL ODBC Connector versi 32-bit.<br \/>\nUntuk koneksi ADODB, ini tidak relevan, tetapi saat menggunakan koneksi DSN, menginstal driver ODBC 32-bit pada Windows 64-bit menyebabkan driver MySQL 5.1 yang seharusnya terinstal tidak muncul di layar pengaturan ODBC di Panel Kontrol, yang bisa membingungkan. Oleh karena itu, gunakan perintah berikut dari command prompt untuk menampilkan layar Administrator Sumber Data ODBC 32-bit dan lakukan pengaturan DSN.<\/p>\n<div class=\"graybox\">\n<div class=\"maruck\">\n<ul>\n<li>%windir%\\SysWOW64\\odbcad32.exe<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>Untuk koneksi DSN:<\/p>\n<pre><code class=\"prettyprint linenums\">'Membuat objek koneksi untuk DSN driver MySQL 5.1  \r\nDim conn As New ADODB.Connection  \r\nDim rs As New ADODB.Recordset  \r\nDim dsn As String\r\ndsn = \"dsn=xxx;uid=yyy;pwd=zzz\"\r\nconn.Open dsn\r\nconn.CursorLocation = 3<\/code><\/pre>\n<p>Untuk koneksi ADODB:<\/p>\n<pre><code class=\"prettyprint linenums\">'Membuat objek koneksi untuk ADO driver MySQL 5.1  \r\nDim conn As New ADODB.Connection  \r\nDim rs As ADODB.Recordset  \r\n\r\nDim strConn, xServer, xDatabase, xUID, xPass As String  \r\nIf conn.State = 0 Then  \r\n    xServer = \"localhost\"  \r\n    xDatabase = \"xxx\"  \r\n    xUID = \"yyy\"  \r\n    xPass = \"zzz\"  \r\n\r\n    strConn = \"DRIVER={MySQL ODBC 5.1 Driver};SERVER=\" &amp; xServer &amp; _  \r\n               \";PORT=3306\" &amp; _  \r\n               \";DATABASE=\" &amp; xDatabase &amp; _  \r\n               \";USER=\" &amp; xUID &amp; _  \r\n               \";PASSWORD=\" &amp; xPass &amp; _  \r\n               \";OPTION=3;\"  \r\n    conn.Open strConn  \r\nEnd If  \r\n\r\n'DELETE  \r\nDim query1 As String  \r\nquery1 = \"DELETE * FROM ORDER_SOURCE\"  \r\nrs.Open query1, strConn  \r\n\r\n'SELECT  \r\nDim query2 As String  \r\nquery2 = \"SELECT * FROM ORDER_SOURCE\"  \r\nrs.Open query2, strConn  \r\n\r\nDo Until rs.EOF  \r\n    X1 = rs!Order_Code  \r\n    X2 = rs!Order_Item  \r\n    X3 = rs!Order_Qty  \r\n\r\n    rs.MoveNext  \r\nLoop<\/code><\/pre>\n<h2>Mengakses Excel dari VB<\/h2>\n<p>Tambahkan Microsoft Excel 12.0 Object Library dari pengaturan referensi.<\/p>\n<pre><code class=\"prettyprint linenums\">'Objek terkait Excel  \r\nDim xlApp As Excel.Application  \r\nDim xlBook As Excel.Workbook  \r\nDim xlSheet As Excel.Worksheet  \r\n'Nama file (path lengkap)\r\nDim strFilename As String\r\nstrFilename = \"C:\\SO\\Delivery Schedule.xls\"  \r\n'Nama sheet\r\nDim strSheetName As String\r\nstrSheetName = \"Delivery Schedule\"  \r\n'Membuat Application\r\nSet xlApp = CreateObject(\"Excel.Application\")  \r\n'Membuka EXCEL\r\n'xlApp.Workbooks.Open FileName:=strFilename, UpdateLinks:=0  \r\n'Membuat objek Workbook\r\n'Set xlBook = xlApp.Workbooks(Dir(strFilename))\r\nSet xlBook = xlApp.Workbooks.Open(strFilename)  \r\n'Membuat objek Worksheet\r\nSet xlSheet = xlBook.Worksheets(strSheetName)  \r\n'Mendapatkan data Worksheet\r\nDim cnt As Integer\r\ncnt = 1  \r\nDo\r\n    'ORDCOD = Worksheets(\"Delivery Schedule\").Cells(cnt, 1).Text juga bisa digunakan\r\n    ORDCOD = xlSheet.Cells(cnt, 1).Text\r\n    ORDITM = xlSheet.Cells(cnt, 2).Text\r\n    ORDQTY = xlSheet.Cells(cnt, 3).Text  \r\n\r\ncnt = cnt + 1  \r\n\r\nLoop While ORDCOD &lt;&gt; \"\"<\/code><\/pre>\n<p>Ngomong-ngomong, saat menetapkan nama file (path lengkap) untuk pembuatan objek buku dari variabel, Anda harus menghapus ekstensi file, kalau tidak akan error entah kenapa. Namun, jika path tetap dimasukkan sebagai string seperti contoh di atas, tidak ada masalah.<br \/>\nGunakan InStrRev untuk mendapatkan posisi titik dan menghapus ekstensi.<\/p>\n<pre><code class=\"prettyprint linenums\">strFilename = CurDir &amp; \"\\data\\\" &amp; strFilename  \r\n'Menghapus ekstensi (jika tidak dilakukan akan error)  \r\nstrFilename = Left(strFilename, InStrRev(strFilename, \".\") - 1)  \r\n\r\nSet xlBook = xlApp.Workbooks.Open(strFilename)<\/code><\/pre>\n<p>Mendapatkan dan menambahkan nama worksheet dilakukan sebagai berikut:<\/p>\n<pre><code class=\"prettyprint linenums\">'Mendapatkan nama worksheet  \r\nj = 0  \r\nFor Each ws In xlBook.Worksheets  \r\n    sheetArry(j) = ws.Name  \r\n    j = j + 1  \r\nNext  \r\n\r\n'Menambahkan worksheet 6  \r\nSet xlSheet = xlBook.Worksheets.Add  'Menambahkan worksheet  \r\nxlSheet.Name = \"New sheet\"<\/code><\/pre>\n<h2>Mengakses File Teks (CSV) dari VB<\/h2>\n<p>Tambahkan Microsoft Scripting Runtime dari pengaturan referensi. FileSystemObject adalah komponen untuk menangani sistem file dengan mudah di Windows.<\/p>\n<pre><code class=\"prettyprint linenums\">'Membuat objek koneksi DB dan objek recordset  \r\nDim conn As New ADODB.Connection  \r\nDim rs As New ADODB.Recordset  \r\n'Membuat objek komponen untuk menangani file CSV\r\nDim objFSO As New Scripting.FileSystemObject  \r\n'Menghubungkan ke DB\r\nconn.Open _\r\n    \"Provider = Microsoft.Jet.OLEDB.4.0; \" &amp; _\r\n    \"Data Source = \" &amp; CurDir &amp; \"\\SO.mdb\"  \r\n'Membuat recordset dengan SELECT (kosong)\r\nquery1 = \"SELECT * FROM ORDER_SOURCE\"\r\nrs.Open query1, conn, adOpenStatic, adLockOptimistic  \r\n'Membaca data file CSV ke objek\r\nSet objFile = objFSO.OpenTextFile(\"C:\\APS_ERP\\VB\" &amp; CSVNAME)  \r\n'Membaca satu baris demi satu dan menyimpan ke recordset\r\ncnt = 0\r\nDo Until objFile.AtEndOfStream\r\n    strMastflow = objFile.ReadLine\r\n    arrMastflow = Split(strMastflow, \",\")  \r\n\r\nrs.AddNew  \r\nrs(\"Order_Code\") = arrMastflow(0)  \r\nrs(\"Order_Item\") = arrMastflow(1)  \r\nrs(\"Order_Qty\") = arrMastflow(2)  \r\nrs.Update  \r\n\r\ncnt = cnt + 1  \r\n\r\nLoop<\/code><\/pre>\n<h2>Istilah Terkait OLE DB<\/h2>\n<p>Hubungan antara middleware dan komponen hingga mengakses DB melalui ADO mirip dengan proses pengiriman barang laut dari pengirim (Shipper) ke penerima (Consignee).<br \/>\n<a href=\"https:\/\/bahtera.jp\/wp-content\/uploads\/oledb.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-3685 size-full\" src=\"https:\/\/bahtera.jp\/wp-content\/uploads\/oledb.jpg\" alt=\"oledb\" width=\"615\" height=\"304\" srcset=\"https:\/\/bahtera.jp\/wp-content\/uploads\/oledb.jpg 615w, https:\/\/bahtera.jp\/wp-content\/uploads\/oledb-300x148.jpg 300w\" sizes=\"(max-width: 615px) 100vw, 615px\" \/><\/a><br \/>\nUntuk mengakses RDB, Excel, atau file teks (Consignee) dari program aplikasi pengembangan (Shipper), Anda meminta prosedur kepada penyedia data OLE DB (Forwarder), tetapi berurusan langsung dengan OLE DB melibatkan dokumen yang rumit dan merepotkan, jadi Anda menyerahkannya ke ADO (perusahaan kargo).<\/p>\n<div class=\"graybox\">\n<div class=\"maruck\">\n<ul>\n<li>OLE DB (Object Linking and Embedding DataBase)<br \/>\nAntarmuka pemrograman yang dikembangkan oleh Microsoft untuk mengakses basis data dengan metode yang seragam terlepas dari jenis basis datanya.<br \/>\nYaitu DB (Consignee) &lt;&lt; OLE DB diwujudkan sebagai kumpulan komponen COM (bagian program) dan dapat digunakan dari bahasa pemrograman apa pun. OLE DB secara konseptual dibagi menjadi &#8220;konsumen (consumer)&#8221; dan &#8220;penyedia (provider)&#8221;. Konsumen adalah aplikasi yang perlu mengakses data, sedangkan penyedia adalah komponen perangkat lunak yang mengimplementasikan antarmuka dan menyediakan data ke konsumen.<\/li>\n<li>Antarmuka COM<br \/>\nMekanisme untuk mempublikasikan data internal dan isi proses melalui COM (Component Object Model), memungkinkan akses ke fungsi yang dipublikasikan aplikasi dari plugin (file ActiveX DLL) atau klien otomasi (file EXE Standar) untuk mengembangkan dan mempublikasikan plugin.<\/li>\n<li>ADO (ActiveX Data Object)<br \/>\nKomponen untuk mengakses basis data melalui penyedia OLE DB. Antarmuka pemrograman yang membuat OLE DB dapat digunakan dalam bentuk kontrol ActiveX. Dengan ADO, Anda dapat langsung memanipulasi rekord tabel dari VB.<\/li>\n<li>Kontrol ActiveX<br \/>\nTeknologi yang sebelumnya disebut kontrol OLE, diperluas untuk mendukung internet. Kontrol ActiveX diunduh dari server web melalui jaringan dan digunakan untuk menambahkan fungsi ke browser web Internet Explorer dari Microsoft.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<p>DLL plugin dikembangkan untuk penambahan fungsi (fungsi), sedangkan DLL antarmuka ekstensi dikembangkan untuk perubahan pada logika yang ada.<br \/>\nPerbedaannya terletak pada apakah Anda mendefinisikan kunci plugin (KeyHookGeneric) atau antarmuka (IEIIFilterCalc ReplenishOrderLotSizing) di dalam metode AutoRegistration kelas AsDefault.<\/p>\n<h2>Perbedaan antara Kunci Plugin dan Antarmuka<\/h2>\n<p>Jika Anda mendefinisikan kunci plugin (KeyHookGeneric) di bagian pemanggilan fungsi masuk dalam metode AutoRegistration kelas AsDefault plugin, fungsi masuk akan dipanggil dan dijalankan ketika peristiwa yang sesuai terjadi di Asprova (perintah yang ditambahkan dijalankan).<br \/>\nDemikian pula, jika Anda mendefinisikan antarmuka (IEIIFilterCalc ReplenishOrderLotSizing) di bagian pemanggilan fungsi masuk dalam metode AutoRegistration kelas AsDefault EII (Extension Interface Implementation), fungsi masuk akan dipanggil dan dijalankan ketika peristiwa yang sesuai terjadi di Asprova (penciptaan pengisian ulang otomatis).<br \/>\nNamun, antarmuka disesuaikan agar overhead pemanggilan lebih kecil dibandingkan kunci plugin, sehingga cocok untuk perubahan logika yang sering dipanggil seperti ekspansi pesanan, pengisian ulang otomatis, atau pengelompokan lot.<br \/>\nDLL plugin dikembangkan untuk penambahan fungsi (fungsi), sedangkan DLL antarmuka ekstensi dikembangkan untuk perubahan pada logika yang ada.<br \/>\n<img decoding=\"async\" class=\"alignnone wp-image-51873 size-full\" src=\"https:\/\/bahtera.jp\/wp-content\/uploads\/1-1208.png\" alt=\"\u30d7\u30e9\u30b0\u30a4\u30f3DLL\" width=\"1067\" height=\"588\" srcset=\"https:\/\/bahtera.jp\/wp-content\/uploads\/1-1208.png 1067w, https:\/\/bahtera.jp\/wp-content\/uploads\/1-1208-300x165.png 300w, https:\/\/bahtera.jp\/wp-content\/uploads\/1-1208-768x423.png 768w, https:\/\/bahtera.jp\/wp-content\/uploads\/1-1208-1024x564.png 1024w\" sizes=\"(max-width: 1067px) 100vw, 1067px\" \/><br \/>\nMenggunakan antarmuka ekstensi menghasilkan overhead pemanggilan yang lebih kecil dibandingkan kunci plugin, sehingga digunakan saat menambahkan fungsi masuk yang ingin dipanggil dari peristiwa yang sering terjadi dalam penjadwalan ulang.<\/p>\n<h2>Antarmuka Ekstensi (DLL) untuk Mengubah Ukuran Lot Pesanan Pengisian Ulang<\/h2>\n<p>Ukuran lot pesanan pengisian ulang ditentukan oleh &#8220;Ukuran Lot Produksi MAX&#8221;, &#8220;Ukuran Lot Produksi MIN&#8221;, dan &#8220;Unit Ukuran Lot Produksi&#8221;, tetapi FilterCalcReplenishOrderLotSizing dipanggil saat pengikatan dalam perintah &#8220;Ekspansi Pesanan&#8221;, memperoleh tiga objek berikut untuk mengubah (menimpa) ukuran lot pesanan pengisian ulang dan meneruskan hasilnya ke ArgList:<\/p>\n<div class=\"graybox\">\n<div class=\"maruno\">\n<ol>\n<li>Array item pengisian ulang ArgAsObject(kArgItem)<\/li>\n<li>Daftar instruksi input kerja dari proses pertama pesanan induk ArgAsObject(kArgObjectList)<\/li>\n<li>Daftar ukuran lot ArgAsSafeArray(kSafeArrayArgDouble)<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<h3>Ukuran Lot<\/h3>\n<div class=\"graybox\">\n<div class=\"maruno\">\n<ol>\n<li>Ukuran lot adalah pengisian ulang otomatis &#8220;ya&#8221;<\/li>\n<li>Ukuran lot ditentukan saat pembuatan pesanan pengisian ulang<\/li>\n<li>Daftar instruksi input kerja (array 2D) dan daftar instruksi output kerja (item)<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<h3>Proses Ekspansi Pesanan<\/h3>\n<div class=\"graybox\">\n<div class=\"maruno\">\n<ol>\n<li>Membuat kerja pesanan induk (instruksi input kerja dan instruksi output kerja)<br \/>\nPesanan induk dalam keadaan awal adalah pesanan pemesanan atau pesanan produksi yang didaftarkan.<br \/>\nMembuat instruksi input kerja dan instruksi output kerja dari BOM produksi.<\/li>\n<li>Pengisian ulang otomatis<br \/>\nMemeriksa apakah instruksi input kerja dari kerja pesanan induk adalah target pengikatan.<br \/>\nJika pesanan induk lebih awal dari stok (kuantitas absolut),<br \/>\ninstruksi input kerja bukan target pengikatan. Membuat pesanan produksi untuk kekurangan instruksi input kerja secara otomatis.<br \/>\nMembuat pesanan produksi untuk kekurangan instruksi input kerja (item input) pesanan induk sebagai pesanan anak.<br \/>\nMembuat pesanan produksi untuk kekurangan instruksi input kerja pesanan anak sebagai pesanan cucu.<\/li>\n<li>Pengikatan antar pesanan pertama kali<br \/>\nPengikatan pesanan pemesanan, pesanan produksi, pesanan pembelian, dan pesanan stok dengan pengaturan pengisian ulang otomatis.<br \/>\nPesanan produksi tanpa pengaturan pengisian ulang otomatis (item yang terhubung melalui BOM produksi).<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<h3>Contoh Mengelompokkan Proses Sebelumnya untuk 7 Kali Penyelesaian Pesanan Produksi<\/h3>\n<div class=\"graybox\">\n<div class=\"maruno\">\n<ol>\n<li>Pada pengisian ulang otomatis pertama, B1 masuk ke item dan daftar B masuk ke inst.<br \/>\nMenambahkan jumlah kekurangan instruksi input B1 dari kerja M4 (karena tidak ada stok, RemainingQty adalah B itu sendiri) sebanyak 7 kali.<\/li>\n<li>Pada pengisian ulang otomatis kedua, C masuk ke item dan daftar A masuk ke inst.<br \/>\nMenambahkan jumlah kekurangan instruksi input C dari kerja M2 sebanyak 7 kali.<\/li>\n<li>Karena kondisi adalah inst.Operation.OperationMainRes.Code=&#8217;M4&#8242;, (2) tidak dijalankan.<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<p><img decoding=\"async\" class=\"alignnone wp-image-51877 size-full\" src=\"https:\/\/bahtera.jp\/wp-content\/uploads\/2-vert-1.jpg\" alt=\"\u30d7\u30e9\u30b0\u30a4\u30f3DLL\" width=\"1067\" height=\"2582\" srcset=\"https:\/\/bahtera.jp\/wp-content\/uploads\/2-vert-1.jpg 1067w, https:\/\/bahtera.jp\/wp-content\/uploads\/2-vert-1-124x300.jpg 124w, https:\/\/bahtera.jp\/wp-content\/uploads\/2-vert-1-768x1858.jpg 768w, https:\/\/bahtera.jp\/wp-content\/uploads\/2-vert-1-423x1024.jpg 423w\" sizes=\"(max-width: 1067px) 100vw, 1067px\" \/><br \/>\nUntuk mengakses setiap tabel Asprova, Anda perlu melalui objek proyek Asprova yang dimuat di memori, dan metode untuk memperoleh objek proyek ini berbeda antara DLL dan EXE. Dalam kasus DLL, daftar objek yang terkait dengan kunci plugin dimuat ke argumen args sebagai ASPArgList, dan objek proyek diperoleh darinya, sedangkan dalam kasus EXE, proyek aktif diperoleh dari objek dokumen yang memuat file proyek yang ditentukan.<\/p>\n<h2>Dalam Kasus Plugin Ekstensi (DLL)<\/h2>\n<pre><code class=\"prettyprint linenums\">'(Definisi dan pengambilan objek dalam ASPArgList)  \r\n'------------------------------------------------------------------  \r\nPublic Function AddPersonPlan(args As ASPArgList) As TReturnType  \r\n'Objek setiap tabel APS diakses dari objek proyek  \r\n'Objek proyek diperoleh dari antarmuka args  \r\n'Menerima argumen dengan menetapkan objek proyek dari objek ASPAgrList ke variabel tipe ASBProject  \r\n\r\nDim project As aslib.ASBProject  \r\nSet project = args.ArgAsObject(kArgProject)  \r\n\r\n'Menetapkan RootObject dari objek proyek ke variabel tipe ASORootObject  \r\nDim root As aslib.ASORootObject  \r\nSet root = project.RootObject  \r\n\r\n'Menetapkan RootCalendar dari objek proyek ke variabel tipe ASBCalendar  \r\nDim calendarRoot As aslib.ASBCalendar  \r\nSet calendarRoot = project.RootCalendar  \r\n\r\n'Menetapkan RootResource dari objek proyek ke variabel tipe ASBResource  \r\nDim resourceRoot As aslib.ASBResource  \r\nSet resourceRoot = project.RootResource  \r\n\r\n'Menetapkan orderRoot dari objek proyek ke variabel tipe ASBOrder  \r\nDim orderRoot As aslib.ASBOrder  \r\nSet orderRoot = project.orderRoot  \r\n\r\n'Menetapkan itemRoot dari objek proyek ke variabel tipe ASBItem  \r\nDim itemRoot As aslib.ASBItem  \r\nSet itemRoot = project.itemRoot  \r\n\r\n'Definisi variabel untuk menyimpan ID properti  \r\nDim propID1 As Long  \r\n\r\n'(Akses ke objek yang diperoleh)\r\n'------------------------------------------------------------------\r\n    'Jumlah anak (jumlah rekord) dari objek kalender\r\n    calendarCount1 = calendarRoot.ChildCount  \r\n\r\n'Mendapatkan ID properti kode sumber daya menggunakan objek root  \r\npropID1 = root.LookupPropID(\"Cal_Resource\")  \r\n\r\n'Loop hingga rekord selesai  \r\n'Argumen ChildAsCalendar dimulai dari 1 (0 mewakili data terakhir)  \r\nFor i = 1 To calendarCount1  \r\n    'Mengakses rekord  \r\n    Set calendar = calendarRoot.ChildAsCalendar(i)  \r\n\r\n    'Mengakses nilai properti dengan metode GetAsStr. Jika properti bukan nilai array, tetapkan 1 ke argumen kedua  \r\n    res1 = calendar.GetAsStr(propID1, 1)  \r\nNext  \r\n\r\nEnd Function<\/code><\/pre>\n<h2>Dalam Kasus EXE Standar<\/h2>\n<p>Berbeda dengan plugin atau antarmuka ekstensi, Anda perlu memperoleh objek Asprova dari program EXE di luar Asprova. Dalam kasus ini, file proyek yang ditentukan dimuat ke objek dokumen, dan proyek aktif diperoleh dari objek dokumen tersebut.<\/p>\n<pre><code class=\"prettyprint linenums\">Private Sub Command1_Click()  \r\n'\u25a0\u25a0\u25a0Objek terkait Asprova\u25a0\u25a0\u25a0  \r\n'Definisi objek proyek Asprova  \r\nDim m_pProject As ASBProject  \r\nDim m_pDoc As ASFDocument  \r\n\r\n'Mendapatkan aplikasi Asprova  \r\nDim app As ASFApplication  \r\nSet app = New ASFApplication  \r\n\r\n'Membuka dokumen Asprova dengan nama yang ditentukan  \r\nSet m_pDoc = app.Deserialize(CurDir &amp; \"\\data.aru\")  \r\n\r\n'Mendapatkan proyek aktif dari dokumen  \r\nSet m_pProject = m_pDoc.ActiveProject  \r\n\r\n'\u25a0\u25a0\u25a0Pencocokan dengan item pesanan akhir dari tabel kerja\u25a0\u25a0\u25a0  \r\n'Mendapatkan objek kerja  \r\nDim operation As ASBOperation  \r\nDim operationList As ASOObjectList  \r\nSet operationList = m_pProject.GetOperationList(False)  \r\n\r\n'Mendapatkan objek root  \r\nDim root As ASORootObject  \r\nSet root = m_pProject.RootObject  \r\n\r\n'Mendapatkan propID (diperoleh dari objek root)  \r\npropID1 = root.LookupPropID(\"Work_OperationOutMainItemQty\")  \r\n\r\n'Mendapatkan semua kerja proyek dan melakukan pencocokan sekali  \r\noperationList.FilterByExprStr (\"WorkUser_MostRightOrderItem=='\" &amp; Left(Combo1.Text, 7) &amp; \"')  \r\n\r\n'Menyortir berdasarkan waktu mulai produksi secara ascending  \r\noperationList.SortByExprStr (\"Work_OperationProductionStartTime,a\")  \r\n\r\nDo  \r\n    'Mendapatkan data dari daftar  \r\n    Set operation = operationList.Object(i)  \r\n    'Mendapatkan nilai  \r\n    PrdQty = operation.GetAsStr(propID1, 1)  \r\n    'Menyimpan nilai  \r\n    operation.SetAsStr propID1, 1, Text1.Text  \r\n\r\n    i = i + 1  \r\n\r\nLoop While i &lt;= operationList.ObjectCount  \r\n\r\n'\u25a0\u25a0\u25a0Memeriksa data tabel sumber daya satu per satu\u25a0\u25a0\u25a0  \r\n'Definisi objek sumber daya  \r\nDim RootResource As AsLib.ASBResource  \r\nDim resource As AsLib.ASBResource  \r\n\r\n'Mendapatkan objek root sumber daya  \r\nSet RootResource = m_pProject.RootResource  \r\n\r\n'Mendapatkan propID (diperoleh dari objek root)  \r\npropID2 = root.LookupPropID(\"Res_Code\")  \r\n\r\n'Jumlah rekord tabel sumber daya  \r\nResourceCount = RootResource.ChildCount  \r\n\r\nFor i = 1 To ResourceCount  \r\n    Set resource = RootResource.ChildAsResource(i)  \r\n    ResCode = resource.GetAsStr(propID2, 1)  \r\n\r\nNext i  \r\n\r\n'\u25a0\u25a0\u25a0Pencocokan dengan kode item dari tabel item\u25a0\u25a0\u25a0  \r\n'Definisi objek item  \r\nDim RootItem As ASBItem  \r\nDim Item As ASBItem  \r\n\r\n'Mendapatkan objek root item  \r\nSet RootItem = m_pProject.RootItem  \r\n\r\n'Mendapatkan objek item  \r\nSet Item = RootItem.FindChild(Left(Combo1.Text, 7))  \r\n\r\n'Jumlah rekord yang cocok di tabel item  \r\nItemCount=Item.ChildCount  \r\n\r\nEnd Sub<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Penjadwal Produksi Asprova mempublikasikan antarmuka COM, yang memungkinkan perluasan fungsi melalui file EXE atau plugin (DLL). Anda dapat memperoleh objek proyek yang telah dimuat di memori dari file EXE atau DLL, serta mengakses objek tabel bawahan Asprova.<\/p>\n","protected":false},"author":2,"featured_media":81056,"parent":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[618],"tags":[],"class_list":["post-68116","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-production-scheduler"],"_links":{"self":[{"href":"https:\/\/bahtera.jp\/id\/wp-json\/wp\/v2\/posts\/68116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bahtera.jp\/id\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bahtera.jp\/id\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bahtera.jp\/id\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bahtera.jp\/id\/wp-json\/wp\/v2\/comments?post=68116"}],"version-history":[{"count":0,"href":"https:\/\/bahtera.jp\/id\/wp-json\/wp\/v2\/posts\/68116\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bahtera.jp\/id\/wp-json\/wp\/v2\/media\/81056"}],"wp:attachment":[{"href":"https:\/\/bahtera.jp\/id\/wp-json\/wp\/v2\/media?parent=68116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bahtera.jp\/id\/wp-json\/wp\/v2\/categories?post=68116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bahtera.jp\/id\/wp-json\/wp\/v2\/tags?post=68116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}