Difference between revisions of "VN3056REP - Same business logic as View Report for View Cross function from Questionnaire list"
(→Introduction) |
Wikicatglobe (talk | contribs) |
||
(18 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 12: | Line 15: | ||
== Design decisions == | == 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 | ||
− | + | [[Image: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 == | == Design detail == | ||
− | + | * Re-make a new "Regenerate instant cross" dialog as above. | |
− | + | * There are two main processes for this dialog: | |
− | There are | + | :* The Page_Load event: |
− | + | [[Image:3056_FLPageLoadMethod.PNG]] | |
− | + | : Create default data cache | |
+ | <source lang=csharp> | ||
+ | // QuestionnaireObject is a selected Questionnaire | ||
+ | QuestionnaireCacheSpecification qcsObject = DiagramUtilities.CreateNewDCSByQuestionnaire(QuestionnaireObject); | ||
+ | </source> | ||
− | The | + | :* The Button Ok clicked event: |
− | + | [[Image:3056_FLButtonOkClicked.png]] | |
− | [[Image: | ||
− | + | : Re-setup data cache: | |
− | [[Image: | + | <source lang=csharp> |
+ | // _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(); | ||
+ | </source> | ||
+ | : Rebuild data cache: | ||
+ | <source lang=csharp> | ||
+ | // qcsObject is a questionnaire cache specification object | ||
+ | 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> | ||
== Document revisions == | == Document revisions == | ||
Line 61: | Line 127: | ||
|- | |- | ||
| 0.1 | | 0.1 | ||
− | | | + | | 23.03.2010 |
− | | [[Nguyễn | + | | [[Trần Nguyễn Thanh Tùng]] |
− | | | + | | Technical design |
| NA | | NA | ||
|- | |- | ||
− | | 0.2 | + | | 0.2 |
− | | | + | | 01.04.2010 |
− | | [[Nguyễn | + | | [[Trần Nguyễn Thanh Tùng]] |
− | | Finish | + | | Update to bug fixed - Finish |
− | | | + | | NA |
|} | |} |
Latest revision as of 04:22, 18 October 2013
<accesscontrol>Main:MyGroup</accesscontrol>
Introduction
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
- 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:
- Create default data cache
// QuestionnaireObject is a selected Questionnaire
QuestionnaireCacheSpecification qcsObject = DiagramUtilities.CreateNewDCSByQuestionnaire(QuestionnaireObject);
- The Button Ok clicked event:
- 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
- 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 |