Вы не можете сделать это напрямую, но вы можете запросить самые последние чеки, которые были выписаны для интересующей вас учетной записи. Номер первой проверки по умолчанию будет на единицу больше, чем самый высокий номер чека, который был выписан.
Как правило, я не пишу для них код людей, сегодня делаю исключение только потому, что сегодня пятница и у меня сумасшедшее настроение. Следующий код можно использовать в качестве отправной точки для полезной процедуры последнего контрольного числа. Чтобы иметь реалистичную, полезную рутину, вам, а не мне, придется иметь дело со всеми странностями, которые связаны с тем, как люди используют свои чековые книжки: нечисловые числа, числа не по порядку и т. д.
Обратите внимание: в этом коде используется библиотека с открытым исходным кодом Zombie и QBFC 11.
class CheckNumbers
{
private const int DATE_INTERVAL = -7;
private string _accountName;
private DateTime _lastToDate;
private DateTime _lastFromDate;
public CheckNumbers(string accountName)
{
_accountName = accountName;
_lastToDate = DateTime.Today;
_lastFromDate = _lastToDate.AddDays(DATE_INTERVAL);
}
private void SetCriteria(IORTxnQuery qry)
{
qry.TxnFilter.AccountFilter.ORAccountFilter.FullNameList.Add(_accountName);
var dateFilter = qry.TxnFilter.ORDateRangeFilter.ModifiedDateRangeFilter;
dateFilter.FromModifiedDate.SetValue(_lastFromDate, true);
dateFilter.ToModifiedDate.SetValue(_lastToDate, true);
}
private void ProcessCheckNumber(string checkNumber, ref int highestNumber)
{
if (!string.IsNullOrEmpty(checkNumber))
{
int thisCheck;
if (!int.TryParse(checkNumber, out thisCheck))
{
throw new Exception(string.Format("Check number {0} cannot be read as an integer", checkNumber));
}
if (thisCheck > highestNumber) highestNumber = thisCheck;
}
}
public int GetLastCheckNumber()
{
DateTime failSafe = DateTime.Parse("1/1/2010");
using (var cn = Zombie.ConnectionMgr.GetConnection())
{
int highestCheck = 0;
while (highestCheck == 0 && _lastFromDate > failSafe)
{
var batch = cn.NewBatch();
var checkQuery = batch.MsgSet.AppendCheckQueryRq();
checkQuery.IncludeRetElementList.Add("RefNumber");
SetCriteria(checkQuery.ORTxnQuery);
batch.SetClosures(checkQuery, b =>
{
var checks = new Zombie.QBFCIterator<ICheckRetList, ICheckRet>(b);
foreach (var check in checks)
{
ProcessCheckNumber(Zombie.Safe.Value(check.RefNumber), ref highestCheck);
}
});
var billCheckQuery = batch.MsgSet.AppendBillPaymentCheckQueryRq();
billCheckQuery.IncludeRetElementList.Add("RefNumber");
SetCriteria(billCheckQuery.ORTxnQuery);
batch.SetClosures(billCheckQuery, b =>
{
var checks = new Zombie.QBFCIterator<IBillPaymentCheckRetList, IBillPaymentCheckRet>(b);
foreach (var check in checks)
{
ProcessCheckNumber(Zombie.Safe.Value(check.RefNumber), ref highestCheck);
}
});
if (!batch.Run()) return 0;
_lastToDate = _lastFromDate;
_lastFromDate = _lastToDate.AddDays(DATE_INTERVAL);
}
return highestCheck;
}
}
}
person
Paul Keister
schedule
29.08.2012