That's correct (although from your example I would use $get(%request.Data("Q31",1)) over the "Get" method). I had another look and an assumption I had made in my previous post was partially incorrect. At least in questionnaires you can safely check the IsNew property of %UDF - this is correctly set when a questionnaire is created using either an API or through the UI. This value is derived from a variable that is set at the very top of the save so it allows us to identify a new added record. Here is a fairly simple (if a little crude) example:
ClassMethod Test()
{
tstart
do ..GetAPI(.objAPI)
set objAPI.QUESPAPatMasDR = 5878
set objAPI.QUESPAAdmDR = 11480
set objAPI.Q01 = "Y"
set rc = objAPI.Save()
zwrite {"Q01":(objAPI.Q01)}
set id = objAPI.ID
kill objAPI
set obj = ##class(questionnaire.QAUXXARP).%OpenId(id)
zwrite {"Q01":(obj.Q01)}
kill obj
do ..GetAPI(.objAPI)
set rc = objAPI.Open("",id)
set objAPI.Q01 = "Y"
set rc = objAPI.Save()
zwrite {"Q01":(objAPI.Q01)}
kill objAPI
set obj = ##class(questionnaire.QAUXXARP).%OpenId(id)
zwrite {"Q01":(obj.Q01)}
trollback
}
ClassMethod OnAfterSave() As %Boolean
{
#dim %UDF as websys.UDFExt.TrakEvent
set sc = $$$OK
write !,"%UDF.IsNew = "_%UDF.IsNew,!
if %UDF.IsNew {
set obj = ##class(questionnaire.QAUXXARP).%OpenId(%UDF.Id,,.sc)
if $isobject(obj) {
set obj.Q01 = "N"
set sc = obj.%Save()
}
}
if $$$ISERR(sc) {
do %UDF.Message.Status(sc)
}
return 1
}
do ##class(Custom.AUXX.UDF.questionnaire.QAUXXARP).Test()
%UDF.IsNew = 1
{"Q01":"Y"} ; <DYNAMIC OBJECT>
{"Q01":"N"} ; <DYNAMIC OBJECT>
%UDF.IsNew = 0
{"Q01":"Y"} ; <DYNAMIC OBJECT>
{"Q01":"Y"} ; <DYNAMIC OBJECT>
As you can see, the value of "Q01" is only set to "N" on the first save and is not updated afterwards.
- Log in to post comments