Effacer le filtre
338 Publications•0 Abonnés
17 Publications•0 Abonnés
11 Publications•0 Abonnés
13 Publications•0 Abonnés
Annonce
Robert Bira · Mai 27, 2022
Chers développeurs,
Nous sommes ravis d'annoncer le lancement de l'[annuaire des partenaires InterSystems](https://partner.intersystems.com/) !
[](https://partner.intersystems.com)
C'est l'endroit où aller pour trouver des [services](https://partner.intersystems.com/services) et [solutions](https://partner.intersystems.com/solutions?fromMenu=1) commerciaux bâtis sur les produits InterSystems.
**Pourquoi un annuaire des partenaires InterSystems ?**
Nous recevons chaque jour des questions comme celles-ci :
Existe-t-il des solutions ERP construites sur la technologie InterSystems ?
J'habite en Suède, comment puis-je me former à d'InterSystems ?
InterSystems a-t-il des partenaires de mise en œuvre en France ?
Que nos clients cherchent de l'aide pour élaborer une solution, une source de conseil de confiance, de l'assistance pour un projet d'implémentation ou une formation supplémentaire, ils peuvent utiliser l'annuaire des partenaires pour établir une relation avec la société qui leur convient.
Si votre entreprise est un partenaire d'InterSystems qui fournit :
Des services de mise en œuvre, de conseil ou de formation liés à la technologie InterSystems,
et/ou des solutions construites avec ou pour les produits InterSystems,
Nous vous invitons à publier votre annonce et à rejoindre l'[annuaire des partenaires](https://partner.intersystems.com).
[Jetez-y un coup d'œil](http://partner.intersystems.com) et partagez-le avec vos collègues !
* * *
Vous trouverez facilement le site de l'annuaire des partenaires InterSystems dans la barre supérieure :
.png)
Annonce
Irène Mykhailova · Mars 23, 2022
Salut les développeurs,
C'est un temps heureux pour tous les utilisateurs francophones de notre communauté !
Nous sommes ravis d'annoncer le lancement officiel de la Communauté des Développeurs InterSystems en français !
Laissez-moi vous présenter @Guillaume.Rongier7183, @Robert.Bira et @Irène.Mykhailova en tant que responsables de la Communauté française.
Voici les principaux points à connaître:
➡️ Vous pouvez passer d'un site à l'autre à l'aide du menu de langue dans le coin haut droit:
Si vous connaissez le français, c'est formidable et vous pouvez contribuer des articles, faire des discussions, poser et répondre à des questions sur les plates-formes de données InterSystems en français !
De plus!
➡️ Vous pouvez utiliser le Sélecteur de Langue – l'option pour passer à la version française de l'article.
Ensuite!
➡️ Si vous avez publié un article en anglais ou autre langue, il pourrait être traduit par n'importe qui en français et sera utile à encore plus de personnes !
Tout le monde peut désormais ajouter ou demander une traduction à n'importe quel article de la Communauté des Développeurs. Après avoir sélectionné une langue à l'aide du Sélecteur de Langue, chaque utilisateur peut ajouter un lien avec la traduction du message ou demander sa traduction.
➡️ La même chose fonctionne pour le site Communauté francophone : vous pouvez traduire l'article français en anglais ou en autre langue. Assurez-vous que vous connaissez bien les deux langues !
N'hésitez pas à nous faire part de vos commentaires sur la façon d'améliorer notre Communauté francophone.
Bienvenue dans la Communauté des Développeurs d'InterSystems francophone ! 🚀
Parlons des sujets que vous aimeriez voir et discuter sur le FR DC. Participez au sondage ci-dessous ☑️
Par ailleurs, n'hésitez pas à partager vos suggestions dans les commentaires !
Annonce
Irène Mykhailova · Avr 6, 2022
Nous sommes ravis de vous présenter notre nouveau portail de commentaires, [InterSystems Ideas](https://intersystems.ideas.aha.io/) !
Nous souhaitons améliorer nos mécanismes de rétroaction afin que vous puissiez suggérer des façons dont nos produits pourraient évoluer pour répondre à vos défis commerciaux. Les [questions](https://fr.community.intersystems.com/?filter=questions) sur la Communauté des Développeurs sont un excellent moyen d'interagir avec vos pairs autour d'un problème de codage spécifique, et le [Support Client](https://www.intersystems.com/fr/support/) est, comme toujours, le moyen de résoudre un problème immédiat.
Ce nouveau portail est destiné à capturer des idées de niveau supérieur. Moins sur la façon dont vous faites quelque chose aujourd'hui, et plus sur la façon dont vous aimeriez voir le produit mieux fonctionner à l'avenir. Il vous permet de publier vos propres commentaires et de commenter/voter pour les commentaires fournis par d'autres. InterSystems peut afficher tous les commentaires que vous soumettez, y répondre directement et mettre à jour le statut de vos éléments de commentaires au fur et à mesure que nous progressons sur vos demandes.
Alors jetez-y un coup d'œil, apportez vos idées et marquez-le pour l'avenir. Merci!
Article
Guillaume Rongier · Mai 27, 2022
La semaine dernière, nous avons annoncé la [**Plate-forme de données InterSystems IRIS**](http://www.intersystems.com/iris), notre nouvelle plate-forme complète pour toutes vos activités liées aux données, qu'elles soient transactionnelles, analytiques ou les deux. Nous avons inclus un grand nombre des fonctionnalités que nos clients connaissent et apprécient de Caché et Ensemble, mais dans cet article, nous allons mettre un peu plus en lumière l'une des nouvelles capacités de la plate-forme : **SQL Sharding**, une nouvelle fonctionnalité puissante dans notre histoire de scalability.
Si vous avez exactement 4 minutes et 41 secondes, jetez un coup d'œil à [cette vidéo astucieuse](https://learning.intersystems.com/course/view.php?id=732) sur le scalability. Si vous ne trouvez pas vos écouteurs et ne croyez pas que notre voix apaisante plaira à vos collègues, continuez à lire !
### Changement d'échelle
Qu'il s'agisse de traiter des millions d'opérations boursières par jour ou de soigner des dizaines de milliers de patients par jour, une plateforme de données prenant en charge ces activités doit être capable de faire face à ces grandes échelles de manière transparente. La _manière transparente_ signifie que les développeurs et les utilisateurs ne doivent pas se préoccuper de ces chiffres et qu'ils peuvent se concentrer sur leurs activités et applications principales, la plate-forme se chargeant de l'aspect de l'échelle.
Depuis des années, Caché prend en charge le **vertical scalability**, où les progrès du matériel sont exploités de manière transparente par le logiciel, en exploitant efficacement un nombre très élevé de cœurs et de grandes quantités de RAM. C'est ce qu'on appelle la mise à l'échelle _vers le haut_, et bien qu'un bon effort de dimensionnement initial puisse vous permettre d'obtenir un système parfaitement équilibré, il y a une limite inhérente à ce que vous pouvez réaliser sur un seul système de manière rentable.
C'est là qu'intervient le **horizontal scalability**, qui consiste à répartir la charge de travail sur un certain nombre de serveurs distincts travaillant en cluster, plutôt que sur un seul. Caché prend en charge les serveurs d'application ECP comme moyen de _horizontal scalability_ depuis un certain temps déjà, mais InterSystems IRIS ajoute désormais le sharding SQL.
### Quelles sont les nouveautés ?
Quelle est donc la différence entre les serveurs d'application ECP et la nouvelle fonctionnalité de sharding ? Pour comprendre cette différence, examinons de plus près les charges de travail. Une charge de travail peut consister en des dizaines de milliers de petits dispositifs écrivant continuellement de petits lots de données dans la base de données, ou juste une poignée d'analystes émettant des requêtes analytiques couvrant chacune des Go de données à la fois. Lequel des deux a la plus grande échelle ? Difficile à dire, tout comme il est difficile de dire si une canne à pêche ou un tonneau de bière est le plus grand. Les charges de travail ont plus d'une dimension et, par conséquent, la mise à l'échelle pour les prendre en charge nécessite également un peu plus de subtilité.
En simplifiant grossièrement, considérons les composants suivants dans une charge de travail d'application : N représente la _charge de travail de l'utilisateur_ et Q représente la _taille de la requête_. Dans nos exemples précédents, la première charge de travail a un N élevé mais un Q faible et la seconde est caractérisée par un N faible mais un Q élevé. Les serveurs d'application ECP sont très efficaces pour aider à supporter un grand N, car ils permettent de répartir les utilisateurs de l'application sur différents serveurs. Cependant, ils ne sont pas nécessairement aussi utiles si l'ensemble de données devient très grand et que l'ensemble de travail ne tient pas dans la mémoire d'une seule machine. Le sharding s'occupe des grands Q, en vous permettant de partitionner l'ensemble de données entre les serveurs, le travail étant également poussé vers ces _serveurs shard_ autant que possible.
### Sharding SQL
Alors, à quoi sert réellement le sharding ? Il s'agit d'une fonctionnalité SQL qui divise les données d'une _table partagée_ en ensembles disjoints de lignes qui sont stockés sur les serveurs shard. Lorsque vous vous connectez au _maître du shard_, vous voyez toujours cette table comme s'il s'agissait d'une table unique contenant toutes les données, mais les requêtes sont divisées en requêtes locales au shard qui sont envoyées à tous les serveurs shard. Là, les serveurs shard calculent les résultats en fonction des données qu'ils ont stockées localement et renvoient leurs résultats au shard master. Ce dernier agrège ces résultats, exécute toute combinaison logique pertinente et renvoie les résultats à l'application.
Bien que ce système soit trivial pour un simple SELECT * FROM table, il y a beaucoup de logique intelligente au niveau de l'interface qui garantit que vous pouvez utiliser (presque) n'importe quelle requête SQL et qu'un maximum de travail est poussé vers les shards pour maximiser le parallélisme. La "clé du shard", qui définit quelles lignes vont où, est l'endroit où vous anticipez les modèles de requête typiques. Plus important encore, si vous pouvez vous assurer que les tables souvent reliés entre eux sont répartis selon les mêmes clés, les jointures peuvent être entièrement résolues au niveau du shard, ce qui vous donne les hautes performances que vous recherchez.
Bien sûr, ce n'est qu'un avant-goût et il y a beaucoup plus à explorer, mais l'essentiel est ce qui est illustré ci-dessus : Le sharding SQL est une nouvelle recette dans le livre des plats hautement évolutifs que vous pouvez concocter avec InterSystems IRIS. Il s'agit d'un complément aux serveurs d'applications ECP, qui se concentre sur les ensembles de données de taille importante, ce qui en fait une solution idéale pour de nombreux cas d'utilisation analytique. Comme les serveurs d'applications ECP, il est entièrement transparent pour l'application et présente quelques variations architecturales plus créatives pour des scénarios très spécifiques.
### Où puis-je en savoir plus ?
Les enregistrements des sessions suivantes du Global Summit 2017 sur le sujet sont disponibles ici : http://learning.intersystems.com:
* [Qu'est-ce qui est caché dans votre lac de données ?](https://learning.intersystems.com/course/view.php?id=723), un aperçu technique du scalability et du sharding en particulier
* [Nous en voulons plus ! Résolution de la question du scalability](https://learning.intersystems.com/course/view.php?id=722), un aperçu des cas d'utilisation pertinents exigeant une plateforme hautement scalable
Consultez également [le présent guide de ressources](https://learning.intersystems.com/course/view.php?id=755) sur InterSystems IRIS sur learning.intersystems.com pour en savoir plus sur les autres capacités de la nouvelle plate-forme. Si vous souhaitez essayer le sharding sur votre cas d'utilisation particulier, consultez et remplissez le formulaire en bas de page pour vous inscrire à notre programme d'adoption initiale, ou surveillez la version de test sur le terrain prévue plus tard cette année.
Article
Guillaume Rongier · Juin 3, 2022
Class Query dans InterSystems IRIS (et Cache, Ensemble, HealthShare) est un outil utile qui sépare les requêtes SQL du code Object Script. En principe, cela fonctionne comme suit : supposons que vous souhaitiez utiliser la même requête SQL avec différents arguments à plusieurs endroits différents. Dans ce cas, vous pouvez éviter la duplication du code en déclarant le corps de la requête comme une Class Query, puis en appelant cette requête par son nom. Cette approche est également pratique pour les requêtes personnalisées, dans lesquelles la tâche consistant à obtenir la ligne suivante est définie par un développeur. Cela vous intéresse ? Alors lisez la suite !
## Class queries de base
Plus simplement, les Class Queries de base vous permettent de représenter des requêtes SQL SELECT. L'optimiseur et le compilateur SQL les traitent comme des requêtes SQL standards, mais elles sont plus pratiques lorsqu'il s'agit de les exécuter à partir du contexte Caché Object Script. Ils sont déclarés en tant qu'éléments de requête Query dans les définitions de classe (similaires aux méthodes ou aux propriétés) de la manière suivante :
* Type: %SQLQuery
* Tous les arguments de votre requête SQL doivent être énumérés dans la liste des arguments
* Type de requête: SELECT
* Utiliser les deux-points pour accéder à chaque argument (similaire au SQL statique)
* Définissez le paramètre ROWSPEC qui contient des informations sur les noms et les types de données des résultats de sortie ainsi que l'ordre des champs
* (Facultatif) Définissez le paramètre CONTAINID qui correspond à l'ordre numérique si le champ contient l'ID. Si vous n'avez pas besoin de renvoyer l'ID, n'attribuez pas de valeur à CONTAINID
* (Facultatif) Définissez le paramètre COMPILEMODE qui correspond au paramètre similaire en SQL statique et spécifie quand l'expression SQL doit être compilée. Lorsque ce paramètre est défini sur IMMEDIATE (par défaut), la requête sera compilée en même temps que la classe. Lorsque ce paramètre a la valeur DYNAMIC, la requête sera compilée avant sa première exécution (similaire au SQL dynamique)
* (Facultatif) Définissez le paramètre SELECTMODE qui spécifie le format des résultats de la requête
* Ajoutez la propriété SqlProc, si vous voulez appeler cette requête comme une procédure SQL.
* Définissez la propriété SqlName, si vous souhaitez renommer la requête. Le nom par défaut d'une requête dans le contexte SQL est le suivant : PackageName.ClassName_QueryName
* Caché Studio fournit l'assistant intégré pour la création de Class Query
Exemple de définition de la classe Sample.Person avec la requête ByName qui renvoie tous les noms d'utilisateur qui commencent par une lettre spécifiée
Class Sample.Person Extends %Persistent
{
Property Name As %String;
Property DOB As %Date;
Property SSN As %String;
Query ByName(name As %String = "") As %SQLQuery
(ROWSPEC="ID:%Integer,Name:%String,DOB:%Date,SSN:%String",
CONTAINID = 1, SELECTMODE = "RUNTIME",
COMPILEMODE = "IMMEDIATE") [ SqlName = SP_Sample_By_Name, SqlProc ]
{
SELECT ID, Name, DOB, SSN
FROM Sample.Person
WHERE (Name %STARTSWITH :name)
ORDER BY Name
}
}
Vous pouvez appeler cette requête depuis Caché Object Script de la manière suivante :
Set statement=##class(%SQL.Statement).%New()
Set status=statement.%PrepareClassQuery("Sample.Person","ByName")
If $$$ISERR(status) {
Do $system.OBJ.DisplayError(status)
}
Set resultset=statement.%Execute("A")
While resultset.%Next() {
Write !, resultset.%Get("Name")
}
Vous pouvez également obtenir un ensemble de résultats en utilisant la méthode générée automatiquement queryNameFunc :
Set resultset = ##class(Sample.Person).ByNameFunc("A")
While resultset.%Next() {
Write !, resultset.%Get("Name")
}
Cette requête peut également être appelée à partir du SQLcontext de ces deux manières :
Call Sample.SP_Sample_By_Name('A')
Select * from Sample.SP_Sample_By_Name('A')
Cette classe peut être trouvée dans l'espace de nom par défaut SAMPLES Caché. Et c'est tout pour les requêtes simples. Passons maintenant aux requêtes personnalisées
## Class queries personnalisées
Bien que les Class Queries de base fonctionnent parfaitement dans la plupart des cas, il est parfois nécessaire d'exécuter un contrôle total sur le comportement des requêtes dans les applications, par exemple :
* Des critères de sélection sophistiqués. Puisque dans les requêtes personnalisées vous implémentez une méthode Caché Object Script qui renvoie la ligne suivante de façon autonome, ces critères peuvent être aussi sophistiqués que vous le souhaitez.
* Si les données sont accessibles uniquement via l'API dans un format que vous ne souhaitez pas utiliser
* Si les données sont stockées dans des globales (sans classes)
* Si vous avez besoin d'élever les droits afin d'accéder aux données
* Si vous devez appeler une API externe afin d'accéder à des données
* Si vous devez accéder au système de fichiers afin d'accéder aux données
* Vous devez effectuer des opérations supplémentaires avant d'exécuter la requête (par exemple, établir une connexion, vérifier les autorisations, etc.)
Alors, comment créer des requêtes de classes personnalisées ? Tout d'abord, vous devez définir 4 méthodes qui mettent en œuvre l'ensemble du flux de travail de votre requête, de l'initialisation à la destruction :
* queryName — fournit des informations sur une requête (similaire aux requêtes de classe de base)
* queryName**Execute** — construit une requête
* queryName**Fetch** — obtient le résultat de la ligne suivante d'une requête
* queryName**Close** — détruit une requête
Analysons maintenant ces méthodes plus en détail.
**La méthode queryName**
La méthode queryName représente des informations sur une requête
* Type: %Query
* Laissez le corps vide
* Définissez le paramètre ROWSPEC qui contient les informations sur les noms et les types de données des résultats de sortie ainsi que l'ordre des champs
* (Facultatif) Définissez le paramètre CONTAINID qui correspond à l'ordre numérique si le champ contient l'ID. Si vous ne renvoyez pas d'ID, n'attribuez pas de valeur à CONTAINID
Par exemple, créons la requête AllRecords (queryName = AllRecords, et la méthode est simplement appelée AllRecords) qui produira toutes les instances de la nouvelle classe persistante Utils.CustomQuery, une par une. Tout d'abord, créons une nouvelle classe persistante Utils.CustomQuery :
Class Utils.CustomQuery Extends (%Persistent, %Populate){
Property Prop1 As %String;
Property Prop2 As %Integer;
}
Maintenant, écrivons la requête AllRecords :
Query AllRecords() As %Query(CONTAINID = 1, ROWSPEC = "Id:%String,Prop1:%String,Prop2:%Integer") [ SqlName = AllRecords, SqlProc ]
{
}
**La méthode queryNameExecute**
La méthode queryNameExecute initialise complètement une requête. La signature de cette méthode est la suivante :
ClassMethod queryNameExecute(ByRef qHandle As %Binary, args) As %Status
où:
* qHandle est utilisé pour la communication avec les autres méthodes de l'implémentation de la requête
* Cette méthode doit mettre qHandle dans l'état qui sera ensuite transmis à la méthode queryNameFetch
* qHandle peut être défini comme OREF, une variable ou une variable multidimensionnelle
* Les args sont des paramètres supplémentaires transmis à la requête. Vous pouvez ajouter autant d'args que vous le souhaitez (ou ne pas les utiliser du tout)
* La méthode doit retourner le statut d'initialisation de la requête
Revenons à notre exemple. Vous pouvez itérer dans l'étendue de plusieurs façons (je décrirai plus loin les approches de travail de base pour les requêtes personnalisées), mais pour cet exemple, itérons dans la globale en utilisant la fonction $Order. Dans ce cas, qHandle stockera l'ID actuel, et puisque nous n'avons pas besoin d'arguments supplémentaires, l'argument arg n'est pas nécessaire. Le résultat est le suivant :
ClassMethod AllRecordsExecute(ByRef qHandle As %Binary) As %Status {
Set qHandle = "" Quit $$$OK
}
**La méthode queryNameFetch**
La méthode queryNameFetch renvoie un seul résultat sous la forme $List. La signature de cette méthode est la suivante :
ClassMethod queryNameFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = queryNameExecute ]
where:
* qHandle est utilisé pour la communication avec les autres méthodes de l'implémentation de la requête
* Lorsque la requête est exécutée, les valeurs spécifiées par queryNameExecute ou par un appel précédent de queryNameFetch sont attribuées à qHandle.
* Le rang sera défini soit par une valeur de %List, soit par une chaîne vide, si toutes les données ont été traitées
* AtEnd doit être mis à 1, une fois que la fin des données est atteinte.
* La méthode "Fetch" doit être positionnée après la méthode "Execute", mais cela n'est important que pour SQL statique, c'est-à-dire les curseurs à l'intérieur des requêtes.
En général, les opérations suivantes sont effectuées dans le cadre de cette méthode :
1. Vérifier si nous avons atteint la fin des données
2. S'il reste encore des données : Créez une nouvelle %List et attribuez une valeur à la variable Row
3. Sinon, mettez AtEnd à 1
4. Préparer qHandle pour la prochaine récupération de résultat
5. Retourner l'état
Voici comment cela se présente dans notre exemple :
ClassMethod AllRecordsFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status {
#; itérer dans ^Utils.CustomQueryD
#; ecrire le prochain id dans qHandle et écriture de la valeur de la globale avec le nouvel id dans val
Set qHandle = $Order(^Utils.CustomQueryD(qHandle),1,val)
#; Vérifier s'il reste des données
If qHandle = "" {
Set AtEnd = 1
Set Row = ""
Quit $$$OK
}
#; Si ce n'est pas le cas, créer %List
#; val = $Lb("", Prop1, Prop2) voir définition de Storage
#; Row =$lb(Id,Prop1, Prop2) voir ROWSPEC pour la demande AllRecords
Set Row = $Lb(qHandle, $Lg(val,2), $Lg(val,3))
Quit $$$OK
}
**La méthode queryNameClose**
La méthode queryNameClose met fin à la requête, une fois toutes les données obtenues. La signature de cette méthode est la suivante :
ClassMethod queryNameClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = queryNameFetch ]
où :
* Caché exécute cette méthode après le dernier appel à la méthode queryNameFetch
* En d'autres termes, il s'agit d'un destructeur de requête
* Par conséquent, vous devez disposer de tous les curseurs SQL, des requêtes et des variables locales dans sa mise en œuvre
* Les méthodes renvoient l'état actuel
Dans notre exemple, nous devons supprimer la variable locale qHandle :
ClassMethod AllRecordsClose(ByRef qHandle As %Binary) As %Status {
Kill qHandle
Quit $$$OK
}
Et voilà ! Une fois que vous aurez compilé la classe, vous serez en mesure d'utiliser la requête AllRecords à partir de %SQL.Statement - tout comme les requêtes de la classe de base.
## Approches de la logique d'itération pour les requêtes personnalisées
Alors, quelles approches peuvent être utilisées pour les requêtes personnalisées ? En général, il existe 3 approches de base :
* Itération à travers une globale
* Static SQL
* Dynamic SQL
**Itération à travers une globale**
Cette approche est basée sur l'utilisation de $Order et de fonctions similaires pour l'itération à travers une globale. Elle peut être utilisée dans les cas suivants :
* Les données sont stockées dans des globales (sans classes)
* Vous voulez réduire le nombre de glorefs dans le code
* Les résultats doivent/peuvent être triés par l'indice de la globale
**SQL statique**
L'approche est basée sur les curseurs et le SQL statique. Elle est utilisée pour :
* Rendre le code int plus lisible
* Faciliter le travail avec les curseurs
* Accélération du processus de compilation (le SQL statique est inclus dans la requête de la classe et n'est donc compilé qu'une seule fois).
Remarque:
* Les curseurs générés à partir de requêtes du type %SQLQuery sont nommés automatiquement, par exemple Q14.
* Tous les curseurs utilisés dans une classe doivent avoir des noms différents
* Les messages d'erreur sont liés aux noms internes des curseurs qui comportent des caractères supplémentaires à la fin de leur nom. Par exemple, une erreur dans le curseur Q140 est en fait causée par le curseur Q14.
* Utilisez PlaceAfter et assurez-vous que les curseurs sont utilisés dans la même routine int où ils ont été déclarés.
* INTO doit être utilisé en conjonction avec FETCH, mais pas DECLARE.
Exemple de SQL statique pour Utils.CustomQuery :
Query AllStatic() As %Query(CONTAINID = 1, ROWSPEC = "Id:%String,Prop1:%String,Prop2:%Integer") [ SqlName = AllStatic, SqlProc ]
{
}
ClassMethod AllStaticExecute(ByRef qHandle As %Binary) As %Status
{
&sql(DECLARE C CURSOR FOR
SELECT Id, Prop1, Prop2
FROM Utils.CustomQuery
)
&sql(OPEN C)
Quit $$$OK
}
ClassMethod AllStaticFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = AllStaticExecute ]
{
#; INTO doit être associé à FETCH
&sql(FETCH C INTO :Id, :Prop1, :Prop2)
#; Vérifier si la fin des données est atteinte
If (SQLCODE'=0) {
Set AtEnd = 1
Set Row = ""
Quit $$$OK
}
Set Row = $Lb(Id, Prop1, Prop2)
Quit $$$OK
}
ClassMethod AllStaticClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = AllStaticFetch ]
{
&sql(CLOSE C)
Quit $$$OK
}
**SQL dynamique**
L'approche est basée sur les requêtes d'autres classes et le SQL dynamique. Cette approche est raisonnable lorsqu'en plus d'une requête SQL proprement dite, vous devez également effectuer certaines opérations supplémentaires, par exemple exécuter une requête SQL dans plusieurs espaces de noms ou escalader les permissions avant d'exécuter la requête.
Exemple de SQL dynamique pour Utils.CustomQuery :
Query AllDynamic() As %Query(CONTAINID = 1, ROWSPEC = "Id:%String,Prop1:%String,Prop2:%Integer") [ SqlName = AllDynamic, SqlProc ]
{
}
ClassMethod AllDynamicExecute(ByRef qHandle As %Binary) As %Status
{
Set qHandle = ##class(%SQL.Statement).%ExecDirect(,"SELECT * FROM Utils.CustomQuery")
Quit $$$OK
}
ClassMethod AllDynamicFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status
{
If qHandle.%Next()=0 {
Set AtEnd = 1
Set Row = ""
Quit $$$OK
}
Set Row = $Lb(qHandle.%Get("Id"), qHandle.%Get("Prop1"), qHandle.%Get("Prop2"))
Quit $$$OK
}
ClassMethod AllDynamicClose(ByRef qHandle As %Binary) As %Status
{
Kill qHandle
Quit $$$OK
}
## Approche alternative : %SQL.CustomResultSet
Vous pouvez également créer une requête en sous-classant la classe %SQL.CustomResultSet. Les avantages de cette approche sont les suivants :
* Une légère augmentation de la vitesse
* ROWSPEC est inutile, puisque toutes les métadonnées sont obtenues à partir de la définition de la classe
* Respect des principes de conception orientée objet
Pour créer une requête à partir de la sous-classe de la classe %SQL.CustomResultSet, assurez-vous d'effectuer les étapes suivantes :
1. Définir les propriétés correspondant aux champs résultants
2. Définir les propriétés privées où le contexte de la requête sera stocké
3. Remplacer la méthode %OpenCursor (similaire à queryNameExecute) qui initie le contexte. En cas d'erreur, définissez également %SQLCODE et %Message
4. Remplacer la méthode %Next (similaire à queryNameFetch) qui obtient le résultat suivant. Remplacer les propriétés. La méthode renvoie 0 si toutes les données ont été traitées et 1 s'il reste des données
5. Remplacer la méthode %CloseCursor (similaire à queryNameClose) si nécessaire
Exemple de %SQL.CustomResultSet pour Utils.CustomQuery :
Class Utils.CustomQueryRS Extends %SQL.CustomResultSet
{
Property Id As %String;
Property Prop1 As %String;
Property Prop2 As %Integer;
Method %OpenCursor() As %Library.Status
{
Set ..Id = ""
Quit $$$OK
}
Method %Next(ByRef sc As %Library.Status) As %Library.Integer [ PlaceAfter = %Execute ]
{
Set sc = $$$OK
Set ..Id = $Order(^Utils.CustomQueryD(..Id),1,val)
Quit:..Id="" 0
Set ..Prop1 = $Lg(val,2)
Set ..Prop2 = $Lg(val,3)
Quit $$$OK
}
}
Vous pouvez l'appeler à partir de Caché Object Script code de la manière suivante :
Set resultset= ##class(Utils.CustomQueryRS).%New()
While resultset.%Next() {
Write resultset.Id,!
}
Un autre exemple est disponible dans l'espace de noms SAMPLES - il s'agit de la classe Sample.CustomResultSet qui implémente une requête pour Samples.Person.
## Résumé
Les requêtes personnalisées vous aideront à séparer les expressions SQL du code Caché Object Script et à mettre en œuvre un comportement sophistiqué qui peut être trop difficile pour le SQL pur.
## Références
Class Queries
Itération à travers une globale
SQL statique
Dynamic SQL
%SQL.CustomResultSet
Classe Utils.CustomQuery
Classe Utils.CustomQueryRS
L'auteur tient à remercier [Alexander Koblov] (https://community.intersystems.com/user/alexander-koblov) pour son aide à la composition de cet article.
Annonce
Irène Mykhailova · Août 6, 2022
Salut la communauté !
Alors que nous sommes sur une lancée avec de nouvelles idées pour la communauté des développeurs, nous avons décidé de donner également le crédit là où le crédit est dû (c'est-à-dire vous, nos membres les plus chers), et de partager votre créativité et votre imagination avec les autres.
Nous allons introduire une nouvelle rubrique "Memes InterSystems"! 😜
Il y a un mois, nous avons lancé un défi sur Global Masters où nous vous avons demandé de publier des mèmes qui vous font sourire. Nous nous sommes beaucoup amusés à voir toutes les entrées, nous avons donc décidé de partager cette joie avec tous les membres de DC !
Nous publierons bientôt vos mèmes dans des annonces amusantes spéciales sur DC. Restez à l'écoute! 😝
Vous avez une idée pour un nouveau mème lié à la technologie ISC ? N'hésitez pas à partager les memes dans les commentaires de ce post également.
Nous allons relancer le défi et chaque mois nous choisirons les meilleurs mèmes et les publierons ici, sur la communauté des développeurs, afin que chaque membre rigole
Rejoignez en tant qu'auteur des memes ou en tant que lecteur !
Annonce
Robert Bira · Oct 7, 2022
Salut la communauté,
Nous sommes très heureux de vous présenter nos toutes nouvelles pages À propos de nous ! Veuillez accueillir :
📍 Équipe
📍 Écosystème
Alors...
Rencontrons l'équipe ! Ce sont les personnes qui font que la magie opère ✨
N'hésitez pas à nous contacter : nous sommes là pour faire de la communauté un meilleur endroit pour les développeurs !
De plus, ne manquez pas votre chance de faire connaissance avec toutes nos équipes régionales :
L'équipe ES DC
L'équipe PT DC
L'équipe JP DC
L'équipe CN DC
L'équipe EN DC
Et...
🤩 Rencontrons notre page de présentation de l'écosystème de développeurs InterSystems !
Vous pouvez voir ici un aperçu clair et simple de nos portails et ressources associés où vous pouvez trouver de nombreuses informations intéressantes et utiles :
Comment trouver ces pages ?
Accédez à la section "À propos de nous" dans le menu supérieur :
J'espère que vous apprécierez nos toutes nouvelles pages !
N'hésitez pas à partager vos impressions dans les commentaires ;)
Annonce
Robert Bira · Oct 18, 2022
InterSystems France recherche le développeur qui participera à la planification, au développement, à la maintenance et aux tests de nos logiciels (systèmes d’information hospitaliers). Il est de sa responsabilité de créer des logiciels robustes et de vérifier que les solutions répondent à toutes les obligations. Son rôle consiste également à produire la documentation technique ainsi que de participer au cycle de vie complet du développement de logiciels.
Le développeur
intégrera une équipe R&D Française de taille humaine et devra collaborer avec les équipes R&D internationales
sera amené à travailler en équipe avec des membres de plusieurs départements (Support, Implémentation, commercial)
concevra des structures objets, des schémas SQL et des workflows applicatifs
utilisera en partie la technologie propriétaire de la société (cf : Data Management & Healthcare Information Systems | InterSystems )
créera l’agencement de l’IHM dans le respect des normes applicables à chaque application
se chargera de planifier, développer et tester les programmes en appliquant ses connaissances des techniques de programmation
prêtera assistance pour investiguer et résoudre les erreurs logicielles non reproductibles (support niveau 2)
participera aux implémentations techniques sur site si nécessaire
se tiendra informé des évolutions des fonctionnalités relatives aux logiciels applicatifs
se tiendra informé des évolutions des outils de programmation, des systèmes d’exploitation et des technologies connexes
se tiendra informé des évolutions des normes d’échanges de données applicables
assistera aux sessions de formation produit pour se familiariser avec les fonctionnalités de base des produits et les workflows.
Experience and qualifications
At least five years of experience in large-scale web application development environments.
La capacité d’innovation et la créativité sont des atouts et des qualités vivement encouragées.
Perfect knowledge of the software development life cycle.
Technical skills: SQL - Java - Angular - Linux
Lieu: Île-de-France Métropole (Hybride)
>> appliquer ici <<
Annonce
Irène Mykhailova · Jan 17, 2023
Salut les développeurs,
Nous aimerions vous inviter à participer à notre prochain concours dédié à la création d'outils utiles pour faciliter la vie de vos collègues développeurs :
🏆 Concours d'outils de développement InterSystems 🏆
Soumettez une application qui aide à développer plus rapidement, contribue à un code plus qualitatif et aide au test, au déploiement, au support ou à la surveillance de votre solution avec InterSystems IRIS.
Durée: du 23 janvier au 12 février 202
Prix: $13,500!
Le sujet
💡 Outils de développement InterSystems IRIS 💡
Dans ce concours, nous attendons des applications qui améliorent l'expérience des développeurs avec IRIS, aident à développer plus rapidement, contribuent à un code plus qualitatif, aident à tester, déployer, prendre en charge ou surveiller votre solution avec InterSystems IRIS.
Exigences générales :
Applications acceptées : nouvelles applications Open Exchange ou existantes, mais avec une amélioration significative. Notre équipe examinera toutes les candidatures avant de les approuver pour le concours.
L'application doit fonctionner sur InterSystems IRIS Community Edition.
Types d'applications qui correspondent : UI-frameworks, IDE, gestion de base de données, surveillance, outils de déploiement, etc.
L'application doit être Open Source et publiée sur GitHub.
Le fichier README de l'application doit être en anglais, contenir les étapes d'installation et contenir la vidéo de démonstration ou/et une description du fonctionnement de l'application.
Prix du concours :
1. Nomination d'experts – les gagnants seront sélectionnés par l'équipe d'experts d'InterSystems :
🥇 1ère place - $5,000
🥈 2e place - $3,000
🥉 3e place - $1,500
🏅 4e place - $750
🏅 5e place - $500
🌟 6-10e places - $100
2. Lauréats de la communauté – les candidatures qui recevront le plus de votes au total :
🥇 1ère place - $1,000
🥈 2e place - $750
🥉 3e place - $500
✨ Badges Global Masters pour tous les gagnants sont inclus !
Remarque : Si plusieurs participants obtiennent le même nombre de votes, ils sont tous considérés comme gagnants et le prix en argent est partagé entre les gagnants.
Délais importants :
🛠 Phase de développement et d'enregistrement de l'application :
23 janvier 2023 (00 h 00 HNE) : début du concours
5 février 2023 (23 h 59 HNE) : date limite de soumission
✅ Période de vote :
6 février 2023 (00 h 00 HNE) : début du vote.
12 février 2023 (23 h 59 HNE) : fin des votes.
Remarque : Les développeurs peuvent améliorer leurs applications tout au long de la période d'inscription et de vote.
Qui peut participer ?
Tout membre de la communauté de développeurs, à l'exception des employés d'InterSystems (sous-traitants ISC autorisés). Créer un compte !
👥 Les développeurs peuvent s'associer pour créer une application collaborative. Autorisé de 2 à 5 développeurs dans une équipe.
N'oubliez pas de mettre en surbrillance les membres de votre équipe dans le README de votre application - les profils d'utilisateurs DC.
Ressources utiles :
✓ Exemples d'application :
iris-rad-studio - RAD for UI
cmPurgeBackup - backup tool
errors-global-analytics - errors visualization
objectscript-openapi-definition - open API generator
Test Coverage Tool - test coverage helper
and many more.
✓ Modèles que nous suggérons pour commencer :
iris-dev-template
rest-api-contest-template
native-api-contest-template
iris-fhir-template
iris-fullstack-template
iris-interoperability-template
iris-analytics-template
✓ Pour les débutants avec IRIS :
Build a Server-Side Application with InterSystems IRIS
Learning Path for beginners
✓ Pour les débutants avec ObjectScript Package Manager (IPM) :
How to Build, Test and Publish ZPM Package with REST Application for InterSystems IRIS
Package First Development Approach with InterSystems IRIS and ZPM
✓ Comment soumettre votre application au concours :
How to publish an application on Open Exchange
How to submit an application for the contest
Besoin d'aide?
Rejoignez le canal du concours sur le serveur Discord d'InterSystems ou parlez avec nous dans le commentaire de ce post.
Nous avons hâte de voir vos projets! Bonne chance 👍
En participant à ce concours, vous acceptez les conditions du concours énoncées ici. Veuillez les lire attentivement avant de continuer.
Article
Guillaume Rongier · Juil 12, 2023
L' adaptateur Telegram pour InterSystems IRIS sert de pont entre la populaire plateforme de messagerie Telegram et InterSystems IRIS, facilitant une communication et un échange de données transparents. En exploitant les capacités de l'API Telegram, l'adaptateur permet aux développeurs de créer des chatbots robustes, d'automatiser des tâches et d'intégrer Telegram aux applications d'InterSystems IRIS.
Les scénarios les plus courants dans lesquels l'adaptateur Telegram peut être utilisé sont les suivants :
Notifications système en temps réel : Envoi de notifications immédiates sur des événements spécifiques se produisant dans le système. Il peut s'agir d'alertes, de mises à jour ou d'informations système importantes transmises aux utilisateurs ou aux administrateurs via Telegram.
Interaction avec les clients et applications de chatbot : Il peut s'agir de diverses activités telles que la prise de rendez-vous, les rappels de rendez-vous et la réalisation d'enquêtes NPS (taux de recommandation net) pour recueillir les commentaires des clients. Il est possible de créer des chatbots intelligents qui s'intègrent aux systèmes existants, ont accès à des bases de connaissances étendues et sont capables de répondre aux questions des utilisateurs.
Apprentissage et test : Il peut être utilisé pour diffuser du matériel de formation, des quiz interactifs ou effectuer des évaluations par l'intermédiaire de Telegram.
Caractéristiques et fonctionnalités clés
Communication bidirectionnelle
Toutes les fonctionnalités de l'API Telegram Bot sont prises en charge (https://core.telegram.org/bots/api)
Services commerciaux, opérations métier et messages prêts à l'emploi
Caractéristiques techniques de l'adaptateur.
Le paquet telegram-adapter comprend non seulement l'adaptateur lui-même, mais aussi des services commerciaux prêts à l'emploi (Telegram.LongPollingService.cls et Telegram.WebHookService.cls), une opération métier (Telegram.BusinessOperation) et la classe de message Telegram.Request.
On suppose que vous n'aurez pas besoin de créer vos propres services métier ou opérations métier.
Chacun de ces services métier créera et enverra un message contenant toutes les données brutes (reçues de telegram) au composant de production désigné, comme spécifié dans les paramètres. En outre, vous avez la possibilité de configurer l'enregistrement automatique des fichiers (documents) à partir des messages entrants.
Pour envoyer un message, vous devez créer un message Telegram.Request, en spécifiant la méthode API à invoquer, et dans le champ Data, inclure le JSON avec tous les champs requis pour l'API Telegram. Par exemple, envoyons un message texte :
Set msg = ##class(Telegram.Request).%New()
Set msg.Method = "sendMessage"
// Tous les champs possibles sont décrits ici https://core.telegram.org/bots/api#sendmessage
Set msg.Data = {
"chat_id" : (..ChatId),
"text": ("*bold text*" _$$$NL_ "_italic text_ " _$$$NL_ "```"_$$$NL_"pre-formatted fixed-width "_$$$NL_"code block```"),
"parse_mode": "MarkdownV2",
"disable_notification": "true"
}
Return ..SendRequestAsync("Telegram.BusinessOperation", msg)
Pour envoyer des fichiers tels que des images, des fichiers vidéo, des fichiers audio et d'autres types de fichiers, vous devez ajouter le nom complet du fichier (y compris le chemin d'accès) à la collection "Files" de l'objet Telegram.Request et utiliser le même chemin d'accès dans les champs correspondants du message JSON. Voici un exemple :
Set filePath = "/path/to/photo.jpg"
Set msg = ##class(Telegram.Request).%New()
Set msg.Method = "sendPhoto"
Do msg.Files.Insert(filePath)
// Tous les champs possibles sont décrits ici https://core.telegram.org/bots/api#sendphoto
Set msg.Data = {
"chat_id": (..ChatId),
"photo": (filePath),
"caption": ("IRIS Telegram Adapter Demo")
}
Return ..SendRequestAsync("Telegram.BusinessOperation", msg)
Démonstration de l'adaptateur Telegram
Le paquet telegram-adapter-demo comprend un exemple de mise en œuvre d'un chatbot Echo..
Le chatbot répond à tout message texte qui lui est envoyé. Si vous envoyez un fichier .png, il répondra également avec une vignette de cette image, générée automatiquement par Telegram. Pour exécuter cet exemple, suivez toutes les étapes d'installation décrites dans la documentation fournie ici : . Une fois le processus d'installation terminé, vous pourrez lancer et expérimenter cet exemple de chatbot Echo.
Annonce
Irène Mykhailova · Jan 12, 2024
Salut la Communauté!
Profitez de regarder la nouvelle vidéo pour découvrir les plateformes de données InterSystems IRIS et InterSystems IRIS for Health, les familles de produits HealthShare et InterSystems TrakCare.
📺 Introduction aux produits InterSystems
Cette vidéo est doublée grâce à Bard, l'intelligence artificielle de Google (IA). N'oubliez pas à partager vos réflexions et impressions dans des commentaires après avoir regardé cette vidéo !
Abonnez-vous à la chaîne Youtube d'InterSystems France pour plus de vidéos et restez à l'écoute !