List 6-163 変更したBusiness.SlipコンポーネントのRequestConsentメソッド(変更部分は赤色で示した)
  1: Public Sub RequestConsent(ByVal SlipID As Long, ByVal Comment As Variant)
  2:     ' 指定された伝票を承認依頼中にする
  3:     ' 【引数】
  4:     '   SlipID = 承認依頼中としたい伝票の伝票番号
  5:     '   Comment = 承認依頼中にするときのコメント
  6:     ' 【戻り値】
  7:     '   なし
  8:     Dim objContext As ObjectContext
  9:     Dim objDataSlip As DataObj.Slip, objDataSlipInformation As DataObj.SlipInformation
 10:     Dim objDataSlipDetail As DataObj.SlipDetail
 11:     Dim objDataProduct As DataObj.Product, objDataStock As DataObj.STOCK
 12:     Dim SlipStatus As SlipStatus
 13:     Dim old_CUSTOMERID As Variant, old_SUBTOTAL As Variant, old_TAX As Variant
 14:     Dim old_TOTAL As Variant, old_MADEDATE As Variant, old_MADEUSER As Variant
 15:     Dim old_LASTUSER As Variant, old_LASTDATE As Variant
 16:     Dim old_ONEBILLFLAG As Variant, old_BILLID As Variant, old_BILLDATE As Variant
 17:     Dim objRecSlipDetail As ADODB.Recordset
 18:     Dim Number As Long, ProductID As Long
 19:     Dim old_DIVISION As Variant, old_PERSON As Variant, old_DELIVERDATE As Variant
 20:     Dim old_SENT_ADDR As Variant, old_SENT_TEL As Variant, old_MEMO As Variant
 21:     Dim nowStock As Long, willStock As Long
 22:     
 23:     ' オブジェクトコンテキストの取得
 24:     Set objContext = GetObjectContext()
 25:     
 26:     ' エラーハンドラの設定
 27:     On Error GoTo ErrHandle
 28:     
 29:     ' DataObj.Slipコンポーネントを実体化
 30:     Set objDataSlip = CreateObject("DataObj.Slip")
 31:     
 32:     ' 伝票が存在することを確認
 33:     If objDataSlip.IsDeleted(SlipID) <> ID_Exists Then
 34:         ' 伝票が存在しない
 35:         Err.Raise Errorcode.Err_NOTFOUND, App.Title, _
                       "指定された伝票は存在しません"
 36:     End If
 37:     
 38:     ' 伝票の状態を取得
 39:     SlipStatus = objDataSlip.Get_SlipStatus(SlipID)
 40:     If (SlipStatus <> Creating) And (SlipStatus <> Rejected) Then
 41:         ' 伝票が作成中または却下されたという状態ではない
 42:         Err.Raise BusinessError.Err_CANTUPDATE, App.Title, _
                       "その伝票はすでに承認依頼されています"
 43:     End If
 44:     
 45:     ' ユーザーの確認
 46:     If Not objContext.IsSecurityEnabled() Then
 47:         ' セキュリティ設定が無効
 48:         Err.Raise ERR_NOSECURE, App.Title, _
                       "セキュリティ機構が無効です"
 49:     End If
 50: 
 51:     ' その時点の伝票の情報を取得
 52:     objDataSlip.GetRecord_Slip SlipID, old_CUSTOMERID, _
                                    old_SUBTOTAL, old_TAX, old_TOTAL, _
                                    old_MADEDATE, old_MADEUSER, _
                                    old_LASTDATE, old_LASTUSER
 53:     ' 作成者と呼び出し者が一致するか
 54:     If objContext.Security.GetOriginalCallerName() <> old_MADEUSER Then
 55:         ' 一致しない
 56:         ' SalesAdminロールまたはAllAdminロールに属するのであれば,
 57:         ' 一致しなくてもよいものとする
 58:         If Not (objContext.IsCallerInRole("SalesAdmin") Or _
                     objContext.IsCallerInRole("AllAdmin")) Then
 59:             ' SalesAdminロールやAllAdminロールに属さない
 60:             Err.Raise ERR_NOSECURE, App.Title, _
                           "他人が作成した伝票を更新することはできません"
 61:         End If
 62:     End If
 63: 
 64:     ' 以上で権限の調査は完了。以下,実際のデータ操作に入る
 65:     
 66:     ' REQ_CONSENTFLAGフィールドの値をTrueにする
 67:     objDataSlip.Set_REQ_CONSENTFLAG SlipID, True, Comment
 68:     ' REJECTEDFLAGフィールドの値をFalseにする
 69:     objDataSlip.Set_REJECTEDFLAG SlipID, False, Null
 70:     
 71:     ' 在庫の調査
 72:     
 73:     ' その時点の伝票追加情報の取得
 74:     ' DataObj.SlipInformationコンポーネントの実体化
 75:     Set objDataSlipInformation = CreateObject("DataObj.SlipInformation")
 76:     objDataSlipInformation.GetRecord SlipID, old_DIVISION, _
                                          old_PERSON, old_DELIVERDATE, _
                                          old_SENT_ADDR, old_SENT_TEL, old_MEMO, _
                                          old_MADEDATE, old_MADEUSER, _
                                          old_LASTDATE, old_LASTUSER
 77:     
 78:     ' その時点の明細レコードの取得
 79:     ' DataObj.SlipDetailコンポーネントの実体化
 80:     Set objDataSlipDetail = CreateObject("DataObj.SlipDetail")
 81:     Set objRecSlipDetail = objDataSlipDetail.GetRecords(SlipID)
 82:     
 83:     ' DataObj.Productコンポーネントの実体化
 84:     Set objDataProduct = CreateObject("DataObj.Product")
 85:     ' DataObj.Stockコンポーネントの実体化
 86:     Set objDataStock = CreateObject("DataObj.Stock")
 87:     
 88:     ' すべての明細についてループ
 89:     While Not objRecSlipDetail.EOF
 90:         If Not objRecSlipDetail.Fields("DELETEDFLAG").Value Then
 91:             ' 削除ずみでないならば在庫を調査
 92:             ProductID = objRecSlipDetail.Fields("PRODUCTID").Value
 93:             Number = objRecSlipDetail.Fields("NUMBER").Value
 94:             
 95:             ' その時点の在庫数を取得
 96:             nowStock = objDataProduct.GetNowStock(ProductID)
 97:                     
 98:             ' 納入予定日までに到着する予定の数量を取得
 99:             willStock = objDataStock.GetWillStock(ProductID, old_DELIVERDATE)
