Tuesday, June 28, 2011

10 Yếu tố đảm bảo triển khai ERP thành công (lý thuyết)

Những câu chuyện về các dự án ERP thất bại luôn là nỗi ám ảnh cho các CEO hay CIO khi quyết định triển khai hệ thống ERP cho doanh nghiệp mình. Vì vậy, câu hỏi thường trực luôn đặt ra trong đầu họ là phải làm gì để tránh các vết xe đổ đi trước và đảm bảo rằng dự án luôn thành công?

Dưới đây là 10 yếu tố mà theo tác giả đánh giá là quan trọng nhất đảm bảo triển khai thành công một dự án ERP.

1. Lựa chọn đúng giải pháp

Điều này có vẻ hiển nhiên, nhưng trên thực tế không phải luôn luôn xảy ra. Các nhà cung cấp giải pháp ERP, để đạt được mục đích bán hàng, thường có xu hướng hoàn hảo hóa khả năng của giải pháp. Tức là với bất kỳ bài toán nghiệp vụ nào doanh nghiệp đặt ra, giải pháp đều đáp ứng hoàn toàn. Tất nhiên thực tế không hẳn như vậy. Trong trường hợp này, doanh nghiệp cần đặt câu hỏi ngược lại với nhà cung cấp: Họ sẽ giải quyết bài toán như thế nào? Họ đã từng gặp bài toán này ở đâu chưa?…Đó là thực tiễn thành công của giải pháp. Ngoài ra, doanh nghiệp cần phải có quá trình lựa chọn khắt khe và có cấu trúc để tìm ra giải pháp phù hợp nhất cho mình.
Bạn đọc có thể tìm hiểu thêm về quá trình lựa chọn ERP tại đây.

2. Lựa chọn đúng đơn vị triển khai

Đây cũng là điều tối quan trọng tương tự như việc lựa chọn đúng giải pháp. Đơn vị triển khai phải là đối tác có đủ năng lực chuyên môn và kinh nghiệm nhằm đảm bảo doanh nghiệp sẽ nhận được tối đa những tính năng, lợi ích của giải pháp đã đầu tư. Việc lựa chọn này, doanh nghiệp có thể tự thực hiện hoặc cũng có thể thuê đơn vị tư vấn độc lập. Đây là xu hướng đã phổ biến trên thế giới, tuy nhiên tại Việt Nam mới chỉ có một số ít doanh nghiệp áp dụng, điển hình là Tân Hiệp Phát và Prime Group.

3. Lập kế hoạch dự án một cách cẩn thận

Lập kế hoạch triển khai một cách thực tế và chi tiết nhất, đảm bảo rằng doanh nghiệp luôn kiểm soát được những gì sẽ phải làm và từng cá nhân trong đội dự án sẽ chịu trách nhiệm phần công việc nào. Đây là những điều rất cơ bản trong việc thực hiện bất kỳ dự án nào không chỉ là dự án ERP.

Có một thực tế đang diễn ra phổ biến tại các dự án ERP tại Việt Nam: thời gian triển khai gần như luôn kéo dài hơn so với kế hoạch ban đầu. Có thể do nhiều nguyên nhân: thay đổi nhân sự, mức độ phức tạp của nghiệp vụ đòi hỏi customize, thay đổi quy mô triển khai…tuy nhiên, còn có một nguyên nhân chung, đó là khi lập kế hoạch, doanh nghiệp cũng như đơn vị triển khai thường đặt ra các mốc thời gian một cách khá “lạc quan”, trong nhiều trường hợp là “phi thực tế”. Có thể do đơn vị triển khai không ước lượng được khối lượng công việc phải làm. Cũng có thể do doanh nghiệp muốn hoàn thành dự án sớm nhất có thể.

Điều này rất nên tránh, bởi việc trễ thời gian không chỉ dẫn đến việc phát sinh công việc, phát sinh chi phí mà còn ảnh hưởng tới tinh thần của các thành viên dự án.

4. Xác định phạm vi dự án rõ ràng và luôn tập trung vào đó

Thay đổi phạm vi giữa chừng luôn tiềm ẩn nguy cơ lớn đối với hầu hết các dự án. Khi bổ sung một điểm triển khai, hoặc một phân hệ đồng nghĩa với việc phải đầu tư thêm nguồn lực và thay đổi cấu trúc, kế hoạch dự án. Nếu không quản lý khéo, có thể dẫn đến tình trạng chồng chéo, ảnh hưởng tới các công việc khác hoặc nghiêm trọng hơn có thể làm trì hoãn cả dự án.

5. Tập trung vào những lợi ích đã xác định

