Effacer le filtre
Annonce
Irène Mykhailova · Mai 12
Salut la Communauté !
Nous avons hâte de vous retrouver sur SANTEXPO 2025 !
⏱ Date : 20 mai - 22 mai 2025
📍Lieu : Paris, Porte de Versailles, Hall 1 Stand F43
Du 20 au 22 mai, nos équipes seront de nouveau présentes à SantExpo pour vous montrer comment :
✔️ Améliorer la coordination des soins✔️ Fluidifier les parcours patients✔️ Valoriser les données de santé✔️ Intégrer une IA responsable et utile dans les workflows métiers
Consultez le program complet ici.
De plus, les équipes InterSystems ont le plaisir de vous recevoir pour un moment d'échange et de partage en toute convivialité - Cocktail InterSystems. Mardi 20 mai 2025 à partir de 17h. Inscrivez-vous ici!
Faire avancer la santé numérique ! On se voit à Paris !
Annonce
Irène Mykhailova · Juin 4
Salut la Communauté !
Nous avons hâte de vous retrouver sur HIMSS 2025 - Conférence et exposition européenne sur la santé !
⏱ Date : 10 - 12 juin 2025
📍Lieu : Palais des Congrès de Paris, stand F15, Paris, France
Trois jours pour découvrir ce qui se fait de mieux en matière de santé numérique en Europe.
Trois jours pour échanger, s’inspirer, rencontrer… et co-créer ensemble la santé de demain. Sur notre stand, on partagera AUSSI ce qu’on fait de mieux :
DPI intelligent
coordination territoriale
responsabilité populationnelle
intelligence artificielle au service des professionnels de santé
FHIR
Espace Européen des Données de Santé…
Notre démo live pour découvrir comment deux hôpitaux européens peuvent partager des données de santé grâce à l’International Patient Summary (IPS), basé sur FHIR et les technologies InterSystems.
Bref, que vous soyez expert, porteur de projet ou simplement passionné… passez nous voir ! On a hâte d’échanger avec vous !
Inscrivez-vous ici!
Annonce
Irène Mykhailova · Mars 23, 2023
Nous sommes ravis d'inviter tous nos clients, partenaires, développeurs et membres de la communauté à notre InterSystems Global Summit 2023 en personne !
Notre conférence des utilisateurs du Global Summit est votre opportunité de vous connecter avec des développeurs de produits pionniers, d'autres utilisateurs poussant notre technologie vers de nouvelles frontières et les personnes dont la pensée originale fait vibrer nos universités et nos salles de conseil. Le tout dans le même espace. Et les inscriptions sont désormais ouvertes !
➡️ InterSystems Global Summit 2023
🗓 Dates : 4-7 juin 2023
📍 Lieu : Diplomat Beach Resort, Hollywood, Floride, États-Unis
Rejoignez-nous cette année pour découvrir comment des clients comme vous utilisent notre technologie pour innover et quelles tendances affectent nos innovations futures, y compris les produits et les offres de produits nouveaux et améliorés.
Voici un petit aperçu de l'ordre du jour.
Dimanche 4 juin
Sortie de golf ou activités sociales du matinRetrait des badgesBootcamp technologiqueExamens de certificationRencontre des femmesRéception de bienvenue
Lundi 5 juin
Bienvenue et KeynotesSéances en petits groupesConférence sur le leadership des soins de santéPavillon des partenairesRéunions 1:1Examens de certificationGroupes de discussionÉchange technologiqueSéances d'affinitéBoissons et démos en soirée
Mardi 6 juin
Keynotes Séances en petits groupesPavillon des partenairesRéunions 1:1Examens de certificationGroupes de discussionÉchange technologiqueSéances d'affinitéÉvénement social en soirée
Mercredi 7 juin
KeynotesSéances en petits groupesPavillon des partenairesRéunions 1:1Examens de certificationGroupes de discussionÉchange technologiqueRéception d'adieu
Pour plus d'informations sur l'ordre du jour, rendez-vous ici.
Nous avons hâte de vous voir à l'InterSystems Global Summit 2023 !
353 Publications•0 Abonnés
17 Publications•0 Abonnés
12 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 <<