Écrit par

Associate professor at Igor Sikorsky Kyiv Polytechnic Institute
Article Iryna Mykhailova · Avr 15, 2024 7m read

Partie II : Les rapports glisser-déposer de la Jasperreports open source pour IRIS

Dans la partie II, vous apprendrez à exécuter n'importe quel fichier de rapport Jasper (fichier jrxml) conçu sur Jasper Studio à partir d'InterSystems IRIS. Nous allons créer une API REST pour renvoyer un rapport traité au format PDF.

Le fichier jrxml

Dans la partie I, nous avons conçu le rapport suivant :

1. Tout d'abord, renommez le rapport de Blank_A4.jrxml en sample.jrxml (onglet Explorateur de projet > Faites un clic droit sur le fichier > Renommer):

Le fichier renommé s'affiche :

2. Faites un clic droit sur le fichier sample.jrxml > Propriétés et visualisez l'emplacement du fichier :

3. Copiez le fichier de cet emplacement vers l'instance docker (instance docker créée dans la Partie I) dans le dossier /home/irisowner/dev:

docker cp C:\Users\yurim\JaspersoftWorkspace\MyReports\sample.jrxml jirisreport-api-sample-iris-1:/home/irisowner/dev

Installez JIRISReport pour être en mesure d'exécuter Jasper à partir d'IRIS

1. Ouvrez le code source sur VSCode (installez ObjectScript et les extensions InterSystems si vous ne les avez pas encore) et sélectionnez en bas docker:iris52773[USER] pour ouvrir les options :

2. Sélectionnez l'option Ouvrir un terminal dans Docker :

3. Le terminal s'affiche :

4. Tapez zpm pour lancer l'interpréteur de commandes zpm :

5. Tapez, exécutez et attendez l'installation (cela prend un certain temps) :

zpm:USER>install jirisreport -verbose

6. Découvrez les résultats de l'installation :




Les informations d'identification du rapport

Le JIRISReport se connecte à la base de données en utilisant l'utilisateur et le mot de passe configurés dans l'interopérabilité > informations d'identification. Pour définir les informations d'identification, procédez comme suit :

1. Ouvrez le portail de gestion (http://localhost:52773/csp/sys/UtilHome.csp?$NAMESPACE=USER):

2. Accédez à l'Interopérabilité > Configurez > Les informations d'identification:

3. Créez les informations d'identification de ReportCreds :

  • Identifiant : ReportCreds
  • Nom d'utilidateur : _SYSTEM
  • Mot de passe : SYS

L' API REST :

1. Accédez à src\dc\Sample\PersonREST.cls, modifiez le fichier pour inclure une méthode REST sur les routes :

<!-- All persons Report -->
<Route Url="/report" Method="GET" Call="GetReport" Cors="true"/>

2. Mise en œuvre de la méthode :

/// Get all persons reportClassMethod GetReport() As%Status
{
    Set Parameters = {}
<span class="hljs-keyword">Set</span> result = <span class="hljs-keyword">##class</span>(dc.jirisreport.JIRISReport).GenerateReportAsFile(
    <span class="hljs-string">"jdbc:IRIS://localhost:1972/USER"</span>, 
    <span class="hljs-string">"/home/irisowner/dev/sample.jrxml"</span>,
    <span class="hljs-string">"/tmp/sample.pdf"</span>,
    Parameters 
)
    
<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.ContentType</span> = <span class="hljs-string">"application/pdf"</span>
<span class="hljs-keyword">Do</span> <span class="hljs-built_in">%response.SetHeader</span>(<span class="hljs-string">"Content-Disposition"</span>,<span class="hljs-string">"attachment;filename=""sample.pdf"""</span>)
<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.NoCharSetConvert</span>=<span class="hljs-number">1</span>
<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.Headers</span>(<span class="hljs-string">"Access-Control-Allow-Origin"</span>)=<span class="hljs-string">"*"</span>
<span class="hljs-keyword">Set</span> stream=<span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%Stream.FileBinary</span>).<span class="hljs-built_in">%New</span>()
<span class="hljs-keyword">Set</span> sc=stream.LinkToFile(<span class="hljs-string">"/tmp/sample.pdf"</span>)
<span class="hljs-keyword">Do</span> stream.OutputToDevice() 

<span class="hljs-keyword">Set</span> tSC=<span class="hljs-built_in">$$$OK</span>

}

  • La classe dc.jirisreport.JIRISReport est une classe utilitaire pour générer des rapports à l'aide de la bibliothèque JasperReports.
  • La méthode GenerateReportAsFile récupère l'URL JDBC, le chemin d'accès au fichier de rapport et le chemin de sortie PDF et génère le rapport sur le chemin de sortie.

