Տվյալների աղբյուրի պարամետրերի ընդլայնման ձեռնարկ
Բովանդակություն
Ներածություն
Գոյություն ունեցող դիտելու ձևերում լրացուցիչ սյուներ, պարամետրեր ավելացնելու, տողերի պարունակությունը փոփոխելու համար նկարագրվում է տվյալների աղբյուրի ընդլայնում։
Ստորև ձեռնարկում նկարագրած է տվյալների աղբյուրում նոր պարամետրերր ավելացնելու քայլերը։
Դիտելու ձև ընդլայնելու և նոր սյուներ ավելացնելու հիմնական ձեռնարկի համար տե՛ս Տվյալների աղբյուրի ընդլայնում 8X-ում։
Ընդլայնումը դիտելու ձևում օգտագործումը համար տե՛ս:
Օրինակը ամբողջությամբ հասանելի է այստեղ:
.cs ֆայլի ստեղծում
Տվյալների աղբյուրի պարամետրերը նկարագրող դասը սահմանվում է ընդլայնվող սյունյակների նման։ Տե’ս նաև Տվյալների աղբյուրի ընդլայնում 8X-ում։
.cs ֆայլում հարկավոր է ստեղծել class, որը ժառանգում է Extender<R, P>
դասը՝ որպես R
փոխանցելով տվյալների աղբյուրի սյուները նկարագրող դասը, իսկ որպես P
՝ պարամետրերը նկարագրող դասը։
Եթե տվյալների աղբյուրը չի պարունակում սյուներ, ապա որպես R
անհրաժեշտ է փոխանցել NoColumns
դասը։
Հարկավոր է նաև ավելացնել [DataSourceExtender]
ատրիբուտը։ Օրինակ՝
[DataSourceExtender]
public class AllOperExtended : Extender<NoColumns, AllOperExtended.Params>
Բերվող օրինակում, որպես նոր պարամետր հայտարարված է հաճախորդի կոդը։
Ավելացվող պարամետրը հարկավոր է սահմանել երկու տեղ
- Նոր class, որը պարունակում է ընդլայնվող պարամետրերը որպես հատկություններ (Օրինակում
Params
)
public class Params
{
public string CliCode { get; set; }
}
- Ընդլայնող դասի կոնստրուկտորի մեջ՝ AddParam ֆունկցիայի միջոցով։
private readonly IDBService dbService;
public AllOperExtended(IDBService dbService)
{
this.dbService = dbService;
AddParam(nameof(Params.CliCode), "Հաճախորդի կոդ".ToArmenianANSI(), FieldTypeProvider.GetStringFieldType(8));
}
AddParam ֆունկցիային հարկավոր է փոխանցել հետևյալ արժեքները՝
- Պարամետրի ներքին անուն՝ կոդ (նույնանուն հատկության պետք է լինի ստեղծված
Params
դասի մեջ), - Անվանումը հայրեն ANSI կոդավորմամբ (կարելի է գրել Unicode և օգտագործել ToArmenianANSI() ֆունկցիան),
- Պարամետրի տիպը։
Կոնստրուկտորի մեջ ստանում է նաև տվյալների պահոցի հետ աշխատելու IDBService
սերվիսը ինյեկցիայի միջոցով։
BeforeProcess ֆունկցիա
Պարամետրին դիմելու համար BeforeProcess ֆունկցիայում
- ստանում է տվյալների աղբյուրին փոխանցված պարամետրերը
extenderParameters
փոփոխականի մեջ, - ստուգվում է հաճախորդ պարամետրի փոխանցված (լրացված) լինելը,
- կատարվում է SQL հարցում, որի արդյունքում վերադարձվում են տվյալ հաճախորդի բոլոր հաշիվները
private HashSet<string> accounts;
public override async Task BeforeProcess(IList<IExtendableRow> rows, IDataSourceArgs args)
{
var extenderParameters = (Params)args.ExtenderParameters;
if (string.IsNullOrWhiteSpace(extenderParameters.CliCode))
{
return;
}
string sqlQuery = "SELECT fCODE from ACCOUNTS with (nolock) where fCLICODE = @CliCode";
this.accounts = (await this.dbService.Connection.QueryAsync<string>(sqlQuery,
new { CliCode = extenderParameters.CliCode })).ToHashSet();
}
ProccessRow ֆունկցիա
Եթե ընդլայնված պարամետրով փոխանցված հաճախորդի կոդ, ապա ProccessRow ֆունկցիայում ստուգվում է, որ տվյալների աղբյուրի յուրաքանչյուր տողում գրված հաշիվը (դեբետում կամ կրեդիտում) լինի BeforeProcess-ում ստացած հաշիվների ցանկում։
Եվ առկայության դեպքում ProccessRow ֆունկցիան վերադարձնում է true
, որպեսզի տողը ընդգրկվի վերջնական ցանկում։ Ցանկում չլինելու դեպքում վերադարձնում է false
տողը վերջնական ցանկից հանելու համար։
public override Task<bool> ProccessRow(IExtendableRow row, IDataSourceArgs args)
{
var extenderParameters = (Params)args.ExtenderParameters;
if (string.IsNullOrWhiteSpace(extenderParameters.CliCode))
{
return Task.FromResult(true);
}
var dsRow = (AllOperations.DataRow)row;
bool result = this.accounts.Contains(dsRow.ACCDB) || this.accounts.Contains(dsRow.ACCCR);
return Task.FromResult(result);
}
Ներմուծում և օգտագործում
.as և .cs ֆայլերը պատրաստ լինելուն պես անհրաժեշտ է SYSCON-ով համապատասխան .as ֆայլը ներմուծել համակարգ, ինչի արդյունքում .cs ֆայլը նույնպես կներմուծվի։
ֆայլերը ներմուծելուց հետո հարկավոր այն կարգավորել դիտելու ձևում։