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é!
Etes-vous sûr que cela doit être un déclencheur? – Ice
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
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