3. Enregistrez le fichier PersonREST.cls pour le compiler sur le serveur (VSCode doit être connecté pour envoyer la nouvelle version au serveur). Découvrez la version finale du fichier :

Class dc.Sample.PersonREST Extends Sample.REST.Base
{

Parameter Version = "1.0.6"; XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { <Routes> <!-- All persons Report --> <Route Url="/report" Method="GET" Call="GetReport" Cors="true"/> <!-- Server Info --> <Route Url="/" Method="GET" Call="GetInfo" Cors="true"/> <!-- Get all records of Person class --> <Route Url="/persons/all" Method="GET" Call="GetAllPersons"/> <!-- Swagger specs --> <Route Url="/_spec" Method="GET" Call="SwaggerSpec" /> <!-- GET method to return JSON for a given person id--> <Route Url="/persons/:id" Method="GET" Call="GetPerson"/> <!-- Update a person with id--> <Route Url="/persons/:id" Method="PUT" Call="UpdatePerson"/> <!-- Delete a person with id--> <Route Url="/persons/:id" Method="DELETE" Call="DeletePerson"/> <!-- Create a person--> <Route Url="/persons/" Method="POST" Call="CreatePerson"/> <!-- Create random persons--> <Route Url="/persons/gen/:amount" Method="POST" Call="CreateRandomPersons"/>

</Routes> }

/// Get all persons reportClassMethod GetReport() As%Status { Set Parameters = {}

<span class="hljs-keyword">Set</span> result = <span class="hljs-keyword">##class</span>(dc.jirisreport.JIRISReport).GenerateReportAsFile(
    <span class="hljs-string">"jdbc:IRIS://localhost:1972/USER"</span>, 
    <span class="hljs-string">"/home/irisowner/dev/sample.jrxml"</span>,
    <span class="hljs-string">"/tmp/sample.pdf"</span>,
    Parameters 
) 
    
<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.ContentType</span> = <span class="hljs-string">"application/pdf"</span>
<span class="hljs-keyword">Do</span> <span class="hljs-built_in">%response.SetHeader</span>(<span class="hljs-string">"Content-Disposition"</span>,<span class="hljs-string">"attachment;filename=""sample.pdf"""</span>)
<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.NoCharSetConvert</span>=<span class="hljs-number">1</span>
<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.Headers</span>(<span class="hljs-string">"Access-Control-Allow-Origin"</span>)=<span class="hljs-string">"*"</span>
<span class="hljs-keyword">Set</span> stream=<span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%Stream.FileBinary</span>).<span class="hljs-built_in">%New</span>()
<span class="hljs-keyword">Set</span> sc=stream.LinkToFile(<span class="hljs-string">"/tmp/sample.pdf"</span>)
<span class="hljs-keyword">Do</span> stream.OutputToDevice() 

<span class="hljs-keyword">Set</span> tSC=<span class="hljs-built_in">$$$OK</span>

}

/// PersonsREST general informationClassMethod GetInfo() As%Status { SET version = ..#Version SET info = { "version": (version) } RETURN ..%ProcessResult($$$OK, info) }

/// Retreive all the records of dc.Sample.PersonClassMethod GetAllPersons() As%Status {

<span class="hljs-keyword">#dim</span> tSC <span class="hljs-keyword">As</span> <span class="hljs-built_in">%Status</span> = <span class="hljs-built_in">$$$OK</span>
<span class="hljs-keyword">Set</span> rset = <span class="hljs-keyword">##class</span>(dc.Sample.Person).ExtentFunc()

<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.ContentType</span> = ..#CONTENTTYPEJSON
<span class="hljs-keyword">Write</span> <span class="hljs-string">"["</span>
<span class="hljs-keyword">if</span> rset.<span class="hljs-built_in">%Next</span>() {
    <span class="hljs-keyword">Set</span> person = <span class="hljs-keyword">##class</span>(dc.Sample.Person).<span class="hljs-built_in">%OpenId</span>(rset.ID)    
    <span class="hljs-keyword">Do</span> person.<span class="hljs-built_in">%JSONExport</span>()
}
<span class="hljs-keyword">While</span> rset.<span class="hljs-built_in">%Next</span>() {   
    <span class="hljs-keyword">Write</span> <span class="hljs-string">","</span>
    <span class="hljs-keyword">Set</span> person = <span class="hljs-keyword">##class</span>(dc.Sample.Person).<span class="hljs-built_in">%OpenId</span>(rset.ID)    
    <span class="hljs-keyword">Do</span> person.<span class="hljs-built_in">%JSONExport</span>()
}
<span class="hljs-keyword">Write</span> <span class="hljs-string">"]"</span>
<span class="hljs-keyword">Quit</span> tSC

}

