Բովանդակություն

Ներածություն

Գոյություն ունեցող դիտելու ձևերում լրացուցիչ սյուներ, պարամետրեր ավելացնելու, տողերի պարունակությունը փոփոխելու համար նկարագրվում է տվյալների աղբյուրի ընդլայնում։

Ստորև ձեռնարկում նկարագրած է տվյալների աղբյուրում նոր պարամետրերր ավելացնելու քայլերը։
Դիտելու ձև ընդլայնելու և նոր սյուներ ավելացնելու հիմնական ձեռնարկի համար տե՛ս Տվյալների աղբյուրի ընդլայնում 8X-ում։
Ընդլայնումը դիտելու ձևում օգտագործումը համար տե՛ս:

Օրինակը ամբողջությամբ հասանելի է այստեղ:

.cs ֆայլի ստեղծում

Տվյալների աղբյուրի պարամետրերը նկարագրող դասը սահմանվում է ընդլայնվող սյունյակների նման։ Տե’ս նաև Տվյալների աղբյուրի ընդլայնում 8X-ում։

.cs ֆայլում հարկավոր է ստեղծել class, որը ժառանգում է Extender<R, P> դասը՝ որպես R փոխանցելով տվյալների աղբյուրի սյուները նկարագրող դասը, իսկ որպես P՝ պարամետրերը նկարագրող դասը։ Եթե տվյալների աղբյուրը չի պարունակում սյուներ, ապա որպես R անհրաժեշտ է փոխանցել NoColumns դասը։ Հարկավոր է նաև ավելացնել [DataSourceExtender] ատրիբուտը։ Օրինակ՝

[DataSourceExtender]
public class AllOperExtended : Extender<NoColumns, AllOperExtended.Params>

Բերվող օրինակում, որպես նոր պարամետր հայտարարված է հաճախորդի կոդը։

Ավելացվող պարամետրը հարկավոր է սահմանել երկու տեղ

  1. Նոր class, որը պարունակում է ընդլայնվող պարամետրերը որպես հատկություններ (Օրինակում Params)
public class Params
{
    public string CliCode { get; set; }
}
  1. Ընդլայնող դասի կոնստրուկտորի մեջ՝ 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 ֆայլը նույնպես կներմուծվի։

ֆայլերը ներմուծելուց հետո հարկավոր այն կարգավորել դիտելու ձևում։