accéder à la publication Sylvain Guilbaud · Jan 29 @Jean-Charles Cano, une autre approche existe cependant : celle qui consisterait à construire une image Docker contenant ton flux FTP, et à lancer une fois par jour un conteneur de cette image pour exécuter le flux.La commande "docker run" pouvant elle-même être exécutée via $zf(-100) depuis une tâche planifiée exécutée par IRIS à la fréquence souhaitée.
accéder à la publication Sylvain Guilbaud · Jan 29 Exactement @Jean-Charles Cano Je te confirme que tu avais déjà trouvé la bonne solution par toi-même et que tu étais sur la bonne piste 😀
accéder à la publication Sylvain Guilbaud · Jan 25 Bonjour @Jean-Charles Cano si ton service FTP ne doit s'exécuter qu'une seule fois par jour, à une heure bien précise, la planification est effectivement le bon moyen, en veillant à ce que l'intervalle entre appel soit supérieur à la durée séparant l'heure du START et celle du STOP. L'autre moyen, sans planification, est de simplement mettre un intervalle entre appels de 86400 pour obtenir un appel une seule fois par jour. L'inconvénient ici étant que le service restera démarré 24h/24h sans utilité.
accéder à la publication Sylvain Guilbaud · Jan 15 Bonjour @Cyril Grosjean essaie d'utiliser embedded python, en remplaçant la connexion par create_engine('iris+emb:///'): from sqlalchemy import create_engine _engine = create_engine('iris+emb:///')
accéder à la publication Sylvain Guilbaud · Jan 15 Bonjour @Cyril Grosjean essaie d'utiliser embedded python, en remplaçant la connexion par create_engine('iris+emb:///'): from sqlalchemy import create_engine _engine = create_engine('iris+emb:///')
accéder à la publication Sylvain Guilbaud · Jan 12 Bonjour @Cyril Grosjean l'erreur indique un "accès refusé". Peux-tu donner plus d'information sur le code du BP PostFusionIntervention ?
accéder à la publication Sylvain Guilbaud · Jan 12 Bonjour @Cyril Grosjean le pb vient peut-être des librairies python requises qui n'ont pas été correctement installées sur l'environnement WIndows.Tu peux essayer de le résoudre en installant les librairies python sur Windows via la commande irispip C:\InterSystems\IRIS\bin>irispip install --target C:\InterSystems\IRIS\mgr\python iris-pex-embedded-python
accéder à la publication Sylvain Guilbaud · Jan 12 Bonjour @Pierre LaFay pour rediriger la sortie standard du Terminal IRIS, tu peux ouvrir un fichier et l'indiquer via la commande USE Exemple ci-dessous et en ligne : Class utils.file { Parameter DIRECTORY = "/data/"; Parameter FILENAME = "results"; Parameter EXTENSION = ".txt"; /// Redirect standard output to a file ClassMethod results() As %Status { set sc = $$$OK SET file=..#DIRECTORY _ ..#FILENAME _ "_" _ $tr($zdt($h,8)," :")_..#EXTENSION OPEN file:("NRW"):5 USE file WRITE !,"BEGIN RESULTS ",$zdt($h,3),! do ##class(UnitTest.utils).run("Test3") WRITE !,"END RESULTS ",$zdt($h,3) CLOSE file WRITE !,"Results are in ",file,! return sc } } Avec le fichier contenant toutes les écritures vers la sortie :
accéder à la publication Sylvain Guilbaud · Jan 12 Merci @Iryna Mykhailova et @Brett Saviano Cela est très utile en effet et fonctionne aussi avec IRIS 2023.3 sans Private Web Server (depuis IRIS 2023.2)
accéder à la publication Sylvain Guilbaud · Jan 12 La commande alias est aussi très pratique et souvent méconnue :
accéder à la publication Sylvain Guilbaud · Jan 12 Hello @Pierre LaFay tu peux aussi utiliser la commande "!" sans paramètre pour ouvrir une session du système d'exploitation et revenir au terminal IRIS en quittant la session de l'OS. Exemple ci-dessous :
accéder à la publication Sylvain Guilbaud · Jan 11 Merci @Pierre LaFay et @Seisuke Nakahashi pour cet article intéressant, qui apporte une autre méthode d'exploitation des rapports de performances.Je vous invite à essayer également YASPE (Yet Another System Performance Extractor), qui génére des rapports html par une exploitation des rapports en Python.
accéder à la publication Sylvain Guilbaud · Jan 8 Bonjour @Jean-Charles Cano, pour en savoir plus sur les logs, côté IRIS tu peux activer les traces dans les paramètres du Business Service : En t'assurant que les traces sont aussi activées au niveau des paramètres de la production :
accéder à la publication Sylvain Guilbaud · Jan 5 Réponse d' @Eduard Lebedyuk : L'approche la plus sûre consiste à utiliser Privileged Routine Application.
accéder à la publication Sylvain Guilbaud · Jan 5 Bonjour @Jean-Charles Cano, les messages commençant par "ConfigItem" font simplement partie des messages d'information dans le journal des événements indiquant le démarrage d'un service/process/operation dans la production (en précisant l'ID du processus de la tâche associée).D'après tes captures d'écran, cela signifie que la connexion a échoué le 27/12 à 04:25 et que le service a correctement redémarré (message ConfigItem), le 28/12 à 14:45, ainsi que le même jour à 14:50, 16:27, etc.Peut-être que le pb vient du paramètre Rester connecté (StayConnected) = -1 Le passer à une valeur positive ou à 0 règlera peut-être le pb.
accéder à la publication Sylvain Guilbaud · Jan 2 Et @Vitaliy Serdtsev conclue : Ajout à ce qui précède : pagination SQL accélérée
accéder à la publication Sylvain Guilbaud · Jan 2 @Eduard Lebedyuk précise : L'idée d'un ensemble de résultats défilants est d'appeler Save/OpenId - et l'ensemble de résultats continuera automatiquement sur une ligne suivante. Vous n'avez donc pas besoin de gérer les indices avant/arrière : Un exemple ici Class User.Pagination { /// do ##class(User.Pagination).Time("NoSave") /// do ##class(User.Pagination).Time("Save") ClassMethod Time(method = "Save") { set start = $zh do $classmethod(,method) set end = $zh write $$$FormatText("%1 took %2 sec", method, $fnumber(end-start,"",4)) } /// do ##class(User.Pagination).NoSave() ClassMethod NoSave() { do { do $i(i) set obj = ..getPersonsPage(20,i) //w obj.%ToJSON(),!,! } while (obj.toIndex < obj.resultSetTotal) } /// do ##class(User.Pagination).Save() ClassMethod Save() { do { set obj = ..getPersonsPageSave(20,.id) //w obj.%ToJSON(),!,! } while (id'=-1) } ClassMethod getPersonsPage(pageSize As %String = 20, pageIndex As %String = 1) As %DynamicObject { #dim sc As %Status = $$$OK #dim rs As %ScrollableResultSet set sc = ..getRS(,.rs) quit:$$$ISERR(sc) {"msg": ($System.Status.GetErrorText(sc))} set vFrom = ((pageIndex -1 ) * pageSize) set vTo = vFrom + (pageSize-1) do rs.CurrRowSet(vFrom) set results = [] set:(pageSize >= rs.Count()) pageSize = rs.Count() set i = 0 while rs.%Next() && $i(i) { quit:(i>pageSize) do results.%Push({ "index": (i), "pid": (rs.%Get("ID")), "ssn" : (rs.%Get("SSN")), "age": (rs.%Get("Age"))}) //do results.%Push(+rs.%Get("ID")) } set out = { "pageSize":(pageSize), "pageIndex":(pageIndex), "fromIndex":(vFrom + 1), "toIndex":(vFrom+i), "resultSetTotal":(rs.Count()), "pageRecords":(i), "pages":($NORMALIZE((rs.Count()/pageSize),0)), "resultSet":(results) } return out } ClassMethod getRS(id As %Integer, Output rs As %ScrollableResultSet) As %Status { #dim sc As %Status = $$$OK if '$d(id) { set sql = "SELECT ID, SSN, Age FROM Sample.Person" set rs=##class(%ScrollableResultSet).%New("%DynamicQuery:SQL") set sc = rs.Prepare(sql) quit:$$$ISERR(sc) sc set sc = rs.Execute() quit:$$$ISERR(sc) sc quit:(rs.Count()=0) $$$ERROR($$$GeneralError, "No results") } else { set rs=##class(%ScrollableResultSet).%OpenId(id) } quit sc } ClassMethod getPersonsPageSave(pageSize As %String = 20, ByRef id As %Integer) As %DynamicObject { #dim sc As %Status = $$$OK #dim rs As %ScrollableResultSet set sc = ..getRS(.id,.rs) quit:$$$ISERR(sc) {"msg": ($System.Status.GetErrorText(sc))} set results = [] set:(pageSize >= rs.Count()) pageSize = rs.Count() set i = 0 set notAtEnd = rs.%Next() while notAtEnd && $i(i) { do results.%Push({ "index": (i), "pid": (rs.%Get("ID")), "ssn" : (rs.%Get("SSN")), "age": (rs.%Get("Age"))}) //do results.%Push(+rs.%Get("ID")) quit:(i>=pageSize) set notAtEnd = rs.%Next() } if notAtEnd { do rs.%Save() Set id=rs.%Id() } else { do rs.%DeleteId(id) set id = -1 } set out = { "pageSize":(pageSize), "resultSetTotal":(rs.Count()), "pageRecords":(i), "pages":($NORMALIZE((rs.Count()/pageSize),0)), "resultSet":(results) } kill rs return out } } C'est également environ 3 fois plus rapide puisque la requête n'est exécutée qu'une seule fois : do ##class(User.Pagination).Time("Save") Save took 0,0048 sec do ##class(User.Pagination).Time("NoSave") NoSave took 0,0143 sec