(Document) Փաստաթղթի նկարագրման ձեռնարկ
Բովանդակություն
- Ներածություն
- .as ֆայլի նկարագրություն
- CodeGen-ով C# ֆայլի ձևավորում
- Իրադարձությունների C# ֆայլի նկարագրություն
Ներածություն
8X-ում փաստաթղթի նկարագրության համար հարկավոր է ունենալ DOCUMENT նկարագրություն .as
ֆայլում, և իրականացնել ինտերֆեյսի հետ չաշխատող իրադարձությունները C# դասում (.cs
ֆայլում)։
Փաստաթղթի նկարագրությունը կատարվում է 4X գործիքներով, և դրանում ավելացվում միայն մի քանի 8X-ին յուրահատուկ են հատկությունները, ինչպիսին են`
ALLOWSTOREINSERVICE
-ը, որը թույլատրում է փաստաթղթի գրանցումը 8X սերվիսում,PROCESSINGMODE
-ը, որը սահմանում է փաստաթղթի հիմնական գործողություններից (Store, Delete, Load, Create) որոնք են կատարվում 8X սերվիսում։
Նկարագրությունը ներմուծվում է SysCon գործիքով։
C# դասը սովորաբար դրվում է երկու .cs
ֆայլում։
Առաջինը գեներացվում է CodeGen գործիքով, և պարունակում է նկարագրության հատվածը։
Երկրորդը ստեղծվում է ձեռքով և պարունակում է ոչ ինտերֆեյսային իրադարձությունների իրականացումը (Validate, Action, Folders…)։
Արդյունքում կունենանք 4 ֆայլ:
- definition.as
- definition.cs
- definition.CodeGen.tt
- definition.CodeGen.cs
Տե՛ս 4 ֆայլերի օրինակը:
.as ֆայլի նկարագրություն
DOCUMENT-ի սահմանումը տես 4X-ի համապատասխան ձեռնարկի։
Նկարագրության մեջ հարկավոր է ավելացնել միայն PROCESSINGMODE
(կատարման ռեժիմ) հատկությունը։
Օրինակ՝
DOCUMENT {
NAME = UsrAccs;
CAPTION = "Օգտագործողի հաշիվներ";
ECAPTION = "User's accounts";
ALLOWSTOREINSERVICE = 1;
PROCESSINGMODE = 8; '#DocProcessingMode2
PAGE { CAPTION = "Ընդհանուր"; ECAPTION = "General";
REKVIZIT {NAME = USERNAME; CAPTION = "Օգտագործողի անուն"; ECAPTION="User's name"; TYPE = C(20); };
REKVIZIT {NAME = BRANCH; CAPTION = "Մասնաճյուղ"; ECAPTION="Registration branch"; TYPE = C(10); };
GRID {NAME = Accounts; CAPTION = "Հաշիվներ"; ECAPTION = "Accounts"; WIDTH = 13000; HEIGHT = 3000;
COLUMN {NAME = ACCTYPE; CAPTION = "Տիպ"; ECAPTION = "Type"; TYPE = C(10); };
COLUMN {NAME = CODE; CAPTION = "Կոդ"; ECAPTION = "Code"; TYPE = NP(16); };
};
MEMO {NAME = COMMENT; CAPTION = "Մեկնաբանություն"; ECAPTION = "Comment"; WIDTH = 7000; HEIGHT = 2300; };
};
}
CodeGen-ով C# ֆայլի ձևավորում
Առաջին C# ֆայլը գեներացվում է CodeGen գործիքով, և պարունակում է նկարագրության հատվածը։
Տե՛ս օրինակում ձևավորված UsrAccs.CodeGen.cs
ֆայլը:
-
Հայտատարարված է դաս, որը ունի փաստաթղթի ներքին անվանումը պարունակող
Document
ատրիբուտը և ժառանգում է Document դասից։[Document("UsrAccs")] public class UsrAccs : Document
-
Ավելացված են մուտքագրման դաշտերը որպես հատկություններ` ճիշտ տիպի բերումները արած։
/// <summary> /// Օգտագործողի անուն /// </summary> public string USERNAME { get { return (string)this[nameof(this.USERNAME)]; } set { this[nameof(this.USERNAME)] = value; } } /// <summary> /// Մասնաճյուղ /// </summary> public string BRANCH { get { return (string)this[nameof(this.BRANCH)]; } set { this[nameof(this.BRANCH)] = value; } }
-
Ավելացված է դաս աղյուսակի տողերի համար, որը պետք է պարտադիր ժառանգի
GridRow
դասից: Աղյուսակի սյուները դասում հատկություններ են` ճիշտ տիպի բերումները արած։public partial class AccountsRow : GridRow { /// <summary> /// Տիպ /// </summary> public string ACCTYPE { get { return (string)this[nameof(this.ACCTYPE)]; } set { this[nameof(this.ACCTYPE)] = value; } } /// <summary> /// Կոդ /// </summary> public decimal CODE { get { return (decimal)this[nameof(this.CODE)]; } set { this[nameof(this.CODE)] = value; } } }
- Ավելացված է աղյուսակը վերադարձնող հատկությունը ճիշտ տիպի բերված։
/// <summary> /// Հաշիվներ /// </summary> public Grid<AccountsRow> Accounts { get { return (Grid<AccountsRow>)this.Grids[nameof(this.Accounts)]; } }
- Ավելացված է Մեծ տեքստային դաշտը(մեմո) որպես հատկություն
public string COMMENT { get { return GetMemo(nameof(this.COMMENT)); } set { SetMemo(nameof(this.COMMENT), value); } }
Իրադարձությունների C# ֆայլի նկարագրություն
Երկրորդ C# ֆայլը ստեղծվում է ձեռքով և պարունակում է ոչ ինտերֆեյսային իրադարձությունների իրականացումը (Validate, Action, Folders…)։
Այն պետք է իր մեջ ունենա սահմանված նախրորդ քայլում ձևավոևված դասը partial հատկանիշով։
public partial class UsrAccs
Տե՛ս օրինակում ձևավորված UsrAccs.cs
ֆայլը:
Կոնստրուկտորի ձևավորում
Հարկավոր է ավելացնել public կոնստրուկտոր՝ IServiceProvider տիպի պարտադիր պարամետրով, որը պիտի կանչի base Document-ի կոնստրուկտորը և փոխանցի IServiceProvider տիպի պարամետրը:
Կոնստուկտորում կարող է ստանալ հարկավոր սերվիսները ինյեկցիայի միջոցով։
Մասնավորապես, օրինակում, ստանում է նաև պարամետրերի հետ աշխատելու IParametersService
սերվիսը։
private readonly IParametersService parametersService;
public UserAccounts(IParametersService parameterService, IServiceProvider serviceProvider) : base(serviceProvider)
{
this.parametersService = parameterService;
}
Մեթոդներ
Փաստաթղթի մեջ հարկավոր է գերբեռնել (override) հարկավոր մեթոդները համապատասխան իրադարձությունները մշակելու համար։
Տե՛ս փաստաթղթի բոլոր իրադարձությունները 4X ձեռնարկում։
Validate
Դաշտերի արժեքների ստուգման անհրաժեշտության դեպքում override անել Validate մեթոդը:
public override Task Validate(ValidateEventArgs args)
{
if (this.Accounts.RowCount == 0)
{
throw new Exception("Օգտագործողին հաշիվներ կցված չեն".ToArmenianANSI());
}
return Task.CompletedTask;
}
Action
Փաստաթղթի գրանցման ժամանակ հավելյալ ստուգումներ կատարելու, լոգում, տվյալների բազայի աղյուսակներում փոխկապակցված գրանցումներ կատարելու, ինչ-որ պայմաններից կախված փաստաթղթի էլեմենտների(ռեկվիզիտ, մեմո, աղյուսակ) և հատկությունների արժեքները փոփոխելու համար անհրաժեշտ է override անել Action մեթոդը:
public override async Task Action(ActionEventArgs args)
{
if (string.IsNullOrWhiteSpace(this.BRANCH))
{
this.BRANCH = await this.parametersService.DefaultBranch();
}
}
Folders
Փաստաթուղթը FOLDERS աղյուսակում գրանցելու համար անհրաժեշտ է override անել Folders մեթոդը՝ ստեղծելով և գրանցելով FolderElement
, որը հանդիսանում է 4x համակարգում նկարագրված AsFoldElement դասի համարժեքը։
public override Task Folders(FoldersEventArgs args)
{
var folderElement = new FolderElement()
{
FolderId = "UserAccounts",
Status = FolderStatus.Edit,
Key = this.USERNAME,
Comment = this.Description.ArmenianCaption,
EComment = this.Description.EnglishCaption,
Spec = this.USERNAME.LeftAlign(20) + this.BRANCH.LeftAlign(50)
};
this.DocumentService.StoreInFolder(this, folderElement);
return Task.CompletedTask;
}
Delete
Եթե կա անհրաժեշտություն փաստաթղթի հեռացումից առաջ ստուգումներ կատարելու և կապակցված տվյալներ հեռացնելու, ապա անհրաժեշտ է override անել Delete մեթոդը:
public override async Task Delete(DeleteEventArgs args)
{
bool isDeletionAllowed = await this.parametersService.GetBooleanValue("DELETEALIENDOCS");
if (!isDeletionAllowed)
{
throw new Exception("Փաստաթուղթը հեռացնելու իրավասություն չունեք".ToArmenianANSI());
}
}