Jumat, 01 November 2019

Create record Purchase Agreement through x++

My code here is to copy Purchase Agreement line from reference Purchase Agreement to new Purchase Agreement.

static void PSMCopydirecttoagreementline(Args _args)
{
    AgreementLineQuantityCommitment agreementLineQuantity;
    AgreementLineQuantityCommitment xagreementLineQuantity;
    AgreementLineVolumeCommitment   agreementlinevolume;
    AgreementLineVolumeCommitment   xagreementlinevolume;
    PurchAgreementHeader            purchAgreementHeader = PurchAgreementHeader::findAgreementId("PSM-000020");//Header reference
    purchAgreementHeader            xpurchagreementheader =  PurchAgreementHeader::findAgreementId("PSM-000078");//Header baru



    //Jika Komitment Purchase Agreement berdasaran kuantity
    if(purchAgreementHeader.DefaultAgreementLineType == CommitmentType::ProductQuantity)
    {
        info("Quantity based");
        //copy line AgrementLIneQuanity menjadi line baru
        while select agreementLineQuantity
            where agreementLineQuantity.Agreement == purchAgreementHeader.RecId
        {
            xagreementLineQuantity.clear();
            xagreementLineQuantity.data(agreementLineQuantity);
            xagreementLineQuantity.Agreement = xpurchagreementheader.RecId;
            xagreementLineQuantity.doInsert();
        }
    }
    else
    {
        //Jika Komitment Purchase Agreement BUKAN berdasaran kuantity
        info("value based");
        while select agreementlinevolume
            where agreementlinevolume.Agreement == purchAgreementHeader.RecId
        {

            xagreementlinevolume.clear();
            xagreementlinevolume.data(agreementlinevolume);
            xagreementlinevolume.Agreement = xpurchagreementheader.RecId;
            xagreementlinevolume.doInsert();
        }
    }

}

below is how to setup and create new Purchase Agreement(header) from reference Purchase Agreement(header) through x++

void createDuplicate()
{
    ttsBegin;
    this.setHeader();
    this.createPurchAgreementHeader();
    this.setLine();
    //this.createAgreementLine();
    ttsCommit;

    info("done");
}

