Tuesday, May 31, 2016

Retail business concept

A guru in retail business describes me about the overview of Retail business. So let me share it here. (Please note that most of them might not be the wide-use academic terminology)

At high level, I split out the retail operation into 3 main parts.
  1. Buy-in
  2. GR (Goods Receiving)
  3. Sell
Buyer, a subset of Merchandise unit buy products from vendors. Then do receive the products. Merchandise and Marketing will set the price and promotion of each products. The product with retail price will be ready to sell at Store at last. The flow is shown in the figure 1 below.


Figure 1 - Overview of Retail Business



Another concept is Warehouse (W/H) and Distribution center (DC). Products keep at the warehouse, and then transfer to a DC, eventually supply to each stores. Figure 2 illustrates those relations.



Figure 2 - Warehouse and Distribution center



When do GR, the goods can transfer to W/H, DC or store warehouse directly. One of important information which are synced back to the Merchandise unit is the sales amount. This info helps Merchandise to decide which product should buy, what price should set, and etc.


Figure 3 - Receiving the products from a vendor

In addition, there are some concepts interesting, for example Loyalty unit, (or we can call it CRM) the unit which collect sell and customer information to predict or set the proper promotion for each customers.

Hope this article gives an idea about Retail Business. Until the next post!

Friday, May 6, 2016

Fiscal period is not open

I found the issue 'Fical period 5/5/2016 is not open' when I tried to invoice a purchase order yesterday. I solved it by this post Error - Fiscal period for xx/xx/xxxx is not open.


















Above picture is captured from the Internet because I forgot to capture mine ;(

Solution
General ledger -> Setup -> Ledger  

Click  'Ledger calendar'..  make sure that the period you're going to process, the period status is set to 'Open'.














X++ Display Financial Dimension Value

I found this useful post https://sumitsaxfactor.wordpress.com/2011/12/16/getting-individual-dimension-combination-valuesdimension-storage-class-ax-2012/ written by Sumit Loya.

As real beginner on Financial module. This is a simple to show financial dimension from table/class. For example,  General ledger -> Common -> Trial Balance -> Click Journal entries 'Balance' -> Choose a journal and click 'Transaction Origin'.

















Only input of this code is RecId of table GeneralJournalAccountEntry. In short words, this table keeps the key of LedgerAccount and Journal.

--------------------------------------------------------------------------------------------------
static void getDimensionCombinationValues(Args _args)
{
    // DimensionAttributeValueCombination stores the combinations of dimension values
    // Any tables that uses dimension  combinations for main account and dimensions
    // Has a reference to this table’s recid
    DimensionAttributeValueCombination  dimAttrValueComb;
    //GeneralJournalAccountEntry is one such tables that refrences DimensionAttributeValueCombination
    GeneralJournalAccountEntry          gjAccEntry;
    // Class Dimension storage is used to store and manipulate the values of combination
    DimensionStorage        dimensionStorage;
    // Class DimensionStorageSegment will get specfic segments based on hierarchies
    DimensionStorageSegment segment;
    int                     segmentCount, segmentIndex;
    int                     hierarchyCount, hierarchyIndex;
    str                     segmentName, segmentDescription;
    SysDim                  segmentValue;
    ;

    //Get one record for demo purpose
    gjAccEntry = GeneralJournalAccountEntry::find(5642191935);  //put the input here

    setPrefix("Dimension values fetching");
    //Fetch the Value combination record
    dimAttrValueComb = DimensionAttributeValueCombination::find(gjAccEntry.LedgerDimension);
    setPrefix("Breakup for " + dimAttrValueComb.DisplayValue);

    // Get dimension storage
    dimensionStorage = DimensionStorage::findById(gjAccEntry.LedgerDimension);
    if (dimensionStorage == null)
    {
        throw error("@SYS83964");
    }

    // Get hierarchy count
    hierarchyCount = dimensionStorage.hierarchyCount();
    //Loop through hierarchies to get individual segments
    for(hierarchyIndex = 1; hierarchyIndex <= hierarchyCount; hierarchyIndex++)
    {
        setPrefix(strFmt("Hierarchy: %1", DimensionHierarchy::find(dimensionStorage.getHierarchyId(hierarchyIndex)).Name));
        //Get segment count for hierarchy
        segmentCount = dimensionStorage.segmentCountForHierarchy(hierarchyIndex);

        //Loop through segments and display required values
        for (segmentIndex = 1; segmentIndex <= segmentCount; segmentIndex++)
        {
            // Get segment
            segment = dimensionStorage.getSegmentForHierarchy(hierarchyIndex, segmentIndex);

            // Get the segment information
            if (segment.parmDimensionAttributeValueId() != 0)
            {
                // Get segment name
                segmentName = DimensionAttribute::find(DimensionAttributeValue::find(segment.parmDimensionAttributeValueId()).DimensionAttribute).Name;
                //Get segment value (id of the dimension)
                segmentValue        = segment.parmDisplayValue();
                //Get segment value name (Description for dimension)
                segmentDescription  = segment.getName();
                info(strFmt("%1: %2, %3", segmentName, segmentValue, segmentDescription));
            }
        }
    }
}
--------------------------------------------------------------------------------------------------

The result looks like below.