Service métier pour interroger la base de données IRIS interne
IRIS propose des adaptateurs entrants SQL à utiliser avec des passerelles SQL telles que EnsLib.SQL.InboundAdapter pour interroger à plusieurs reprises les connexions SQL Gateway. Un scénario est apparu dans lequel nous voulions interroger une base de données interne pour certaines données, mais nous n'avons pas vu de service prêt à l'emploi pour cela.
Disposer d'un service générique capable d'interroger le SQL interne pour fonctionner avec les composants en aval.
Ce qui n'était pas clair, c'était "Comment envoyer un ensemble de résultats en aval". Ce n'était pas très clair car un jeu de résultats lui-même n'est pas une classe persistante et l'objet ne peut pas être "Swizzled", provoquant une erreur comme celle-ci
<METHOD DOES NOT EXIST>zNewRequestMessage+4^Ens.MessageHeader.1 *%GetSwizzleObject,%sqlcq.SRFT.cls535 -- logged as '-'
number - @''La solution etait d'utiliser l'objet
EnsLib.SQL.SnapshotCela peut ensuite être utilisé comme une opération commerciale pour envoyer un ensemble de résultats en aval en utilisant la fonction Import from resultset
set result=##class(EnsLib.SQL.Snapshot).%New()
// Some SQL query here resulting in resultset where rset is the resultset objectset tSC=result.ImportFromResultSet(rset)Vous pouvez ensuite l'envoyer à une autre opération
set tSC=..SendRequestAsync(..ForwardComponentName,result,0) Quit:$$$ISERR(tSC)
Notez dans le code téléchargé sur l'échange ouvert disponible ici via github . L'exemple est que vous pouvez l'ouvrir et l'interroger. Ce qui suit est la méthode de classe utilisée pour insérer un code HTML. Cela diffère légèrement de l'exemple publié car il est tiré d'une implémentation en direct.
ClassMethod GetDataTable(pRequest As EnsLib.SQL.Snapshot, html As%String) As%String
{
//first html obj can be if the styling needs passedif$ISOBJECT(html){set html=""}
//loop get column titles set ColumnIteration=1set ColumnCount=pRequest.%ResultColumnCountGet()
set html=html_" <table class=""tg"">"set html= html_ " " _"<tr>"set meta=pRequest.%GetMetadata() //this is like raw text of the result using it to get the column titles outif ColumnCount>0{
while ColumnIteration<=ColumnCount{
set html= html_ " <th>"_ meta.columns.GetAt(ColumnIteration).colName _" </th>"set ColumnIteration=ColumnIteration+1
}
}
set html= html_ " " _"</tr>"//not get the data from each row. In html need a <tr> and a td. set coldataiteration=1While pRequest.%Next() {
set html= html_ " <tr>"while coldataiteration <=ColumnCount{
set html= html_ " <td> "_pRequest.%GetData(coldataiteration) _" </td>"set coldataiteration=coldataiteration+1
}
set html= html_ " </tr>"set coldataiteration=1
}
set html= html_ " " _"</table>"$$$TRACE(html)
return html
}