Script to acccess tag present on udt

Hello I have UDT tag on foders tag

image

I have a list of tag and I want to know if it is possible to verify présent of a string item of my list on a tag_udt folder.

For exemple
ls_listTag = ["int","code_", "ps_A", "inf"]

I would like to check if each item of my list is present on each udt_tag on image1 above

If items are not present, I will put this item on a list

And I alse would like to check if each item of my list is present on parameters of tag_udt

If items are not present, I will put this item on a list

this what i did

Chemin1 =  "[AR]AS_VTV/502_U_KAM_FIXE/502_U_KAM_FIXE_001/TC"
ls_listTag = ["int","code_", "ps_A", "inf"]
def ParcourirTags(ls_CheminPath, ls_DictFiltre):
    
   # First, browse for anything that can have children (Folders and UDTs, generally)
   results = system.tag.browse(ls_CheminPath)
   #print results
   #liste de paramettres absents 
   ls_parametreAbsent = []
   if results.getResults() is not None:
       for branch in results.getResults():   
           if branch['hasChildren']:
               ParcourirTags(branch['fullPath'], ls_DictFiltre)
   # Appelez à nouveau cette fonction au chemin actuel, mais appliquez le filtre.
   results = system.tag.browse(ls_CheminPath, ls_DictFiltre)

   #print "PARAMETRES A VERIFIER  :\n"
   for i in range (0, len(ls_listTag)):
       #initialiser un variable boolean False qui passera en True si le parametre est present
       lb_Presenceparam = False
       for result in results.getResults():
           if result['name'] == ls_listTag[i]: #ls_listTag[i]:
               lb_Presenceparam =  True
               #print str(i)+": "+str(ls_listTag)
               #break if param is found
               break #sortir du boucle si le parametre est present
       if lb_Presenceparam == False: # Si lb_Presenceparam == False ça veut dire que  le nom du tag n'a pas present
           ls_parametreAbsent.append(ls_listTag[i]) 

   j= 0
   for result in results.getResults():
       j=j+1
       #print tag 
       print str(j) + " : "+str(result['fullPath'])
   return ls_parametreAbsent #return list of param non found
# appel fonction
ls_parametreAbsent = ParcourirTags(chemin1, {'tagType':"UdtInstance"})
#afficher la liste de parametre absents
print "\nPARAMS ABSENTS : "+str(ls_parametreAbsent) # print parameters no found on a tag_udt

And I obtened

iT NOT WORK because script does not access the tags present in udt

I have no idea what you're trying to do, can you try explaining in French ?

In the meantime:

This does nothing. You're calling the function recursively, but not assigning its return to anything.
Also, you probably should avoid doing the resursive browse yourself, system.tag.browse has this functionality built into it, you just need to add 'recursive': True to the filters.
Especially when you're calling browse TWICE by recursive call !

Bonjour merci pour votre réponse.

En fait ce que j'essaie de faire est créer une fonction qui vérifie si une variable ou paramètre string est présent dans le dossier de tag.

Par exemple:
j'ai une liste de paramètre de tag **ls_listTag** = ["int","code_", "ps_A", "inf"]

Je dois vérifier si le String int et inf sont présent dans le dossier TC/Eb_CmdAffectationEcran

Si ces paramètres ne sont pas présent alors, je dois créer une liste dont j'ajouterais les paramètres non trouvé dans le dossier de tag TC/Eb_CmdAffectationEcran

Y'a un truc qui va pas dans la description du problème:
Une instance d'un UDT DOIT avoir les tags définis dans l'UDT. Si tu essayes de supprimer un tag d'une instance, ca supprime toute l'instance.

Donc pas besoin de vérifier chaque instance de tes UDTs, vérifier la définition suffit.
Est ce que tu as beaucoup d'UDTs différents ?

