Last Project in University
I code a tools for chatbot Facebook, Zalo, Webchat, Wechat, Skype.

But my Partner ask: In small shop and company, when they have a message, why they use your tools?

My Old Dream
My dream is have a small company with my tools i develop. But i can do it alone, i want have a friends and team.

In this picture is some of my tools

Convert from row & column number to Excel range
Trainee: Song Thanh Nghia

//convert from row & column number to Excel range
//(1,1) -> A1, (1,2) -> B1
final str getConvertedCellRange(  int     _startRow,
                            int     _startColumn,
                            int     _endRow         = _startRow,    //one whole row
                            int     _endColumn      = _startColumn) //one whole colum
    str             startColumnStr;
    str             endColumnStr;

    if (!_startColumn || !_endColumn
        || (_startColumn > _endColumn)
        || !_startRow || !_endRow
        || (_startRow > _endRow))

        throw warning("Invalid excel range!");

    if(_startColumn <= 26)
        startColumnStr = num2char(_startColumn + 64);
        startColumnStr = num2char((_startColumn - 1) / 26 + 64) + num2char(((_startColumn - 1) mod 26) + 65);

    if(_endColumn <= 26)
        endColumnStr = num2char(_endColumn + 64);
        endColumnStr = num2char((_endColumn - 1) / 26 + 64) + num2char(((_endColumn - 1) mod 26) + 65);

    return strfmt("%1%2:%3%4", startColumnStr, _startRow, endColumnStr, _endRow);

Page Break In SSRS Report

Page Break In SSRS Report

Trainee: Song Thanh Nghia
Today my member of team trainee sent me a blog to create a SSRS Report and how to break page in report.
I really know it, but so long time no interactive(tương tác) with AX 2012 So that note it in my blog

Report developer get a request from team lead saying… Design a simple report with table component and display all rows available in a table x. But, you should show only 10 rows per page in the SSRS report.

The brave(thách đố)  report developer just design a report by pulling (kéo)  data to the report without our the 10 rows per page constraint(hạn chế).

I will be showing you that how to display only N rows in the report in this article.


Design a report as described in the article . This implementation topic has page break configuration in the report.

Step 1: A simple design to show all rows in a table using table component.
Step 2: Add a group to the detail row

Step 3: Add group expression “=Ceiling((RowNumber(Nothing)) / Nth row)” and Click OK

Step 4: You may get the following error if you run the report after step 3.

Step 5: Open Row group properties and remove sort expression.

Step 6: Now, report will show 30 rows in a group. Next step is to define page break for the group. Go to page breaks tab and select page break option

Step 7: Now, hide the group header and detail column from the table component and run the report.

Thanks for reading. Please subscribe for e-mail for instant article delivery to your inbox. For latest updates vision Facebook page and like the page.
Create button for filter advance in form axapta 4.0

Create button for filter advance in form axapta 4.0

Trainee: Song Thanh Nghia

void clicked()
    SCA_ManualTransfer               manualTransfer;
    InventJournalTable               inventJournal;
    Query                   query = new Query();
    QueryRun                queryRun;
    QueryBuildDataSource    qbd;

    QueryBuildRange         range;
    QueryBuildRange         qbrTransportCompany;
    int                     cntManual, cntInvent,  i;


    queryRun = new QueryRun(querystr(sca_internalTransfer));

        cntManual = queryRun.query().dataSourceTable(tablenum(SCA_ManualTransfer)).rangeCount();
        for ( i = 1 ; i <= cntManual ; i++ )
            range = queryRun.query().dataSourceTable(tablenum(SCA_ManualTransfer)).range(i);
            info(strfmt("Range Field %1, Value %2",range.AOTname(),range.value()));
            SCA_ManualTransfer_ds.query().dataSourceName("SCA_ManualTransfer").addRange(fieldName2Id(tableName2Id('SCA_ManualTransfer'), range.AOTname())).value(range.value());

        cntInvent = queryRun.query().dataSourceTable(tablenum(InventJournalTable)).rangeCount();
        for ( i = 1 ; i <= cntInvent ; i++ )
            range = queryRun.query().dataSourceTable(tablenum(InventJournalTable)).range(i);
            info(strfmt("Range Field %1, Value %2",range.AOTname(),range.value()));
            InventJournalTable_ds.query().dataSourceName("InventJournalTable").addRange(fieldName2Id(tableName2Id('InventJournalTable'), range.AOTname())).value(range.value());

Some Method To Control Date In Axapta

Some Method To Control Date In Axapta

Trainee: Song Thanh Nghia

DateTimeUtil: A date time manipulation utility class. Some of its methods are referenced below too

DateTimeUtil::getSystemDateTime(): Works like a Now() method

DateTimeUtil::addMonths(): Add n months to the provided date

dayOfMth(date): Calculates the number of the day in the month for the specified date.

I usually use this method to create new date - so easy to make date time

mkDate(int month, day, year)- Creates a date based on three integers, which indicate the day, month, and year, respectively.

prevYr(date) - Retrieves the date in the previous year that corresponds most closely to the specified date. Similar functions include prevMth() and prevQtr()

dateMthFwd(date, int qty): Adds the specified number of months to a date.
Pass Selected Record To New Form Dynamic AX

Pass Selected Record To New Form Dynamic AX

Trainee: Song Thanh Nghia
Step1. Create a form with datasource as CustTable and design a form, then we have a grid with the same datasource. And add button to override click and function in this to pass argrument.

Step2. Code in Override click

void Clicked()
Args    _args;
FormRun _formRun;
AccountNum      _accountNum;
_accountNum = CustTable.AccountNum;  // Selected data to pass in args
_args = new Args(); // creating a object for args class;  // Name of display form
_args.caller(this);  //Caller form
_args.parm(_accountNum); // Parm record to new form 
_args.record(CustTable); // Table name is passed
_formRun = ClassFactory.formRunClass(_args); //new FormRun(_args);   // Creating object for FormRun
_formRun.init();   // Form Initialization for Load;  // Form Run for process
_formRun.wait(); // Form Wait for Display

Step3. Create another form same old form

Step4. In new form overide init form 

public void init()
parmid      _parmId;
CustTable   _CustTable;
_parmId =  element.args().parm();
        info('DataSet Not Received'); 

Step5. Overide Init datasource

public void init()
    Query               query;
    QueryBuildRange     queryBuildRangeProj;
switch(element.args().dataset())// get the table id sent by caller
case tablenum(CustTable):  // check the table if matches with this tableid
_AccountNum  =   element.args().parm();  // get the argument value
query  = new Query();
queryBuildRangeProj = query.addDataSource(tablenum(CustTable)).addRange(fieldnum(CustTable,AccountNum));          // query build for the form to display
queryBuildRangeProj.value(_accountNum); // Criteria for the form
CustTable_ds.query(query); // execution of the query
super(); //datasource  initialization on the form based on the criteria

Step6. In the class declaration of the form

public class FormRun extends ObjectRun
          SysLookupMultiSelectCtrl msCtrl;
          AccountNum   _accountNum   ;

And then is result

Learn online

Accounting Terminology - Thuật Ngữ Kế Toán

Accounting Terminology - Thuật Ngữ Kế Toán 

Trainee: Song Thanh Nghia

