[Sunopsis] Boite à outils
Ici seront accumulées des questions/réponses interessantes issues de la KB Sunopsis ou trouvées en interne
- Use Sunopsis Variables to set the value of a Procedure or Knowledge Module Option?
- Define the MYVAR GLOBAL or Project Variable and set the corresponding refresh statement as required.
- Modify the Knowledge Module by adding the MYOPTION Option.
- Define the Integration Interface and, on the “Flow” tab, set the MYOPTION Option to: #GLOBAL.MYVAR (or #MYPROJECT.MYVAR if the Variable was defined on the MYPROJECT Project)
- Define a Package with the following two steps:
- declare or refresh Variable MYVAR
- execute the Integration Interface above
- Execute the Package above. The Knowledge Module MYOPTION Option will take the value stored in the MYVAR Variable.
- Un select dans un KM ?
Il semblerait que pour faire un simple select sur une base source dans une ligne de commande d’un KM, il faille systématiquement avoir quelquechose dans la partie ‘Commande sur destination’, même si elle ne fait rien. Car le traitement des requêtes par Snps semble être le suivant : Si la partie “Commande sur la destination” est vide, Sunopsis fait un executeUpdate sur la partie “Commande sur la source”, sinon c’est un executeQuery qui est fait. Donc si rien n’est mis dans la partie destination, une erreur sera automatiquement soulevée par la base de données source disant qu’on ne peut pas utiliser d’executeUpdate ici ( Teradata ) ou que la requête ne renvoie pas de rowCount ( HSql ).
Pour contourner ça, il est possible de mettre dans la destination un commentaire Jython, en précisant la techno Jython ex : #Ici, on ne fait rien - Conditionally execute specific blocks of code. Is it possible using IF THEN ELSE commands?
The following pseudo-code is an example:
If Option_OPT1 is checked (Yes) then
….Sql-Instruction 1
Else
….If Option_2 = “foobar” then
………Sql-Instruction 2
….Else
……..Sql-Instruction 3
….End if
End if
Solution
This is possible. For example, if two OPTIONS are set up:
OPT1: boolean (Yes | No)
OPT2: text value (default: foobar)
The following program may be used to set up conditional blocks:
<%if (snpRef.getOption(”OPT1″).equals(”1″))
…..{%>
……….Sql-Instruction 1
…..<%}
else {%>
………<%if (snpRef.getOption(”OPT2″).equals(”foobar”))
……….{%>
………………….Sql-Instruction 2
……….<%}
……….else
………..{%>
…………………Sql-Instruction 3
………..<%}%>
<%}%>
- Utiliser dans un onglet Commande sur destination une valeur récupérée dans l’onglet Commande sur la source
Dans la requête du coté source, cette requête peut retourner plusieurs valeurs et plusieurs lignes. On récupére la ou les valeurs (champs) dans la partie destination (en préfixant par # les noms des champs de la partie source), l’onglet destination sera exécuté autant de fois que de lignes retournées par la partie source.
ex :
(Onglet Source) select first 10 distinct to_char(d_evnm,’%m/%d/%Y’) my_date from <%=snpRef.getObjectName("L","ADHS_PRTC_CRTE","D")%> order by 1(Onglet Cible - Technologie Jython)
s = ‘#my_date’
print s - Passer par une table temporaire lorsque la source et la cible sont sur le même schéma physique
Lorqu’on crée une interface comportant deux tables appartenant au même serveur de données, Sunopsis ne passe pas par les LKM pour charger les données, il fait les jointures directement.
Seulement, dans certains cas, il est nécessaire d’avoir une table temporaire de travail afin de extraire la partie utile d’un ensemble de données très volumineux et ensuite d’utiliser cette table temporaire pour faire des jointures.
Voici comment faire :- Créer une première interface
- Dans l’onglet “Définition”, chécker “Espace de travail différent de la cible”
- Renseigner l’espace de travail utilisé
- Dans l’onglet “Diagramme”, dropper la table source
- Cliquer dans Datastore Cible sur “Sans nom”
- Donner un nom à la table temporaire
- Désigner l’emplacement du datastore temporaire comme étant l’”Espace de travail”
- Bouton droit sur le Datastore source -> Ajouter à la cible : Les champs sont créés sur la table temporaire
- Dans l’onglet “Flux”, dropper la table source
- Cliquer sur “cible + Espace de travail”, l’IKM doit en être un de type ‘Incrémental Update’
- Modifier l’option de l’IKM : CREATE_TARG_TABLE, pour mettre à oui
- Enregistrer
- La nouvelle interface doit se retrouver dans la liste des interfaces du projet, avec un robinet jaune, disant qu’elle est temporaire
- Créer une seconde interface
- Dropper l’interface temporaire comme s’il s’agissait d’un datastore de modèle. Elle peut être utilisée comme source désormais
- Dans le package, exécuter bien entendu l’interface temporaire avant l’interface sur la cible
- Créer une première interface
- Travailler sur le résultat d’une fonction snpRef
Il peut s’avérer utile de travailler sur le résultat de retour d’une fonction de l’objet snpRef ex : pour tester le code d’un contexte. Il faut alors utiliser par exemple dans une option de traitement :<@= "CTX_DEV".equals(snpRef.getPop("TARG_CTX")) ? "TITI" : "TOTO" @>A finir… - Gestion des agents schedulers
Les agents schedulers sont ceux qui acceptent d’avoir une planification. Pour monter un agent de cette sorte il faut :- Créer l’agent physique dans la topologie
- Lancer l’agent scheduler en lui précisant le nom entré dans la topologie ( si l’agent n’a pas été créé au préalable, il refuse de se lancer)
Lorsqu’un scénario a été planifié, surtout ne pas oublier d’aller dans la topologie, de sélectionner l’agent scheduler impacté dans l’architecture physique et de faire Mettre à jour le planning. Sinon rien ne sera exécuté à l’heure prévue - Quelle est la longueur maximale pour un paramètre de scénario ?
version 4.1.01.05 : 195 caractères passés avec succès. Au-delà, le scénario plante sans donner d’explication, comme généralement dans Sunopsis…
- Un bug fait apparaitre SEP_GROUPE dans une requete ?
Dans certaines conditions encore inexpliquées, il se peut que Sunopsis ne crée pas correctement ses jointures. Ex : Un table est jointurée à deux autres, on devrait avoir :
Select * from table1, table2, table3 where table1.id = table2.id AND table1.champ = table3.champ
Dans certains cas ou Sunopsis bugge, le AND peut être remplacé par SEP_GROUPE et forcément les SGBD ne comprennent pas ( même ceux qui coûtent très cher ;o). Pour contourner ça, il faut mettre toutes les jointures dans une seule, et donc joindre soit-même les groupes.
No comments yet. Be the first.
Leave a reply