Skip to main content

Cet article présente en détail le fonctionnement et l’intérêt d’une fonctionnalité très importante d’administration d’un repository EA, à savoir la vérification d’intégrité du repository.

Ce texte a l’origine a été rédigé par Piotr Trętowski, en 2012, à l’adresse suivante :
http://eablogpl.blogspot.com/2012/12/project-integrity-check-od-srodka.html

Avec l’accord explicite de Piotr Trętowski,nous avons traduit le contenu et adapté celui-ci à la version la plus récente d’EA.

 

Vérifier l'intégrité d'un repository EA

Un repository (projet) créé dans Enterprise Architect est stocké sous la forme d'une base de données relationnelle. Quel que soit le moteur de base de données utilisé (MS Jet pour EAP, MS SQL, MySQL, Oracle ou autres fichiers), le même schéma de base de données est utilisé pour stocker les modèles. Les données de la base de données relationnelle doivent être cohérentes.

Cette cohérence peut être assurée de manière technique par l'introduction de contraintes spécifiques, puis le moteur de base de données veille au respect des règles définies.

 

Fonction de vérification de l'intégrité du repository

Partant de la logique métier lié au traitement des données et des concepts de base comme le package, l'élément, la relation, l'attribut ou la méthode, une fonctionnalité a été implémentée à partir de EA permettant de vérifier la cohérence du repository à partir du niveau de l'interface utilisateur. Cette fonction est appelée « Vérification de l'intégrité du projet » et est disponible en sélectionnant :

Configure -> Model -> Integrity Check -> Project Integrity dans le ribbon menu de EA version 14.x.

La fenêtre suivante s'affiche lorsque cette option est appelée :

 

 

Par défaut, Report only est sélectionné, de sorte que vous pouvez vérifier l’intégrité des données sans apporter de modifications. Si vous décidez de résoudre automatiquement les problèmes que vous avez rencontrés, vous devriez choisir « Recover/Clean ».

Dans la pratique, effectuez d'abord la première exécution en mode Rapport seulement, et en cas d'irrégularités, effectuez ensuite l'exécution corrective du mode Rapport / Nettoyage. Avant cela, faites un « backup ».

La portée de la vérification peut être modifiée en cochant et décochant les options de la section « Checks to run ».

Un exemple du résultat est illustré dans la figure ci-dessous.

 

 

Pour le « recovery /clean », un avertissement est affiché avant que l'opération de réparation suite à des problèmes d’intégrité ne soit effectuée.

 

 

À la suite du nettoyage d'un repository, il peut y avoir des données qui ont été trouvées incohérentes et qui peuvent être effacées ou récupérées.
Les données récupérées sont visibles dans la fenêtre du navigateur de projet dans une « nœud racine » spécial nommé _recovered_.

 

 

Quand faut-il appliquer la vérification de l'intégrité du repository ?

Si un repository contient des données qui ne sont pas cohérentes avec le programme EA, EA ne nous informe pas avec des messages d'erreur. EA nous présente simplement les données du mieux qu'il peut. Il y a probablement des mécanismes dans le code qui permettent d'afficher ou même de modifier de telles données.

Les incohérences dans le repository peuvent contribuer un impact négatif sur la performance, ce qui peut être ressenti dans des opérations plus complexes comme le Model Compare, par exemple.

Cette fonction de vérification d’intégrité doit être utilisée principalement lorsqu'il existe un repository partagé, ainsi que dans le cas d'un projet local développé par une seule personne. Peut-être seulement avec la différence que la probabilité d'incohérence est plus élevée dans le premier cas.

 

Risques liés à l'utilisation de la vérification de l'intégrité du repository

Le déclenchement de la réparation des problèmes d’intégrité des données reste une opération risquée.

L'administrateur du repository qui appuie sur le bouton OK assume la responsabilité des changements qui seront effectués en dehors de son contrôle.

Plus important encore, le programme n'informe pas sur les objets du modèle que ces changements concernent ! Nous ne recevons que des messages du style :

  •     Connecteur invalide, et l'action recommandée (celle qui doit être prise) est - Supprimer le connecteur,
  •     Objet orphelin avec l'action : Supprimer l'objet paquet,
  •     91 Élément orphelin de stéréotypes avec action : Supprimer les stéréotypes orphelins.

Cela semble assez destructeur.

