Written by

Technical Delivery Master at Deloitte
Question Michael Wood · Jul 18, 2023

Method to return value of object element

I am trying to write a class method to return the value of a object element.  Input to method is the object and element. I am not getting a value returned. What am I missing?

ClassMethod GetObjectFieldValue(pObject As %DynamicAbstractObject, pField As %String) As %String
{
    quit:pObject="" ""
    quit:pField="" ""set tResponse=""
    set tResponse = pObject.%Get(pField)
    return tResponse

}

Here is my input data,

{
    "priority": "2",
    "lastmodifieduser": "PORTAL",
    "assignedto": "jdoe01 STAFF",
    "status": "REVIEW",
    "documentclass": "PATIENTCASE",
    "versiontoken": "937486",
    "departmentid": "999",
    "patientcaseid": "105555424",
    "providerusername": "jdoe01",
    "internalnote": "firstMessage",
    "subject": "first123",
    "patientid": 9877654321,
    "createduser": "PORTAL",
    "description": "patient case - first123",
    "documentroute": "MDP",
    "documentsubclass": "PATIENTCASE_CLINICALQUESTION",
    "documentsource": "PORTAL",
    "createddate": "07/17/2023",
    "lastmodifieddate": "07/17/2023"
}

Product version: IRIS 2021.2

Comments

David Hockenbroch · Jul 18, 2023

It looks to me like you might want to use %DynamicObject instead of %DynamicAbstractObject. %DynamicAbstractObject doesn't have a %Get method.

0
Michael Wood  Jul 18, 2023 to David Hockenbroch

Tried that. Still did not get a response with a value.

0
Julius Kavay  Jul 18, 2023 to Michael Wood

Nice, now we know nearly everything, except the most important info: what is the content of pField?

I assume, pObject contains the above JSON, i.e.

set pObject = {"priority": "2",
               "lastmodifieduser": "PORTAL",
               "assignedto": "jdoe01 STAFF",
               ...
               }
               
0
Michael Wood  Jul 19, 2023 to Julius Kavay

pField = "patientid"

0
Vitaliy Serdtsev · Jul 19, 2023

Did a little test:

Class dc.test Abstract ]
{

ClassMethod GetObjectFieldValue(
  pObject As %DynamicAbstractObject,
  pField As %StringAs %String
{
  quit:pObject="" ""
  quit:pField="" "" set tResponse=""
  set tResponse pObject.%Get(pField)
  return tResponse
}

ClassMethod Test()
{
  p1={
    "priority""2",
    "lastmodifieduser""PORTAL",
    "assignedto""jdoe01 STAFF",
    "status""REVIEW",
    "documentclass""PATIENTCASE",
    "versiontoken""937486",
    "departmentid""999",
    "patientcaseid""105555424",
    "providerusername""jdoe01",
    "internalnote""firstMessage",
    "subject""first123",
    "patientid"9877654321,
    "createduser""PORTAL",
    "description""patient case - first123",
    "documentroute""MDP",
    "documentsubclass""PATIENTCASE_CLINICALQUESTION",
    "documentsource""PORTAL",
    "createddate""07/17/2023",
    "lastmodifieddate""07/17/2023"}
    
  p2="documentsubclass"
  ..GetObjectFieldValue(p1,p2)
}

}

Result:

USER>##class(dc.test).Test()
PATIENTCASE_CLINICALQUESTION
0
Davide Vittorio Pagani  Jul 19, 2023 to Vitaliy Serdtsev

It works also for me... maybe it depends on how Michael Wood is passing the json object to the method... 

If he is passing a string, there is a conversion needed from string to %DynamicAbstractObject like:

Set str="{""prio"":""2"",""code"":""A001""}"Write str
{"prio":"2","code":"A001"}
Set obj=##Class(%DynamicAbstractObject).%FromJSON(str)
Write obj
1@%Library.DynamicObjectZW obj
obj={"prio":"2","code":"A001"}  ; <DYNAMIC OBJECT>
0
Michael Wood  Jul 19, 2023 to Davide Vittorio Pagani

That worked.  Thanks.

ClassMethod GetObjectFieldValue(pObject As %String, pField As %String) As %String
{
    quit:pObject="" ""
    quit:pField="" ""
    $$$TRACE("pObject="_pObject)
    $$$TRACE("pField="_pField)

    set dynObj=##Class(%DynamicAbstractObject).%FromJSON(pObject)
    set tValue=$PROPERTY(dynObj,pField)

    return tValue

}

0