0

作業指示書を自動的に発行する IBM Maximo データベースを使用しています。作業指示書が発行される (データベースの作業指示書テーブルに挿入される) ときに、一連の基準に基づいてスーパーバイザー、所有者、および所有者グループを自動割り当てしたいと考えています。これは、スーパーバイザー、所有者、および所有者グループがまだ割り当てられていない場合にのみ行う必要があります。多くの場合、「親の作業指示書」に情報がありますが、「子」の作業指示書にコピーする必要があります (以下の基準で確認できます)。すべてのトリガーの基準は次のとおりです。

WHERE status<>'COMP'
AND historyflag=0
AND istask=0

トリガーの基準は次のとおりです。

-所有者グループとスーパーバイザーに値がある場合は、レコードをスキップします。(何もしない)

- 所有者グループおよび/または監督者が空白または null で、対応する PARENT 作業指示書フィールドが Null でない場合は、所有者グループおよび/または監督者を PARENT 作業指示書レコードからコピーします。

-親作業指示所有者グループおよび/またはスーパーバイザーが空白または null の場合、以下の表の値に従って所有者グループおよびスーパーバイザーを割り当てます: (セキュリティのために名前を削除しましたが、すべての列は正しいです。つまり、B3 が想定されていますSuperA をスーパーバイザとして持つ)

Site / OwnerGroup / Supervisor
ABC / @ABCGroup / @ABCSupervisor
DEF / @DEFGroup / @DEFSupervisor

**注: SITE はテーブル列ではなく、実際には workorder.location フィールドの最初の 3 文字です。たとえば、場所は ABC-1234 である可能性があります。これは、サイト ABC の建物 1234 にあることを意味します (残念ながら、これらは別々の列に保存されず、場所の列にまとめて表示されるだけです)。この SQL クエリでは、ある場所にあるすべての建物が同じ所有者グループ/監督者によって管理されているため、現在使用している他のすべてのクエリでは workorder.location='ABC%' を使用しています。

私は多くの選択、更新、およびストアド プロシージャを実行しましたが、これは私の最初のトリガーであり、データベースをめちゃくちゃにしないようにしたいと考えています。どんな助けでも大歓迎です!

Maximo に慣れていない方のために説明すると、テーブルは dbo.workorder で、フィールドは location,ownergroup,supervisor です。


UPDATE1:
重要な追加情報を次に示します。
場所:
まず、workorder.location には ABC-1234 などの値が含まれます。これは、サイト ABC、建物 1234 にあることを意味します (これらは個別の値ではなく、組み合わされています)。この SQL クエリでは、ある場所にあるすべての建物が同じ所有者グループ/監督者によって管理されているため、すべてのクエリで workorder.location='ABC%' のようなものを使用しています。

最終的なクエリのロジックを次のようにします。

スーパーバイザー フィールドが見つからない場合は、まず親があるかどうかを確認します。ある場合は、親にスーパーバイザーがありますか? そうでない場合は、上の表に基づいて割り当てます。

ownergroup フィールドがない場合は、まず親があるかどうかを確認します。ある場合は、親に ownergroup がありますか? そうでない場合は、上の表に基づいて割り当てます。

これが、ケースステートメントがおそらく最良の選択肢であると考えている理由です。また、現在、必要に応じて将来変更できるように、「@ASupervisor、@B1Supervisor、@B2Supervisor、...など」などの変数のリストがあります。多くの冗長なコードを節約するために、次のようなことを行うことは可能ですか
?コード)

スーパーバイザー フィールドが欠落している場合は、まず親があるかどうかを確認します。親がある場合は、親にスーパーバイザーがありますか (そのスーパーバイザーをコピーします)。そうでない場合は、スーパーバイザー X を割り当てます。
ここで、X = '@' + '(場所の最初の 3 文字)' + 'Supervisor' (この例では、X=@ABCSupervisor)

これは可能ですか??


更新 2:

