Powered By

Skin Design:
Free Blogger Skins

Powered by Blogger

Cari Blog Ini

Tampilkan postingan dengan label ERP. Tampilkan semua postingan
Tampilkan postingan dengan label ERP. Tampilkan semua postingan

02 Agustus 2023

Dynamics AX 2012 Workflow Stopped error: The SQL database has issued an error.

 Terjadi error workflow dengan tampilan seperti ini:

Stopped (error): session 113 (Sync) UPDATE T1 SET ACCOUNTINGEVENT=5638165117,RECVERSION=786788108 FROM ACCOUNTINGDISTRIBUTION T1 WITH (INDEX(I_7452SOURCEDOCUMENTHEADERIDX)) CROSS JOIN SOURCEDOCUMENTLINE T2 WHERE (((T1.PARTITION=5637144576) AND (T1.ACCOUNTINGEVENT=0) AND (T1.ACCOUNTINGDATE={ d''})) AND (T1.SOURCEDOCUMENTHEADER=5638834650)) AND ((T2.RECID=T1.SOURCEDOCUMENTLINE) AND (T2.ACCOUNTINGSTATUS=4 OR T2.ACCOUNTINGSTATUS=6)) AND (T2.PARTITION=5637144576) [Microsoft][SQL Server Native Client 10.0][SQL Server]Conversion failed when converting date and/or 
time from character string. Object Server 01:  Cannot execute the required database operation.
The SQL database has issued an error.

Penyebabnya adalah tidak disetnya AccountingDate pada tabel PurchReqTable dan PurchReqLine. Kenapa terjadi seperti itu? Tidak tau. Karena secara default harusnya accounting date terisi dengan tanggal saat dibuat.

Solusinya:

Isi accounting date di kedua table tersebut dan pada tabel AccountingDistribution yang berhubungan. (Link melalui table SourceDocumentHeader dan SourceDocumentLine).


Referensi dan ide:

sql server - Dynamics AX 2012: Conversion failed when converting date and/or time from character string - Stack Overflow






13 Desember 2022

Approve Dynamics AX 2012 Workflow by Code (X++)

Untuk membuat fungsi yang melakukan approval atas Sales Order tertentu maka bisa menggunakan kode dibawah ini:


WorkflowWorkItemTable  wfItem;

SalesTable so;

so  = SalesTable::find(<Nomor SO>);

Workflow::activateFromWorkflowType(workFlowTypeStr(<Nama workflow>),  so.RecId, "Accept by x++", false, "<nama user AX>");


select wfItem  

    where wfItem.RefTableId == so.TableId && wfItem.RefRecId == so.RecId

    && wfItem.UserId == curUserId() 

    && wfItem.Status == WorkflowWorkItemStatus::Pending;

    

    if (wfItem) {

        WorkflowWorkItemActionManager::dispatchWorkItemAction(

            wfItem, 

            "Auto Approve by system",

            curUserId(),

            WorkflowWorkItemActionType::Complete,

            menuitemActionStr(<Nama Menu Approval workflow yang digunakan>),

            false); 

    }



Berdasarkan blog: How to approve workflow by Code | Mohammad Aamir Shakil (wordpress.com)

24 September 2021

Mencoba plug-in yang sudah ada - Idempiere

Setelah berhasil mempersiapkan environtment dev untuk idempiere 5.1 maka selanjutnya saya mencoba untuk melakukan development plug-in. Namun saya tidak membuat dari nol, karena untuk konsepnya saya masih meraba-raba. Saya coba ambil dari plug-in yang telah ada. Saya pilih coba mengembangkan  Plugin: Create from requisition - iDempiere en. Plug in ini berguna untuk melakukan generate PO line dari requisition line. Default di iDempiere fungsi untuk generate PO langsung melalu menu Create PO from Requisition (Process ID-337) - iDempiere en. Namun saya rasa kurang fleksibel.

Langkahnya:

1. Download dahulu source codenya disini. Kemudian di extract ke folder yang di inginkan.
2. Buka menu File -> Open Project From File System

 

3. Pilih directory tempat folder tadi diekstrak, dan tekan finish. Maka akan muncul project baru seperti dibawah ini.
4. Terlihat JRE yang dipakai adalah Java 1.6 (Java 6). Hal ini karena plug-in tersebut dibuat di iDempiere versi 2.0 yang masih menggunakan Java 6.  Apakah bermasalah? Saya juga belum tahu, tapi amannya saya ganti versi java nya difile MANIFEST.MF (Klik 2x pada file tersebut)

5. Pada tab Overview (Manifest.fm) ubah execution environment menjadi Java 8 seperti gambar dibawah.


6. Pada tab Dependencies terlihat ada error. Hal ini terjadi karena saat ini library yang digunakan berganti nama. Maka lakukan remove kemudian add lagi dengan memilih zk (8.0.2.2)