Cependant, il faut noter que s’il s’agit d’éléments de modélisation importants, le problème aura tout naturellement déjà été détecté et identifiés.

Le plus souvent, il s’agit d’éléments et objets périmés et perdus qui seront supprimés, qui restaient dans le repository  et étaient invisibles au niveau du project browser ou du diagramme.

Afin d’éviter une utilisation inattendue de cette fonctionnalité, il est important d’activer la sécurité et limiter les permissions de vérification de l'intégrité du repository à un groupe d'utilisateurs spécifique.

Avant toute opération de ce genre, vous devez faire une sauvegarde complète du repository.

 

Liste des requêtes effectuées pour le contrôle de l'intégrité du projet (Queries)

Afin d’avoir un certain contrôle sur les mécanismes automatiques utilisés par le programme EA, voici une liste de requêtes SQL qui sont exécutées pour vérifier l'intégrité du repository.  

Si EA trouve des irrégularités, nous pouvons éventuellement modifier la requête pour qu'elle renvoie des noms d'objets ou des identificateurs, par exemple, au lieu de renvoyer le numéro (count(*)).

 

 
Requête SQL
Résultat
 
Package structure
 
 
1
SELECT Count(*) as RecCnt FROM t_package child  LEFT JOIN t_package parent on parent.Package_ID = child.Parent_ID  where parent.Package_ID Is NULL and child.Parent_ID <> 0
Retourne les package orphelins qui n'ont pas de package parent ou esclave.
Orphaned package
 
 
 
 
Object Structure
 
 
2
SELECT     t_diagram.Diagram_ID, t_diagram.Name, t_diagram.ParentID, t_object.Object_ID  FROM         t_diagram LEFT OUTER JOIN t_object ON t_diagram.Package_ID = t_object.Package_ID AND t_diagram.ParentID = t_object.Object_ID WHERE     (t_object.Object_ID IS NULL) AND (t_diagram.ParentID <> 0)
Renvoie les diagrammes orphelins qui ne sont attachés à aucun paquet ou élément.
Orphaned diagram
3
SELECT     t_diagram.Diagram_ID, t_diagram.Name, t_diagram.ParentID, 'NULL' FROM         t_diagram WHERE t_diagram.ParentID IS NULL
Une autre forme de recherche diagramme, qui doit être reliée à un élément via son parent.
Orphaned diagram
4
select t_object.Name as OName, t_object.Object_ID as ID  from t_object left join t_package on  t_object.PDATA1 = t_package.Package_ID where t_package.Package_ID is null and t_object.Object_Type = 'Package'
Retourne les éléments de type package pour lesquels il n'y a pas d'équivalent dans la table t_package.
Invalid package object
5
select t_diagram.Diagram_ID as DiagramID, t_diagram.Name as DiagramName, t_diagram.Diagram_Type as DiagramType from t_diagram left join t_package on t_package.Package_ID = t_diagram.Package_ID where t_package.Package_ID is null or t_package.Parent_ID = 0
Renvoie également les diagrammes orphelins qui ne sont attachés à aucun paquet ou élément.
Orphaned diagram
6
SELECT t_package.Package_ID, t_package.Name AS PackageName, t_object.Name AS ObjectName FROM t_package LEFT OUTER JOIN t_object ON (Object_Type='Package' AND t_package.Package_ID = t_object.PDATA1) WHERE t_package.Name <> t_object.Name
Retourne les package dont le nom diffère de l'équivalent package dans la table t_object.
Invalid package object
7
SELECT COUNT(*) AS RecCnt FROM t_package WHERE Package_ID = Parent_ID
Renvoie le nombre de package qui sont parents d’eux-mêmes.
Invalid package object OU Orphaned package
8
Select count(*) as RecCnt from t_object left join t_package  on t_package.Package_ID = t_object.Package_ID  where t_package.Package_ID is null and (t_object.ParentID is null or t_object.ParentID=0)
Retourne le nombre de package pour lesquels il n'y a pas d'équivalent dans la table t_object.
Invalid package object
9
Select count(*) as RecCnt FROM t_object child left join t_object parent  on child.ParentID = parent.Object_ID  where child.ParentID is not null and child.ParentID <> 0 and parent.Object_ID is null
Renvoie le nombre d'éléments qui sont parents d’eux-mêmes.
Object parent invalid OU Orphaned object
10
Select count(*) as RecCnt FROM t_object where ParentID = Object_ID
Autre forme pour la requête ci-dessus
Object parent invalid OU Orphaned object
11
Select count(*) as RecCnt FROM t_object child left join t_object parent on child.ParentID = parent.Object_ID and parent.ParentID = child.Object_ID where parent.Object_ID is not null and child.Object_ID <> child.ParentID
Autre forme pour la requête ci-dessus
Object parent invalid OU Orphaned object
12
Select count(*) as RecCnt FROM t_object child left join t_object parent on child.ParentID = parent.Object_ID where parent.Object_Type = 'Package'
Une autre façon de rechercher des package qui sont parents d’eux-même.
Invalid package object OU Orphaned package
 
 
 
 
Caractéristiques des objets
 
 
13
Select Object_ID, Name FROM t_object where Object_Type is null or Object_Type = '' or ( Name='EA_IMPORT_STUB' and Package_ID=1 and Object_Type='Class')
Retourne les éléments qui n'ont pas de type spécifique.
Invalid Object Types
14
select f.Object_ID, f.FileName from t_objectfiles f left join t_object o on f.Object_ID = o.Object_ID where o.Object_ID is null
Retourne les attributs d'un élément de type 'File' qui ne sont associés à aucun élément.
 