Làm thế nào để xác định một dự án ERP triển khai thành công? Thành công của một dự án ERP không chỉ đo đạc bằng các tiêu chuẩn thông thường như hoàn thành đúng thời gian hay đúng ngân sách. Thành công thực sự thể hiện trong việc giải quyết hoàn toàn các bài toán nghiệp vụ cũng như quản lý của doanh nghiệp, mức độ hài lòng của đội ngũ nhân viên với hệ thống mới. Từ đó doanh nghiệp đạt được những lợi ích đã kỳ vọng khi quyết định đầu tư ERP như tăng năng suất, giảm được chi phí, minh bạch hóa tài chính…

6. Lựa chọn đội dự án với các thành viên phù hợp

Trong nhiều trường hợp, doanh nghiệp thường mặc định rằng việc triển khai ERP là trách nhiệm của đơn vị triển khai. Họ nghĩ đơn giản chỉ cần bỏ tiền mua giải pháp, thuê triển khai và một vài tháng sẽ có hệ thống mới để sử dụng.

Đánh giá thấp các yêu cầu và vai trò của đội dự án nội bộ là một trong những nguyên nhân dễ dẫn đến thất bại. Những kỹ năng, kinh nghiệm và nỗ lực của đội dự án nội bộ là tối quan trọng đối với việc triển khai. Bởi họ chính là những người phối hợp với đơn vị triển khai để xây dựng hệ thống và cũng chính họ sau này sẽ là những người tiếp nhận, vận hành hệ thống. Hãy lựa chọn những nhân viên am hiểu nghiệp vụ cũng như nắm rõ các vấn đề mà doanh nghiệp đang gặp phải để tham gia vào đội dự án. Cũng cần đảm bảo rằng đây là những người sẽ gắn bó lâu dài với doanh nghiệp.

Trong thời gian triển khai dự án, tốt nhất hãy để họ tập trung duy nhất vào công việc triển khai, các công việc thường ngày nên chuyển giao cho những người khác.

7. Đảm bảo có sự cam kết từ cấp lãnh đạo

Dự án ERP cần phải được định hướng từ trên xuống dưới, cần có người từ đội ngũ lãnh đạo tham gia chỉ đạo, hỗ trợ hàng ngày. Mâu thuẫn, hay đơn giản là sự không thống nhất có thể nảy sinh bất cứ lúc nào giữa thành viên hai đội dự án, đó là lúc cần sự dung hòa cũng như quyết đoán của lãnh đạo .

8. Đảm bảo người dùng cuối được đào tạo đầy đủ

Việc triển khai chưa dừng lại sau khi đã thiết kế, cấu hình và cài đặt được hệ thống bởi hệ thống không thể tự nó mà vận hành được, những người dùng cuối bao gồm đội ngũ quản trị hệ thống và đội ngũ nhân viên tác nghiệp cần phải được đào tạo để sử dụng hệ thống đúng cách và hiệu quả nhất. Việc đào tạo cần được thực hiện một các nghiêm túc, hướng dẫn lý thuyết phải gắn liền với thực hành ngay trên máy. Nếu có điều kiện doanh nghiệp nên đào tạo cho tất cả người dùng tuy nhiên, trong một số trường hợp người dùng quá đông hay doanh nghiệp có nhiều quá nhiều chi nhánh tại nhiều địa điểm khác nhau, có thể lựa chọn đào tạo những người chủ chốt, sau đó chính những người này sẽ tiếp tục đào tạo lại cho người khác.

9. Đừng quên hệ thống các báo cáo

Hãy suy nghĩ về các hệ thống hiện tại và danh sách các báo cáo mà doanh nghiệp đang sử dụng trước khi triển khai ERP. Liệu rằng đơn vị triển khai có thể cung cấp được tất cả các báo cáo này trên hệ thống ERP mới? Nếu được, sẽ mất bao nhiêu thời gian để phát triển tất cả các báo cáo này?
Doanh nghiệp thường có tâm lý tận dụng tối đa đơn vị triển khai để xây dựng và phát triển hệ thống báo cáo nhiều nhất có thể, trong số đó có thể có những báo cáo thực sự không cần thiết. Điều này sẽ dẫn đến việc lãng phí nguồn lực của cả hai bên.

10. Quản lý thay đổi hiệu quả

Một điều chắc chắn là sự ra đời của hệ thống mới sẽ ảnh hưởng đến nhiều khía cạnh trong doanh nghiệp: các quy trình kinh doanh, thủ tục thay đổi dẫn đến vai trò của một số nhân sự sẽ khác… Do mỗi người đều có phản ứng khác nhau trước những thay đổi, nên đây sẽ là lúc doanh nghiệp cần có một chiến lược khéo léo để từng bước đưa ERP vào một cách “xuôi chèo, mát mái”.

(ITGVN – theo eac.vn)

Wednesday, June 22, 2011

OLAP PivotTable Extensions