100:             
101:             ' 在庫が足りるかどうか
102:             If (nowStock + willStock < Number) Then
103:                 ' 在庫が足りない
104:                 Err.Raise Err_CANTUPDATE, App.Title, _
                               "製品[" & objRecSlipDetail.Fields("PRODUCTNAME").Value & "]" & _
                               "が納入予定日までに揃いません。納入予定日までに揃う数量は" & _
                               nowStock + willStock & "個です"
105:             End If
106:             
107:             ' 予約数を加える
108:             objDataProduct.AddBackOrder ProductID, Number
109:                     
110:         End If
111:         
112:         ' 次のレコードに移動
113:         objRecSlipDetail.MoveNext
114:     Wend
115:     
116:     objRecSlipDetail.Close
117:     Set objRecSlipDetail = Nothing
118:     
119:     ' 各種コンポーネントの解放
120:     Set objDataStock = Nothing
121:     Set objDataProduct = Nothing
122:     Set objDataSlipDetail = Nothing
123:     Set objDataSlipInformation = Nothing
124:     Set objDataSlip = Nothing
125: 
126:     ' トランザクションのコミット
127:     objContext.SetComplete
128:     
129:     ' オブジェクトコンテキストの解放
130:     Set objContext = Nothing
131:     
132:     ' 伝票の合計金額がg_MaxTotal以下であれば,承認処理に進む
133:     If old_TOTAL <= g_MaxTotal Then
134:         ConsentSlip SlipID, Null
135:     End If
136: 
137:     Exit Sub
138: 
139: ErrHandle:
140:     ' エラーハンドラ
141:     objContext.SetAbort
142:     Set objDataSlip = Nothing
143:     Set objDataSlipInformation = Nothing
144:     Set objDataSlipDetail = Nothing
145:     Set objDataProduct = Nothing
146:     Set objDataStock = Nothing
147:     Set objRecSlipDetail = Nothing
148:    
149:     ' エラーの再発行
150:     Err.Raise Err.Number, Err.Source, Err.Description, _
                   Err.HelpFile, Err.HelpContext
151: End Sub