15
select f.Object_ID, f.Effort from t_objecteffort f left join t_object o on f.Object_ID = o.Object_ID where o.Object_ID is null
Retourne les attributs d'un élément de type 'Effort' qui ne sont associés à aucun élément.
 
16
select f.Object_ID, f.Metric from t_objectmetrics f left join t_object o on f.Object_ID = o.Object_ID where o.Object_ID is null
Retourne les attributs d'un élément de type 'Metric' qui ne sont associés à aucun élément.
 
17
select f.Object_ID, f.Problem from t_objectproblems f left join t_object o on f.Object_ID = o.Object_ID where o.Object_ID is null
Retourne les attributs d'un élément de type 'Problème' qui ne sont assignés à aucun élément.
 
18
select f.Object_ID, f.Requirement from t_objectrequires f left join t_object o on f.Object_ID = o.Object_ID where o.Object_ID is null
Retourne les attributs d'un élément de type 'Exigence'[interne] qui ne sont assignés à aucun élément.
 
19
select f.Object_ID, f.`Resource` from t_objectresource f left join t_object o on f.Object_ID = o.Object_ID where o.Object_ID is null
Retourne les attributs d'un élément de type 'Ressource' qui ne sont assignés à aucun élément.
 
20
select f.Object_ID, f.Risk from t_objectrisks f left join t_object o on f.Object_ID = o.Object_ID where o.Object_ID is null
Retourne les attributs d'un élément 'Risque' qui ne sont assignés à aucun élément.
 
21
select f.Object_ID, f.Scenario from t_objectscenarios f left join t_object o on f.Object_ID = o.Object_ID where o.Object_ID is null
Retourne les attributs d'un élément de type 'Scénario' qui ne sont assignés à aucun élément.
 
22
select f.Object_ID, f.Test from t_objecttests f left join t_object o on f.Object_ID = o.Object_ID where o.Object_ID is null
Retourne les attributs d'un élément de type 'Test' qui ne sont assignés à aucun élément.
 
23
select Object_ID, ConstraintType from t_objectconstraint where ConstraintType is null or ConstraintType=''
Retourne les attributs d'un élément de type 'Contrainte' qui n'ont pas de type spécifique.
 
24
select Object_ID, `Constraint` from t_objectconstraint where `Constraint` is null or `Constraint`=''
Retourne les attributs d'un élément de type 'Contrainte' qui n'ont pas de nom spécifique.
 
25
select Instance_ID, 'Missing Object' as Problem from t_diagramobjects l left join t_object c on l.Object_ID = c.Object_ID where  c.Object_ID is null  UNION select Instance_ID, 'Missing Diagram' as Problem from t_diagramobjects l left join t_diagram d on l.Diagram_ID = d.Diagram_ID where  d.Diagram_ID is null
Retourne les objets manquants qui doivent être affichés dans les diagrammes et les diagrammes manquants pour lesquels il y a des objets à afficher.

Invalid object geometry. ITEM: Missing Diagram ET/OU

