Business Service para consultar o banco de dados IRIS interno
O IRIS tem adaptadores de entrada SQL para uso com SQL gateways, como EnsLib.SQL.InboundAdapter, para consultar repetidamente as conexões do SQL Gateway. Surgiu uma situação em que queríamos consultar alguns dados em um banco de dados interno, mas não encontramos um serviço pronto para uso com essa finalidade.
Tenha um Serviço genérico que possa pesquisar o SQL interno para trabalhar com componentes downstream.
O que não ficou claro era "Como envio um conjunto de resultados downstream". Não estava muito claro porque o próprio resultset não é uma classe persistente, e o objeto não pode ser "Convertido" em um erro assim
<METHOD DOES NOT EXIST>zNewRequestMessage+4^Ens.MessageHeader.1 *%GetSwizzleObject,%sqlcq.SRFT.cls535 -- logged as '-'
number - @''A solução era usar o objeto
EnsLib.SQL.SnapshotIsso pode ser usado como uma operação de negócios para enviar um resultset downstream ao usar a função Import from resultset (Importar de resultset)
set result=##class(EnsLib.SQL.Snapshot).%New()
// Uma consulta SQL aqui resultando em resultset onde rset é objeto resultsetset tSC=result.ImportFromResultSet(rset)Depois, você pode enviar isso para outra operação
set tSC=..SendRequestAsync(..ForwardComponentName,result,0) Quit:$$$ISERR(tSC)
Observe no código carregado no open exchange, disponível aqui pelo github. Você pode abrir e consultar o exemplo. Abaixo está o classmethod usado para colocá-lo em um html. É um pouco diferente do exemplo publicado, já que foi tirado de uma implementação ativa.
ClassMethod GetDataTable(pRequest As EnsLib.SQL.Snapshot, html As%String) As%String
{
//o primeiro obj html pode ser se o estilo precisa ser passadoif$ISOBJECT(html){set html=""}
//loop para obter títulos das colunas set ColumnIteration=1set ColumnCount=pRequest.%ResultColumnCountGet()
set html=html_" <table class=""tg"">"set html= html_ " " _"<tr>"set meta=pRequest.%GetMetadata() //é como o texto bruto do resultado usando-o para tirar os títulos das colunasif ColumnCount>0{
while ColumnIteration<=ColumnCount{
<span class="hljs-keyword">set</span> html= html_ <span class="hljs-string">" <th>"</span>_ meta.columns.GetAt(ColumnIteration).colName _<span class="hljs-string">" </th>"</span>
<span class="hljs-keyword">set</span> ColumnIteration=ColumnIteration+<span class="hljs-number">1</span>
}
}
set html= html_ " ""</tr>"//não obtenha os dados de cada linha. Em html precisa de um <tr> e 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
}
<span class="hljs-keyword">set</span> html= html_ <span class="hljs-string">" </tr>"</span>
<span class="hljs-keyword">set</span> coldataiteration=<span class="hljs-number">1</span>
}
set html= html_ " " _"</table>"$$$TRACE(html)
return html
}