Ensuite j'ai pas bien compris ce que tu veux faire du résultat: Ajouter un tag de type liste dans le dossier pour lister les tags qui n'existent pas ? Une seule liste par dossier (ne pas confondre avec instance d'UDT) ? Par instance UDT ?

Quel est le but final de tout ca ? Qu'est ce que tu veux faire de ces listes de tags ?

évidement les instances d'UDT ont les tags définis dans l'UDT

A ce moment là, je te suggère de plutôt ajouter un UDT qui défini ces tags, et ensuite utiliser cet UDT pour construire le reste. Pour être sur que tous les tags sont bien présents, t'as juste à regarder cet UDT, et si tu as besoin de modifier ces tags de base, tu pourras le faire en modifiant un seul UDT.

Si tu tiens à avoir un script pour vérifier, je le fais après manger.

1 Like

Merci pour la solution proposée, mais avec un script je pense que ça serait mieux

Oui, j'aimerais bien un script pour vérifier.

Je t'assure que non ;p
Les UDTs existent précisement pour ca.

1 Like

En fait, je n'ai pas simplement les UDTs que j'ai partagé sur l'image jointe, j'en ai plusieurs UDT avec différents tags et paramètres dans le projet. C'est pourquoi je procède de cette manière. En fait quelqu'un d'autre avait crée tous les tags, paramètres et UDT, et moi, je vais simplement vérifier l'existence de tags ou paramètres ou simplement vérifier l'absence de tags. Cela évitera les erreur lors de tests. Apres je ne sais pas peut-être vous avez raison et c'est moi qui complique les choses :smiley:

Si ils avaient été créé avec des UDTs au départ, tu aurais pas besoin de vérifier. Si tu as encore la possibilité de modifier la structure des tags/UDTs, je te conseille de faire ca. En attendant, je te ferais le script quand même, au cas où, dans pas trop longtemps

1 Like

OUI, c'est vrai modifier les UDT serait mieux si je n'avais pas beaucoup de tags et UDT, mais Il y a vraiment beaucoup beaucoup de tags et UDTs, vérifier l'existence de tags à l'aide d'un script serait mieux. en plus ce script m'aidera aussi sur d'autre besoin.

Je viens juste de réaliser... sur ton screenshot, ce qui contient les tags Inf et Int... est un UDT.
Est ce que c'est pareil partout ? Si c'est le cas, t'as rien à faire - tu prends cet UDT et tu le modifies/check selon les besoins, et ca se répercutera partout.

Si c'est pas le cas et que tu as des DOSSIERS qui doivent contenir ces tags, il faut déterminer une règle: Quels dossier doivent contenir les tags, et lesquels sont juste des dossiers de structure (par exemple le dossier "TC")

1 Like

OUI, c'est pareil

Bon ben voilà, y'a plus de problème. Regarde quel UDT est utilisé, si y'en a plusieurs différents... ensuite tu pourras te concentrer sur la définitions de ce(s) UDT(s).
Pas la peine de vérifier chacune de leur instantiations - les instances auront les mêmes tags que l'UDT.
Alors si en plus y'a qu'un UDT parent, là c'est vraiment tranquille :wink:

1 Like

Ré-bonjour Pascal,

Sur mon script envoyé au début, j'ai remplacé la ligne de code ci-dessus par:
ls_parametreAbsent = ParcourirTags(chemin3, {"recursive":True})
et maintenant j'obtiens le résultat attendu. Je ne sais pas s'il y a une autre meilleure solution que celle-ci

Y'a une meilleure solution: T'as pas besoin du script, du tout.
Si comme tu le disais plus haut, tout les tags sont dans un même UDT, t'as juste à regarder cet UDT.

Si tu tiens à utiliser un script, alors comme chemin utilise "[AR]_types_" pour ne browse que les définitions des UDTs - ca ne sert à rien de vérifier toutes les instances, puisqu'elles utilisent le même UDT.

Mais vraiment, VRAIMENT, je vois pas l'intérêt.

Tu peux faire un export de tes UDTs que je regarde si y'a un truc que j'ai mal compris ?

Je pense que c'est moi qui a mal expliqué. les UDT ne sont pas tous structuré de la même façon.
En plus il y aussi les parametres du UDT à vérifier s'il existe ou pas.

Concernant l'export de UDT, je pense que je n'ai pas le droit de partager ces données.
Le client interdit ça.

On va reprendre du début alors:
Dans ton screenshot, chaque entrée qui comment par "Eb_" EST une instance d'un UDT.
Tu as juste à regarder l'UDT à partir duquel ces entrées sont instanciées, c'est là que les tags sont définis.
Peu importe la structure des UDTs dans lesquels les instances sont incluses, les instances auront TOUJOURS les mêmes tags ET paramètres.

Trouve cet UDT, il doit avoir juste les tags "Int" et "Inf".

1 Like

J'ai fais ceci:

def ParcourirTags(ls_CheminPath, ls_DictFiltre):
    
   ls_parametreAbsent = []
   results = system.tag.browse(ls_CheminPath, ls_DictFiltre)
    #liste de paramettres absents 
   ls_parametreAbsent = []
   #print "PARAMETRES A VERIFIER  :\n"
   for i in range (0, len(ls_listTag)):
       #initialiser un variable boolean False qui passera en True si le parametre est present
       lb_Presenceparam = False
       for result in results.getResults():
           if result['name'] == ls_listTag[i]: #ls_listTag[i]:
               lb_Presenceparam =  True
               #break #sortir du boucle si le parametre est present
       if lb_Presenceparam == False: # Si lb_Presenceparam == False ça veut dire que  le nom du tag n'a pas present
           ls_parametreAbsent.append(ls_listTag[i]) 
	#affciher les full path de tags trouvé
   j= 0
   for result in results.getResults():
       j=j+1
       #print tag 
       print str(j) + " : "+str(result['fullPath'])
   return ls_parametreAbsent #return list of param non found
# appel fonction
ls_parametreAbsent = ParcourirTags(chemin4, {"recursive":True})
#afficher la liste de parametre absents
print "\nPARAMS NOT FOUND : "+str(ls_parametreAbsent) # print parameters no found on a tag_udt

Sans afficher les tags,
j'aurais ceci:

def ParcourirTags(ls_CheminPath, ls_DictFiltre):
    
   ls_parametreAbsent = []
   results = system.tag.browse(ls_CheminPath, ls_DictFiltre)
    #liste de paramettres absents 
   ls_parametreAbsent = []
   #print "PARAMETRES A VERIFIER  :\n"
   for i in range (0, len(ls_listTag)):
       #initialiser un variable boolean False qui passera en True si le parametre est present
       lb_Presenceparam = False
       for result in results.getResults():
           if result['name'] == ls_listTag[i]: #ls_listTag[i]:
               lb_Presenceparam =  True
               #break #sortir du boucle si le parametre est present
       if lb_Presenceparam == False: # Si lb_Presenceparam == False ça veut dire que  le nom du tag n'a pas present
           ls_parametreAbsent.append(ls_listTag[i])