readVNNumber X++
static TempStr readVNNumber(real _num)
    {
        int64           tmpNum          = any2int64(abs(_num));
        str             tmpStr          = strfmt("%1",tmpNum);
        int             lenStr          = strLen(tmpStr), i, j;
        real            remainAmount    = abs(_num) - tmpNum;
        int             tmp             = decround(abs(remainAmount),2)*100;
        str             trillionTxt     = "";
        str             billionTxt      = "";
        str             millionTxt      = "";
        str             thousandTxt     = "";
        str             hundredTxt      = "";
        str             remainTxt       = "";
        VASUtils        vasUtil         = new VASUtils();
        ;
 
        if (_num == 0)
            return "Không";
 
        If (remainAmount != 0)
            remainTxt = strfmt(" và %1/%2",tmp,100);
        else
            remainTxt   = "";
 
        for (i = lenStr; i >= 1; i --)
        {
            j ++;
            if (i > 12 && i <= 15)
                trillionTxt = trillionTxt + substr(tmpStr,j,1);
 
            if (i > 9 && i <= 12)
                billionTxt = billionTxt + substr(tmpStr,j,1);
 
            if (i > 6 && i <= 9)
                millionTxt = millionTxt + substr(tmpStr,j,1);
 
            if (i > 3 && i <= 6)
                thousandTxt = thousandTxt + substr(tmpStr,j,1);
 
            if (i <= 3)
                hundredTxt = hundredTxt + substr(tmpStr,j,1);
 
        }
 
        return str2Capital(strltrim(strRtrim(vasUtil.trillion(trillionTxt)
               + vasUtil.billion(billionTxt)
               + vasUtil.million(millionTxt)
               + vasUtil.thousand(thousandTxt)
               + vasUtil.hundred(hundredTxt)
               + remainTxt)));
    }


Protected str billion(str billion)
    {
        ;
 
        if (billion == "000" || billion == "")
            return "";
        else
            return this.hundred(billion) + " Tỷ ";
    }

    Protected str hundred(str hundred)
    {
        str     txt = "", tmpTxt;
        int     i, tmplen = strlen(hundred);
        ;
 
        if (hundred == "000")
 
        return "";
 
        if ((tmplen == 3) && (substr(hundred,2,2) == "00"))
        {
            return this.rawStr(substr(hundred,1,1)) + " Trăm";
        }
        else if (tmplen == 2)
        {
            if (substr(hundred,1,1) == "1")
            {
                if (substr(hundred,2,1) == "0")
                    return " Mười";
                else
                    return " Mười " + this.rawStr(substr(hundred,2,1));
            }
            else
            {
                if (substr(hundred,2,1) == "0")
                    return this.rawStr(substr(hundred,1,1)) + " Mươi";
 
                else if (substr(hundred,2,1) == "1")
                    return this.rawStr(substr(hundred,1,1)) + " Mươi " + "Mốt";
 
                else
                {
                    if (substr(hundred,2,1) == "5")
                        return this.rawStr(substr(hundred,1,1)) + " Mươi " + "Lăm";
                    else
                        return this.rawStr(substr(hundred,1,1)) + " Mươi " + this.rawStr(substr(hundred,2,1));
                }
            }
        }
        else if (tmplen == 1)
        {
            return this.rawStr(hundred);
        }
 
        for (i = 1; i <= strlen(hundred); i++)
        {
            tmpTxt = subStr(hundred,i,1);
 
            if (i == 1)
                txt = this.rawStr(tmpTxt) + " Trăm";
            if (i == 2)
            {
                if (str2int(tmpTxt) >= 2)
                {
                    txt = txt + " " + this.rawStr(tmpTxt) + " Mươi";
                }
                else
                {
                    if (tmpTxt == "0")
                        txt = txt + " Lẻ";
                    else
                        txt = txt + " Mười";
                }
            }
            if (i == 3)
            {
                if (tmpTxt == "0")
                txt = txt;
                else if (tmpTxt == "1")
                {
                    if (substr(hundred,strLen(hundred)-1,1) == "0" || substr(hundred,strLen(hundred)-1,1) == "1")
                        txt = txt + " Một";
                    else
                        txt = txt + " Mốt";
                }
                else if (tmpTxt == "5" && subStr(hundred,2,1) != "0")
                    txt = txt + " Lăm";
                else
                    txt = txt + " " + this.rawStr(tmpTxt);
            }
        }
        return txt;
    }

    Protected str million(str million)
    {
        ;
 
        if (million == "000" || million == "")
            return "";
        else
            return this.hundred(million) + " Triệu ";
    }

    Protected str rawStr(str  tenth)
    {
        str     ret;
        ;
        switch (tenth)
        {
            case "0":
                ret = "Không";
            break;
 
            case "1":
                ret = "Một";
            break;
 
            case "2":
                ret = "Hai";
            break;
 
            case "3":
                 ret = "Ba";
            break;
 
            case "4":
                 ret = "Bốn";
            break;
 
            case "5":
                 ret = "Năm";
            break;
 
            case "6":
                ret = "Sáu";
            break;
 
            case "7":
                ret = "Bảy";
            break;
 
            case "8":
                 ret = "Tám";
            break;
 
            case "9":
                 ret = "Chín";
            break;
 
            case "10":
                 ret = "Mười";
            break;
        }
        return ret;
    }

    Protected str thousand(str thousand)
    {
        ;
 
        if (thousand == "000" || thousand == "")
            return "";
        else
            return this.hundred(thousand) + " Ngàn ";
    }

    Protected str trillion(str trillion)
    {
        ;
 
        if (trillion == "000" || trillion == "")
            return "";
        else
            return this.hundred(trillion) + " Ngàn tỷ ";
    }
