さらに調査した結果、入力バッファを自由にトラバースすることはできないことがわかりました。
解決策は、質問に対して少し直感に反しています。次の行を特定して変更する代わりに、前の値に基づいて現在の行を変更することが最善の方法です。これは、顧客 ID 内の最大の日付から最小の日付までデータを評価する必要があることを意味します。
継続性のために、元の質問のコンテキスト内で例を保持します。
スクリプト コンポーネントの入力データがあるとします。並べ替えコンポーネントを追加して、レコード セットを並べ替えCustomerID
、次にContractStartDate
降順で並べ替えます。
次に、スクリプト コンポーネントで、入力値としてCustomerID
andContractStartDate
を追加ContractEndDate
し、出力値として追加します。
をオーバーライドしInput0_ProcessInputRow
ます。これを行うコードはデフォルトで生成されます。
いくつかのプロパティを追加して、前の開始日と前の顧客を追跡し、前の行に基づいて現在の行の終了日の値を設定します。
スクリプトは次のようになります。
public DateTime? PreviousRowStartDate { get; set; }
public string PreviousRowCustomerID { get; set; }
public int KnownContractPeriod { get; set; }
int defaultContractPeriod = 12;
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (PreviousRowCustomerID == Row.CustomerID)
{
Row.ContractEndDate= PreviousRowStartDate.Value.AddDays(-1);
}
else
{
Row.ContractEndDate= Row.ContractStartDate.AddMonths(defaultContractPeriod).AddDays(-1);
}
PreviousRowCustomerID = Row.CustomerID;
PreviousRowStartDate = Row.ContractStartDate;
}
これは、最初の契約 (最新の顧客) を処理するときに破綻します。このため、デフォルトの契約期間を含めました。
この問題は実際に私を苦しめる可能性がありますが、ここでのほとんどの契約は 12 か月の長さであるため、現時点で言うのは困難です.