7. Pilih ZK 8.0.2.2 dan Zul (8.0.2.2) kemudian tekan OK. Di source aslinya hanya ada zkoss library. Di versi idempeire 5.1 library tersebut dipisah menjadi ZK dan Zul.
8. Error akan hilang setelah proses refresh dan build (jika build manual) 
9. Setelah error hilang, setting Run Configurations dan pastikan plugin muncul dipilihan. Centang sehingga saat run plug-in akan terload dan bisa digunakan. 

10. Sebelumnya, kita harus melakukan setting pada Application Dictionary iDempiere yaitu dengan menambah tombol pada tabel C_Order dan window Purchase Order. Jalankan query dibawah ini untuk mudahnya:
ALTER TABLE adempiere.c_order    
ADD COLUMN createfrom CHAR(1) ;

--Columnm
INSERT INTO "ad_column" ("ad_column_id", "ad_client_id", "ad_org_id", "isactive", "created", "updated", "createdby", "updatedby", "name", "description", "help", "version", "entitytype", "columnname", "ad_table_id", "ad_reference_id", "ad_reference_value_id", "ad_val_rule_id", "fieldlength", "defaultvalue", "iskey", "isparent", "ismandatory", "isupdateable", "readonlylogic", "isidentifier", "seqno", "istranslated", "isencrypted", "callout", "vformat", "valuemin", "valuemax", "isselectioncolumn", "ad_element_id", "ad_process_id", "issyncdatabase", "isalwaysupdateable", "columnsql", "mandatorylogic", "infofactoryclass", "isautocomplete", "isallowlogging", "formatpattern", "ad_column_uu", "isallowcopy", "seqnoselection", "istoolbarbutton", "issecure", "ad_chart_id", "fkconstraintname", "fkconstrainttype", "pa_dashboardcontent_id") VALUES (912001, 0, 0, 'Y', '2021-08-14 20:52:31.914', '2021-08-14 20:52:31.914', 0, 0, 'Create lines from', 'Process which will generate a new document lines based on an existing document', 'The Create From process will create a new document based on information in an existing document selected by the user.', 0, 'U', 'CreateFrom', 259, 28, NULL, NULL, 1, NULL, 'N', 'N', 'N', 'Y', NULL, 'N', 0, 'N', 'N', NULL, NULL, NULL, NULL, 'N', 1490, NULL, 'N', 'N', NULL, NULL, NULL, 'N', 'Y', NULL, 'fc189bcf-2b48-4969-818c-2341f6d76749', 'Y', 0, 'Y', 'N', NULL, NULL, 'N', NULL);
--
--Field
INSERT INTO "ad_field" ("ad_field_id", "ad_client_id", "ad_org_id", "isactive", "created", "createdby", "updated", "updatedby", "name", "description", "help", "iscentrallymaintained", "ad_tab_id", "ad_column_id", "ad_fieldgroup_id", "isdisplayed", "displaylogic", "displaylength", "isreadonly", "seqno", "sortno", "issameline", "isheading", "isfieldonly", "isencrypted", "entitytype", "obscuretype", "ad_reference_id", "ismandatory", "included_tab_id", "defaultvalue", "ad_reference_value_id", "ad_val_rule_id", "infofactoryclass", "ad_field_uu", "isallowcopy", "seqnogrid", "isdisplayedgrid", "xposition", "numlines", "columnspan", "isquickentry", "isupdateable", "isalwaysupdateable", "mandatorylogic", "readonlylogic", "istoolbarbutton", "isadvancedfield", "isdefaultfocus", "vformat", "ad_labelstyle_id", "ad_fieldstyle_id") VALUES (912001, 0, 0, 'Y', '2021-08-14 20:55:13.451', 0, '2021-08-14 20:55:13.451', 0, 'Create lines from', 'Process which will generate a new document lines based on an existing document', 'The Create From process will create a new document based on information in an existing document selected by the user.', 'Y', 294, 912001, NULL, 'Y', NULL, 0, 'N', 510, 0, 'N', 'N', 'N', 'N', 'U', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'd99471ce-72a0-418d-8809-861d1d3a8a72', NULL, 510, 'Y', 1, 1, 1, 'N', NULL, NULL, NULL, NULL, NULL, 'N', 'N', NULL, NULL, NULL);
11. Buka form PO, maka akan muncul tombol create lines.




Penjelasan:
Fungsi action button di iDempiere ada di class org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/adwindow/AbstractADWindowContent.java

Di class tersebut, ketika terdapat button dengan nama columnnya "CreateForm" maka akan memanggil fungsi WCreateFromFactory.create(GridTab tab). Fungsi itu akan melist semua object yang memiliki interface ICreateFromFactory baik dicore iDempiere ataupun di plug-in nya. Di plug-in yang kita coba terdapat class  FaaCreateFromFactory yang mengimplementasikan ICreateFromFactory. Kebetulan Tab Purchase Order standartnya tidak ada kolom CreateFrom, jadi cukup menambah kolom CreateFrom akan dapat memanggil form dari plug-in.

Jika kolom sudah ada, maka pendekatannya bisa menggunakan membuat process yang memanggil form custom.