OLAP PivotTable Extensions is an Excel 2007 and Excel 2010 add-in which extends the functionality of PivotTables on Analysis Services cubes. The Excel API has certain PivotTable functionality which is not exposed in the UI. OLAP PivotTable Extensions provides an interface for some of this functionality. It also adds some new features like searching cubes, configuring default settings, and filtering to a list in your clipboard. The add-in can be launched from the following menu option in the right-click menu for PivotTables:

menu.png

Private Calculated Members

Any calculated members which are part of the Analysis Service cube on the server can be added to PivotTables. But there is no built-in UI to define your own MDX calculations. Adding extra Excel calculations in the cells surrounding the PivotTable has some limitations as they are not part of the PivotTable and can be wiped out if the dimensions of the PivotTable change, and plain Excel calculations must only operate on data visible in the PivotTable.

OLAP PivotTable Extensions let you define your own calculated measures which are private to that particular PivotTable:
AvgTaxFormula.png

Those calculations appear in the PivotTable just like any other calculations:
AvgTaxPivotTable.png

They appear in the Field List pane at the very top under the Values grouping:
AvgTaxFieldList.png

For help with advanced calculation properties for these private PivotTable calculations, or for help with MDX expressions, refer to our Calculations Helppage.

Best Practice: In order to ensure a single version of the truth, it is a best practice to define important calculations as part of the cube source code. But some calculations like simple ratios or differences may clutter the cube and may be more appropriate if defined in the PivotTable itself. In addition, certain ad hoc research or prototyping may be more appropriate to be done as calculations private to a PivotTable until they are finalized and are ready to be added to the cube source code.

Limitation: If you run "OLAP Tools... Convert to Formulas" on a PivotTable with private calculated members in Excel 2007, the private calculated members will show N/A. There is no known workaround at this point other than upgrading to Excel 2010 or having your OLAP administrator define these calculated members in the cube itself.

Calculations Library

Since all calculations you define are private to that one PivotTable, OLAP PivotTable Extensions automatically creates a Calculations Library for you which contains all the calculations you create. This allows you to pick any previous calculation you've used from a dropdown and add it to the current PivotTable:

LibraryDropDown.png

You can also perform Calculation Library maintenance by importing, exporting, and deleting calculations:

Export.png

View PivotTable MDX

If a PivotTable is performing poorly or returning incorrect numbers, it may be necessary for the Analysis Services administrator to troubleshoot the MDX query which the PivotTable is using. The MDX tab of the OLAP PivotTable Extensions dialog shows you this MDX.

AvgTaxMDX.png

The MDX is exactly what is sent to the server with one exception. Any private calculations you've created for your PivotTable are defined as session calculated members. The MDX query exposed on the MDX tab displays the formulas for these calculations as query calculated members in the WITH clause of the MDX query. This allows an administrator to copy and paste the MDX query and troubleshoot it more easily in Management Studio or MDX Studio.

Filtering PivotTable to a List

A common scenario is having a list of items you wish to research in a PivotTable. Instead of manually checking each item in the filter dropdown, you can use the Filter List feature from OLAP PivotTable Extensions:

FilterListDialog.png

Changing PivotTable Defaults

Certain settings must be manually changed after creating a new PivotTable. For instance, if your dimensions have calculated members you wish to see in your PivotTable, you must manually right click on the PivotTable, choose PivotTable Options, flip to the Display tab, then check "Show calculated members from OLAP server". The Defaults tab of OLAP PivotTable Extensions lets you default this setting to be on in any new PivotTables you create in the future. If checked, it also automatically sets "Refresh data when opening the file" on the connection properties:

Defaults.png

Searching

Finding what you’re looking for in a cube can sometimes be challenging, but the Search feature of OLAP PivotTable Extensions can help. It lets you text search the items in the Field List and their descriptions. It also lets you text search the dimension members in your cube.

SearchTab.png

For more detailed information about the Search feature, see the dedicated Search page.

Distributing PivotTables

OLAP PivotTable Extensions need only be installed on computers which need to create new private PivotTable calculations. After those calculations have been defined, the PivotTable can be distributed to others without problem. If you distribute the Excel 2007 workbook to other Excel 2007 users, they will be able to continue designing and manipulating that PivotTable without problem. If published to Excel Services, the private calculations you define will still be active in the PivotTable.

ExcelServices.png

The Calculation Library does not need to be distributed unless other users wish to start brand new PivotTables and reuse certain calculations you have created using OLAP PivotTable Extensions.

Using Excel 2007/2010 and OLAP PivotTable Extensions to edit an Excel 2003 format .xls workbook with a PivotTable and add a private calculated member will work. This PivotTable can be saved and distributed to users of Excel 2003 and the private calculated member will show up and work.

Installation Requirements

  • Excel 2007 or Excel 2010 is required.
  • Access to a cube on an Analysis Services server is required.
  • .NET Framework version 2.0 is required.

Sunday, March 20, 2011

Close Inventory AX

