public bool FetchDataFromCellsMisys(object objCommand, ref object objResult, ref object objError)
        {
            Logger.logBegin("FetchDataFromCellsMisys");

            const string cnst_CONDITION = "CONDITION:";
            string       strCommand     = objCommand == null ?  null : objCommand.ToString();

            try
            {
                if (string.IsNullOrEmpty(strCommand))
                {
                    throw new Exception("objCommand should not be NULL or empty");
                }

                /** check Command **/

                /*  ' format :
                 *  '   ROWS_LIMIT:0:0;Code/Name
                 *  '   ALLROWS;ColumnsName
                 *  '   CONDITION:COLUMN=A;ColumnName;NOSUB, Example: CONDITION:0=@FO_test;Income;NOSUB
                 *  '       NOSUB means don't get all sub information, other wise get all sub expanded rows
                 * */
                if (!TigerMarsUtil.RegularTest("^CONDITION:", strCommand))
                {
                    throw new Exception(string.Format("No supported Command, [{0}]", strCommand));
                }
                //objReflect.GetMember<object>(objDataSrcTmp,"")

                if (TigerMarsUtil.RegularTest("^" + cnst_CONDITION, strCommand))
                {
                    #region CONDITION MODE
                    //CONDITION:COLUMN=A;ColumnName;NOSUB, Example: CONDITION:0=@FO_test;Income;NOSUB
                    if (!TigerMarsUtil.RegularTest(@"CONDITION:\S+=\S{1,};\b\w+\b(;NOSUB){0,1}", strCommand))
                    {
                        objError = string.Format("RC should match CONDITION:\\b\\w+\\b=\\w+;\\b\\w+\\b(;NOSUB), Command:{0}", strCommand);
                        Logger.Error("FetchDataFromCellsMisys", (string)objError);
                        return(false);
                    }

                    string   strCmdNoHeader = strCommand.Replace(cnst_CONDITION, "");
                    string[] arrTargetField = strCmdNoHeader.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries);
                    string   strTargetField = arrTargetField[1];
                    string[] arrCondition   = arrTargetField[0].Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries);

                    TreeList objTr = (TreeList)base.SourceControl;

                    CustomTreeList     objCTrlst     = (CustomTreeList)objTr;
                    object             objDataSrcTmp = objCTrlst.DataSource;
                    ReflectorForCSharp objReflect    = new ReflectorForCSharp();
                    CSMPortfolio       objPortC      = null;
                    CSMPosition        objPortCsub   = null;
                    //object objPortfolio = objReflect.GetMember<object>(objDataSrcTmp, "Portfolio");
                    //CSMPortfolio objPortC = (CSMPortfolio)objPortfolio;
                    //double dIncome = objPortC.GetIncome();
                    object         tmpData = objReflect.GetMember <object>(objTr, "Data");
                    UnboundData    unData = (UnboundData)tmpData;
                    VirtualDataRow objVDataRow = null;
                    bool           isFind = false;
                    string         strHeadName = "";
                    int            iLevel = -1;
                    double         dDat = 0.00;
                    string         strResult = "", strTmp = "";
                    for (int i = 0; i < unData.DataList.Count; i++)
                    {
                        objVDataRow = (VirtualDataRow)unData.DataList[i];
                        objPortC    = (CSMPortfolio)(objReflect.GetMember <object>(objVDataRow.VirtualNode, "Portfolio"));
                        iLevel      = objPortC.GetLevel();
                        if ((iLevel <= 1) && (isFind))
                        {
                            break;
                        }
                        strHeadName = objPortC.GetName() == null?"":objPortC.GetName().ToString();
                        if (!isFind)
                        {
                            /** Only the root level can be taken as comparison node **/
                            if (iLevel != 1)
                            {
                                continue;
                            }
                            if (!TigerMarsUtil.RegularTest(arrCondition[1], strHeadName))
                            {
                                continue;
                            }
                            else
                            {
                                isFind = true;
                            }
                        }

                        switch (strTargetField.ToUpper())
                        {
                        case "INCOME":
                            dDat   = objPortC.GetIncome() * 1000;
                            strTmp = dDat.ToString("0.");
                            break;

                        case "NAV":
                            dDat   = objPortC.GetNetAssetValue() * 1000;
                            strTmp = dDat.ToString("0.");
                            break;

                        case "RESULT":
                            dDat   = objPortC.GetResult() * 1000;
                            strTmp = dDat.ToString("0.");
                            break;

                        case "REALIZED":
                            dDat   = objPortC.GetRealised() * 1000;
                            strTmp = dDat.ToString("0.");
                            break;

                        case "BALANCE":
                            dDat   = objPortC.GetBalance() * 1000;
                            strTmp = dDat.ToString("0.");
                            break;

                        default:
                            throw new Exception(string.Format("Not supported field :[{0}]", strTargetField));
                        }
                        if (string.IsNullOrEmpty(strResult))
                        {
                            strResult = string.Format("[{0}{1}]", strHeadName, FormatStrWithTab(0, strTmp));
                        }
                        else
                        {
                            strResult = string.Format("{0}\n\r{1}", strResult, string.Format("[{0}{1}]", strHeadName, FormatStrWithTab(0, strTmp)));
                        }

                        for (int j = 0; j < objVDataRow.Children.Count; j++)
                        {
                            //objVDataRow.Children[j];
                            objPortCsub = (CSMPosition)objReflect.GetMember <object>(objVDataRow.Children[j], "Position");
                            strHeadName = objVDataRow.Children[j].ToString();
                            if (objPortCsub == null)
                            {
                                continue;
                            }
                            switch (strTargetField.ToUpper())
                            {
                            case "INCOME":
                                dDat   = objPortCsub.GetIncome() * 1000;
                                strTmp = dDat.ToString("0.");
                                break;

                            case "NAV":
                                dDat   = objPortCsub.GetNetAssetValue() * 1000;
                                strTmp = dDat.ToString("0.");
                                break;

                            case "RESULT":
                                dDat   = objPortCsub.GetResult() * 1000;
                                strTmp = dDat.ToString("0.");
                                break;

                            case "REALIZED":
                                dDat   = objPortCsub.GetRealised() * 1000;
                                strTmp = dDat.ToString("0.");
                                break;

                            case "BALANCE":
                                dDat   = objPortCsub.GetBalance() * 1000;
                                strTmp = dDat.ToString("0.");
                                break;

                            default:
                                throw new Exception(string.Format("Not supported field :[{0}]", strTargetField));
                            }
                            strResult = string.Format("{0}\n\r{1}", strResult, string.Format("[{0}    {1}]", strHeadName, FormatStrWithTab(0, strTmp)));
                        }
                        break;
                    }
                    objResult = strResult;
                    return(true);

                    #endregion //CONDTION MODE
                }

                objError = string.Format("Unsupported Command formatter:[{0}]", strCommand);
                return(false);
            }
            catch (Exception e)
            {
                objError = e.Message;
                Logger.Error("FetchDataFromCellsMisys", string.Format("Errors come across. Exception:[{0}]", e.Message), e);
                return(false);
            }
            finally
            {
                Logger.logEnd("FetchDataFromCellsMisys");
            }
        }