作業指示書を自動的に発行する 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
ここで見られる唯一の問題は、「挿入された」テーブルに何らかの結合を行わないため、それらのエントリにのみ影響する (毎回テーブル全体には影響しない) ことです。もし私がそれについて助けを得ることができれば、それは大歓迎です!!