1. Khi đóng kho thì phải recalculation, sau đó mới closing.
2. Nếu đã recalculation cho tất cả các tháng trong năm rồi thì không thể closing theo từng tháng được nữa. Mà chúng ta phải closing ngày cuối cùng của năm thôi (VD: 31/12/2010).
Và nhớ khi chọn : Specification là : Item Group.

Monday, March 14, 2011

Closing and Adjustment Inventory management Axapta(AX)

Five Steps to Complete Your Microsoft Dynamics AX Inventory Close for 2009, and Prepare for 2010

I recently provided guidance for handling the inventory close process using Microsoft Dynamics AX. In this followup article, I provide five steps for completing the year-end 2009 inventory close in such a way that you prepare your organization for handling the same process more efficiently in 2010.

1. Prepare to run the inventory close.

Before you perform the inventory close, the following tasks are recommended:

--Make sure that the inventory model assigned to the item on the Inventory model tab of the Inventory model groups form is accurate. Inventory close will settle transactions to each other based on the current inventory valuation method assigned to the item.

--View or print the Open quantity report by clicking Inventory management > Periodic > Closing and adjustment > Close procedure > 1. Check open quantities. This report will print a list of inventory transactions that will remain open after the inventory close is performed.

For example, you have an item that includes the following transactions:

  • Inventory physical receipt for a quantity of 10
  • Inventory financial issue for a quantity of 3

In this case, the report will show an open quantity of 3, since this financial issue cannot be settled to any transactions. The Open quantity report also includes a Show receipts option that lets you view all the physical receipts posted for an item and all the open quantities that will remain after an inventory close for the date specified.

--Print or view the Investigation of cost price for receipts report by clicking Inventory management > Periodic > Closing and adjustment > 2. Check cost prices. This report allows you to enter a maximum deviation percentage. Items that appear on this report will be only those exceeding the maximum deviation percentage. The deviation is based on the item cost price, item or median cost price, or median.

2. Complete the inventory close

Inventory close will settle issue transactions to receipt transactions based on the inventory model you have selected in the item's inventory model group setup. You also have to choose the general ledger updated to reflect the adjustments created.

To close the inventory:

--Inventory management > Periodic > Closing and adjustment > Close procedure> Close

To open the Close inventory form.

--In the Close inventory up to field, type or select the end date up to which you want to close inventory.

--Select the Run recalculation after closing check box if you want to run a recalculation up to the current date after the closing has completed.

--Set any other options you want to choose for this inventory close.

--Click OK.

After inventory close has completed, the results will be reported in the Closing and adjustment form.

Steps that are performed by the Inventory Close routine:

When you run the Close routine, Microsoft Dynamics AX performs the following steps:

--Checks whether any Recalculations were run after the date that you choose for your Close. Microsoft Dynamics AX will cancel any of those later Recalculations before the Close can start.

--Puts all the items that are to be processed into a queue. These items are stored in the InventCostListtable.
Note: While a Close or Recalculation is processing, you can click Calculation/Calculation List from the Close & adjustment form to view the data in the InventCostList table. This shows which items are still to be processed by the Close or Recalculation process.

--Process each item from that queue sequentially. Microsoft Dynamics AX performs the following for each item:

  • Settles individual receipts and issues against one another for the item according to the Inventory Model Group such as FIFO, Weighted Average.
  • Makes any required cost adjustments to the issue that was settled based on the cost of the receipt(s) against which the issue was settled.
  • Updates the inventory transactions to show the settlement and cost adjustment data.
  • Writes the settlement data into the Inventory Settlement table. The data will include records that show explicitly which Receipt(s) were settled to each Issue in addition to any cost adjustment that is made to the Issue that is settled.

--As soon as all possible transactions are processed for that item, Microsoft Dynamics AX looks for any transactions that are fully settled, and then updates those transactions to "Closed"

--As soon as all the items are processed, the settlement records that were created are read and sorted by General Ledger Account. Then, Microsoft Dynamics AX summarizes all the cost adjustments that were made, and a General Ledger Journal is created and posted.

--If you select the Run recalculation after closing check box in the Close dialog box, a Recalculation will be run for all items up to today's date.

3. Handle the Inventory Recalculation Process

The recalculation process matches inventory receipts and issues for the transactions that are not financially matched through inventory dimensions in order to determine the real value of the on-hand inventory.

To recalculate the inventory, follow these steps:

-- Click Inventory management > Periodic > Closing and adjustment > Recalculation to open the Recalculation form.

-- If you want to select specific items or item groups to be recalculated, click Select. Your selection displays in the Items field group.

-- In the Recalculate inventory up to field, type or select a date up to which you want the inventory to be recalculated.

-- Fill in the remaining fields as required.

-- Click OK to start the recalculation.


