Here's a quick sample:
Class DC.Demo.XDataDemo
{
ClassMethod Driver()
{
Set array = ..GetXDataContents("DC.Demo")
zw array
}
ClassMethod GetXDataContents(package As %String) As %Library.ArrayOfObjects
{
$$$ThrowOnError($System.OBJ.GetPackageList(.classes,package))
Set array = ##class(%Library.ArrayOfObjects).%New()
Set class = ""
For {
Set class = $Order(classes(class))
Quit:class=""
Set xDataName = ""
For {
Set xDataName = $$$defMemberNext(class,$$$cCLASSxdata,xDataName)
Quit:xDataName=""
Set xdata = ##class(%Dictionary.XDataDefinition).IDKEYOpen(class,xDataName,,.sc)
$$$ThrowOnError(sc)
Do array.SetAt(xdata.Data,class_":"_xDataName)
}
}
Quit array
}
XData Foo
{
}
XData Bar
{
}
}Note that this gets XData blocks defined in a class; if you want to get "inherited" XData blocks listed for each subclass along with the inherited content it's only slightly more complex:
ClassMethod GetXDataContents(package As %String) As %Library.ArrayOfObjects
{
$$$ThrowOnError($System.OBJ.GetPackageList(.classes,package))
Set array = ##class(%Library.ArrayOfObjects).%New()
Set class = ""
For {
Set class = $Order(classes(class))
Quit:class=""
Set xDataName = ""
For {
Set xDataName = $$$comMemberNext(class,$$$cCLASSxdata,xDataName)
Quit:xDataName=""
Set origin = $$$comMemberKeyGet(class,$$$cCLASSxdata,xDataName,$$$cXDATAorigin)
Set xdata = ##class(%Dictionary.XDataDefinition).IDKEYOpen(origin,xDataName,,.sc)
$$$ThrowOnError(sc)
Do array.SetAt(xdata.Data,class_":"_xDataName)
}
}
Quit array
}- Log in to post comments