Visible when init form
[ExtensionOf(formStr(RetailSizeGroupTable))]
final class VtvRetailSizeGroupTableForm_Extension
{
 
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormEventHandler(formStr(RetailSizeGroupTable), FormEventType::Initialized)]
    public static void RetailSizeGroupTable_OnInitialized(xFormRun sender, FormEventArgs e)
    {
        FormControl control = sender.design(0).controlName("AutoBarcodeNumberButton");
     
        control.visible(false);
    }

}
Below is the code snippent for "onActivated" event handler-
FormDataSourceEventType::Activated)]
public static void ProjTable_OnActivated(FormDataSource sender, FormDataSourceEventArgs e)
{
     ProjTable projTable = sender.cursor();   /
     FormDataSource projTable_ds = sender.formRun().dataSource("ProjTable");
     FormRun element = sender.formRun();
     FormControl costOpportionToSubProject = element.design(0).controlName("Apportionment");            
     //Appointment is the newly added button

if(ProjTable.Type == ProjType::FixedPrice)
{
costOpportionToSubProject.enabled(true);
}
else
{
costOpportionToSubProject.enabled(false);
}
}
Select a record from a table when you only have the tableId
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public Common findRecord(TableId _tableId, RecId _recId, Boolean _forUpdate = false)
{
    Common      common;
    DictTable   dictTable;
    ;
    dictTable = new DictTable(_tableId);
    common = dictTable.makeRecord();
 
    common.selectForUpdate(_forUpdate);
 
    select common
    where common.RecId == _recId;
 
    return common;
}
Get sales price, purchase, sales discount for item like sales line
public static void main(Args args)
    {
     
       PriceDisc_Price priceDisc_Price = PriceDisc_Price::construct();
        PriceDisc_LineDisc                  priceDisc_LineDisc;
     
                        //TODO: sell price and sell off
                priceDisc_Price.parmModuleType(ModuleInventPurchSales::Sales);
                priceDisc_Price.parmItemId(inventJournalTransNew.ItemId);
                priceDisc_Price.parmInventDim(newInventDim);
                priceDisc_Price.parmUnitID(scanUnitId);
                priceDisc_Price.parmPriceDate(DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone()));
                priceDisc_Price.parmQty(inventJournalTransNew.Qty);
                priceDisc_Price.parmAccountNum("");
                priceDisc_Price.parmCurrencyCode(Ledger::accountingCurrency(CompanyInfo::current()));
               
                inventJournalTransNew.VtvSellPrice = priceDisc_Price.price();

                priceDisc_LineDisc.parmModuleType(ModuleInventPurchSales::Sales);
                priceDisc_LineDisc.parmItemId(inventJournalTransNew.ItemId);
                priceDisc_LineDisc.parmInventDim(newInventDim);
                priceDisc_LineDisc.parmUnitID(scanUnitId);
                priceDisc_LineDisc.parmDiscDate(DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone()));
                priceDisc_LineDisc.parmQty(inventJournalTransNew.Qty);
                priceDisc_LineDisc.parmAccountNum("");
                priceDisc_LineDisc.parmCurrencyCode(Ledger::accountingCurrency(CompanyInfo::current()));
         
                inventJournalTransNew.VtvPercentSalesOff    = priceDisc_LineDisc.discPct();
                inventJournalTransNew.VtvDiscountAmount     = priceDisc_LineDisc.discAmount();


     

    }