The Inventory Recalculation routine performs a similar job to the Inventory Close routine. However, there are a few differences. When you run the Recalculation routine, Microsoft Dynamics AX performs the following steps:

--Checks whether any Recalculations were run after the date that you choose to run your Recalculation up to. Microsoft Dynamics AX will cancel any of those later Recalculations found before your Recalculation routine can start.

--Puts all the items that are to be processed into a queue, and then store the queue in the InventCostList table.

--Process each item from that queue sequentially. Microsoft Dynamics AX performs the following for each item:

  • Makes a "virtual" settlement between individual receipts and issues for the item according to the Inventory Model Group such as FIFO, Weighted Average. This is a "virtual" settlement because it occurs in the Recalculation's calculations. However, the detailed settlement data that shows the explicit matching of each issue to the various receipts is not stored in the InventSettlement table. The only data that is stored is the cost adjustment that is made to the issue.
  • Makes any required cost adjustments to the issue that was settled based on the cost of the receipt(s) against which the issue was settled.
  • Writes a single settlement record for any cost adjustment that is made for that Issue into the Inventory Settlement table.

--As soon as all the items are processed, the cost adjustment settlement records that were created are read, sorted by General Ledger Account, and summarized and posted in a General Ledger Journal.

--Along with recalculation, you can also perform the following functions from the same window:

  • Cancel later Recalculations. This process indicates that any existing recalculations dated after the close inventory up to or recalculate inventory up to date will be automatically cancelled or reversed before you continue with the closing or recalculation.
  • Recalculate inventory up to. The system date will be proposed by default. You can change this date, but only to a date after the latest closing.
  • You can also pause and resume the recalculation.

4. Distinguish between recalculate and close.

--Inventory recalculation results in adjustments that match inventory receipts to issues. Unlike inventory close, it will not make a settlement and close a transaction.

--The same parameter settings are available for inventory recalculation as for inventory close, but inventory recalculation can be performed on a subset of inventory items. Inventory close must be performed on all inventory items.

--Since inventory recalculation can be run on a subset of items, and because inventory recalculation will not make an adjustment for less than the throughput amount, it is not as accurate as an inventory close and should not be relied on to replace inventory close.

5. Determine if cancellation required.

The latest closing, recalculation, on-hand or transaction adjustment made can be cancelled. This may be necessary if, for accountancy purposes, you need to make transactions in the inventory in a closed period. The closing is canceled, but it can still be viewed on the overview tab of the closing and adjustment.

Only cancellation of the last closing made is allowed. Because closings are in effect up to a particular date, if closings are canceled in periods between two other closings, there would be gaps in the closing.

Reverse completed recalculation:

In some cases, you may need to reverse a completed inventory recalculation, returning adjustments to the state they held before adjustments were made.

Reverse a completed closing:

In some cases, you may need to reverse a completed inventory close, returning settlements to the state they held before adjustments were made. When you reverse a completed inventory close, inventory is also reopened to allow for posting in the valid period.

Leveraging the inventory close process to your ongoing advantage:

-- Going forward in 2010, run inventory closes on a monthly basis in order to make the Fiscal year process simple on the year end.

-- Try to record inventory data sequentially i.e. Receipts followed by issues date-wise

-- Inventory close is the first step in the fiscal year close process, so try to do it ASAP

-- You can still record transactions for the next year even if annual inventory close has not been run.

-- Finally, and perhaps most obviously, year-end inventory values should be accurate.

Thursday, November 25, 2010

Workflow là gì?

Định nghĩa đơn giản nhất của workflow: là các định nghĩa của các qui trình đã chuẩn hóa. Và khi mình viết các module cho từng công việc, workflow là 1 chuỗi công việc phải làm. Thường thì các công ty nước ngoài hoặc các doanh nghiệp lớn mới có được sự ổn định trong các quy trình làm việc, nên workflow của họ thường là 1 dòng chảy thống nhất, ví dụ: A –> B –> C –> D. Tuy nhiên ở các doanh nghiệp Việt Nam, sự ổn định trong dòng chảy đó thường là hiếm, nên nhiều khi các ERP có workflow phải thường là workflow động. VD, tại một thời điểm X thì workflow của phòng SX là A –> B –> C –> D, tuy nhiên có thể tại thời điểm Y thì workflow đó được thay đổi là: B –> A –> C –> D, và … Tuy nhiên để rộng đường tìm hiểu workflow, tôi xin mượn ý kiến của 1 bài viết mà tôi đã có dịp đọc được trên mạng (hình như là của PAT). Theo bài viết đó thì workflow trong một ERP thể hiện ở các yếu tố căn bản sau :

