Rabu, 03 Juni 2015

Passing value from parents form to child form

Morning SpAXrtan
Ohayou
Gunaydin

this time i share a steps how to get value from Parent form,wraped it become parameter,send to child form.

> Create a Display menuItem of child form
> Drag it to Parents form to become a button.
> Override the method click of menuItem button  

// #! INCIDENT !#.LAST.04.06.15.Husna.Yu:
//Menangkap nilai yang disortir digrid(diform parent),dijadikan parameter lalu dilempar ke form child
void clicked()
{
    /*
    Args                        args;
    FormRun                     formrun;
    super();

    args = new Args(formStr(PTGITTransaction));
    args.record(PTGITInventtable);
    formrun = classFactory.formRunClass(args);
    formrun.init();
    */

    Args                        parameters = new Args();
    MenuFunction                addressFormatmenu;
    ;

    addressFormatmenu = new MenuFunction(menuitemDisplayStr(PTGITTransaction),MenuItemType::Display);
    parameters.caller(element);
    parameters.parm(Grid_PTGItemcode.text());
    addressFormatmenu.run(parameters);

}

> on the datasource of childs form, overide the init method

// #! INCIDENT !#.LAST.04.06.15.Husna.Yu:
public void init()
{
    FormRun         callerForm = element.args().caller();
    super();

    if(callerForm)
    {
        if(callerForm.name() == formStr(PTGITInventtable))
        {
            //info(element.args().parm()); //cek parameter yang dilempar
        this.query().dataSourceNo(1).addRange(fieldNum(vwPTGITJournaltrans, PTGItemcode)).value(element.args().parm()); //memfilter record datasource agar menampilkan data sesuai parameter (element.args().parm())
        }
    }

}

done.

http://microsoft.public.axapta.programming.narkive.com/ZnRRSzzp/set-form-data-source-filter-from-x
»»  READMORE...

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());
}
»»  READMORE...

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
»»  READMORE...

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 
»»  READMORE...

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

»»  READMORE...

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;
                    }


    }


»»  READMORE...

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.
»»  READMORE...