List 6-128 Business.SlipコンポーネントのUpdateSlipDetailメソッド
  1: Public Function UpdateSlipDetail(ByVal ID As Variant, _
                                      ByVal ProductID As Variant, _
                                      ByVal NUMBER As Variant, _
                                      ByVal UNITPRICE As Variant, _
                                      ByVal PRICE As Variant, _
                                      ByVal MEMO As Variant) As Long
  2:     ' 指定された明細情報を変更する
  3:     ' 【引数】
  4:     '   ID = 変更したい明細のレコードID
  5:     '   ProductID = 明細の対象となる製品の製品番号
  6:     '   NUMBER = 数量
  7:     '   UNITPRICE = 製品単価
  8:     '   PRICE = 製品価格
  9:     '   MEMO = 摘要
 10:     ' 【戻り値】
 11:     ' 追加した明細を示すレコードID(IDフィールドに設定された値)
 12:     Dim objContext As ObjectContext
 13:     Dim objDataSlip As DataObj.Slip, objDataSlipDetail As DataObj.SlipDetail
 14:     Dim objDataProduct As DataObj.Product
 15:     Dim old_CUSTOMERID As Variant, old_SUBTOTAL As Variant, old_TAX As Variant
 16:     Dim old_TOTAL As Variant, old_MADEDATE As Variant, old_MADEUSER As Variant
 17:     Dim old_LASTUSER As Variant, old_LASTDATE As Variant
 18:     Dim SUBTOTAL As Currency, TAX As Currency, TOTAL As Currency
 19:     Dim p_PRODUCTNAME As Variant, p_YOMIGANA As Variant, p_PRICE As Variant
 20:     Dim p_STOCK As Variant, p_MEMO As Variant
 21:     Dim p_BACKORDER As Variant, p_MADEUSER As Variant, p_MADEDATE As Variant
 22:     Dim p_LASTUSER As Variant, p_LASTDATE As Variant
 23:     Dim SlipID As Long
 24:     
 25:     ' オブジェクトコンテキストの確認
 26:     Set objContext = GetObjectContext()
 27:     
 28:     ' エラーハンドラの設定
 29:     On Error GoTo ErrHandle
 30:     
 31:     ' 現在の明細を削除する
 32:     ' DataObj.SlipDetailコンポーネントの実体化
 33:     Set objDataSlipDetail = CreateObject("DataObj.SlipDetail")
 34:         
 35:     SlipID = objDataSlipDetail.SetDeleted(ID)
 36:     
 37:     ' 製品の存在を確認
 38:     ' DataObj.Productコンポーネントの実体化
 39:     Set objDataProduct = CreateObject("DataObj.Product")
 40:     If objDataProduct.IsDeleted(ProductID) <> ID_Exists Then
 41:         ' 製品がない
 42:         Err.Raise Errorcode.Err_PRODUCTID, App.Title, _
                       "指定された製品は存在しません"
 43:     End If
 44:     
 45:     ' 価格がNULLであった場合には,製品情報テーブルから取得した値を使用
 46:     If IsNull(UNITPRICE) And IsNull(PRICE) Then
 47:         ' 製品情報を取得
 48:         objDataProduct.GetRecord ProductID, p_PRODUCTNAME, p_YOMIGANA, p_PRICE, _
                                      p_STOCK, p_MEMO, p_BACKORDER, p_MADEUSER, p_MADEDATE, _
                                      p_LASTUSER, p_LASTDATE
 49:         UNITPRICE = p_PRICE
 50:         PRICE = UNITPRICE * NUMBER
 51:     End If
 52:     
 53:     ' DataObj.Slipコンポーネントの実体化
 54:     Set objDataSlip = CreateObject("DataObj.Slip")
 55:     
 56:     ' 削除されていないことを確認
 57:     If objDataSlip.IsDeleted(SlipID) <> ID_Exists Then
 58:         Err.Raise Errorcode.Err_NOTFOUND, App.Title, _
                       "指定された伝票番号を持つ伝票が見つかりません"
 59:     End If
 60:     
 61:     ' 伝票の現在の状態が承認待ち以上であれば編集は不可
 62:     If objDataSlip.Get_SlipStatus(SlipID) >= RequestingConsent Then
 63:         Err.Raise ERR_CANTUPDATE, App.Title, _
                       "承認待ち以上まで進んでいるため変更できません"
 64:     End If
 65:     
 66:     ' その時点における伝票の状態を確認
 67:     objDataSlip.GetRecord_Slip SlipID, old_CUSTOMERID, _
                                    old_SUBTOTAL, old_TAX, old_TOTAL, _
                                    old_MADEDATE, old_MADEUSER, _
                                    old_LASTDATE, old_LASTUSER
 68:     
 69:     ' 変更する権限があるかどうかをチェック
 70:     If Not objContext.IsSecurityEnabled() Then
 71:         ' セキュリティ設定が無効
 72:         Err.Raise ERR_NOSECURE, App.Title, _
                       "セキュリティ機構が無効です"
 73:     End If
 74:     
 75:     ' 作成者と呼び出し者が一致するか
 76:     If objContext.Security.GetOriginalCallerName() <> old_MADEUSER Then
 77:         ' 一致しない
 78:         ' SalesManagerロール,SalesAdminロール,AllAdminロールに属するのであれば,
 79:         ' 一致しなくてもよいものとする
 80:         If Not (objContext.IsCallerInRole("SalesManager") Or _
                     objContext.IsCallerInRole("SalesAdmin") Or _
                     objContext.IsCallerInRole("AllAdmin")) Then
 81:             ' SalesManagerロール,SalesAdminロール,AllAdminロールに属さない
 82:             Err.Raise ERR_NOSECURE, App.Title, _
                           "他人が作成した伝票を更新することはできません"
 83:         End If
 84:     End If
 85:     
 86:     ' 明細を追加する
 87:     ' 明細の追加
 88:     UpdateSlipDetail = objDataSlipDetail.AddRecord( _
                              ProductID, NUMBER, UNITPRICE, PRICE, MEMO, SlipID)
 89:     ' 伝票の合計の再計算
 90:     SUBTOTAL = objDataSlipDetail.GetSubTotal(SlipID)
 91:     TAX = SUBTOTAL * 0.05
 92:     TOTAL = SUBTOTAL + TAX
 93:     objDataSlip.SetTotal SlipID, SUBTOTAL, TAX, TOTAL
 94:     
 95:     ' コンポーネントの解放
 96:     Set objDataSlipDetail = Nothing
 97:     Set objDataSlip = Nothing
 98:     Set objDataProduct = Nothing
 99: 
100:     ' トランザクションをコミット
101:     objContext.SetComplete
102:     
103:     ' オブジェクトコンテキストの解放
104:     Set objContext = Nothing
105:     
106:     Exit Function
107: 
108: ErrHandle:
109:     ' エラーハンドラ
110:     objContext.SetAbort
111:     Set objContext = Nothing
112:     Set objDataProduct = Nothing
113:     Set objDataSlip = Nothing
114:     Set objDataSlipDetail = Nothing
115:     
116:     ' エラーの再発行
117:     Err.Raise Err.NUMBER, Err.Source, Err.Description, _
                   Err.HelpFile, Err.HelpContext
118: End Function