2010-10-20 7 views
0

Je travaille avec une base de données IBM Maximo qui émet WorkOrders automatiquement. Lorsque les WorkOrders sont émis (alias Inséré dans la base de données table ordre de travail), je voudrais automatiquement attribuer un superviseur, le propriétaire et le groupe propriétaire basé sur un ensemble de critères. Cela ne doit se produire que si le superviseur, le propriétaire et le groupe de propriétaires n'ont pas déjà été affectés. Souvent, un «ordre de travail parent» contient l'information, mais il doit être copié dans l'ordre de travail «enfant» (comme vous le verrez dans les critères ci-dessous). Les critères pour tous les déclencheurs est:SQL Trigger - Maximo WorkOrders - Superviseur/propriétaire Initialisation

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

Voici les critères de déclenchement:

-si le groupe propriétaire et superviseur ont une valeur, sauter l'enregistrement. (Ne rien faire)

-si le groupe propriétaire et/ou le superviseur est vide ou nul, et le travail de parent correspondant champ Ordre n'est pas nul, copiez le groupe propriétaire et/ou le superviseur de la PARENT travail dossier de commande. -Si le groupe propriétaire et/ou le superviseur est vide ou nul, alors attribue le groupe propriétaire et le superviseur selon les valeurs de la table ci-dessous: (J'ai supprimé les noms pour des raisons de sécurité, mais toutes les colonnes sont correctes , c.-à-B3 est censé avoir SuperA comme le superviseur)

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

** NOTE: SITE n'est pas une colonne de table, il est vraiment les 3 premiers caractères du champ workorder.location. Par exemple, l'emplacement pourrait être ABC-1234, ce qui signifie qu'il est sur le site ABC, la construction de 1234 (malheureusement, ce ne sont pas stockés dans des colonnes séparées, elles sont présentes seulement ensemble dans la colonne de l'emplacement). Dans cette requête SQL, tous les bâtiments d'un emplacement sont desservis par le même groupe de propriétaires/superviseur, donc toutes les autres requêtes que nous utilisons actuellement utilisent workorder.location = 'ABC%'

J'ai fait beaucoup de sélections, mises à jour, et les procédures stockées, mais c'est mon premier déclencheur et je veux m'assurer de ne pas bousiller royalement la base de données! Toute aide est grandement appréciée!

Pour ceux qui ne connaissent Maximo, la table est: dbo.workorder et les champs sont les suivants: emplacement, ownergroup, superviseur


Update1:
Voici quelques informations supplémentaires qui peuvent être d'une importance. Tout d'abord, workorder.location contiendra des valeurs telles que ABC-1234, ce qui signifie qu'il est au site ABC, bâtiment 1234 (bien que ce ne sont pas des valeurs séparées, il est combiné). Dans cette requête SQL, tous les bâtiments d'un emplacement sont desservis par le même groupe de propriétaires/superviseur, de sorte que toutes les requêtes utilisent quelque chose de similaire à workorder.location = 'ABC%'.

Voici ce que je voudrais la logique pour ressembler à la requête finale:

Si le champ superviseur est absent, premier coup d'oeil pour voir si elle a un parent, et si oui, est-parent avoir un superviseur? Si ce n'est pas le cas, affectez en fonction du tableau ci-dessus.

Si le champ ownergroup manque, premier regard pour voir si elle a un parent, et si oui, le parent a un ownergroup? Si ce n'est pas le cas, affectez en fonction du tableau ci-dessus.C'est pourquoi je pense à une déclaration de cas peut-être la meilleure option. En outre, j'ai actuellement une liste de variables telles que "@ASupervisor, @ B1Supervisor, @ B2Supervisor, ... etc" afin que je puisse les changer à l'avenir si besoin est. Pour économiser beaucoup de code redondant, est-il possible de faire quelque chose comme:
(dans cet exemple, l'emplacement est ABC-1234, le groupe de propriétaires DEVRAIT être @ABCGroup, le superviseur doit être @ABCSupervisor, où @ABCGroup et @ABCSupervisor sont définis plus tôt dans le code)

Si le champ superviseur est manquant, commencez par voir s'il a un parent, et si oui, est-ce que le parent a un superviseur (alors copiez son superviseur)? Sinon, assigner le superviseur X.
Si X = '@' + '(les trois premiers caractères de l'emplacement)' + 'superviseur' (dans cet exemple, X = @ ABCSupervisor)

Est-ce possible ??


MISE À JOUR 2:

