AsprovaのプラグインDLLと拡張インターフェイスDLLの違い 【プラグインDLLは関数の追加、拡張インターフェイスDLLは既存ロジックの変更】

プラグインDLLは機能(関数)の追加、拡張インターフェイスDLLは既存ロジックに対する変更のために開発します。

AsDefaultクラスのAutoRegistrationメソッドの中にプラグインキー(KeyHookGeneric)を定義するか、インターフェイス(IEIIFilterCalcReplenishOrderLotSizing)を定義するかの違いです。

プラグインキーとインターフェイスの違い

プラグインのAsDefaultクラスのAutoRegistrationメソッドの中のエントリ関数呼び出し部分にプラグインキー(KeyHookGeneric)を定義しておけば、Asprovaで該当するイベントが発生(追加したコマンドが起動)したときにエントリ関数が呼び出され実行される。

同じようにEII(Extension Interface Implementation)のAsDefaultクラスのAutoRegistrationメソッドの中のエントリ関数呼び出し部分にインターフェイス(IEIIFilterCalcReplenishOrderLotSizing)を定義しておけば、Asprovaで該当するイベントが発生(自動補充発生)したときにエントリ関数が呼び出され実行される。

ただしプラグインキーよりもインターフェイスは呼び出しにかかるオーバーヘッドが小さくなるようカスタマイズされており、オーダ展開、自動補充、ロットまとめなどのような頻繁に呼び出しがかかるロジックの変更に適しています。

プラグインDLLは機能(関数)の追加、拡張インターフェイスDLLは既存ロジックに対する変更のために開発します。

Option Explicit
Public Function AutoRegistration(pluginMan As AsPlugInManager.ASPPlugInManager, module As AsPlugInManager.ASPModule) As Boolean

    'プラグインと同じくプラグインオブジェクトを保持する変数を定義
    Dim plugin As AsPlugInManager.ASPPlugIn

    'EEI
    Dim pEI As ASPExtensionInterface
    Dim pEII As ASPExtensionInterfaceImplementation

    '自動補充発生時に(kEIIFilterCalcReplenishOrderLotSizing)DNNA.EIIImplementationsが呼び出される
    Set pEI = pluginMan.GetExtensionInterfaceFromType(kEIIFilterCalcReplenishOrderLotSizing)
    Set pEII = pluginMan.AddInterfaceImplementation("稼働日ベースで期間まとめ", "DNNA.EIIImplementations", pEI)

    AutoRegistration = True

End Function

拡張インターフェイスを使うとプラグインキーを使うよりも呼び出しにかかるオーバヘッドが小さいので、リスケジュールの中で頻繁に発生するイベントから呼び出したいエントリ関数を追加する場合に使用します。




補充オーダのロットサイズを変更する拡張インターフェイス(DLL)

補充オーダのロットサイズは「製造ロットサイズMAX」「製造ロットサイズMIN」「製造ロットサイズUNIT」によって決まりますが、FilterCalcReplenishOrderLotSizingは「オーダ展開」コマンドの中での紐付け時に呼び出され、以下の3つのオブジェクトを取得して補充オーダのロットサイズを変更(上書き)し、結果をArgListに渡します。

  1. 補充品目の配列 ArgAsObject(kArgItem)
  2. 親オーダの初工程の作業入力指図のリスト ArgAsObject(kArgObjectList)
  3. ロットサイズのリスト ArgAsSafeArray(kSafeArrayArgDouble)

ロットサイズ

  1. ロットサイズは自動補充「はい」
  2. ロットサイズは補充オーダ生成時に決定される
  3. 作業入力指図のリスト(2次元配列)と作業出力指図のリスト(品目)

オーダ展開のプロセス

  1. 親オーダの作業(作業入力指図と作業出力指図)を生成
    初期状態での親オーダとは受注オーダ、または登録オーダの製造オーダ
    製造BOMより作業入力指図、作業出力指図を生成
  2. 自動補充
    親オーダの作業の作業入力指図が紐付け対象かどうか確認
    親オーダが在庫(絶対量)よりも過去の日時の場合、作業入力指図は紐付け対象外不足分の作業入力指図の製造オーダを自動生成する。
    親オーダの作業入力指図(入力品目)の不足分の製造オーダを子オーダとして生成
    子オーダの作業入力指図の不足分の製造オーダを孫オーダとして生成
  3. オーダ間の紐付け1回目
    自動補充設定のある受注オーダ、製造オーダ、購買オーダ、在庫オーダの紐付け
    自動補充設定のない製造オーダ同士(製造BOMで繋がりのある品目同士)

