Rabu, 17 Desember 2014

Refresh Datasource dari sebuah form

Jika kita membuat suatu Form terutama DropDialog yang diperuntukan untuk mengentry data, terkadang sukar sekali untuk merefresh form induknya supaya memperlihatkan hasil entry kita.
berikut adalah contoh untuk merefresh datasource induk.

Di form Childnya (DropDialog) ...
Buka node method
di method CloseOK()
tambahkan macro #Task

public void closeOk()
{
      #Task
      FormRun formRun;

      super();

      formrun = element.args().caller();

      if(formrun)
      {
             formrun.task(#taskF5);
       }
}

implementasinya bisa speerti ini :

public void closeOk()
{

      #Task
      FormRun formRun;

      RefRecId custRecId = element.args().record().RecId;
      RefRecId caseRecId;
  
      Inventtable            ITinventtable;

      ITinventtable.InventId = FieldInventId.valueStr();
      ITinventtable.Name     = FieldInventname.valueStr();

      ITinventtable.insert();
   
      formrun = element.args().caller();
      formrun.task(#taskF5);

     if(formHasMethod(element.args().caller(), identifierstr('setTouched')))
    {
        element.args().caller().setTouched();
       
    }

    super();

   element.savelastvalues();

}

private void saveLastValues()
{
    xSysLastValue::putValue([FieldInventId.valueStr()], curext(), curuserid(), UtilElementType::Form, form.name());
}

Senin, 15 Desember 2014

Melempar value dari form ke form

Kali ini adalah script untuk melempar value dari Form A ke Form B.

Misalkan kita mempunyai form A dengan value 'husna'. Nilai 'husna' ini ingin kita transfer/lempar ke form B.

Pertama kita mempunyai 2 Form, A dan B
Buat juga menuitem displaynya untuk ke dua form tersebut.

Di form A, tarik menuitem display formB ke form A, jadikan sebagai button link ke form B.
Expand node menuitembutton B ke node method.
tambahkan method Clicked()
void clicked()
{
    Args                    args;
    FormRun                 formrun;
    super();

    args = new Args(formStr([formB]));
    args.record([datasource darimana value berasal]);
    formrun = classFactory.formRunClass(args);
    formrun.init();
   
}
contoh :
void clicked()
{
    Args                    args;
    FormRun                 formrun;
    super();

    args = new Args(formStr(FormB));
    args.record(EmplTable);
    formrun = classFactory.formRunClass(args);
    formrun.init();
    //formrun.run();
    //formrun.wait();
    //formrun.detach();
}
di Classdeclaration Form B
public class FormRun extends ObjectRun
{
    [table value yang akan ditangkap berasal]
    Contoh
    Empltable      empltable;
}
Tambahkan juga method init di form B
public void init()
{
     super();
    empltable = element.args().record();
}

selanjutnya..silahkan diolah ..
misalnya anda ingin menangkap value dari field employeeId.
tinggal ambil dari empltable.

empltable.EmployeeId

Kamis, 13 November 2014

Financial Dimension AX 2012

Selama ini ane dibuat bingung dengan behavior nya Financial Dimension AX 12...
Ada beberapa table yang saling berkaitan.

Tapi akhirnya Alhamdulillah ane dah nemu code yang bisa membaca komponen Financial Dimension di AX 12.

berikut Kodenya ;

static void ShowVendDefaultDimensions(Args _args)
{
    VendTable                       vendTable;
    DimensionAttributeValueSet      dimAttrValueSet;
    DimensionAttributeValueSetItem  dimAttrValueSetItem;
    DimensionAttributeValue         dimAttrValue;
    DimensionAttribute              dimAttr;
    Common                          dimensionValueEntity;
    ;
    
    // Find our supplier
    vendTable = VendTable::find('3008');
    
    // Find the dimension value set that the vendor points to (for specifying the 
    // 'default' dimensions). This table is used as a sort of 'header' that the 
    // value set items (DimensionAttributeValueSetItem) records belong to.
    dimAttrValueSet = DimensionAttributeValueSet::find(vendTable.DefaultDimension);

    // Find all of the 'value set items' linked against the 'value set'  
    while select dimAttrValueSetItem
        where   dimAttrValueSetItem.DimensionAttributeValueSet   == dimAttrValueSet.RecId
    {
        // Find the dimension 'value' (DimensionAttributeValue) that the set item points to.        
        dimAttrValue        = DimensionAttributeValue::find(dimAttrValueSetItem.DimensionAttributeValue);
        
        // Find the underlying attribute.
        dimAttr             = DimensionAttribute::find(dimAttrValue.DimensionAttribute);

        // Use the helper class to obtain a reference to the underlying entity (can be anything)              
        dimensionValueEntity = DimensionDefaultingControllerBase::findBackingEntityInstance(
            curext(),
            dimAttr,
            dimAttrValue.EntityInstance);
        
        info(dimAttr.Name + ' ' + dimAttrValue.getValue());               
    }
}
 
lebih lengkapnya ada disini :
http://axinternals.blogspot.com/2011/09/default-dimension-storage-in-ax-2012.html 

Minggu, 09 November 2014

Melempar value dari form ke report

2 Cara berikut bisa dipakai untuk melempar nilai dari form ke report.
Cara 1 :
Dengan membuat object Query di AOT.

Pastikan kita mempunyai form dengan datasource yang sama dengan report.

Misalkan :
Form Employee, Datasource : EmplTable.
Report Employee, Datasource : EmplTable.

buat object Query dengan nama ex: Emplquery
Definisikan DataSource = EmplTable.
Definisikan Range = field2 yang akan menjadi parameter.
Save

Di Reportnya,
Buat Report dengan EmplReport.
Datasource EmplTable tadi delete dan ganti dengan object query EmplQuery.
di Method init
tambahkan code berikut

public void init()
{
    EmplTable empltable;
    super();

     if (element.args().dataset() == tablenum(EmplTable))
    {
        empltable = element.args().record();
    
        this.query().dataSourceName("[nama query kamu di report]").addRange(fieldnum(EmplTable , EmplId)).value(queryValue(empltable.emplid));
    }
}

Done untuk cara satu.

Cara 2 :

Kita bisa menambahkan method initfromcaller atau kamu bisa pakai nama method kamu sendiri.
(cara ini kita tidak perlu membuat object Query)
tambahkan code berikut di method initfromcaller
public void initFromCaller(Args _args)

{
EmplTable empltable;

QueryBuildDataSource qbds;

;

if (_args.caller())

{

    if (! _args.record().recId)

    throw error(strfmt("@SYS22338",funcname()));

    switch (_args.dataset())

    {

        case tablenum(EmplTable ):

        empltable= _args.record();

        //if (projmtotable.MTODocumentNo != ProjMTOTableAXS.MTODocumentNo)

        //throw error(strfmt("@SYS23396",funcname()));

        //break;

        //default:

        //throw error(strfmt("@SYS23396",funcname()));

    }

}



if (true || empltable.emplid)

{

qbds = element.query().dataSourceTable(tablenum(EmplTable));
SysQuery::findOrCreateRange(qbds, fieldnum(EmplTable, emplid)).value(empltable.emplid);
SysQuery::findOrCreateRange(qbds, fieldnum(EmplTable, Name)).value(empltable.name);
}

}

Done cara 2
bisa lihat lebih lengkap disini http://theaxapta.blogspot.com/2013/01/how-to-pass-values-from-form-to-report.html

Selasa, 09 September 2014

PR approved is not exist in the form Release approved purchase requisitions

There's an unexpected moment when an Approved Purchase Requisition is not collected by Release approved purchase requisition form. ... something silly rite?
but, yes ... iv got that problem.
This case is happen when the Accounting status field on Sourcedocumentline table is set to 'Fully distributed'. i dont know why this accounting status field is set to 'Fully distributed', i mean the trigger that's makes the status become 'Fully distributed'.
So,... in this case u can fix this problem by set the Accounting status to become 'Completed'.

U can use the script from the Job.

Use the PurchTable, Purchline and SourceDocumentline.

Select PRtable where Prtable.PurchReqId == "XXXX";
    while select PRline where PRline.PurchReqTable == PRtable.RecId
    {
        Select forUpdate documentline where documentline.RecId == PRline.SourceDocumentLine;
        {
            info(strFmt("PRlinenum : %1, Documentstatus : %2",PRline.LineNum,documentline.AccountingStatus));
             ttsBegin;
            documentline.AccountingStatus = SourceDocumentLineAccountingStatus::Completed;
            documentline.update();
            ttsCommit;
                    }


    }


Jumat, 22 Agustus 2014

Number sequence ******** has been exceeded


Hai,... maaf nih baru update lagi,...
sudah hampir sepuluh bulan di tempat baru ...

Kali ini kita akan membahas number sequence yang telah habis.
Jika teman-teman mendapatkan error message "Number sequence ******** has been exceeded" pada saat posting Packing Slip, Invoice dsb bisa jadi number sequence yang akan berjalan lebih besar dari number sequence yang terbesar yang telah kita setup.

Cek ******.. tersebut di table Numbersequencetable, lihat number sequence codenya.
Back to form Number sequence dan pilih sequence codenya, klik edit/double click numbersequence tersebut. Selanjutnya kita bisa setup kembali numbersequence terbesarnya di field Largest. Klik OK.

Selasa, 15 April 2014

Cannot update LogisticPostalAddress

Hallo
saat ini aku sedang mencoba untuk mengupdate record yang ada di table LogisticsPostalAddress. Tetapi system malah mengeluarkan error seperti dibawah ini "Cannot edit a record in Addresses (LogisticsPostalAddress). Update on a valid time state table is not allowed without specifying a ValidTimeStateUpdateMode."
what u have todo is,... make sure u call validTimeStateUpdateMode method.

here is the example

static void Job12(Args _args)
{
    RecId   _recid;
    LogisticsPostalAddress      _dlvadress;
    ;
   
    ttsBegin;
    _dlvadress.validTimeStateUpdateMode(ValidTimeStateUpdate::Correction);
    select forUpdate _dlvadress where _dlvadress.RecId == 5637147898;
   // _dlvadress = LogisticsPostalAddress::findRecId(5637147898,true); or ucan try this
   
        _dlvadress.Address = "Cirebon";
        _dlvadress.update();
    ttsCommit;

}

OK...
selamat mencoba

Kamis, 13 Maret 2014

Import Data dari file excel .CSV ke table AX2012

Di AX2012 ini memang bikin kita senewen, terutama untuk kita yang sudah terbiasa dengan fasilitas import Data Excel ke table AX, karena fasilitas ini dihilangkan oleh si mihkocok.

Belum lagi kita dibikin mumet dengan Addin kita yang gaaaaa solve solve errornya.

Ok.
Kali ini saya mau berbagi script untuk meimport data dari file excel terutama yang berformat .CSV.

1.Asumsikan kita mempunyai file excel dengan data yang sudah dimasukna ke kolom2nya.
Oh iya, script ini saya buat untuk mengimport data ke table custom kita bukan table standard AX.(ane masih mumet cuuuy dengan struktur table AX2012 ini :( )
2.Asumsikan kamu mempunyai table custom yang sudah kamu buat.

lalu buat lah job seperti ini.

Di job ini sebelumnya saya sudah membuat table bernama HYNImportTable.
Dan saya juga sudah maping kolom mana saja yang akan saya ambil nilainya dan selanjutnya saya tembak ke field2 yang sesuai dengan field yang ada ditable saya itu.

static void HYNimporttable(Args _args)
{
    #File
    CommaTextIo        commaTextIo;
    FileIOPermission   permission;
    container          containFromRead;
    int                x;
    int                cols;

    PurchId             purchid;
    AccountingDate      accountingdate;
    VendAccount         vendaccount;
    Line                line;
    TaxGroup            taxgroup;
    TaxItemGroup        taxitemgroup;
    PurchPoolId         poolid;
    LogisticsDeliveryName   Dlvaname;
    Addressing              dlvaddress;
    DlvDate                 dlvdate;
    CurrencyCode            currencycode;
    ItemId                  itemid;
    EcoResCategoryName      procurementcategory;

    PurchQty                        purchQty;
    PurchUnit                       purchunit;
    PurchPrice                      purchPrice;
    AmountCur                       lineAmount;
    PurchReqId                      PRid;
    PurchQtyOrdered                 deliveryremainder;
    ProjCategoryId                  ProjCategoryId;
    VersioningDocumentState         Approvalstatus;
    PurchReqAttention               Attention;
    ItemFreeTxt                     POtext;
    AmountCur                       progpaymamount;
    Name                            PaymTermId;
    ProjId                          ProjId;

    EcoResItemConfigurationName     configId;
    InventLocationId                warehouseid;
    InventSiteId                    siteId;
    EcoResItemSizeName              inventSizeid;
    EcoResItemColorName             inventColorid;
    EcoResItemStyleName             inventStyleid;



    HYNImportTable         hynimporttable;
    ;

    permission = new FileIOPermission('d:\\Upload data PTG\\PO Open Part2 4.csv',#io_read);//D:\Upload data PTG
    permission.assert();

    commaTextIo = new CommaTextIO('d:\\Upload data PTG\\PO Open Part2 4.csv','R');

    containFromRead = commaTextIo.read();
     ttsBegin;
    while(containFromRead)
    {

        cols = conLen(containFromRead);
        for(x=1;x<=cols;x++)
        {
            //accounting date
            if(x == 1)
            {
                accountingdate = str2Date(conPeek(containFromRead,x),-1);
            }
            //PO number
            if(x == 2)
            {
                purchid = strLTrim(conpeek(containFromRead,x));
            }
            //vendaccount
            if(x == 3)
            {
                vendaccount = strLTrim(conPeek(containFromRead,x));
            }

            //line
            if(x==4)
            {
                line = conPeek(containFromRead,x);
            }
            //taxgroup
            if(x==5)
            {
                taxgroup = conPeek(containFromRead,x);
            }
            //taxitemgroup
            if(x==6)
            {
                taxitemgroup = conPeek(containFromRead,x);
            }
            //pool
            if(x==8)
            {
                poolid = conPeek(containFromRead,x);
            }
            //Dlvname
            if(x==9)
            {
                Dlvaname = conPeek(containFromRead,x);
            }
            //dlvaddress
            if(x==10)
            {
                dlvaddress = conPeek(containFromRead,x);
            }
            //dlvdate
            if(x==12)
            {
                dlvdate = str2Date(conPeek(containFromRead,x),-1);
            }
            //currencycode
            if(x==13)
            {
                currencycode = conPeek(containFromRead,x);
            }
            //Payemtermid
            if(x==14)
            {
                PaymTermId = conPeek(containFromRead,x);
            }
            //ItemId
            if(x==15)
            {
                itemid = conPeek(containFromRead,x);
            }
            //Procurementcategory
            if(x==16)
            {
                procurementcategory = conPeek(containFromRead,x);
            }
            //configId
            if(x==17)
            {
                configId = conPeek(containFromRead,x);
            }
            //inventSizeId
            if(x==18)
            {
                inventSizeid = conPeek(containFromRead,x);
            }
            //inventCOlorId
            if(x==19)
            {
                inventColorid = conPeek(containFromRead,x);
            }
            //inventStyleId
            if(x==20)
            {
                inventStyleid = conPeek(containFromRead,x);
            }
            //inventSiteId
            if(x==21)
            {
                siteId = conPeek(containFromRead,x);
            }
            //inventLocationId
            if(x==22)
            {
                warehouseid = conPeek(containFromRead,x);
            }
            //Qty
            if(x==23)
            {
                purchQty = conPeek(containFromRead,x);
            }
            //PurchUnit
            if(x==24)
            {
                purchunit = conPeek(containFromRead,x);
            }
            //PurchPrice
            if(x==25)
            {
                purchPrice = conPeek(containFromRead,x);
            }
            //lineamount
            if(x==26)
            {
                lineAmount = conPeek(containFromRead,x);
            }
            //PR
            if(x==27)
            {
               PRid = strLTrim(conPeek(containFromRead,x));
            }
            //deliveryremainder
            if(x==28)
            {
                deliveryremainder = conPeek(containFromRead,x);
            }
            //ProjId
            if(x==30)
            {
                ProjId  = conPeek(containFromRead,x);
            }
            //ProjCategoryId
            if(x==31)
            {
                ProjCategoryId = conPeek(containFromRead,x);
            }
            //Approvalstatus
            if(x==38)
            {
                Approvalstatus = str2enum(Approvalstatus,conPeek(containFromRead,x));
            }
            //Attention
            if(x==39)
            {
                Attention = conPeek(containFromRead,x);
            }
            //POtext
            if(x==40)
            {
                POtext = conPeek(containFromRead,x);
            }
            if(x==42)
            {
                progpaymamount = conPeek(containFromRead,x);
            }



        }
            hynimporttable.AccountingDate = accountingdate;
            hynimporttable.PurchId = purchid;
            hynimporttable.VendAccount = vendaccount;
            hynimporttable.Line = line;
            hynimporttable.TaxGroup = taxgroup;
            hynimporttable.TaxItemGroup = taxitemgroup;
            hynimporttable.PurchPoolId = poolid;
            hynimporttable.DlvName = Dlvaname;
            hynimporttable.DlvAddress = dlvaddress;
            hynimporttable.DlvDate = dlvdate;
            hynimporttable.CurrencyCode = currencycode;
            hynimporttable.PaymTermId = PaymTermId;
            hynimporttable.ItemId = itemid;
            hynimporttable.ProcurementCategory = procurementcategory;
            hynimporttable.ConfigId = configId;
            hynimporttable.InventSiteId = siteId;
            hynimporttable.InventLocationId = warehouseid;
            hynimporttable.InventSizeId = inventSizeid;
            hynimporttable.InventColorId = inventColorid;
            hynimporttable.InventStyleId = inventStyleid;
            hynimporttable.PurchQty = purchQty;
            hynimporttable.PurchUnit = purchunit;
            hynimporttable.PurchPrice = purchPrice;
            hynimporttable.LineAmount = lineAmount;
            hynimporttable.PurchReqId = PRid;
            hynimporttable.DeliverRemainder = deliveryremainder;
            hynimporttable.ProjId = ProjId;
            hynimporttable.ProjCategoryId = ProjCategoryId;
            hynimporttable.ApprovalStatus = Approvalstatus;
            hynimporttable.Attention = Attention;
            hynimporttable.POText = POtext;
            hynimporttable.ProgPaymAmount = progpaymamount;
            hynimporttable.insert();

        containFromRead = commaTextIo.read();

    }
    ttsCommit;
    info("done");
   

}

Ok selamat mencoba

SSRS (rsAccessDenied)


Baiklah Seminggu ini kami dihadapkan persiapan Go Live dan menghadapi kendala pada Report yang tidak bisa dibuka oleh user.

Kendalanya seperti berikut : Report yang ada di menu AX2012 bisa running/terbuka oleh user yang masuk group administrator. User yang tidak termasuk didalamnya tidak bisa membukanya, system mengeluarkan message error seperti berikut

"Error while setting server report parameters. Error message: The permissions granted to user '[DOMAIN\USERNAME]' are insufficient for performing this operation. (rsAccessDenied)"

untuk mengatasi hal ini kita bisa menambahkan permision untuk user2 tersebut di 

http://(SSRSREPORTSERVERNAME)/Reports/Pages/Folder.aspx

anda bisa membukanya dibrowser anda.

SSRSREPORTSERVERNAME : nama server/ip address SSRS anda.

Jika sudah terbuka :
1.

pilih folder Report AXnya

2.

klik tombol Folder Setting

3.

Setelah itu klik menu Security yang ada di panel kiri, maka terbuka halaman list user yang mempunyai akses ke report2 AX2012. Anda bisa menambahkan user2 yang lainnya dengan mengklik tombol New Role Assignment.

Selanjutnya anda tinggal memasukan username user-user anda dan memilih report mana saja yang bisa dibuka oleh mereka.

Selamat mencoba.
 
 

Erorr CS1963 - An expression tree may not contain a dynamic operation.

Kali ini saya mendapatkan erorr dengan code CS1963, padahal sebelumnya saya sudah mendefinisikan 'var item in Model' di @foreach(var...