J'ai parlé avec la personne qui a demandé ce changement de base de données et nous avons changé une réflexion ici. Premièrement, les emplacements des parents et les emplacements des enfants doivent toujours être les mêmes (si ce n'est pas le cas, c'est un problème AUTRE). Tous les sites (les 3 premières lettres de localisation) doivent avoir le même groupe de propriétaires et le même superviseur, donc nous pouvons simplement voir si une entrée de workorder a une valeur NULL dans chaque champ, puis l'assigner en fonction de l'emplacement. Je crois que le code suivant fonctionnera (mais voudrait quelqu'un de l'examiner avant de le mettre en œuvre sur le système)

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 

Les seules questions que je vois ici pour que je ne rejoins pas de quelque sorte sur le « inséré "table pour que cela n'affecte que les entrées (et pas toute la table à chaque fois). Si je pouvais obtenir de l'aide à ce sujet, ce serait grandement apprécié!

+0

Etes-vous sûr que cela doit être un déclencheur? – Ice

+0

Ne stockez pas certaines valeurs par défaut dans le code! Si vous avez une base de données: utilisez-la! il est construit pour stocker tout, disons dans un style old-school "tables et disques". – Ice

+0

si vous avez des ennuis avec ce truc, voici une lecture d'intérêt, jetez un oeil: http://www.simple-talk.com/sql/t-sql-programming/procedural,-semi-procedural-and-declarative -programing-part-ii/ – Ice

Répondre

1

Si vous avez effectué des mises à jour, vous êtes sur la bonne voie. placez la table virtuelle INSERTED dans votre instruction de mise à jour et joignez-la avec une clé unique, par ex. SerialNo: ce serait quelque chose comme ça:

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 

Je sugest pour stocker les valeurs par défaut dans une table séparée, pour pratique si les parentvalues ​​joignent sont vides.

Mettez deux update-déclarations à l'intérieur du déclencheur d'un code de la clause where pour vous assurer que seule instruction exécute ...

paix et bonne chance

+0

Juste quelques questions ... Est-il possible de faire une déclaration de cas pour le rendre plus facile à lire/gérer? Exemple: (. Pardonnez mon style C-comme je ne l'ai pas utilisé MALLETE SQL encore) MISE À JOUR WO SWITCH (LIEU) \t CASE LIKE 'A%': \t \t SET wo.ownergroup = » agroup » \t \t SET wo.supervisor = 'Superr' \t CASE LIKE '% B1': \t \t SET wo.ownergroup = 'Bgroup' \t \t SET wo.supervisor = 'SuperH' \t etc \t. \t. \t. où le statut <> 'COMP' \t ET historyflag = 0 \t ET istask = 0 \t ET ownergroups IS NULL \t et superviseur IS NULL (Je ne sais pas où je ferais la même joint) –

+0

Urgh, il ne s'affiche pas correctement avec le formatage. Je peux le rediffuser éventuellement? –

+0

Si vous aimez ce style, c'est aussi bien. Utilisez "case quand x = y puis 1 quand x = z puis 2 ... else 3 fin" – Ice

0

Pour ce que vous essayez d'atteindre, je Je ne suis pas sûr que l'utilisation d'un déclencheur est la meilleure solution dans Maximo - l'utilisation de déclencheurs ignore toute la logique métier MBO. Peut-être pourriez-vous envisager de personnaliser les classes MBO ou d'utiliser Maximo Escalations pour ce faire. L'utilisation de déclencheurs peut également vous causer des problèmes lors de l'application de groupes de correctifs ou de la mise à niveau de Maximo, donc si vous choisissez de procéder ainsi, veillez à sauvegarder les déclencheurs avant toute action de ce type.

1

Si vous utilisez Maximo 7.x, les scripts d'automatisation peuvent faire ce que vous voulez. Par exemple, nous utilisons un script d'automatisation qui vérifie si le champ du bon de travail enfant est null. Si c'est le cas, Maximo prendra la valeur de l'ordre de travail parent et le remplira. Dans notre cas, il s'agit d'un champ personnalisé appelé WOPM1.

WorkOrderSet = mbo.getMboSet("PARENT") 

if WorkOrderSet.getMbo(0) is not None: 
     SUPERVISOR = WorkOrderSet.getMbo(0).getString("SUPERVISOR") 

Sinon, si vous avez une recherche de base pour remplir OwnerGroup et superviseur basé sur les trois premiers de l'emplacement, vous pouvez faire si puis tapez logique pour remplir les données dans l'ordre de travail des enfants quand il y a un match. v_location est la variable que j'ai définie pour l'emplacement d'un ordre de travail parent:

if v_location == 'ABC': 
    mbo.setValue("ownergroup","ABCOwnerGroup") 
    mbo.setValue("supervisor","ABCSupervisor") 
+0

Merci pour votre solution ! Nous sommes actuellement sur la version 7.1 mais nous passerons bientôt à la version 7.5, nous allons donc passer ce trigger à un script d'automatisation et votre solution est parfaite! Merci encore! –