製造オーダ完成7回分で前工程をまとめる例

  1. 1回目の自動補充でitemにB1が、instにBのリストが入る
    作業M4の入力指図B1の不足数量(在庫がないのでRemainingQtyはBそのもの)を7回足しこむ
  2. 2回目の自動補充でitemにCが、instにAのリストが入る
    作業M2の入力指図Cの不足数量を7回足しこむ。
  3. inst.Operation.OperationMainRes.Code=’M4’が条件なので(2)は実行されない。
'実装しているインターフェイスのメソッドを指定
Implements IEIIFilterCalcReplenishOrderLotSizing

Private Sub IEIIFilterCalcReplenishOrderLotSizing_FilterCalcReplenishOrderLotSizing(ByVal ArgListAsObject As Object)

    'Object型の引数をASPArgList型変数にキャスト
    '***APSから取得するデータ***
    Dim ArgList As ASPArgList
    Set ArgList = ArgListAsObject

    '自動補充設定のある品目(B1,C)
    Dim item As ASBItem
    Set item = ArgList.ArgAsObject(kArgItem)

    'MsgBox item.Code

    '補充オーダ(の最終工程作業の作業出力指図)と紐付けすべきオーダの(初工程作業の)作業入力指図のリスト(紐付け順にソート済み)
    Dim instList As ASOObjectList
    Set instList = ArgList.ArgAsObject(kArgObjectList)

    '作業入力指図の値を入れる変数
    Dim inst As ASBInputInstruction
    Dim order As ASBOrder

    '作業入力指図の数
    Dim numInsts As Integer

    'APS が算出したロットサイズリストをlotSizeListに格納
    Dim lotSizeList() As Double
    lotSizeList = ArgList.ArgAsSafeArray(kSafeArrayArgDouble)

    'ロットサイズの値を入れる変数
    Dim lotSize As Double

    '***新しく定義する変数***
    '新ロットサイズリスト(動的配列)と値を入れるための変数
    Dim newLotSizeList() As Double
    Dim newLotSize As Double

    '新ロットサイズの初期値を0
    newLotSize = 0

    '新ロットサイズの配列の添え字を100にして動的配列のサイズを定義
    Dim ArraySize
    ArraySize = 100
    ReDim newLotSizeList(ArraySize)

    '新ロットサイズの値の数
    Dim numNewLotSizes

    '新ロットサイズの数の初期値を0
    numNewLotSizes = 0

    '対象品目に紐付けられる作業入力指図の数
    numInsts = instList.ObjectCount

    Dim numLotSizes, j, i As Integer

    '添え字の最大値(1)
    numLotSizes = UBound(lotSizeList)

    '紐付けする作業入力指図のリスト回数まわし、その間でロットが確定するたびに配列に格納する。
    'item.codeとinst.item.codeは同じ品目
    For i = 1 To numInsts

        Set inst = instList.Object(i)

        '親オーダ品目が作業入力指図品目なら抜ける
        Set order = inst.order

        '最終工程の割り付きを見て7日分をロットまとめするが、それ以外はItem Tableのロットでまとめる
        If inst.Operation.OperationMainRes.Code <> "M4" Then
            Exit Sub
        End If

        '7回分の出荷または製造オーダでまとめる
        If (i - 1) Mod 7 <> 0 Then
            'ロットサイズをまとめていく
            newLotSize = newLotSize + inst.RemainingQty

        Else
            'ロットサイズを確定しロットサイズ格納用配列に格納
            newLotSizeList(numNewLotSizes) = newLotSize

            '配列の添え字を1つ足す
            numNewLotSizes = numNewLotSizes + 1

            '自動補充時の作業入力指図の不足数量
            newLotSize = inst.RemainingQty

        End If
        'MsgBox "i=" & i & "  " & "  inst.item.Code=" & inst.item.Code & "  newLotSize=" & newLotSize & "   inst.RemainingQty=" & inst.RemainingQty

    Next i

    '端数分をロットまとめ
    If 0 < numInsts Then
        newLotSizeList(numNewLotSizes) = newLotSize
        numNewLotSizes = numNewLotSizes + 1
    End If

    ReDim numNewLotSizes(numNewLotSizes)

    ArgList.ArgAsSafeArray(kSafeArrayArgDouble) = newLotSizeList

End Sub