1. Các quy trình và khả năng xử lý công việc theo trình tự công việc. Ví dụ trình tự công việc cho việc mua hàng trong hệ thống ERP minh hoạ như sau : Các bộ phận có nhu cầu mua hàng xây dựng yêu cầu mua hàng POP (Purchase order Proposal) -> phòng mua hàng -> Nhân viên phụ trách mua ứng với từng loại hình xem xét -> Đề nghị mua hàng của bộ phận mua hàng -> phê duyệt của lãnh đạo phòng -> đề nghị báo giá hoặc đấu thầu -> đánh giá nhà cung cấp -> lựa chọn NCC-> lập đơn hàng chính thức PO -> nhận khẳng định cung ứng từ NCC -> theo dõi nhận hàng -> nhận hóa đơn từ NCC -> chuyển hoá đơn đến kế toán thanh toán….

2. Khả năng xem xét trình tự công việc và phê duyệt công việc trên hệ thống . Lúc này việc hoạch định phân quyền cho từng bước xử lý công việc của mỗi một quy trình phải nghiêm ngặt để đảm bảo tính đúng đắn của thông tin và truy cứu trách nhiệm sau này.

3. Giống như ví dụ workflow động mà tôi nêu trên, cái này được thực thi qua hệ thống tham số quy trình nghiệp vụ và khả năng ánh xạ tham số vào thiết lập quy trình nghiệp vụ (mapping). Đây cũng là một chỉ tiêu rất quan trọng để đánh giá khả năng của một ERP. Một vài ví dụ trong hệ thống tham số mà mình đã thiết lập. DN vừa có một Khách hàng mới. Do thời gian ban đầu muốn có những ưu đãi DN có thể quyết định không tính phạt chậm trả cho thanh toán trễ cũng như vẫn cho phép xuất hàng khi tổng công nợ + doanh thu lớn hơn tín dụng (tất nhiên là trong một phạm vi nào đó) lúc này các tham số phạt chậm trả bằng “No”, giao hàng có giá trị “Yes”. Một thời gian sau DN có thể thay đổi quy trình này bằng tham số phạt chậm trả bằng “Yes”, giao hàng có giá trị “No” hệ thống sẽ tự động tính phạt lãi suất chậm trả ứng với từng lần thanh toán chậm và khi khách hàng mua vượt quá tín dụng hệ thống sẽ bắt buộc phải phê duyệt lệnh xuất hàng này từ lãnh đạo.

Nói chung đây là một ví dụ về tham số và còn rất nhiều tham số khác

khongianit

Sunday, November 14, 2010

Reducing the Size of your Database in SQL Server 2005/SP2

An exciting new feature in SQL Server 2005/SP2 is Vardecimal Storage Format. This storage format lets you reduce the size of your table significantly if the table has one of more columns of type decimal or numeric without requiring any changes to your application.

Up until now, the decimal and numeric types are stored as fixed length data in SQL Server. Both of these types are functionally equivalent and have a format of (p, s) where p is the precision (number of decimal digits) and s is the scale representing number of digits after the decimal. Depending on the precision (it can be declared in the range from 1 to 38), the decimal value can take anywhere from 5 bytes to 17 bytes. This can bloat the size of the table, especially when you have small decimal values for a column declared with high precision requirement. This issue is similar to char (17) vs. varchar(17). In this case, if most of your character data is 1 or 2 characters long but the max value is 17 characters long, you can reduce the size of the table by declaring the column to be of type varchar(17) instead of char(17).

The new vardecimal storage format stores the decimal/numeric values in a variable length storage format. It provides efficient storage of decimal/numeric data by eliminating the leading/trailing zeros and only storing the minimum required bytes. Using this format, you can get significant space savings (depending on your data distribution) in the space required to store decimal/numeric data. You can enable vardecimal storage format at a table level.

In our in-house testing, we have seen significant reduction in the size of the FACT table(s) that has large number of decimal columns. FACT tables are typically the largest table in a Data Warehouse. Here are some the numbers from our testing.

Best case reduction in the size of the table

57%

69%

51%

In my next post http://blogs.msdn.com/sqlserverstorageengine/archive/2006/11/13/estimating-the-space-savings-with-vardecimal-storage-format.aspx , I will describe when and how to enable Vardecimal storage format on one or more tables in your database.

Thursday, October 7, 2010

Using Dynamics 'AX .NET Business Connector' to access Dynamics AX 4.0 from .NET world

So, this is a really interesting integration aspect between AX and .NET apps. We want to access AX business logic (or data, transactions, etc.) from the .NET world. :-)

Requirements

Before starting to develop anything, we need to install several required components:

In my case, I’ve got a single development machine where I have installed everything. I mean:

- SQL Server 2005

- Dynamics AX 4.0

- AX .NET Business Connector

- Visual Studio 2005 (for .NET development)

- We could also install ‘Windows SharePoint Services’ and the ‘AX Enterprise Portal’. It also uses .NET Business Connector for accessing AX, but in this case, we are just talking about .NET and AX. I’ll maybe post about ‘AX Enterprise Portal’ and Windows SharePoint Services in another posting. J