Invalid object geometry. ITEM: Missing Object
26
Select child.Object_ID as ID, child.Name as ObjectName, child.Object_Type, parent.Package_ID as PkgID FROM t_object child, t_object parent where child.ParentID = parent.Object_ID and child.Package_ID <> parent.Package_ID
Retourne les éléments orphelins qui ont un élément parent incorrectement sélectionné.
Orphaned object
27
select op.* from t_operation op left join t_object obj on op.Object_ID = obj.Object_ID where obj.Object_ID is null
Retourne les opérations qui ne sont assignées à aucun élément.
 
28
select att.* from t_attribute att left join t_object obj on att.Object_ID = obj.Object_ID where obj.Object_ID is null
Retourne les attributs qui ne sont assignés à aucun élément.
 
29
select p.* from t_objectproperties p left join t_object o on p.Object_ID = o.Object_ID where o.Object_ID is null
Retourne les tagged values qui ne sont attribuées à aucun élément.
 
 
 
 
 
A propos des GUID’s
 
 
30
Select * from t_object where ea_guid is null
Retourne les éléments qui n'ont pas de GUID
 
31
Select * from t_attribute where ea_guid is null
Retourne les attributs qui n'ont pas de GUID
 
32
Select * from t_operation where ea_guid is null
Retourne les opérations qui n'ont pas de GUID.
 
33
Select * from t_attributetag where ea_guid is null
Retourne les tags des attributs qui n'ont pas de GUID.
 
34
Select * from t_operationtag where ea_guid is null
Retourne les tags des opérations qui n'ont pas de GUID.
 
35
Select * from t_objectproperties where ea_guid is null
Retourne les attributs de tagged values balisées qui n'ont pas de GUID.
 
36
Select * from t_diagram where ea_guid is null
Renvoie les diagrammes qui n'ont pas de GUID.
 
37
Select * from t_operationparams where ea_guid is null
Retourne les paramètres des opérations qui n'ont pas de GUID.
 
38
Select * from t_package where ea_guid is null
Retourne les package qui n'ont pas de GUID.
 
39
Select * from t_stereotypes where ea_guid is null
Renvoie les noms des stéréotypes qui n'ont pas de GUID.
 
40
Select * from t_connector where ea_guid is null
Retourne les connecteurs qui n'ont pas de GUID.
 
41
Select * from t_connectortag where ea_guid is null
Retourne les tagged values des connecteurs qui n'ont pas de GUID.
 
42
Select * from t_taggedvalue where PropertyID is null
Retourne les types de tagged values qui n'ont pas de GUID.
 
43

select space(40) as ea_guid, space(18) as FieldAlias, space(18)  as TableName, space(11) as FieldName, 0 as Rank

UNION ALL select ea_guid, 'Package GUID' as FieldAlias, 't_package' as TableName, 'ea_guid' as FieldName, 1 as Rank from t_package
UNION ALL select ea_guid, 'Object GUID' as FieldAlias, 't_object' as TableName, 'ea_guid' as FieldName, 2 as Rank from t_object where Object_Type <> 'Package'
UNION ALL select ea_guid, 'Diagram GUID' as FieldAlias, 't_diagram' as TableName, 'ea_guid' as FieldName, 3 as Rank from t_diagram
UNION ALL select ea_guid, 'Stereotype GUID' as FieldAlias, 't_stereotypes' as TableName, 'ea_guid' as FieldName, 4 as Rank from t_stereotypes
UNION ALL select ea_guid, 'Attribute GUID' as FieldAlias, 't_attribute' as TableName, 'ea_guid' as FieldName, 5 as Rank from t_attribute
UNION ALL select ea_guid, 'Operation GUID' as FieldAlias, 't_operation' as TableName, 'ea_guid' as FieldName, 6 as Rank from t_operation
UNION ALL select ea_guid, 'Parameter GUID' as FieldAlias, 't_operationparams' as TableName, 'ea_guid' as FieldName, 7 as Rank from t_operationparams
UNION ALL select ea_guid, 'Connector GUID' as FieldAlias, 't_connector' as TableName, 'ea_guid' as FieldName, 8 as Rank from t_connector
UNION ALL select ea_guid, 'Object Tag GUID' as FieldAlias, 't_objectproperties' as TableName, 'ea_guid' as FieldName, 9 as Rank from t_objectproperties
UNION ALL select ea_guid, 'Connector Tag GUID' as FieldAlias, 't_connectortag' as TableName, 'ea_guid' as FieldName, 10 as Rank from t_connectortag
UNION ALL select ea_guid, 'Attribute Tag GUID' as FieldAlias, 't_attributetag' as TableName, 'ea_guid' as FieldName, 11 as Rank from t_attributetag
UNION ALL select ea_guid, 'Operation Tag GUID' as FieldAlias, 't_operationtag' as TableName, 'ea_guid' as FieldName, 12 as Rank from t_operationtag
UNION ALL select PropertyID as ea_guid, 'Generic Tag GUID' as FieldAlias, 't_taggedvalue' as TableName, 'PropertyID' as FieldName, 13 as Rank from t_taggedvalue
UNION ALL select ea_guid, 'Scenario GUID' as FieldAlias, 't_objectscenarios' as TableName, 'ea_guid' as FieldName, 14 as Rank from t_objectscenarios
ORDER BY 1, 5
A découvrir ;-)
 
 
 
 
 