void setHeader()
{
    PurchAgreementId    tmpAgreementId;
    NumberSeq           num;

    xpurchagreementheader.clear();
    xpurchagreementheader.data(purchAgreementHeader);
    xpurchagreementheader.WorkflowStatus_PSN = PurchAgreementWorkflowStatus::NotSubmitted;
    xpurchagreementheader.PSMTotalNetAmount = 0;


    num = NumberSeq::newGetNum(PurchParameters::numRefPurchAgreementId());
    tmpAgreementId = num.num();

    info(strFmt("num %1",tmpAgreementId));
    if (PurchAgreementHeader::findAgreementId(tmpAgreementId).RecId)
    {
        num.abort();
        checkFailed("@SYS19304");
        checkFailed(strfmt("@SYS24176", tmpAgreementId));
        throw error("@SYS23020");
    }

    xpurchagreementheader.PurchNumberSequence = tmpAgreementId;
    num.used();

    agreementHeaderDefault = AgreementHeaderDefault::findAgreementHeader(purchAgreementHeader.RecId);
    if(agreementHeaderDefault.RecId)
    {
    xgreementHeaderDefault.clear();
    xgreementHeaderDefault.data(agreementHeaderDefault);

    }
    purchAgreementHeaderDefault = PurchAgreementHeaderDefault::findPurchAgreementHeader(purchAgreementHeader.RecId);
    if(purchAgreementHeaderDefault.RecId)
    {
    xpurchAgreementHeaderDefault.clear();
    xpurchAgreementHeaderDefault.data(purchAgreementHeaderDefault);

    }

void createPurchAgreementHeader()
{
    xpurchagreementheader.insert();

    xgreementHeaderDefault.AgreementHeader = xpurchagreementheader.RecId;
    xgreementHeaderDefault.insert();

    xpurchAgreementHeaderDefault.PurchaseAgreementHeader = xpurchagreementheader.RecId;
    xpurchAgreementHeaderDefault.insert();
}

note :
u must define/create those 3 method createDuplicate(),setHeader() and createPurchAgreementheader() in the class. for me i called those three methods in run() method.




Selasa, 29 Oktober 2019

Opening balance on report Summary trial balance showing 0

Ada case dimana pada saat kita mengenerate report summary trial balance value dari opening balance = 0.

anda bisa coba jalankan job berikut :

static void ClearCache(Args _args)

{

    LedgerCache::clearAllScopes();

    pause;

}

Minggu, 18 Agustus 2019

Create InventDim otomatis

Disini akan diperlihatkan bagaimana kita membuat/memakai nomor InventdimId secara otomatis.

Sebagai contoh, buatlah satu Table yang mempunyai field inventdimId. disini saya buat contoh table HYInvetdimDisplay.
dengan field IDHY,InventDimId,ItemId

Relasi :
HYNInventdimDisplay.InvetDimId <> InventDim.InventDimId
HYNInventdimDisplay.ItemId<> InventTable.ItemId

ketik method2 berikut ditable kamu :
public InventDim inventDim(boolean _forUpdate = false)
{
    return InventDim::find(this.InventDimId,_forUpdate);
}

public server void modifyInventDim(InventDim _inventDim, FieldId _tableField)
{
    InventDim   inventDimLocal = InventDim::findOrCreate(_inventDim);

    ;

    this.setInventDimId(inventDimLocal.InventDimId, _tableField, inventDimLocal);
}

public void setInventDimId(InventDimId _inventDimId, FieldId _tableField, InventDim _inventDim = InventDim::find(_inventDimId))
{
    InventDim   currentInventDim = this.(_tableField) == _inventDimId ? _inventDim : this.inventDim(_tableField);

    this.(_tableField) = _inventDimId;
}

Kita menuju ke pembuatan GUI :

buat sebuah form dengan DataSource
>HYNInventdimDisplay
>InventDim
Property InventDim :


Tambahkan method berikut di Datasource InventDim :

public void initValue()
{
    InventDim.data(InventDim::find(HYNInventdimdisplay.InventDimId));
    super();
}

void inventDimModified()
{
    HYNInventdimdisplay.modifyInventDim(InventDim, fieldNum(HYNInventdimdisplay, InventDimId));
    InventDim.data(InventDim::find(HYNInventdimdisplay.InventDimId));
    InventDim_ds.setCurrent();
    InventDim_ds.reread();
    InventDim_ds.refresh();
}

Tambahkan method berikut pada setiap field yang akan dijadikan sebagai dimension sebuah Item :
public void modified()
{
    super();
    InventDim_ds.inventDimModified();
}


Minggu, 28 Juli 2019

Error "Object reference not to set to an instance of an object" SSRS AX 2012 (versi 2)

Error "Object reference not to set to an instance of an object" SSRS AX 2012


Sekali lagi saya akan menceritakan (saya pakai kata "menceritakan" karena ..saya ingin pakai daripda saya menggunakan kata "menjelaskan") bagaimana menangani error diatas. Sebelumnya saya juga sudah pernah mengceritakan penanganan error tersebut dipostingan saya sebelumnya.

Kali ini, error ini muncul pada saat kita mau test hasil deploy SSRSReport dari Environment DEV ke LIVE. (sumpah ini error ini emang bikin jengkel, kenapa harus selalu muncul di SSRS).

Pertama :
Setelah deploy element SSRSReport kita di AOT .
Masuk ke \\Users\[folder user]\[appdata]
 delete semua file *.uac
Masuk ke AOT lagi.
 Refresh report server , clear chace Dsb.

Coba test print.

Rabu, 03 Juli 2019

/DynamicsAx/PurchPurchaseOrderreport.Report4´ cannot be found (rsItemNotFound)

"Error while setting server report parameters. Error Message: The item ´/DynamicsAx/PurchPurchaseOrderreport.Report4´ cannot be found (rsItemNotFound)"


Error ini muncul jika custom design report yang kita buat belum sepenuhnya terdeploy di environment yang kita tuju.
pada kasus saya, di Visual studio sudah berhasil dideploy. Tetapi pada saat aplikasi akan mengupdate database report akun yang saya pakai ternyata tidak mempunyai permision untuk merubah table report yang ada di server SSRS.
maka error selanjutnya jika kamu lanjutkan 'klik kanan pada object ssrs > Deploy element' akan mendapatkan error "you dont have permision... bla.. bla... contact your administrator".

Biasanya ini terjadi jika kita mempunyai 2 Environment atau 2 AOS.
Ex : AOS1 dan Visual Studio yang konek ke AOS1
       AOS2

Saat kita memakai client yang berseting AOS1 tetapi Configurasi AX ke AOS2. maka error ini akan muncul saat kita mencoba untuk deploy report SSRS. Maka arahkan configurasi ke AOS1.



Blank page/paper diawal/antara/akhir halaman report

Terkadang report SSRS yang diexport atau disave dalam format PDF akan membuat halaman kosong pada awal/antara/akhir perhalaman report. walaupun diScreen report AX report tsb baik-baik saja.

Cara pertama :
beri warna semua field object direport. karena kamu tidak akan menemukan sesuatu pada report kamu jika feld border tersebut tdak berwana. Jika field borderline kamu berwarna, pada saat dieksport ke PDF kita akan melihat kelebihan2 dari field yang kepanjangan sampai ke halaman berikutnya.




Cara kedua :
Buat semua margin = 0cm
Jangan sisakan ruang kosong pada Page Properties report kamu.

Selamat mencoba.

Selasa, 02 Juli 2019

Cara mengetahui regionId

coba dan tambahkan code berikut diJob baru kalian.

static void PSMcobacountryregionID(Args _args)
{
    LogisticsAddressCountryRegionISOCode isoCountryCode = SysCountryRegionCode::countryInfo();
    
    LogisticsAddressCountryRegionId countryRegionId = SysCountryRegionCode::getCountryRegionIdByIsoCode(isoCountryCode);
    
    ;
    
    info(isoCountryCode);
    info(countryRegionId);
}

ini biasanya bisa dipakai untuk mengidentifikasi/custom Report Purchase Order/Sales Order 

Cloud hosted environment di D365

Biasanya kita menginginkan sebuah environment yang sama dengan LIVE/PROD untuk mengtest sebuah proses. Maka kita bisa menggunakan fitur Clou...