2012-08-29 63 views

回答

1

您無法直接進行此操作,但可以查詢針對您感興趣的帳戶所寫的最近一次支票。默認的第一個支票號碼將比最高的支票號碼大1書面。

作爲一個規則,我不會爲他們編寫人員代碼,今天我只是因爲它是星期五而且我處於一種瘋狂的情緒下才例外。以下代碼可用作起始點,以獲取有用的上次檢查號例程。爲了有一個現實的,可用的例程,你而不是我,將不得不處理所有與人們使用支票簿的方式有關的怪癖:非數字號碼,數字亂序等。

請注意:此代碼使用Zombie open source library和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; 
     } 
    } 
} 
+0

感謝@保羅,該日期字段,我們檢查最近的檢查,帳戶。我們應該使用哪個接口? – Thakur

+1

SDK中沒有「上次修改日期」,因此您必須自行推出。以下是我的做法:選擇一個保守的日期(可能是昨天),並查看查詢是否返回檢查。如果它不繼續向後延伸範圍,直到找到某種東西。您可以通過使用IncludeRetElementList將查詢限制爲僅支持檢查的TxnId,TxnDate和RefNumber來保持輕量級查詢。 –

+0

謝謝@保羅,真的很感激。將嘗試明天實施並讓你知道。 – Thakur