accéder à la publication Lorenzo Scalese · Jan 15 Je m'en doutais. Merci pour le feedback :-) Lorenzo.
accéder à la publication Lorenzo Scalese · Jan 9 Oui en effet!On ne trouve malheureusement aucun exemple d'utilisation de cet adapter et je me demande s'il est bien fonctionnel. En suivant le code de la méthode "OnInit", ensuite la méthode "Open", on retrouve la ligne: Open pDevice:(pParameters):pTimeout qParameters me semble bien trop light, dans votre cas, ça reviendrait à faire : Open "c:\intersystems\ensemble\bin/udpsend 127.0.0.1 3001":("WQ"):5 En TCP on ferait quelque chose ressemblant à : OPEN "|TCP|3001":("127.0.0.1":3001):5 Je n'ai pas trouvé de documentation qui traite sur l'utilisation du protocol UDP directement avec les commandes Open Use Write donc j'ai tenté d'investiguer en comparant avec la classe "%Net.UDP", mais je suis bloqué sur "$system.UDP.Init(host,port,timeout,sendsiz,rcvsiz)", impossible voir le code qui se cache derrière et donc l'éventuelle utilisation de la commande "Open". Si vous avez un accès au WRC vous pouvez leur poser la question.
accéder à la publication Lorenzo Scalese · Jan 8 Bonjour @Corentin Blondeau Je n'ai pas pu tester par moi-même, mais intuitivement je pense qu'il manque une une Instruction "Open" pour que le "Use" et "Write" puisse fonctionner. Essayez avec un appel à la méthode Open de l'adapter avant le SendStream: $$$TOE(status,..Adapter.Open(..Adapter.Device)) Set status = ..Adapter.SendStream(stream) Do ..Adapter.Close(..Adapter.Device)
accéder à la publication Lorenzo Scalese · Nov 28, 2024 Décision logique, chez Zorgi nous sommes aussi passé par l'api. Nous avons ajouté des "metrics" personnalisées pour nos apps et construit nos dashboards avec des outils dédiés comme Grafana et Prometheus.
accéder à la publication Lorenzo Scalese · Sept 11, 2024 Bonsoir @ilyes Bahlagui , L'erreur <FILEFULL> est caractéristique d'un fichier base de données (IRIS.DAT) qui ne dispose plus d'espace libre et qui ne peut plus s'étendre sur le file system. Cela peut se produire dans les cas suivants : le disque sur lequel la database est stockée en ne dispose plus d'espace. la database a été paramétrée avec une taille maximum et elle a été atteinte. Je lis que vous êtes sur une version IRIS Community, je sais qu'il y a une limite au niveau de la taille des bases de données sur cette version gratuite, cela pourrait être aussi la cause du problème si vous avez atteint cette limite. Selon la documentation officiel, l'ensemble des bases de données ne peut pas dépasser 10GB en community edition. Pouvez-vous vérifier si vous êtes dans l'un de ces cas de figure ? Dans le cas ou vous auriez atteint anormalement la limite de 10 Gb pour l'ensemble des base de données, vous pouvez utiliser l'utilitaire : Do ^%GSIZE afin d'identifier les globals les plus volumineuses. Lorenzo.
accéder à la publication Lorenzo Scalese · Sept 11, 2024 Merci pour cette article @Matthieu LAURENT L'utilisation du parameter LOCATION est une très bonne pratique pour éviter un piège. Par défaut si ce n'est pas précisé le système enregistre dans la global qui correspond au nom de la classe en se terminant par un S (ex : ^User.TestStreamS pour la classe User.TestStream). Ce n'est pas forcément un problème, mais à l'usage: si quelqu'un fait Set obj.Justificatif = ##class(%Stream.GlobalCharacter).%New() Le stream se retrouve par défaut dans ^CacheStream ce qui peut devenir un problème si on répète cela avec des streams de différentes classes. L'utilisation du parameter LOCATION évite cela même dans ce cas de figure.
accéder à la publication Lorenzo Scalese · Mai 18, 2024 Bonsoir Julia, Si vous renvoyez toujours le json avec la liste tPrinter complète, le plus simple serait de faire un clear de la liste et la recharger, ex : ClassMethod TestUpdate() As %Status { Set tSC = $$$OK Set json = { "NomPoste":"Poste", "tPrinter": [ { "NomService":"Petite", "NomImprimante":"EPFR_12" }, { "NomService":"Grande", "NomImprimante":"modif" } ] } Set id = 1 Set tSC = ..UpdatePoste(id, json) Return tSC } ClassMethod UpdatePoste(id As %Integer, json As %DynamicObject) As %Status { Set poste = ##class(Epc.conf.poste).%OpenId(id, , .tSC) If $$$ISERR(tSC) Return tSC Do poste.tPrinter.Clear() ; supprime le contenu actuel de la liste tPrinter Do poste.%JSONImport(json) Set tSC = poste.%Save() Return tSC } Est-ce que cela peut vous aider ?
accéder à la publication Lorenzo Scalese · Avr 15, 2024 Bonjour @Pierre LaFay , je profite de cet article pour partagé un problème que nous avons tout récemment rencontré. le paramètre MAXLEN comme ci-dessous: Property PropertyName As %String (MAXLEN = ""); signifie "pas de limite", c'est à dire la longueur max d'une chaine. Via le JDBC, ce MAXLEN="" ne semble pas interprété comme en ObjectScript, vous pouvez donc aussi avoir des données tronquées. Dans ce cas d'utilisation, il vaut mieux utiliser un MAXLEN avec une grande valeur (ex : MAXLEN = 3000000) que "". Il s'agit probablement que d'un petit bug au niveau du driver, j'ouvrirai peut être un WRC à ce sujet prochainement.
accéder à la publication Lorenzo Scalese · Mars 22, 2024 Merci pour cette notification @Adeline Icard , Je viens juste de finir une série de mise à jour en version 2023.1.3 😅 Je ne sais pas dans quelle mesure nous pourrions être exposé à cette memory leak et vais conseiller d'attendre une version 2023.1.4 pour les systèmes de production dans l'attente d'en savoir plus.Edit: Comme c'est limité à AIX, pas d'impact de mon coté.
accéder à la publication Lorenzo Scalese · Mars 19, 2024 C'est très intéressant @Sylvain Guilbaud Merci d'avoir mis cette possibilité en avant. Lorenzo.
accéder à la publication Lorenzo Scalese · Fév 29, 2024 Merci pour la traduction de cet intéressant article.J'en profite pour partager ici mon extrait de code que j'utilise souvent comme base pour le SQL Dynamic: Set sc = $$$OK Set sql = "" ; put your sql query Set args($Increment(args)) = "" ;Set args($Increment(args)) = "" ;Set args($Increment(args)) = "" Set tStatement = ##class(%SQL.Statement).%New() ; Set tStatement.%SelectMode = 2 #Dim tRes As %SQL.StatementResult = ##class(%SQL.Statement).%ExecDirect(.tStatement, sql, args...) If tRes.%SQLCODE < 0 Return $$$ERROR($$$SQLError, tRes.%SQLCODE, tRes.%Message) While tRes.%Next(.sc) { Quit:$$$ISERR(sc) /// do something } If $$$ISERR(sc) Return sc
accéder à la publication Lorenzo Scalese · Fév 16, 2024 Bonjour @Pierre LaFay , Avec plaisir! Pour le OnLogin, je n'ai pas essayé, mais pour le OnEndRequest j'ai tenté le coup et ce fut un échec :D Malgré que le OnEndRequest soit bien exécuté, j'ai l'impression qu'il est "asynchrone" ou plutôt qu'il est exécuté après que la réponse soit envoyée au client. Donc même si on fait Hang dans le OnEndRequest, c'est déjà trop tard malheureusement. N'hésite pas à partager tes découvertes :)
accéder à la publication Lorenzo Scalese · Fév 15, 2024 Bonjour @Pierre LaFay , Effectivement comme l'a mentionné @Sylvain Guilbaud IAM t'offrira pas mal de fonctionnalité. Toutefois si tu veux juste forcer un "Hang 1" lors du login, tu peux t'en sortir une sous classe de %CSP.SessionEvents, ex: Class dc.pierre.RestEvents Extends %CSP.SessionEvents { ClassMethod OnStartRequest() As %Status { #dim %request As %CSP.Request Set ^dc.pierre("OnStartRequest", "LastRequest") = $ZDT($Horolog, 3, 1) _ " " _ %request.URL Set loginURL = "/login" If $Extract(%request.URL, * - $Length(loginURL) + 1, *) = loginURL { ; Vérifie si l'url se termine par /login Hang 1 } Quit $$$OK } } Il faut alors configurer l'application Web pour utiliser cette classe d'évènements. Cela peut se paramétrer via le portail admin gestion de la sécurité -> Application Web, ex : Lorenzo.
accéder à la publication Lorenzo Scalese · Fév 6, 2024 Salut @Alexandre Lucas , Je me permet de te tag sur cette question ;) Peut être que tu auras une idée.
accéder à la publication Lorenzo Scalese · Fév 5, 2024 Salut @Cyril Grosjean Ce n'est pas mon domaine d'expertise, mais je suppose que le processus utilise le framework d'interoperabilité en mode synchrone et qu'une transaction (TSTART) est encore ouverte avant l'appel au business service. Lorsque cette situation se produit, le système effectue automatiquement un TCOMMIT. Tu peux tenter vérifier cela en plaçant une ligne de debug $TLEVEL (cette variable spécial donne le niveau de transaction courant ou 0 si pas de transaction). Lorenzo.
accéder à la publication Lorenzo Scalese · Fév 5, 2024 Merci @Pierre LaFay . Content que tu as pu trouver une solution :) Le mapping même avec le namespace %ALL permet de sélectionner exactement ce que tu souhaites mettre à disposition des autres namespaces (donc pas forcément tout ce qui est dans une DB, une sélection peut être effectuée). Je souligne ce point juste au cas ou cela te serait utile à l'avenir. Lorenzo.
accéder à la publication Lorenzo Scalese · Fév 4, 2024 Bonjour @Pierre LaFay Oui, il est possible de faire du mapping, mais il faut bien distinguer deux choses: Package mapping Celui-ci permet de rendre accessible des package d'un namespace à un autre. Dans le cas d'une classe %Persistent, il faut bien comprendre que seul le code sera mappé. En ce qui concerne les données enregistrée cela nous amène au 2ème point. Global Mapping Il permet de rentre accessible les données de vos globals à votre namespace en spécifiant la base de données source. Ces configurations peuvent s'effectuer par programmation ou plus simplement via le portail d'administration au niveau de la configuration du namespace (voici le lien de la doc officiel si cela peut vous être utile). Dans le cas qui vous occupe peut être qu'il serait plus simple d'effectuer la requête SQL directement dans "RemoveIrisTestUsers" étant donné que vous faites déjà le changement de namespace. Toutefois, pour un package de classe utilitaire comme "Bna.Utils" peut être que vous pourriez le mapper sur le namespace %ALL. Le namespace %ALL, est spécial, les packages (ou les globals et routines) qui y sont mappées sont automatiquement accessible pour tous les autres namespace. Donc le code : Set sc = ##class(Bna.Utils.Sql).SelectFirstColsInArray(query, .userIds) Pourra être exécuter même si vous venez de faire un Set $Namespace = "%SYS". Si besoin, je peux vous fournir une réponse plus complète avec des captures d'écran concernant la configuration avec %ALL. Lorenzo.
accéder à la publication Lorenzo Scalese · Jan 13, 2024 Bonjour @Pierre LaFay J'avais écrit un package pour cela IO-Redirect , je pense que cela pourrait vous aider.
accéder à la publication Lorenzo Scalese · Jan 9, 2024 Bonjour @Cyril Grosjean , Je ne sais pas si ça peut vous aider mais il existe la possibilité d'enregistrer les credentials Il a très longtemps, j'ai déjà utilisé cela pour stocker login/password pour des requêtes http basic auth. Je dois avouer que je ne sais plus exactement comment ça fonctionne, mais c'est peut être une piste. Le point de menu est disponible dans "Interoperability -> Configurer -> Droits"