/// Return one record fo dc.Sample.PersonClassMethod GetPerson(id As%Integer) As%Status { #dim tSC As%Status = $$$OK#dim e As%Exception.AbstractException #; Set the response header to plain textSet%response.ContentType = ..#CONTENTTYPEJSON

<span class="hljs-keyword">Set</span> person = <span class="hljs-keyword">##class</span>(dc.Sample.Person).<span class="hljs-built_in">%OpenId</span>(id)

<span class="hljs-keyword">If</span> '<span class="hljs-built_in">$IsObject</span>(person) <span class="hljs-keyword">Quit</span> <span class="hljs-built_in">..Http</span>404()

<span class="hljs-keyword">Do</span> person.<span class="hljs-built_in">%JSONExport</span>()

<span class="hljs-keyword">Quit</span> tSC

}

/// Creates a new dc.Sample.Person recordClassMethod CreatePerson() As%Status { #dim tSC As%Status = $$$OK#dim e As%Exception.AbstractExceptionSet person = ##class(dc.Sample.Person).%New() Set data=%request.Content$$$TOE(tSC,person.%JSONImport(data)) $$$TOE(tSC,person.%Save())

<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.Status</span> = <span class="hljs-number">204</span>
<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.ContentType</span> = ..#CONTENTTYPEJSON
<span class="hljs-comment">//d data.%ToJSON()</span>
<span class="hljs-keyword">Do</span> person.<span class="hljs-built_in">%JSONExport</span>()

<span class="hljs-keyword">Quit</span> tSC

}

/// Update a record in dc.Sample.Person with idClassMethod UpdatePerson(id As%Integer) As%Status { #dim tSC As%Status = $$$OK#dim e As%Exception.AbstractExceptionSet person = ##class(dc.Sample.Person).%OpenId(id) If '$IsObject(person) Return..Http404() Set data=%request.Content$$$TOE(tSC,person.%JSONImport(data)) $$$TOE(tSC,person.%Save())

<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.Status</span> = <span class="hljs-number">200</span>
<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.ContentType</span> = ..#CONTENTTYPEJSON
<span class="hljs-keyword">Do</span> person.<span class="hljs-built_in">%JSONExport</span>()

<span class="hljs-keyword">Quit</span> tSC

}

/// Delete a record with id in dc.Sample.PersonClassMethod DeletePerson(id As%Integer) As%Status { #dim tSC As%Status = $$$OK#dim e As%Exception.AbstractExceptionSet person = ##class(dc.Sample.Person).%OpenId(id) If '$IsObject(person) Return..Http404()

<span class="hljs-built_in">$$$TOE</span>(tSC,person.<span class="hljs-built_in">%DeleteId</span>(id))

<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.Status</span> = <span class="hljs-number">200</span>
<span class="hljs-keyword">Set</span> <span class="hljs-built_in">%response.ContentType</span> = ..#CONTENTTYPEJSON

<span class="hljs-keyword">Quit</span> tSC

}

ClassMethod CreateRandomPersons(amount As%Integer) As%Status { #dim tSC As%Status = $$$OKSet%response.ContentType = ..#CONTENTTYPEJSON

<span class="hljs-keyword">Try</span> {
    <span class="hljs-keyword">set</span> status = <span class="hljs-keyword">##class</span>(dc.Sample.Person).AddTestData(amount)
    <span class="hljs-built_in">$$$ThrowOnError</span>(status)
    <span class="hljs-keyword">Set</span> message = <span class="hljs-string">"Created "</span>_amount_<span class="hljs-string">" random persons in Sample.Person data"</span>
} <span class="hljs-keyword">Catch</span>(ex) {
    <span class="hljs-keyword">Set</span> tSC = ex.Code
}
<span class="hljs-keyword">Return</span> tSC

}

ClassMethod SwaggerSpec() As%Status { Set tSC = ##class(%REST.API).GetWebRESTApplication($NAMESPACE, %request.Application, .swagger) Do swagger.info.%Remove("x-ISC_Namespace") Set swagger.basePath = "/crud"Set swagger.info.title = "InterSystems IRIS REST CRUD demo"Set swagger.info.version = "0.1"Set swagger.host = "localhost:52773"Return ..%ProcessResult($$$OK, swagger) }

}

Création de données et obtention d'un rapport à partir de l'interface utilisateur Swagger

1. Accédez à la page de l'interface utilisateur Swagger (http://localhost:52773/swagger-ui/index.html):

2. Accédez à la méthode /persons/gen/{amount}, développez-la, fixez le montant à 10 et le contenu à {}, puis exécutez-la (bouton Exécuter) :

3. Accédez maintenant à la méthode /report et exécutez-la :

4. Cliquez sur le lien de téléchargement du fichier :

5. Découvrez les résultats :

Tout est prêt ! Vous disposez d'une API avec générateur de rapports. Dans le prochain article, nous concevrons un rapport avec des paramètres.