Accrued expenses : Chi phí phải trả
Advanced payments to suppliers : Trả trước người bán
Advances to employees : Tạm ứng
Assets : Tài sản
Assets liquidation: : thanh lý tài sản
Balance sheet : Bảng cân đối kế toán
Bookkeeper: : người lập báo cáo
Cash : Tiền mặt
Cash at bank : Tiền gửi ngân hàng
Cash in hand : Tiền mặt tại quỹ
Cash in transit : Tiền đang chuyển
Check and take over: : nghiệm thu
Cost of goods sold : Giá vốn bán hàng
Current assets : Tài sản lưu động và đầu tư ngắn hạn
Current portion of Long-term liabilities : Nợ dài hạn đến hạn trả
Deferred revenue : Người mua trả tiền trước
Depreciation of fixed assets : Hao mòn tài sản cố định hữu hình
Depreciation of intangible fixed assets : Hoa mòn tài sản cố định vô hình
Depreciation of leased fixed assets : Hao mòn tài sản cố định thuê tài chính
Equity and funds : Vốn và quỹ
Exchange rate differences : Chênh lệch tỷ giá
Expenses for financial activities : Chi phí hoạt động tài chính
Extraordinary expenses : Chi phí bất thường
Extraordinary income : Thu nhập bất thường
Extraordinary profit : Lợi nhuận bất thường
Figures in: millions VND : Đơn vị tính: triệu đồng
Financial ratios : Chỉ số tài chính
Financials : Tài chính
Finished goods : Thành phẩm tồn kho
Fixed asset costs : Nguyên giá tài sản cố định hữu hình
Fixed assets : Tài sản cố định
General and administrative expenses : Chi phí quản lý doanh nghiệp
Goods in transit for sale : Hàng gửi đi bán
Gross profit : Lợi nhuận tổng
Gross revenue : Doanh thu tổng
Income from financial activities : Thu nhập hoạt động tài chính
Income taxes : Thuế thu nhập doanh nghiệp
Instruments and tools : Công cụ, dụng cụ trong kho
Intangible fixed asset costs : Nguyên giá tài sản cố định vô hình
Intangible fixed assets : Tài sản cố định vô hình
Intracompany payables : Phải trả các đơn vị nội bộ
Inventory : Hàng tồn kho
Investment and development fund : Quỹ đầu tư phát triển
Leased fixed asset costs : Nguyên giá tài sản cố định thuê tài chính
Leased fixed assets : Tài sản cố định thuê tài chính
Liabilities : Nợ phải trả
Long-term borrowings : Vay dài hạn
Long-term financial assets : Các khoản đầu tư tài chính dài hạn
Long-term liabilities : Nợ dài hạn
Long-term mortgages, collateral, deposits : Các khoản thế chấp, ký cược, ký quỹ dài hạn
Merchandise inventory : Hàng hoá tồn kho
Net profit : Lợi nhuận thuần
Net revenue : Doanh thu thuần
Non-business expenditure source : Nguồn kinh phí sự nghiệp
Non-business expenditure source, current year : Nguồn kinh phí sự nghiệp năm nay
Non-business expenditure source, last year : Nguồn kinh phí sự nghiệp năm trước
Non-business expenditures : Chi sự nghiệp
Non-current assets : Tài sản cố định và đầu tư dài hạn
Operating profit : Lợi nhuận từ hoạt động SXKD
Other current assets : Tài sản lưu động khác
Other funds : Nguồn kinh phí, quỹ khác
Other Long-term liabilities : Nợ dài hạn khác
Other payables : Nợ khác
Other receivables : Các khoản phải thu khác
Other Short-term investments : Đầu tư ngắn hạn khác
Owners’ equity : Nguồn vốn chủ sở hữu
Payables to employees : Phải trả công nhân viên
Prepaid expenses : Chi phí trả trước
Profit before taxes : Lợi nhuận trước thuế
Profit from financial activities : Lợi nhuận từ hoạt động tài chính
Provision for devaluation of stocks : Dự phòng giảm giá hàng tồn kho
Purchased goods in transit : Hàng mua đang đi trên đường
Raw materials : Nguyên liệu, vật liệu tồn kho
Receivables : Các khoản phải thu
Receivables from customers : Phải thu của khách hàng
Reconciliation: : đối chiếu
Reserve fund : Quỹ dự trữ
Retained earnings : Lợi nhuận chưa phân phối
Revenue deductions : Các khoản giảm trừ
Sales expenses : Chi phí bán hàng
Sales rebates : Giảm giá bán hàng
Sales returns : Hàng bán bị trả lại
Short-term borrowings : Vay ngắn hạn
Short-term investments : Các khoản đầu tư tài chính ngắn hạn
Short-term liabilities : Nợ ngắn hạn
Short-term mortgages, collateral, deposits : Các khoản thế chấp, ký cược, ký quỹ ngắn hạn
Tangible fixed assets : Tài sản cố định hữu hình
Taxes and other payables to the State budget : Thuế và các khoản phải nộp nhànước
Total assets : Tổng cộng tài sản
Total liabilities and owners’ equity : Tổng cộng nguồn vốn
Trade creditors : Phải trả cho người bán
Treasury stock : Cổ phiếu quỹ
Welfare and reward fund : Quỹ khen thưởng và phúc lợi
Work in progress : Chi phí sản xuất kinh doanh dở dang