So!, the AX .NET Business Connector allows accessing Microsoft Dynamics AX from our own .NET applications as though they were a native Microsoft Dynamics AX client. So any .NET app or even ASP.NET web-app could access AX business components using this connector. For instance, as I already said, the ‘AX Enterprise Portal’ (based on Windows SharePoint Services and .NET) uses .NET Business Connector to access AX business logic.

BTW, internally, all these integration technologies interact with Dynamics AX through Application Object Server (AOS), which is kind of the ‘Business Components Application Tier’ within AX architecture itself.

AX .NET Business Connector installation and configuration

Before installing Business Connector, the following must be available in the domain:

- A core Microsoft Dynamics AX installation. This installation can be completed at the same time as the Business Connector installation, or it can be done prior to this installation.

- Active Directory configured in native mode.

By default, it uses Windows authentication security (AD), so it can be also integrated with AX Enterprise Portal (based on Windows SharePoint Services, which also uses Windows security). This security authentication type is important to have it into account when accessing from our own .NET apps.

We also need a Windows domain account to act as the Business Connector Proxy. So we need to configure the Business Connector if our application requires "act-on-behalf-of" functionality for external users or users that are at times unable to connect to our application.

So, for instance, I created an account within Windows Active Directory, called MyDomain\bcproxy. That account is going to be my ‘proxy account’.

Remember to assign a password to the user, select the Password does not expire option and select the No interactive logon rights option.

(Optional) Adding the proxy account to the IIS local Windows group.

For Web applications, we must add the Business Connector proxy account to the IIS local Windows group. If you are using Windows SharePoint Services, you must also add the account to the Windows SharePoint local Windows group.

1. Open the Computer Management application (Start > Administrative Tools > Computer Management).

2. Expand the Groups folder under Local Users and Groups.

3. Add the Business Connector proxy account to the following groups:

- IIS_WPG (IIS Worker Process Group)

- STS_WPG (STS Worker Process Group), if running Windows SharePoint Services

(Optional) Configure the IIS application pool

For Web applications, you must associate the Business Connector proxy account to the appropriate application pool identity.

Installation of ‘.NET Business Connector’ setup-app.

So now we are ready to install ‘.NET Business Connector’ from normal AX setup.exe DVD, but we have to select that we want to install it. ;-)

The setup’s steps and quite normal, almost just the ‘next, next’ stuff.

Configure the Business Connector Proxy User

The last step is to configure the Business Connector Proxy User within AX configuration:

1. Start Microsoft Dynamics AX (Start > All Programs > Microsoft Dynamics > Microsoft Dynamics AX 4.0 Client).

2. Open the Business Connector Proxy dialog box: Administration > Setup > Security > Business Connector Proxy.

3. In the Alias box, enter the alias. In the Network domain box, enter the domain of the user and then close the dialog box.

Implementing a sample AX class to consume it

So now we’re starting one of the fun tasks!!

We are going to implement a basic X++ class with a simple method. Just for testing.

So, within Dynamics AX client, open the AOT (Application Objects Tree):

Then, let’s create a new simple class, like the following:

So, I’ve created a very simple method called ‘Salute()’, which accepts a single string parameter (a name) and then it responds with a salutation. It is very simple, just a testing method for accessing AX from .NET world. J. Here is the Salute() method code:

X++ Code:

client server public static str Salute(str name)
{
str salute = "Cheers " + name + "! from AX!";
;
return salute;
}

Great!, very simple!. An if you are used to C# or C++, X++ it is quite similar!.

So now, we could test this method calling it from an AX JOB. But, we’re directly to execute it calling it from .NET (developing with Visual Studio 2005) through the ‘AX .NET Business Connector’.

Ok, I’ve created a simple WinForms application project called NetBcWinFormsTest. Take into account that this is just for testing. If it were a real application (.NET WinForms client as presentation layer), may be we’ll use a Web-Service or WCF-Service in between (for remote calls).

So, here we can see VS.2005 with our simple WinForms proyect, and a single Windows form with a button:

So now, we have to add a reference to the ‘AX .NET Business Connector’ .NET assembly, which is the ‘Microsoft.Dynamics.BusinessConnectorNet.dll’.

We have to add it using the ‘Add ReferenceàBrowse’ option, selecting the physical .dll situated on:

C:\Program Files\Microsoft Dynamics AX\40\Client\Bin\Microsoft.Dynamics.BusinessConnectorNet.dll

Ok, now we are ready for programming some C# code (or VB.Net code, of course).

Let’s double click on our simple button, and add the following code:

