(Respuesta de @Eduard Lebedyuk)

Ver enlace original en https://community.intersystems.com/post/how-automatically-test-deepsee-p...

Aquí algunas ideas

  1. Recupera una lista de pivots
  2. Por cada elemento
    • Obtén el MDX
    • Intenta ejecutar el MDX
    • Si falla, guarda el error
  3. Añade/visualiza los errores

Debería de ser factible, DeepSee API tiene todas las funciones necesarias para hacerlo

Hola,

Os comento las respuestas obtenidas en el community en inglés. Adjunto también el enlace a la respuesta original.

Respuesta de @Robert Cemper 
https://community.intersystems.com/post/query-method-class-persistent-us...

#2) El segundo ejemplo no puede funcionar, principalmente porque no pasa un parámetro en la llamada

#1) NO está previsto utilizar propiedades de objeto vomo variables del lengiaje principal en SQL

El código falla en el métode Execute generado

set tResult = tStatement.%Execute($g(pObject.KeyProcess),$g(pObject.CodeSpecialist),$g(pObject.CodeProvider),$g(pObject.CodeCenter),$g(pObject.Date))

El método $GET object-property simplemente no está implementado. Está definido por la clase y siempre está ahí, pero es necesario y tiene sentido para propiedades multidimensionados

Esto es válido para ObjectScript como tal y no está relacionado con SQL.
Es como tener un método $g(NOTHING, pObkect.KeyProcess)... osea, nada

Alternativas:

  1. Manipular directamente el código generado. No recomendado
  2. Mover las propiedades con una función auxiliar a variables loclaes y ajusta la consulta con esas variables
ClassMethod FillProp(pObject As Kurro.MyClass) As %Boolean [ SqlName = FILLP, SqlProc ]
{
if '$isObject(pObject) set obj=##class(Kurro.MyClass).%OpenId(pObject)
else  set obj=pObject
set %Kurro("kp")=obj.KeyProcess
     ,%Kurro("sp")= obj.CodeSpecialist
     ,%Kurro("pr")= obj.CodeProvider
     ,%Kurro("cs")= obj.CodeCenter
    ,%Kurro("dt")= obj.Date
quit 1
}

Y la invocación sería de esta forma:

Query GetInfoRcc(objid As %Integer) As %SQLQuery(CONTAINID = 0, ROWSPEC = "IdList:%String,IdProcess:%String,Duration:%String")
{
    SELECT IdList, IdProcess, Duration
    FROM Kurro.MyClass
    WHERE KeyProcess = :%Kurro("kp")
    AND CodeSpecialist = :%Kurro("sp")
    AND CodeProvider = :%Kurro("pr")
    AND CodeCenter = :%Kurro("cs")
    AND "Date" = :%Kurro("dt")
   AND FILLP(:objid) = 1
}

Respuesta de @Vitaliy.Serdtsev 
https://community.intersystems.com/post/query-method-class-persistent-us...

Tal y como ha comentado Robert, el problema está en el $GET(), por lo que en lugar de utilizar el método %Library.SqlQuery:Func(), utilizar el PrepareClaseQuery

Query GetInfo(pObject AS Kurro.MyClass) As %SQLQuery(CONTAINID = 1, ROWSPEC = "IdList:%String,IdProcess:%String,Duration:%String") [ SqlProc ]
{
    SELECT IdList, IdProcess, Duration
    FROM Kurro.MyClass
    WHERE KeyProcess = :pObject.KeyProcess
    AND CodeSpecialist = :pObject.CodeSpecialist
    AND CodeProvider = :pObject.CodeProvider
    AND CodeCenter = :pObject.CodeCenter
    AND "Date" = :pObject.Date
}


set obj=##class(Kurro.MyClass).%New()
set obj.KeyProcess="1033004-1#"
set obj.CodeSpecialist = "surgery"
set obj.CodeProvider = "PR002"
set obj.CodeCenter = "CENTER-01"
set obj.Date = $ZDATETIME($ZDATETIMEH("2021-04-30 15:45:00",3,1),3,1)

set st=##class(%SQL.Statement).%New()
set sc=st.%PrepareClassQuery("Kurro.MyClass","GetInfo")
  if $$$ISERR(sc) {write "%PrepareClassQuery failed:" do $System.Status.DisplayError(sc) quit}