Trainee: Song Thanh Nghia
My leader ask me create a document that help people dont know code can do it.

1. Step 1:
Path: AOT\Data Directory\Table

In table Axapta right click add choose properties, look at  fields ModifiedDate, ModifiedTime, ModifiedBy, and CreateDate, CreateTime, CreateBy.
2. Step 2:
Set value to Yes. 
(Right click table)

Then, right click and save change in table

Right click and Restore table 

3. Step 3: 
Path: Main menu/ Stock Manager/ Journal/ Item transaction/ Movement
Open  form content data of table. ( In example, I choose a form Movement content data of table: InventJournalTrans

Click Movement you can see a form 

Right click form and click Setup you can see User Setup Form

In User setup form click tag information  and click edit  form table setup open will be open

4. Step 4
Right click in form, and Restore form 

Click  node  Data Sources  and select table in datasource( the last table user edit in step 1), you can see table name in properties. Then click fields, you can see ModifiedDate, ModifiedBy, CreatedDate, CreateBy.

Right click table in node DataSource and choose open in new window (*)

Click node design and choose exactly tab, grid you want add fieds. You can see grid or tag in User Setup/Layout

Click data table Open In new Window(13) and choose all fields you need to view in design and pull down it in grid design(14)

Axapta will add it in design

Finally, right click form in Axapta and Save, Compile, Restore.

In finish, open form and see it.

Kế hoạch đi chơi thần thánh của mình năm sau :(

1h – 4h30:
Xuất phát – Đến Zenna Pool Camp

Vé vào cổng tham quan
Bếp + Chén dĩa.
Ở đây mình chơi tới sáng.
An ninh bảo vệ.
4h30 – 5h
Mua đồ về nướng
Ghẹ, Sò, Đồ nướng.
Chợ cảng cá phước tỉnh.
Mua đồ ăn sáng:
Bia, Nước: Siêu thị gần đó mua cho lẹ.
Mua ít thôi, mau nhiều ăn không hết đâu.

5h30 – 8h30
Ngắm buổi sáng
Chụp chọt, tắm nếu sạch.

8h30 – 9h30
Mua đồ nướng
Mua đồ để qua Đèo nước ngọt nướng.
9h30 – 10h
Di chuyển
Di chuyển tầm 15km đến Đèo nước ngọt.

10h – 2h30
Chơi tại Đèo Nước Ngọt
Vé vào cổng + Lều + Tắm.
Ăn trưa: Đồ mua trước
Ở đây bao sạch, biển lại rất đẹp nữa.
Ăn trưa
2h30 – 3h00
Di chuyển
Di chuyển tại Hồ Đá Xanh

3h – 4h00
Chụp hình tại Hồ Đá Xanh
Chụp hình tại Hồ Đá Xanh

4h00 – 7h00
Về Sài Gòn

Tổng thời gian:
12h – 9/12
19h – 10/12
1.      Zenna Pool Camp
2.      Đèo Nước Ngọt
3.      Hồ Đá Xanh
Tổng: 220 Km
Ăn uống + ngủ: 860k
Tham quan:
Tổng chi:
1.5 triệu

Tính giá theo Table/Group/All: Trong AXAPTA 4.0 (tiếp)

Tính giá theo Table/Group/All: Trong AXAPTA 4.0

Trainee: Song Thanh Nghia
- Lúc này mình pass probation, traninee VOTIVA

2. Tính giá với 2 tiêu chí:

- Bài toán đặt ra: Cần tính chi phí vận chuyển từ 2 kho, Kho A sang Kho B,  có setup bảng giá. Vậy làm sao để chọn được và tính được số tiền cần trả để chuyển.

Phân tích bài toán
- Phí vận chuyển của nhà cung cấp H:  từ kho A sang kho B và ngược lại
- Phí vận chuyển của nhóm nhà cung cấp H1: từ Kho A sang kho B và ngược lại
- Phí vận chuyển chung ở ngoài thị trường: từ Kho A sang kho B và ngược lại
Rồi từ khu vực kho A tới Khu vực  của kho B(khu vưc kho A và Kho B)....
Rồi từ khu vực kho A tới  kho B(khu vưc kho A và Kho B)....

Tổ hợp lại ta có 9 trường hợp + 2 điều kiện kho và khu vực kho

=> Vậy làm sao để tối ưu lựa chọn ra sao cho chi phí rẻ nhất???
Chắc chắn là sẽ đi từ cá nhân(table) tới nhóm(group) và thị trường(all).

Vậy code sẽ đươc viết thần thánh như sau: X++, anh em .net qua coi vẫn ok nhé

Tính giá: Theo Table/Group/All AXAPTA 4.0

Tính giá theo Table/Group/All: Trong AXAPTA 4.0

Trainee: Song Thanh Nghia

1. Tại sao lại là Table/Group/All
2. Trường hợp có 2 tiêu chí đánh giá( Bài sau nhé)

1. Tại sao lại là Table/Group/All

- Trong AX có tính giá theo khách hàng, nhóm khách hàng, và tất cả khách hàng, vì thế nên được chia theo 3 nhóm: Table, Group, All
+ Table: Table ở đây diễn tả khách hàng cá nhân hay cụ thể:
Ví dụ: Khách hàng A
+ Group: Group diễn tả nhóm khách hàng hay khu vực khách hàng.
Ví dụ: Nhóm khách hàng A
+ All: All diễn tả ở đây là khách hàng nói chung.
Ví dụ: Tất cả khách hàng

- Bài toán cụ thể: Ví dụ khi mua 1 cái bút bi.
- Nhà cung cấp Thiên Long tại Sài gòn bán: 4k. Đây là Table
- Nhà cung cấp khu vực Sài gòn bán trung bình: 5k. Đây là Group
- Nhà cung cấp nói chung bán trung bình: 6k. Đây là All

=>Như vậy khi tính giá 1 cây bút bi về thì lấy nhà cung cấp nào?
- Ở đây chắc chắn nếu table tồn tại thì sẽ lấy 4k, không thì sẽ lấy theo group là 5k, cuối cùng là 6k.
- Đây là đoạn code tương tự ý tưởng trên nó rất thần thánh để lấy được giá ra.

VOTIVA Traning: Ngày 4 + 5: Post Confirm and Invoice AXapta Module: Sales Order/ Sales managerment
VOTIVA Traning: Ngày 4: Sau khi nhập kho xong, bạn thông báo với phòng cung ứng và sau đó phòng cung ứng báo lại bộ phận sales. Phòng cung ứng cũng không quên báo giá đã nhập hàng lại cho bộ phận sales. Sau khi có giá nhập thực tế, bộ phận sales gọi báo giá lại cho Thành Lợi, đơn giá mỗi chiếc laptop là 1750$ và họ xác nhận đơn giá của bạn.

Trainee: Song Thanh Nghia

Chỗ này bị link sai chỗ Sales Agr với SO
-          Update giá trong Sale Agreement để chuẩn bị Release sang Sale Order

Ngày 5: Bộ phận sales yêu cầu kho xuất hàng cho Thành Lợi.
                Task: Hãy thực hiện xuất kho 600 chiếc laptop T8000 đã nhập cho Thành
1.     Tạo Sale Order 

2. Xuất 600 cái cho Thành Lợi

Check Warehouse xem đã giao 600 cái cho Thành Lợi chưa