このデータベースの変更を求めた人と話し、ここでいくつかの考え方を変更しました。まず、親の場所と子の場所は常に同じでなければなりません (そうでない場合、それはまったく別の問題です)。すべてのサイト (場所の最初の 3 文字) は同じ所有者グループと監督者を持つ必要があるため、基本的には作業指示エントリのいずれかのフィールドに NULL 値があるかどうかを確認し、場所に基づいて割り当てることができます。次のコードはうまくいくと思います(ただし、システムに実装する前に誰かにレビューしてもらいたいです)

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER dbo.AutoAssign
   ON  dbo.workorder
   AFTER INSERT,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @ABCSupervisor varchar(30)
    DECLARE @DEFSupervisor varchar(30)

    DECLARE @ABCOwnerGroup varchar(20)
    DECLARE @DEFOwnerGroup varchar(20)


    /*EDIT VARIABLES IF FUTURE CHANGES*/
    --SET Supervisor values HERE;
    SET @ABCSupervisor='JOHNDOE' 
    SET @XYZSupervisor='JANEDOE' 

    --SET OwnerGroup values HERE:
    SET @ABCOwnerGroup='ALPHATEAM' 
    SET @XYZOwnerGroup='OMEGATEAM' 

    --UPDATES
    UPDATE dbo.workorder
        SET ownergroup='@'+SUBSTR(location,1,3)+'OwnerGroup'
    WHERE status<>'COMP'
        AND historyflag=0
        AND istask=0    
        AND ownergroup IS NULL
        AND location IS NOT NULL

    UPDATE dbo.workorder
        SET supervisor='@'+SUBSTR(location,1,3)+'Supervisor'
    WHERE status<>'COMP'
        AND historyflag=0
        AND istask=0
        AND supervisor IS NULL
        AND location IS NOT NULL
END
GO

ここで見られる唯一の問題は、「挿入された」テーブルに何らかの結合を行わないため、それらのエントリにのみ影響する (毎回テーブル全体には影響しない) ことです。もし私がそれについて助けを得ることができれば、それは大歓迎です!!

4

3 に答える 3

1

いくつかの更新ステートメントを実行した場合は、正しい方法です。仮想テーブル INSERTED を update-statement に入れ、一意のキーで結合します。たとえば、SerialNo: は次のようになります。

create trigger Trig_WorkOrder for insert, update as
BEGIN
update wo
set location = pwo.location, ...
from dbo.workorder as wo, inserted as i, dbo.parentworkorder as pwo
where wo.serialNo = i.SerialNo -- join with the actual table-entry
and wo.pwo_id = pwo.id -- join with the parentworkorder
and i.ownergroup is null -- do it if new value is empty
and (pwo.ownergroup is not null or pwo.ownergroup <> '') -- do it if parentvalue is not empty
and (pwo.Supervisor is not null or pwo.Supervisor <> '') -- do it if parentvalue is not empty

update wo
set location = pwo.location, ...
from dbo.workorder as wo, inserted as i, dbo.standardworkorder as pwo
where wo.serialNo = i.SerialNo 
and wo.location = pwo.location
and wo.ownergroup is null
and (pwo.ownergroup is null or pwo.ownergroup = '')
and (pwo.Supervisor is null or pwo.Supervisor = '')
END

親の値が空の場合に便利に結合できるように、デフォルト値を別のテーブルに保存することをお勧めします。

トリガー内に 2 つの update ステートメントを配置し、where 節をコードして、1 つのステートメントのみが実行されるようにします...

平和と幸運

于 2010-10-20T21:14:08.367 に答える
0

あなたが達成しようとしているものについては、トリガーを使用することが Maximo で最適なソリューションであるかどうかはわかりません。トリガーを使用すると、すべての MBO ビジネス ロジックが無視されます。おそらく、MBO クラスをカスタマイズするか、Maximo Escalations を使用してこのタスクを実行することを検討できます。トリガーを使用すると、フィックスパックの適用時または Maximo のアップグレード時にも問題が発生する可能性があるため、この方法を選択する場合は、そのようなアクションを実行する前に必ずトリガーをバックアップしてください。

于 2012-11-18T12:02:32.937 に答える