Difference between revisions of "VN3056REP - Same business logic as View Report for View Cross function from Questionnaire list"

From Catglobe Wiki
Jump to: navigation, search
 
Line 1: Line 1:
<accesscontrol>Administrators,,Cem,,Maysunshine</accesscontrol>
+
<accesscontrol>Main:MyGroup</accesscontrol>
 
[[Category:Miscellaneous]]
 
[[Category:Miscellaneous]]
  

Latest revision as of 04:22, 18 October 2013

<accesscontrol>Main:MyGroup</accesscontrol>

Introduction

ViewCrossFunction.PNG

The current process of "View cross" function in Questionnaire list:

  • Create / Rebuild the default data cache of selected questionnaire.
  • Check if the data cache has any axises, if yes redirect to a "nearly" cross viewer page, if no, just render an error message.

Disadvantage:

  • The data cache is always rebuilt if there is a change in data of questionnaire.
  • If the questionnaire template of questionnaire is changed, it is too difficult to re-setup the data cache.

Design decisions

When "View Cross" function of Questionnaire list is clicked:

  • If this is the first time that this function is used for selected questionnaire, create a data cache and redirect to cross viewer page.
  • If not, use the same business logic as "View Report" function, show the below dialog

ViewCrossDialog.PNG

  • If option 1 is selected, data cache will be re-setup, rebuild, and then show the cross viewer page.
  • If option 2 is selected, just show the cross viewer page with the old data cache.

Design detail

  • Re-make a new "Regenerate instant cross" dialog as above.
  • There are two main processes for this dialog:
  • The Page_Load event:

3056 FLPageLoadMethod.PNG

Create default data cache
// QuestionnaireObject is a selected Questionnaire
QuestionnaireCacheSpecification qcsObject = DiagramUtilities.CreateNewDCSByQuestionnaire(QuestionnaireObject);
  • The Button Ok clicked event:

3056 FLButtonOkClicked.png

Re-setup data cache:
// _dcsId is a questionnaire cache specification ID
// _pqId is a project questionnaire ID
var pq = ProjectQuestionnaire.GetByPrimaryKey(_pqId);
var qcs = QuestionnaireCacheSpecification.GetBy(_dcsId);
var pqs = new List<ProjectQuestionnaire> { pq };
qcs.QuickSetup(pqs, true);
qcs.AxisSet = qcs.CreateDefaultAxisSet();
qcs.Save();
Rebuild data cache:
// qcsObject is a questionnaire cache specification object
DataCacheManager.Instance.BuildDCSIfNeeded(qcsObject, true, false);
Re-setup and rebuild data cache in another thread
 [ServerMethod]
      public bool ResetupAndRebuildDcs(int pqId, int qcsId, string key)
      {
         var identity = WindowsIdentity.GetCurrent();
         var generator = new ResetupDcsForCrossDiagramGenerator(pqId, qcsId, key, identity);
         var thread = new Thread(generator.ResetupDcs)
         {
            CurrentCulture = Thread.CurrentThread.CurrentCulture,
            CurrentUICulture = Thread.CurrentThread.CurrentUICulture
         };
         thread.Start();
         return true;
      }
Class diagram of ResetupDcsForCrossDiagramGenerator class

ResetupDcsForCrossDiagramGenerator.png

ResetupDcs() method:
 public void ResetupDcs()
      {
         if (IsInProc())
         {
            ResetupDcsReal();
            return;
         }
         _identity.Impersonate();
         IoC.Resolve<IAccessFactoryFactory>().CreateFactory();

         try
         {
            ResetupDcsReal();
            AppDomain.CurrentDomain.SetData(_threadkey, string.Format("Success.{0}", _dcsId));
         }
         catch (Exception e)
         {
            Abort(e);
         }
         finally
         {
            Commit();
         }
      }
ResetupDcsReal() method: note that AccessFactory.CurrentInstance().ConnectionFactory.Commit(); has to be called before building Dcs to get latest data.
private void ResetupDcsReal()
      {
         var pq = ProjectQuestionnaire.GetByPrimaryKey(_pqId);
         var qcs = QuestionnaireCacheSpecification.GetBy(_dcsId);
         var pqs = new List<ProjectQuestionnaire> { pq };
         qcs.QuickSetup(pqs, true);
         qcs.AxisSet = qcs.CreateDefaultAxisSet();
         qcs.Save();
         AccessFactory.CurrentInstance().ConnectionFactory.Commit();
         DataCacheManager.Instance.BuildDCSIfNeeded(qcs, true, true);
      }

Document revisions

Version No. Date Changed By Description Svn revision
0.1 23.03.2010 Trần Nguyễn Thanh Tùng Technical design NA
0.2 01.04.2010 Trần Nguyễn Thanh Tùng Update to bug fixed - Finish NA