set result=st.%Execute(obj)
do result.%Display()

He utilizado la última respuesta para solucionar mi problema y funciona muy bien

Mucha gracias a los dos por estas respuestas.

Un saludo,
Kurro

Usando las trazas:

set ^ISCSOAP("LogFile")="c:\temp\SOAP.log"
set ^ISCSOAP("Log")="ios"

 He visto que la respuesta era la del servidor y es como si no estuviera llegando al servicio.

La configuración que tenía era como esta

Al poner toda la ruta en el campo "Web Service URL" ha empezado a responder correctamente

http://myserver.com/path/service

Tenemos implementados otros WS y han funcionado correctamente indicando el servicio en el otro campo, pero creo que son por lo que son del tipo

http://myserver.com/path/server.asmx

Este servicio está creado en java y está desplegado en JBoss

Gracias por tu ayuda.

Un saludo,
Kurro

Gracias Alberto.

Puede que sea por la versión de Caché, dado que estamos usando la 2017.2.1

$ZV: Cache for Windows (x86-64) 2017.2.1 (Build 801_3U) Thu Apr 12 2018 10:02:23 EDT
Product version: Ensemble 2017.1
 
Hay muchas cosas que están funcionando bien en IRIS, y esperamos que pronto nuestro cliente haga la migración a IRIS, pero por ahora tenemos que hacer "malabarismos" con estas cosas.
 
Al final lo he tenido que mapear a mano una vez recibido los datos.
 
Un saludo,
Kurro

Buenas, en el foro en inglés me han dado varias soluciones y os expongo la que he tomado finalmente

He añadido un nuevo método en la clase Request

 
Method Find(item As LabCenter)
{
    for i=1:1:..ListCenter.Count(){
        set tmp=..ListCenter.GetAt(i)
        if tmp.LabId=item.LabIdtmp.Center=item.Centertmp.Code=item.Code return i
    }
 
    quit 0
}

De este modo, encuentro mi Lab-Center

> set obj=##class(ListLabCenter).%OpenId(1)
> zw obj
obj=<OBJECT REFERENCE>[2@ListLabCenter]
+----------------- general information ---------------
|      oref value: 2
|      class name: ListLabCenter
|           %%OID: $lb("1","ListLabCenter")
| reference count: 2
+----------------- attribute values ------------------
|       %Concurrency = 1  <Set>
+----------------- swizzled references ---------------
|      i%ListCenter = ""
|   i%ListCenter(1) = $lb($lb("A08829848","A088298480001",""))
|   i%ListCenter(2) = $lb($lb("A08829848","A088298480002",""))
|   i%ListCenter(3) = $lb($lb("A08829848","A088298480003",""))
|   i%ListCenter(4) = $lb($lb("U66700196","U667001960002",""))
|   i%ListCenter(5) = $lb($lb("U66700196","U667001960003",""))
|   r%ListCenter = "1@%Collection.ListOfObj"
|   r%ListCenter(1) = "3@LabCenter"
+-----------------------------------------------------
> set objFind = ##class(LabCenter).%New()
> set objFind.LabId="A08829848"
> set objFind.Center="A088298480003"
> zw objFind
objFind=<OBJECT REFERENCE>[5@LabCenter]
+----------------- general information ---------------
|      oref value: 5
|      class name: LabCenter
| reference count: 2
+----------------- attribute values ------------------
|             Center = "A088298480003"
|               Code = ""
|              LabId = "A08829848"
+-----------------------------------------------------
> w obj.Find(objFind)
3
> set objFindFake = ##class(LabCenter).%New()
> set objFindFake.LabId="FAKE"
> set objFindFake.Center="A088298480003"
> w obj.Find(objFindFake)
0

Un saludo a todos

Efectivamente,

El problema está en el backspace ($c(8,......)) porque en una simulación en HTML no es reconocido ese caracter.

Prueba a cambiar por esta linea:

 f  v#1 q:(v?.1n) " !no number", $c(27,91)_12_"D"

Esto sería la sentencia ESC[12D que sería lo mismo pero el WebTerminal si sabría interpretarlo

Espero que te sirva de mucha ayuda

Un saludo,

Kurro López