Artigo
· jan 24 3min de leitura

Business Service para consultar o banco de dados IRIS interno

Cenário

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. 

Abordagem desejada

Tenha um Serviço genérico que possa pesquisar o SQL interno para trabalhar com componentes downstream.

Como

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.Snapshot

Isso 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 resultset
set 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 passado
  if $ISOBJECT(html){set html=""}
  //loop para obter títulos das colunas 
  set ColumnIteration=1
  set 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 colunas
  if ColumnCount>0{
    while ColumnIteration<=ColumnCount{
      
      set html= html_ " <th>"_  meta.columns.GetAt(ColumnIteration).colName _" </th>"
      set ColumnIteration=ColumnIteration+1
    }

  }
  set html= html_ " " _"</tr>"
  //não obtenha os dados de cada linha. Em html precisa de um <tr> e td. 
  set coldataiteration=1
  While 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
}

Sparkei/Internal-SQL-Service: serviço da Intersystems que pode ser usado para consultar uma tabela SQL interna para enviar um instantâneo downstream (github.com)
 

Discussão (0)1
Entre ou crie uma conta para continuar