A ‘using’ sentence (just like a shortcut for our C# code):

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;


using Bcn = Microsoft.Dynamics.BusinessConnectorNet;

namespace NetBcWinFormsTest

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void btnAccessAX_Click(object sender, EventArgs e)

{

// Create a BCN object

Bcn.Axapta axp;

axp = new Bcn.Axapta();

try

{

// In this case there’s no need for credentials, it is taken from Winforms execution

// because this is just a sample testing application.

// but if it were an ASP.NET app, we should provide specific credentials.

axp.Logon(null, null, null, null);

}

catch (Exception excepn)

{

MessageBox.Show(excepn.ToString());

return;

}

//Calling the X++ static Method!!.

string salutation;

salutation = (string)axp.CallStaticClassMethod(

"CdltllDemoBcnClass", // The class name.

"Salute", // method's name.

"CESAR"); // Parameters.

MessageBox.Show(salutation);

axp.Logoff();

//

}

}

}

Take a look to the selected code and read all the C# comments within that code.

Note that we are instancing a standard BCN object using the class (Microsoft.Dynamics.BusinessConnectorNet.Axapta), and then, when calling the ‘CallStaticClassMethod() method, we have to provide all the X++ class and method information.

So!, the resulting execution in our .NET App is the following…:

Not a very impressive graphics interface, but we are getting that result from within Dynamics AX business logic!! J.

Next step is getting real data from AX tables and AX business classes.

Getting AX real Data (Updated - November 28th 2007)

So, now, we're going to add a new functionality to our little .NET program. In this case, we are going to invoke AX classes to get real AX data. For instance, we're going to get data about Vendors.

Then, we add another simple button to our .NET form, and also a DataGridView where we'll show that data. It would look like the following:

image

Then, we add the following code to be triggered from our second button:

A ‘using’ sentence (just like a shortcut for our C# code):

private void btnAxDataAccess_Click(object sender, EventArgs e)

{

// .NET Business Connector objects

Bcn.Axapta ax;

Bcn.AxaptaRecord axRecord;

// Name of table to query.

String strTable = "VendTable";

// VendTable field names for calls to AxRecord.get_field

String strVendAccountNumField = "AccountNum";

String strVendNameField = "Name";

// Output variables for calls to AxRecord.get_Field

Object vendAccNum, vendName;

// String used to query table.

String strQuery = "select * from %1";

//Sample including WHERE clause

//strQuery = "select * from %1 where %1.vendGroup == ' my_search_criteria_here '";

try

{

// Log on to Microsoft Dynamics AX.

ax = new Bcn.Axapta();

ax.Logon(null, null, null, null);

// Create an AxaptaRecord object for the VendTable.

axRecord = ax.CreateAxaptaRecord(strTable);

// Execute the query on the table.

axRecord.ExecuteStmt(strQuery);

// DataTable creation

DataTable dt = CreateVendorDataTable();

DataRow row;

// Loop through the set of retrieved records.

while (axRecord.Found)

{

// Retrieve the record data for the

// specified fields.

vendName = axRecord.get_Field(strVendNameField);

vendAccNum = axRecord.get_Field(strVendAccountNumField);

row = dt.NewRow();

row["Name"] = vendName.ToString();

row["AccNum"] = vendAccNum.ToString();

dt.Rows.Add(row);

// Advance to the next row.

axRecord.Next();

}

// Dispose of the AxaptaRecord object.

axRecord.Dispose();

// Log off from Microsoft Dynamics AX.

ax.Logoff();

//Data-Binding with our GRID

dataGridView1.DataSource = dt;

}

catch (Exception ex)

{

// Console.WriteLine("Error encountered: {0}", e.Message);

// Take other error action as needed.

}

}

// Create an ADO.NET DataTable ‘on the fly’

public DataTable CreateVendorDataTable()

{

DataTable dt = new DataTable();

dt = new DataTable();

DataColumn vendorNameColumn;

vendorNameColumn = new DataColumn("Name");

vendorNameColumn.DataType = Type.GetType("System.String");

dt.Columns.Add(vendorNameColumn);

DataColumn vendorAccNumColumn;

vendorAccNumColumn = new DataColumn("AccNum");

vendorAccNumColumn.DataType = Type.GetType("System.String");

dt.Columns.Add(vendorAccNumColumn);

return dt;

}

So, what we are doing is using the AxaptaRecord class to select and get all the records from AX data. Keep in mind one important thing. Unlike ADO.NET, which is connectionless oriented, AX data access classes are connection-oriented. I mean, once you have selected what you want, you have to loop over it in a connected environment. In this case, what I am doing is looping through all the records and creating an ADO.NET DataTable 'on the fly' (could be within a DataSet). After having a DataTable or DataSet we could return it to any other .NET assembly or, as in this case, we just make a DataBinding with our GridView, so we show all the records.

Or course, in a real Application and depending of data volume, we should filter data based on kind of 'data pages' or 'data windows', so we won't fill a single DataTable with all the AX table data.

So, if we execute it, we'll get all that AX data!.

image

Magic between .NET and Dynamics AX?. :-)