Vérification des références croisées
 
 
44
Select Client, `Type`, Name, Behavior from t_xref where Name in ('Stereotypes', 'CustomProperties') Group by Client, `Type`, Name, Behavior having count(XRefID) >1
Cela permettra probablement de vérifier les stéréotypes. Mais peut-être que quelqu'un vous dira en quoi consiste cette vérification.
 
45
select XrefID from t_xref left outer join t_object on t_xref.Client = t_object.ea_guid where t_xref.`Type`='element property' and t_xref.Name='Stereotypes' and t_object.ea_guid is null UNION select XrefID from t_xref left outer join t_attribute on t_xref.Client = t_attribute.ea_guid where t_xref.`Type`='attribute property' and t_xref.Name='Stereotypes' and t_attribute.ea_guid is null UNION select XrefID from t_xref left outer join t_operation on t_xref.Client = t_operation.ea_guid where t_xref.`Type`='operation property' and t_xref.Name='Stereotypes' and t_operation.ea_guid is null UNION select XrefID from t_xref left outer join t_operationparams on t_xref.Client = t_operationparams.ea_guid where t_xref.`Type`='parameter property' and t_xref.Name='Stereotypes' and t_operationparams.ea_guid is null UNION select XrefID from t_xref left outer join t_connector on t_xref.Client = t_connector.ea_guid where t_xref.`Type`='connector property' and t_xref.Name='Stereotypes' and t_connector.ea_guid is null UNION select XrefID from t_xref left outer join t_connector on t_xref.Client = t_connector.ea_guid where t_xref.`Type`='connectorSrcEnd property' and t_xref.Name='Stereotypes' and t_connector.ea_guid is null UNION select XrefID from t_xref left outer join t_connector on t_xref.Client = t_connector.ea_guid where t_xref.`Type`='connectorDestEnd property' and t_xref.Name='Stereotypes' and t_connector.ea_guid is null
Retourne une liste de stéréotypes orphelins qui ne sont pas utilisés par des éléments, des attributs, des méthodes, des paramètres de méthode ou des conneteurs.
Orphaned element stereotypes 
 
 
 
 
Connecteurs
 
 
46
select count(*) as numrows from t_connector where Connector_Type is null
Retourne le nombre de relations pour lesquelles le type est manquant.
Invalid connector 
47
Select t_connector.Connector_ID, t_connector.Connector_Type  from t_connector left join t_object on t_connector.End_Object_ID = t_object.Object_ID where t_object.Object_ID is null or ( t_object.Name='EA_IMPORT_STUB' and t_object.Package_ID=1 and t_object.Object_Type='Class') UNION  Select t_connector.Connector_ID, t_connector.Connector_Type  from t_connector left join t_object on t_connector.Start_Object_ID = t_object.Object_ID where t_object.Object_ID is null or ( t_object.Name='EA_IMPORT_STUB' and t_object.Package_ID=1 and t_object.Object_Type='Class')
Renvoie une liste des relations pour lesquelles il manque l'élément source ou l'élément cible.
Invalid connector 
48
select Instance_ID, 'Missing Connector' as Problem from t_diagramlinks l left join t_connector c on l.ConnectorID = c.Connector_ID where  c.Connector_ID is null UNION select Instance_ID, 'Missing Diagram' as Problem from t_diagramlinks l left join t_diagram d on l.DiagramID = d.Diagram_ID where  d.Diagram_ID is null
Renvoie une liste des relations qui doivent être affichées dans les diagrammes, mais pour lesquelles il n'y a pas de relations dans le modèle.
Invalid link geometry. ITEM: Missing Connector
49
select count(*) as RecCount, DiagramID, ConnectorID,'Duplicate Link Information' as Problem  from t_diagramlinks   group by DiagramID, ConnectorID having count(*) > 1
Renvoie une liste des relations qui sont affichées dans les diagrammes pour lesquels il y a plus d'une relation dans le modèle.
Invalid link geometry. ITEM: Missing Connector
50
select * from t_connectorconstraint c left join t_connector o on c.ConnectorID = o.Connector_ID where o.Connector_ID is null
Renvoie une liste des restrictions affectées aux liaisons pour lesquelles il n'y a pas de relation.
 
