In addition to the reply of @Cristiano Silva , you can use %Dictionary.CompiledClass instead of PropertyDefinition to retrieve also properties in parents classes.
There is a query available :
select *
from %Dictionary.CompiledClassQuery_MemberSummary('class.name','a')
Create an abstract class and add it to all your classes, where a list of properties (for whatever reason) is needed
Class DC.ClassInfo [ Abstract ]
{
/// Return property info: %PropNames(all)/// /// all: 1 = Return a list of all properties<br>/// 0 = Return a list of storable properties onlyClassMethod PropNames(all = 0) As%String [ CodeMode = objectgenerator ]
{
s (prop(0),prop(1))=""
f i=1:1:%compiledclass.Properties.Count() {
s p=%compiledclass.Properties.GetAt(i), s=p.Storable
s prop(s)=prop(s)_$e(",",prop(s)]"")_p.Name
}
d%code.WriteLine($c(9)_"s stor="""_prop(1)_"""")
d%code.WriteLine($c(9)_"q $s(all:"""_prop(0)_$e(",",prop(0)]"")_"""_stor,1:stor)")
q$$$OK
}
}
For example
Class My.Person Extends (%Persistent, DC.ClassInfo)
{
Property Name As%String;Property Age As%Integer;
}
Putting all together
write##class(My.Person).PropNames() --> Age,Name
write##class(My.Person).PropNames(1) --> %%OID,%Concurrency,Age,Name
// That way, in your application, you can easily check,// if a property exists or notif$length(##class(My.Person).PropNames(), ",", "TestProp") -->0if$length(##class(My.Person).PropNames(), ",", "Age") -->1
Hi Pedro,
You can retrieve this information querying the class %Dictionary.PropertyDefinition.
An example:
SELECT Name FROM %Dictionary.PropertyDefinition WHERE parent = "mypackage.MyClassName"
The field parent is fully qualified name of the class that you want to list properties name.
Simple and perfect, I just added "ORDER BY SequenceNumber" to suit my needs. Thanks
Hi Pedro,
In addition to the reply of @Cristiano Silva , you can use %Dictionary.CompiledClass instead of PropertyDefinition to retrieve also properties in parents classes.
There is a query available :
select * from %Dictionary.CompiledClassQuery_MemberSummary('class.name','a')
See class reference
Create an abstract class and add it to all your classes, where a list of properties (for whatever reason) is needed
Class DC.ClassInfo [ Abstract ] { /// Return property info: %PropNames(all) /// /// all: 1 = Return a list of all properties<br> /// 0 = Return a list of storable properties only ClassMethod PropNames(all = 0) As %String [ CodeMode = objectgenerator ] { s (prop(0),prop(1))="" f i=1:1:%compiledclass.Properties.Count() { s p=%compiledclass.Properties.GetAt(i), s=p.Storable s prop(s)=prop(s)_$e(",",prop(s)]"")_p.Name } d %code.WriteLine($c(9)_"s stor="""_prop(1)_"""") d %code.WriteLine($c(9)_"q $s(all:"""_prop(0)_$e(",",prop(0)]"")_"""_stor,1:stor)") q $$$OK } }
For example
Class My.Person Extends (%Persistent, DC.ClassInfo) { Property Name As %String; Property Age As %Integer; }
Putting all together
write ##class(My.Person).PropNames() --> Age,Name write ##class(My.Person).PropNames(1) --> %%OID,%Concurrency,Age,Name // That way, in your application, you can easily check, // if a property exists or not if $length(##class(My.Person).PropNames(), ",", "TestProp") -->0 if $length(##class(My.Person).PropNames(), ",", "Age") -->1
If you use VS Code you might like to see how one of the extensions in https://openexchange.intersystems.com/package/DX-Jetpack-for-VS-Code shows you all the properties (and other class members, such as methods).