VtvCreateInventJournalTrans Tuyệt vời ông mặt trời
public void VtvCreateInventJournalTrans(ItemId itemId, InventBatchId batchId, InventUnitId scanUnitId, VtvOftionScan scanMode)
    {
        JournalTableMap     journalTableMap;
        InventJournalTable  inventJournalTable;
        boolean             refreshForm;
        InventDim           newInventDim;
        RecId               fromUnitRecId;
        RecId               toUnitRecId;
        InventUnitId        inventUnitId;
        InventQtyJournal    convertionQty;
        InventTable         inventTable;
        JournalId JournalId;


        InventJournalTrans  inventJournalTransNew, inventJournalTransExisted, inventJournalTransFocus;
        var journalFormTrans = this.journalForm() as JournalFormTrans;

        JournalId = journalFormTrans.getJournalFormTable().journalTable().JournalId;

        inventJournalTransNew.clear();
        inventJournalTransNew.initValue();
        inventJournalTransNew.ItemId = itemId;
        inventJournalTransNew.initFromInventJournalTable(InventJournalTable::find(JournalId));
        inventJournalTransNew.initFromInventTable(InventTable::find(itemId));

        newInventDim = InventDim::find(inventJournalTransNew.InventDimId);
        newInventDim.inventBatchId  = batchId;

        newInventDim = InventDim::findOrCreate(newInventDim);
        inventJournalTransNew.InventDimId = newInventDim.inventDimId;
        inventJournalTransNew.setInventDimId(newInventDim.inventDimId,newInventDim);

        inventTable     = InventTable::find(itemId);

        //Convert quantity if scan unit id != inventory unit id
        inventUnitId    = inventJournalTransNew.unitId();
        convertionQty   = this.VtvSetQuantity(1, scanMode);

     
        if((inventUnitId != scanUnitId) && (scanUnitId != ""))
        {
            fromUnitRecId   = UnitOfMeasure::findBySymbol(scanUnitId).RecId;
            toUnitRecId     = UnitOfMeasure::findBySymbol(inventUnitId).RecId;

            if (UnitOfMeasureConverter::canBeConverted(fromUnitRecId, toUnitRecId, inventTable.Product)) // can be converted to invent unit
            {
                inventJournalTransNew.Qty = UnitOfMeasureConverter::convert(convertionQty,
                                                                            fromUnitRecId,
                                                                            toUnitRecId,
                                                                            NoYes::Yes,
                                                                            inventTable.Product,
                                                                            NoYes::No);
                inventJournalTransNew.modifiedField(fieldNum(InventJournalTrans,Qty));
            }
            else
            {
                throw error(strFmt("@SYS28690", scanUnitId, inventUnitId));
            }
        }
        else
        {
            inventJournalTransNew.Qty                   = this.VtvSetQuantity(1, scanMode);
        }
     
        //Check existed line
        select firstOnly forUpdate inventJournalTransExisted
    where inventJournalTransExisted.ItemId == inventJournalTransNew.ItemId &&
            inventJournalTransExisted.InventDimId == inventJournalTransNew.InventDimId &&
            inventJournalTransExisted.TransDate == inventJournalTransNew.TransDate &&
            inventJournalTransExisted.JournalId == inventJournalTransNew.JournalId &&
            inventJournalTransExisted.JournalType == inventJournalTransNew.JournalType;
        if(inventJournalTransExisted)
        {

            inventJournalTransExisted.Qty               += inventJournalTransNew.Qty;

            inventJournalTransExisted.modifiedField(fieldNum(InventJournalTrans,Qty));
            inventJournalTransExisted.setCostPrice(inventJournalTransExisted.InventDimId,inventJournalTransExisted.inventDim());

            if(inventJournalTransExisted.Qty == 0)
            inventJournalTransExisted.delete();
            else
            inventJournalTransExisted.update();

            inventJournalTransFocus = inventJournalTransExisted;
            refreshForm = true;
        }
        else
        {
            if(inventJournalTransNew.validateWrite())
            {
                inventJournalTransNew.setCostPrice(inventJournalTransNew.InventDimId,inventJournalTransNew.inventDim());
                inventJournalTransNew.insert();
                inventJournalTransFocus = inventJournalTransNew;
                refreshForm = true;
            }
        }

        //refresh from
        if(refreshForm)
        {
            InventJournalTrans_DS.research();
            InventJournalTrans_DS.executeQuery();
            InventJournalTrans_DS.findRecord(inventJournalTransFocus);

            //update num of line
            inventJournalTransFocus.clear();

            select count(RecId)
            from inventJournalTransFocus
            where inventJournalTransFocus.JournalId == journalId;

            journalTableMap = journalFormTrans.journalTableData().journalTable();
            journalTableMap.NumOfLines = any2int(inventJournalTransFocus.RecId);
            journalFormTrans.journalTableData().journalTable(journalTableMap);
        }
    }
