Article
· Avr 15 7m de lecture

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 report
ClassMethod GetReport() As %Status
{
    Set Parameters = {}

    Set result = ##class(dc.jirisreport.JIRISReport).GenerateReportAsFile(
        "jdbc:IRIS://localhost:1972/USER", 
        "/home/irisowner/dev/sample.jrxml",
        "/tmp/sample.pdf",
        Parameters 
    )
        
    Set %response.ContentType = "application/pdf"
    Do %response.SetHeader("Content-Disposition","attachment;filename=""sample.pdf""")
    Set %response.NoCharSetConvert=1
    Set %response.Headers("Access-Control-Allow-Origin")="*"
    Set stream=##class(%Stream.FileBinary).%New()
    Set sc=stream.LinkToFile("/tmp/sample.pdf")
    Do stream.OutputToDevice() 
    
    Set tSC=$$$OK
}
  • 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 report
ClassMethod GetReport() As %Status
{
    Set Parameters = {}

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

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

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

    #dim tSC As %Status = $$$OK
    Set rset = ##class(dc.Sample.Person).ExtentFunc()

    Set %response.ContentType = ..#CONTENTTYPEJSON
    Write "["
    if rset.%Next() {
        Set person = ##class(dc.Sample.Person).%OpenId(rset.ID)    
        Do person.%JSONExport()
    }
    While rset.%Next() {   
        Write ","
        Set person = ##class(dc.Sample.Person).%OpenId(rset.ID)    
        Do person.%JSONExport()
    }
    Write "]"
    Quit tSC
}

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

    Set person = ##class(dc.Sample.Person).%OpenId(id)

    If '$IsObject(person) Quit ..Http404()

    Do person.%JSONExport()

    Quit tSC
}

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

    Set %response.Status = 204
    Set %response.ContentType = ..#CONTENTTYPEJSON
    //d data.%ToJSON()
    Do person.%JSONExport()

    Quit tSC
}

/// Update a record in dc.Sample.Person with id
ClassMethod UpdatePerson(id As %Integer) As %Status
{
    #dim tSC As %Status = $$$OK
    #dim e As %Exception.AbstractException
    Set 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())

    Set %response.Status = 200
    Set %response.ContentType = ..#CONTENTTYPEJSON
    Do person.%JSONExport()

    Quit tSC
}

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

    $$$TOE(tSC,person.%DeleteId(id))

    Set %response.Status = 200
    Set %response.ContentType = ..#CONTENTTYPEJSON

    Quit tSC
}

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

    Try {
        set status = ##class(dc.Sample.Person).AddTestData(amount)
        $$$ThrowOnError(status)
        Set message = "Created "_amount_" random persons in Sample.Person data"
    } Catch(ex) {
        Set tSC = ex.Code
    }
    Return 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.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer