List 7-195 Business.Billコンポーネントの訂正したMakeBillsメソッド(訂正箇所は赤色で示した)


  1: Public Sub MakeBills(ByVal billdate As Date)
  2:     ' 指定された日付よりも小さい日付の伝票を集計し,請求書を作成する
  3:     ' 【引数】
  4:     '   billdate = 集計したい伝票の締め日
  5:     ' 【戻り値】
  6:     '   なし
  7:     Dim objContext As ObjectContext
  8:     Dim objDataCustomer As DataObj.Customer
  9:     Dim objDataBill As DataObj.Bill
 10:     Dim objDataSlip As DataObj.Slip
 11:     Dim objCustomerRec As ADODB.Recordset
 12:     Dim objSlipRec As ADODB.Recordset
 13:     Dim startBillDay As Long, endBillDay As Long
 14:     Dim nextMonth As Date
 15:     Dim bdate As Date
 16:     Dim SUBTOTAL As Currency, TAX As Currency, TOTAL As Currency
 17:     Dim BillID As Long
 18:     Dim startDate As Date, endDate As Date
 19:     
 20:     ' オブジェクトコンテキストの取得
 21:     Set objContext = GetObjectContext()
 22:     
 23:     ' エラーハンドラの設定
 24:     On Error GoTo ErrHandle
 25:     
 26:     ' 引数billdateの時刻部分を捨てる
 27:     billdate = DateValue(billdate)
 28:     
 29:     ' 請求期間を算出
 30:     startDate = DateAdd("m", -1, billdate)
 31:     startDate = DateAdd("d", 1, startDate)
 32:     endDate = billdate
 33:     
 34:     ' 請求書の締め日を算出
 35:     startBillDay = Day(billdate)
 36:     ' 該当月の最終日を算出
 37:     ' 翌月の日を算出
 38:     nextMonth = DateAdd("m", 1, billdate)
 39:     ' 翌月の月の頭から1日引いた日が該当月の最終日である
 40:     endBillDay = Day(DateAdd("d", -1, _
                                  DateSerial(Year(nextMonth), Month(nextMonth), 1)))
 41:     
 42:     If endBillDay = startBillDay Then
 43:         ' 該当月の最終日である
 44:         ' この場合には,startBillDayから締め日が31日に設定されている顧客までを
 45:         ' 集計の対象とする
 46:         endBillDay = 31
 47:     Else
 48:         ' 該当月の最終日ではない
 49:         ' この場合には,startBillDayに締め日が設定されている顧客だけを
 50:         ' 集計の対象とする
 51:         endBillDay = startBillDay
 52:     End If
 53:     
 54:     ' DataObj.Customerコンポーネントを実体化
 55:     Set objDataCustomer = CreateObject("DataObj.Customer")
 56:     ' DataObj.Slipコンポーネントを実体化
 57:     Set objDataSlip = CreateObject("DataObj.Slip")
 58:     ' DataObj.Billコンポーネントを実体化
 59:     Set objDataBill = CreateObject("DataObj.Bill")
 60:     
 61:     ' startBillDayからendBillDayまでくり返す。
 62:     ' これにより,たとえば,閏年ではない2月28日が指定された場合には,
 63:     ' 上記までの処理において,startBillDay変数に28が,endBillDay変数に31が設定されるため,
 64:     ' 締め日が28日,29日,30日,31日に設定されている顧客に対して集計することになる
 65:     For bdate = startBillDay To endBillDay
 66:         ' 指定された締め日の顧客を抜き出す
 67:         Set objCustomerRec = objDataCustomer.GetCustomersByBillDay(bdate)
 68:         ' それぞれの顧客に対し,伝票の集計処理をする
 69:         While Not objCustomerRec.EOF
 70:             ' objCustomerRec.Fields("CUSTOMERID").Valueの値が取引先に
 71:             ' なっていてかつ経理処理ずみの伝票の一覧を取得する
 72:             Set objSlipRec = objDataSlip.GetRecords(Null, Null, Null, Null, True, _
                                                         FILTER_SLIP_ACCOUNTED, False, _
                                                         objCustomerRec.Fields("ID").Value)
 73:             ' 取得した伝票に対して請求書を作成する処理をする
 74:             If Not objSlipRec.Eof Then       ' 訂正
 75:                 SUBTOTAL = 0
 76:                 TAX = 0
 77:                 TOTAL = 0
 78:                 While Not objSlipRec.EOF
 79:                     If Not objSlipRec.Fields("ONEBILLFLAG").Value Then
 80:                         ' 1枚単位の請求書を作るように指定されていないものである
 81:                         ' 請求額に伝票に記載されている額を加える
 82:                         SUBTOTAL = SUBTOTAL + objSlipRec.Fields("SUBTOTAL").Value
 83:                         TAX = TAX + objSlipRec.Fields("TAX").Value
 84:                         TOTAL = TOTAL + objSlipRec.Fields("TOTAL").Value
 85:                     End If
 86:                                 
 87:                     ' 次のレコードに移動する
 88:                     objSlipRec.MoveNext
 89:                 Wend
 90:                     
 91:                 ' 請求書を作成する
 92:                 BillID = objDataBill.AddRecord(objCustomerRec.Fields("ID").Value, _
                                                    startDate, endDate, _
                                                    SUBTOTAL, TAX, TOTAL)
 93:                 ' 取得した伝票を請求書作成ずみにし,また,請求書と結び付ける
 94:                 objSlipRec.MoveFirst
 95:                 While Not objSlipRec.EOF
 96:                     If Not objSlipRec.Fields("ONEBILLFLAG").Value Then
 97:                         ' 1枚単位の請求書を作るように指定されていないものである
 98:                         ' 請求書作成ずみにする
 99:                         objDataSlip.Set_MADEBILLFLAG objSlipRec.Fields("ID").Value, True
100:                         objDataSlip.Set_ACCOUNTINGFLAG objSlipRec.Fields("ID").Value, False, Null
101:                     
102:                         ' 請求書と結び付ける
103:                         objDataSlip.SetBillID objSlipRec.Fields("ID").Value, BillID
104:                     End If
105:                 
106:                     ' 次のレコードに移動する
107:                     objSlipRec.MoveNext
108:                 Wend
109:             End If               '訂正
110:             ' 以上で1つの顧客に対応する処理は完了
111:         
112:             ' 取得した伝票のレコードセットを解放
113:             objSlipRec.Close
114:             Set objSlipRec = Nothing
115:         
116:             ' 次の顧客の処理に進む
117:             objCustomerRec.MoveNext
118:         Wend
119:         ' 以上で,指定された請求日の処理は完了
120:     
121:         ' 取得した顧客のレコードセットを解放
122:         objCustomerRec.Close
123:         Set objCustomerRec = Nothing
124:     Next
125:     
126:     ' 各種コンポーネントの解放
127:     Set objDataBill = Nothing
128:     Set objDataSlip = Nothing
129:     Set objDataCustomer = Nothing
130:     
131:     ' トランザクションのコミット
132:     objContext.SetComplete
133:     
134:     ' オブジェクトコンテキストの解放
135:     Set objContext = Nothing
136:     
137:     Exit Sub
138:     
139: ErrHandle:
140:     ' エラーハンドラ
141:     objContext.SetAbort
142:     Set objDataCustomer = Nothing
143:     Set objDataSlip = Nothing
144:     Set objDataBill = Nothing
145:     Set objCustomerRec = Nothing
146:     Set objSlipRec = Nothing
147:  
148:     ' エラーの再発行
149:     Err.Raise Err.Number, Err.Source, Err.Description, _
                   Err.HelpFile, Err.HelpContext
150: End Sub