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
(Design detail)
 
(8 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
<accesscontrol>Main:MyGroup</accesscontrol>
 +
[[Category:Miscellaneous]]
 +
 
== Introduction ==
 
== Introduction ==
 
[[Image:ViewCrossFunction.PNG]]
 
[[Image:ViewCrossFunction.PNG]]
Line 26: Line 29:
 
:* The Page_Load event:
 
:* The Page_Load event:
  
[[Image:FLPageLoadMethod.PNG]]
+
[[Image:3056_FLPageLoadMethod.PNG]]
  
 
: Create default data cache
 
: Create default data cache
Line 36: Line 39:
 
:* The Button Ok clicked event:
 
:* The Button Ok clicked event:
  
[[Image:FLButtonOkClicked.PNG]]
+
[[Image:3056_FLButtonOkClicked.png]]
  
 
: Re-setup data cache:
 
: Re-setup data cache:
 
<source lang=csharp>
 
<source lang=csharp>
// qcs is a questionnaire cache specification object
+
// _dcsId is a questionnaire cache specification ID
var generator = new GenerateInstantReport();
+
// _pqId is a project questionnaire ID
List<DataColumn> datacolumns = qcs.QuestionnaireSelection.GetDataColumns();
+
var pq = ProjectQuestionnaire.GetByPrimaryKey(_pqId);
generator.RemoveBrTagFromQuestionAndSubQuestion(datacolumns);
+
var qcs = QuestionnaireCacheSpecification.GetBy(_dcsId);
 +
var pqs = new List<ProjectQuestionnaire> { pq };
 +
qcs.QuickSetup(pqs, true);
 
qcs.AxisSet = qcs.CreateDefaultAxisSet();
 
qcs.AxisSet = qcs.CreateDefaultAxisSet();
 
qcs.Save();
 
qcs.Save();
Line 51: Line 56:
 
// qcsObject is a questionnaire cache specification object
 
// qcsObject is a questionnaire cache specification object
 
DataCacheManager.Instance.BuildDCSIfNeeded(qcsObject, true, false);
 
DataCacheManager.Instance.BuildDCSIfNeeded(qcsObject, true, false);
 +
</source>
 +
: Re-setup and rebuild data cache in another thread
 +
<source lang=csharp>
 +
[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;
 +
      }
 +
</source>
 +
: Class diagram of ResetupDcsForCrossDiagramGenerator class
 +
[[Image: ResetupDcsForCrossDiagramGenerator.png]]
 +
: ResetupDcs() method:
 +
<source lang=csharp>
 +
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();
 +
        }
 +
      }
 +
</source>
 +
: ResetupDcsReal() method: note that ''AccessFactory.CurrentInstance().ConnectionFactory.Commit();'' has to be called before building Dcs to get latest data.
 +
<source lang=csharp>
 +
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);
 +
      }
 
</source>
 
</source>
  
Line 66: Line 130:
 
| [[Trần Nguyễn Thanh Tùng]]
 
| [[Trần Nguyễn Thanh Tùng]]
 
| Technical design
 
| Technical design
 +
| NA
 +
|-
 +
| 0.2
 +
| 01.04.2010
 +
| [[Trần Nguyễn Thanh Tùng]]
 +
| Update to bug fixed - Finish
 
| NA
 
| NA
 
|}
 
|}

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