accéder à la publication Pierre LaFay · Fév 16, 2024 Merci @Lorenzo Scalese pour ta réponse qui correspond à ce que je souhaite faire. J'ai peut-être un complément : Je crois comprendre que la méthode OnStartRequest() va être appelée avant le login proprement dit. Ne devrais-je pas utiliser plutôt OnLogin() ou OnEndRequest() pour exécuter mon code après le login ? Je vais faire quelques tests ce matin
accéder à la publication Pierre LaFay · Fév 16, 2024 Merci @Sylvain Guilbaud pour cette info, même si mon but est de me passer d'IAM ;-)
accéder à la publication Pierre LaFay · Fév 5, 2024 Merci @Lorenzo Scalese Je vais fouiller ça dans la doc, car je n'ai jamais fait de mapping autrement que globalement pour une BD. Je pense que cela doit être pratique dans certains cas (j'ai une reprise de données à faire, je pense que j'utiliserai cela pour accéder à certaines tables de la base source dans la nouvelle base). Merci également pour le NS %All que je ne connaissais pas et qui semble très pratique ! Pierre
accéder à la publication Pierre LaFay · Fév 5, 2024 Merci beaucoup @Lorenzo Scalese pour ta réponse rapide, claire et précise. J'avais déjà pensé au mapping que j'ai déjà utiliser, mais je ne sais mapper que l'intégralité des routines ou des globales d'une base dans une autre, ce que je trouve trop global. Dans mon cas précis, je m'en suis tiré en faisant hériter la classe contenant ma méthode RemoveIrisTestUsers de la classe Bna.Utils.Sql. Cela fonctionne car maintenant la méthode est dans la classe courante, le lien est fait avant que je ne change de NS : ClassMethod RemoveIrisTestUsers() As %Status { w "Suppression des utilisateurs de tests",! New $NameSpace Set $NameSpace="%SYS" // Get test users by login begining Set query = "select UPPER(ID) from Security.Users "_ "where "_ "ID like LOWER('ARS-%') or "_ "ID like LOWER('CHERCHEUR-%') or "_ "ID like LOWER('CS-%') or "_ "ID like LOWER('DGOS-%') or "_ "ID like LOWER('CENTRE-%')" Set sc = ..SelectFirstColsInArray(query, .userIds) if 'sc Return sc for i=0 : 1 : userIds-1 { w userIds.%Get(i),! } Return $$$OK }
accéder à la publication Pierre LaFay · Jan 13, 2024 Merci à @Nikolay Solovyev pour cette commande. Pour ma part, je pense que cela va m'aider rapidement pour mes déploiements.
accéder à la publication Pierre LaFay · Jan 13, 2024 Merci @Lorenzo Scalese Je suis allé voir le package et c'est exactement ce qu'il me faut Echo Redirect et Redirect Output to a global sont deux fonctionnalités qui vont me servir pour faire une sortie document plus adaptée
accéder à la publication Pierre LaFay · Jan 13, 2024 Merci @Sylvain Guilbaud , Cela va me permettre de conserver un peu mon code pas trop propre 🙃 et de produire un résultat, je vais aussi regarder le package de @Lorenzo Scalese
accéder à la publication Pierre LaFay · Jan 10, 2024 Bonjour @Jean-Charles Cano, Pour ma part, je pense que tu pourrais te pencher sur le serveur SSH vers lequel tu envoie (ou sur lequel tu récupère) tes fichiers. J'ai eu moi même ce type de problème, car le nombre maximum de session était atteint. Le message était le même et je n'avait pas de trace dans les logs de ma machine SSH/SFTP car ce n'était pas un fonctionnement anormal que de refuser la connexion dans ce cas. Je ne suis pas certain que ton pb vienne de là, mais c'est toujours une piste
accéder à la publication Pierre LaFay · Jan 6, 2024 NDT : Je pense a voir trouvé une autre façon de protéger une route.Je ne protège pas la route à proprement parler, mais la méthode vers laquelle elle pointe à l'aide de [ Requires = "myResource:Use" ] : /// Sample API Class Test.Api Extends %CSP.REST { XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { <Routes> <Route Url="/test" Method="GET" Call="Test" /> </Routes> } ClassMethod Test() As %Status [ Requires = "myResource:Use" ] { Do ##class(%REST.Impl).%WriteResponse("api method test : OK") Return $$$OK } }
accéder à la publication Pierre LaFay · Jan 3, 2024 Les différences de performance sont impressionnantes, ce qui montre bien à mon sens qu'il est préférable de se poser les questions d'implémentation en tout début de phase de développement et/ou créer des classes façades
accéder à la publication Pierre LaFay · Déc 30, 2023 Merci Irène pour cette réponse très complète, je m'y mets dès ce week-end ! Bonne fin d'année
accéder à la publication Pierre LaFay · Déc 29, 2023 Merci pour cette traduction qui présente une fonctionnalité méconnue de l'extension.
accéder à la publication Pierre LaFay · Déc 26, 2023 Merci pour ces liens, mais en fait je me dbrouille avec python, c'était bien sur l'intégration de Python dans Iris que je m'interrogeais (j'ai cru comprendre que l'on peut utiliser python en embarqué ou indépendamment d'Iris. J'attendrai l'article dont tu me parles ;-) et verrai cela avec @Sylvain Guilbaud bientôt Bonnes fêtes et merci pour tes réponses
accéder à la publication Pierre LaFay · Déc 26, 2023 Bonjour, Comme tu peux le voir en utilisant les outils de développement de ton navigateur, la feuille CSS utilisée pour les styles est générée par une page ZEN : Le problème est que tu peux modifier cette classe mais que tes modifications seront potentiellement perdues à chaque mise à jour de'Iris. De plus ce n'est pas terrible de procéder de cette manière (modifier la fourniture d'Iris). Tout d'abord avec les outils de dev du navigateur vérifiions ce qu'il faut cibler : C'est donc la classe portalTitle qui permet la modification du background. Regardons maintenant les css statiques chargées : la feuille ZEN_Component__core_3.css me parait une bonne candidate pour la modification, tu peux l'éditer et ajouter tes styles à la fin de celle-ci : et on obtient l'effet désiré : Ce n'est toujours pas terrible, mais cela répond je pense à ta demande.
accéder à la publication Pierre LaFay · Déc 22, 2023 Bonjour Guillaume, Merci pour cette réponse rapide, j'utilise actuellement Iris en objectscript uniquement, donc je ne suis pas trop à l'aise avec l'intégration de python. Je dois avoir prochainement une présentation/formation à l'intégration de python (langage que je pratique un peu par ailleurs) par @Sylvain Guilbaud Afin de rendre cette session plus productive j'aimerai bien me dégrossir un peu sur le sujet, quelles ressources pourrais-tu me conseiller ?
accéder à la publication Pierre LaFay · Déc 22, 2023 Mince alors, c'est exact, tu as raison. Il me semblait avoir vérifié le résultat, mais je pense que j'ai été trop enthousiaste, et comme il s'agissait juste d'un essai, je n'ai pas enchainé sur un développement. Comme je le dis dans ma conclusion il faut se garder d'utiliser tel que ce que propose ChatGpt, mon propos, même si j'ai donné un magnifique contre-exemple était que bien utilisé, cet outil peut accélerer le démarrage d'un projet. Dans tous les cas quelque soit la provenance (chatGpt, Forum, Tuto,...) utiliser un code sans le comprendre n'est jamais une bonne solution, l'effort gagné sur le coup se paiera plus tard par des difficultés de maintenance au mieux ou des dysfonctionnements.
accéder à la publication Pierre LaFay · Déc 18, 2023 Merci @Guillaume Rongier Le paradoxe c'est que je ne suis pas passé à la 2023.3 car il n'y a plus studio dans la fourniture justement à cause de ce problème de remontée d'erreurs...
accéder à la publication Pierre LaFay · Déc 18, 2023 Merci @Sylvain Guilbaud pour ces précisions, j'avoue ne pas avoir saisi la subtilité entre $SEQUENCE et $INCREMENT quand la valeur d'incrément est 1. Pour la classe, j'avais plus ou moins pensé à faire cela, mais je trouve plus pratique d'avoir une clé unique indépendante de l'ID dans une seule propriété. J'ai finalement fait une petite classe pour gérer ce besoin dans différentes fonctionnalités (numérotation automatique des centre, génération de login, ...), la voici : Class Bna.Utils.Sequence Extends %RegisteredObject { Property Name As %String; Method %OnNew(name) As %Status { Set ..Name = name Return $$$OK } ClassMethod ShowAll() { zw ^Sequence } ClassMethod ResetAll() { Kill ^Sequence } Method Get(seqKey As %String = "") As %Integer { if seqKey="" { Return $INCREMENT(^Sequence(..Name)) } else { Return $INCREMENT(^Sequence(..Name, seqKey)) } } Method Reset(seqKey As %String = "") { if seqKey="" { Kill ^Sequence(..Name) } else { Kill ^Sequence(..Name, seqKey) } } Method Show(seqKey As %String = "") { if seqKey="" { zw ^Sequence(..Name) } else { zw ^Sequence(..Name, seqKey) } } }