51
select * from t_connectortag c left join t_connector o on c.ElementID = o.Connector_ID where o.Connector_ID is null
Renvoie une liste des tags affectées à des relations pour lesquelles il n'existe pas de relation.
Invalid connector tag
52
SELECT t_connector.Connector_ID, t_connector.Connector_Type, t_diagram.Diagram_ID, t_connector.DiagramID FROM t_connector LEFT JOIN t_diagram ON t_connector.DiagramID = t_diagram.Diagram_ID WHERE (((t_diagram.Diagram_ID) Is Null) AND ((t_connector.DiagramID)<>0))
Vérifier la cohérence entre les relations dans le modèle et celles présentées dans les diagrammes.
Invalid link geometry. ITEM: Missing Connector
53
SELECT t_connector.Connector_ID, t_connector.SourceRole, t_connector.DestRole, t_connector.StyleEx FROM t_connector, t_operation WHERE t_connector.Start_Object_ID = t_operation.Object_ID AND t_operation.Stereotype = 'FK' GROUP BY Connector_ID
Vérifie l'exactitude des relations clés étrangères.
 
54
select Connector_ID from t_connector where Connector_Type='Realization'
Vérifie l'exactitude, parce qu'il devrait s'agir d'une " Réalisation
 
55
select Stereotype from t_stereotypes where AppliesTo='realization'
Vérifiez s'il existe des stéréotypes qui s'appliquent à la " realization " au lieu de " realisation ".
 
56
select c.* from t_attributeconstraints c left join t_attribute o on c.ID = o.ID where o.ID is null
Retourne les contraintes de liste des attributs pour lesquels aucun attribut n'a été trouvé.
 
57
select * from t_attributetag c left join t_attribute o on c.ElementID = o.ID where o.ID is null
Retourne une liste de tags d'attributs pour lesquelles aucun attribut n'a été trouvé.
Invalid attribute tag 
58
select * from t_attribute where t_attribute.Name is null
Renvoie la liste des attributs sans nom.
 
59
select o.*, c.OperationID as OpID, c.PostCondition from t_operationposts c left join t_operation o on c.OperationID = o.OperationID where o.OperationID is null
Renvoie la liste des conditions finales pour les méthodes pour lesquelles aucune méthode n'a été trouvée.
 
60
select o.*, c.OperationID as OpID, c.PreCondition from t_operationpres c left join t_operation o on c.OperationID = o.OperationID where o.OperationID is null
Renvoie la liste des conditions de départ pour les méthodes pour lesquelles aucune méthode n'a été trouvée.
 
61
select * from t_operationtag c left join t_operation o on c.ElementID = o.OperationID where o.OperationID is null
Retourne une liste de tags de méthode pour lesquelles aucune méthode n'a été trouvée.
 
62
select c.* from t_operationparams c left join t_operation o on c.OperationID = o.OperationID where o.OperationID is null
Retourne la liste des paramètres de la méthode pour laquelle la méthode n'a pas été trouvée.
 
63
select 0 as tabletype, `Type`, Classifier, ea_guid from t_attribute where Classifier is not null and Classifier <> '0' union select 1 as tabletype, `Type`, Classifier, ea_guid from t_operation where Classifier is not null and Classifier <> '0' union select 2 as tabletype, `Type`, Classifier, ea_guid from t_operationparams where Classifier is not null and Classifier <> '0'
Peut-être que quelqu'un vous dira à quoi il peut servir.
 

 

Ces requêtes sont compatibles avec MySQL et doivent peut-être être adaptées pour les utiliser sur d’autres technologies de base de données.

 

 

 

Discutons de votre projet

Contactez-nous

  •  + 32 (0) 10 49 51 00
  •  info@expert-it.com