init form
    [PostHandlerFor(formStr(InventJournalMovement), formMethodStr(InventJournalMovement, init))]
    public static void InventJournalMovement_Post_init(XppPrePostArgs args)
    {
        Info("Init data");
        FormRun formRun = args.getThis();
        Common common = formRun.args().record();
        InventJournalTrans_Tag inventJournalTrans_tag;
        InventJournalTable inventJournalTable;
    }
InventItemBarcodeForm_Extension
[ExtensionOf(formStr(InventItemBarcode))]
final class InventItemBarcodeForm_Extension
{
    [FormControlEventHandler(formControlStr(InventItemBarcode, btnUpdateItemBarcode), FormControlEventType::Clicked)]
    public static void InventItemBarcode_OnClicked(FormControl sender, FormControlEventArgs e)
    {
        FormRun             formRun       = sender.formRun() as FormRun;
        formRun.vtvUpdateBarcode();
       

    }

    public void vtvUpdateBarcode()
    {
        InventItemBarcode           inventItemBarcode = InventItemBarcode_DS.getFirst() as InventItemBarcode;

        while(inventItemBarcode)
        {
            inventItemBarcode = InventItemBarcode_DS.getNext() as InventItemBarcode;
        }
    }

}
FormDataSourceEventHandler
    [FormDataSourceEventHandler(formDataSourceStr(InventItemBarcode, InventItemBarcode), FormDataSourceEventType::Initialized)]
    public static void InventItemBarcode_OnInit(FormDataSource sender, FormDataSourceEventArgs e)
    {
        FormRun             element      = sender.formRun();
        FormDataSource      InventItemBarcode_ds = element.dataSource(formDataSourceStr(InventItemBarcode, InventItemBarcode)) as FormDataSource;
        InventItemBarcode_ds.object(fieldNum(InventItemBarcode, itemBarCode)).allowEdit(false);
    }