Thank you @Daniel.Pasco. It's a wonderful detailed clarification for the property and member type class
- Log in to post comments
Thank you @Daniel.Pasco. It's a wonderful detailed clarification for the property and member type class
Hello @Hannah Sullivan
If you need to delete the list of object while deleting the parent object. You can override the %OnDelete method and add the delete implementation refer below code logic. Once you call the ##Class(package.class).%DeleteId(id). It will trigger the %OnDelete Method and delete the list of persistent object as well.
ClassMethod %OnDelete(oid As %ObjectIdentity) As %Status [ Private, ServerOnly = 1 ]
{
set object = ..%Open(oid,,.status)
If $$$ISERR(status) quit status
If $IsObject(object.Organizations) {
set org= object.OrganizationsGetSwizzled()
while org.GetNext(.key){
do object.Organizations.GetAt(key).%DeleteId(key)
}
}
Quit $$$OK
}
You can create these object with Parent-child relationship as well.
I'm not sure why the request class
You can add a property setter method for property DOB and modify the value from MM/DD/YYYY to +$H value. This will keep the internal date format in database.
Class CSVtoHL7.Inputfile.Record Extends (Ens.Request, %XML.Adaptor, EnsLib.RecordMap.Base) [ ProcedureBlock ]
{
Property ID As %Integer;
Property LastName As %String;
Property FirstName As %String;
Property MiddleName As %String;
Property DOB As %Date;
Method DOBSet(pDate) As %Status
{
Set i%DOB= $ZDH(pDate)
Quit $$$OK
}
Property Gender As %String;
ClassMethod createObj() As CSVtoHL7.Inputfile.Record
{
Set obj = ##class(CSVtoHL7.Inputfile.Record).%New()
Set obj.DOB="12/30/2001"
Set obj.FirstName="Test"
Set obj.ID=12345
Set obj.MiddleName = "middle"
Set obj.Gender="M"
return obj
}
}Create a object for the request class and send to Transformation. you can use the logic $translate($ZDT(source.DOB_",0",3)," ","T")_"Z" in DTL to convert the internal date format to required output 2023-08-24T00:00:00Z. You can refer the DTL sample below
Class CSVtoHL7.DTL.Record Extends Ens.DataTransformDTL [ DependsOn = (CSVtoHL7.Inputfile.Record, EnsLib.HL7.Message) ]
{
Parameter IGNOREMISSINGSOURCE = 1;
Parameter REPORTERRORS = 1;
Parameter TREATEMPTYREPEATINGFIELDASNULL = 0;
XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='CSVtoHL7.Inputfile.Record' targetClass='EnsLib.HL7.Message' targetDocType='2.5:ADT_A01' create='new' language='objectscript' >
<assign value='source.ID' property='target.{PID:SetIDPID}' action='set' />
<assign value='source.FirstName' property='target.{PID:PatientName().FamilyName}' action='set' />
<assign value='source.MiddleName' property='target.{PID:PatientName().GivenName}' action='set' />
<assign value='source.Gender' property='target.{PID:AdministrativeSex}' action='set' />
<assign value='$translate($ZDT(source.DOB_",0",3)," ","T")_"Z"' property='target.{PID:DateTimeofBirth.Time}' action='set' />
</transform>
}
}output
.png)
Exactly. Thanks for the samples. This will helps to figure out the property is modified or not.
As we mentioned above the DOB should have +$H value instead of MM/DD/YYYY. However you can try the below
If DOB is date format
IRISMYDEV>set dob="12/01/1993"
IRISMYDEV>write $translate($ZDT($ZDTH(dob),3)," ","T")_"Z"
1993-12-01T00:00:00ZIf DOB is +$H value
IRISMYDEV>set dob=+$H
IRISMYDEV>write $translate($ZDT(d_",00000",3)," ","T")_"Z"
2023-08-24T00:00:00ZHello Scott,
I had created ZAUTHENTICATE.mac in %SYS namespace. Implemented the GetCredentials and validated the authentication for delegated user. It works for me without any issues.
Hello @Joel Solon
IRISMYDEV>set obj = ##Class(Samples.NewClass2).%OpenId(1)
IRISMYDEV>write obj.Name
Test
IRISMYDEV>zwrite obj.%ValidateObject()
1
IRISMYDEV>set obj.Name="newname"
IRISMYDEV>zwrite obj.%ValidateObject()
1
Class Samples.NewClass2 Extends %Persistent
{
Property Name As %String;
Method modified()
{
write "Property modifed : ",$Property(,"m%Name")
}
}
IRISMYDEV>set obj = ##Class(Samples.NewClass2).%OpenId(1)
IRISMYDEV>do obj.modified()
Property modifed : 0
IRISMYDEV>set obj.Name="test"
IRISMYDEV>do obj.modified()
Property modifed : 1
IRISMYDEV>Hello Smythe,
I agree with @Robert Cemper points. The %Date datatype is for +$H which means numeric date value. Not an string. You should modify the datatype of the property or use string functions.
IRISMYDEV>s obj = ##Class(CSVtoHL7.Inputfile.Record).%New()
IRISMYDEV>s obj.DOB="12/12/1993"
IRISMYDEV>zw ##Class(%Date).IsValid(obj.DOB)
"0 "_$lb($lb(7207,"12/12/1993",,,,,,,,$lb(,"IRISMYDEV",$lb("e^IsValid+1^%Library.Date.1^1","e^^^0"))))/* ERROR #7207: Datatype value '12/12/1993' is not a valid number */
IRISMYDEV>w $SYSTEM.OBJ.DisplayError()
ERROR #7207: Datatype value '12/12/1993' is not a valid number1IRISMYDEV>s obj = ##Class(CSVtoHL7.Inputfile.Record).%New()
IRISMYDEV>s obj.DOB=$ZDateH("12/12/1993")
IRISMYDEV>zw ##Class(%Date).IsValid(obj.DOB)
1Hello Pierre,
No problem. You can use the merge command(sorry not a string function) to take a copy of entire global node and subtree
merge queryparam = %request.Data
zwrite queryparam ;print the entire node and subtreeNice article. However, there is a minor problem while setting the trailing zero values in %Set() of dynamicobject. But, It's not happening in literal constructor {} syntax. Due to objectscript not keep the trailing zeros. But json number do.
set json = { "decimal": 12.000}
zw json
set json1= ##Class(%DynamicObject).%New()
do json1.%Set("decimal", 12.000) ; this is consider as string
do json1.%Set("decimal1", $FN(12,,2), "number")
zw json1
#;output
json={"decimal":12.000} ; <DYNAMIC OBJECT>
json1={"decimal":12,"decimal1":12} ; <DYNAMIC OBJECT>Hello Pierre,
You have two options to get query parameters
.png)
ClassMethod GetQueryParams()
{
set data=""
For {
set data = %request.Next(data) quit:data=""
write data,!
}
}
OUTPUT
Bottom
Name
TopFor cgiEnvs. You can follow same merge option to get all values. Otherwise use
ClassMethod GetcgiEnvs()
{
set cgi=""
for {
set cgi = %request.NextCgiEnv(cgi) quit:cgi=""
write cgi,!
}
}Hello @ARTHUR.LASILVA
You create a your custom task and schedule this task in task manager if it's required. Follow the below steps to schedule the task.
Class Samples.TaskMgr.SQLExportTask Extends %SYS.Task.Definition
{
Parameter TaskName As STRING = "ExportQueryToCSV";
Method OnTask() As %Status
{
set statement = ##class(%SQL.Statement).%New()
/// Place your sql query
set sql = "Select Name,dob,Phone From Samples_DB.Person"
set tSC = statement.%Prepare(sql)
if $$$ISERR(tSC) Q $$$OK
set result = statement.%Execute()
#dim meta As %SQL.StatementMetadata= result.%GetMetadata()
for i=1:1:meta.columnCount {
if i>1 w ","
write meta.columns.GetAt(i).colName
}
write $$$NL
while result.%Next()
{
write result.Name,",",result.dob,",",result.Phone,$$$NL
}
return $$$OK
}
}
Task scheduler


Can you try the below sample to download file from the directory
Class Samples.CSPFileDownload Extends %CSP.Page
{
Parameter CONTENTTYPE As STRING = "application/text";
ClassMethod OnPage() As %Status
{
do %stream.OutputToDevice()
return $$$OK
}
ClassMethod OnPreHTTP() As %Boolean
{
#; your directory and file
set file="C:\Users\readmyfile.txt"
set stream=##class(%Stream.FileCharacter).%New()
set sc=stream.LinkToFile(file)
set %stream = stream
set %response.ContentType = ..#CONTENTTYPE
set %fileName = file
set %response.ContentLength=stream.Size
return $$$OK
}
}
Hello @Elijah Cotterrell
Thanks for the suggestion, I need to verify whether the property is modified while saving for opened object and Generally I do some verification with the mentioned piece of code. So, I thought to generate a method like getter and setter method in some cases.
Class Samples.Person Extends %Persistent
{
Property Name As %String;
Property Age As %String;
ClassMethod ValidateObject()
{
Set obj =##Class(Sample.Person).%OpenId(1)
w "before: ",obj.PropertyIsModified("Age"),!
Set obj.Age=12
Write "after: ",obj.PropertyIsModified("Age"),!
}
Method PropertyIsModified(Property)
{
Return $Select(Property'="":$Property($THIS,"m%"_Property), 1:0)
}
}Hello @Eduard Lebedyuk
Thanks for the samples.Creating my own datatype and implementation is works for me.
Hi @Steven Hobbs
Thanks for the wonderful explanation with samples. It make sense
Hi Pierre
Can you try with below. And try Create a subclass of %CSP.SessionEvents and try override OnStartRequest, OnEndRequest .
ClassMethod Page(skipheader As %Boolean = 1) As %Status [ ProcedureBlock = 0 ]
{
set ^Pierre("login")="on login (by overrided method Page)"
return ##super(skipheader)
}
Thanks Vitaliy for the suggestion, %ScrollableResultSet is works for the Cache SQL. We are actually fetching multiple
ClassMethod tt() [ Language = tsql, SqlName = mycls, SqlProc ]
{
SELECT Name FROM sample_SQL.NewClass4
SELECT Name, Age FROM sample_SQL.NewClass5
}
set results=##class(%ScrollableResultSet).%New()
set tsc = results.Prepare("call sample_SQL.MYCLS()")
if $$$ISERR(tsc) W $SYSTEM.OBJ.DisplayError(tsc)
do results.Execute()
ERROR #6048: Invalid Statement Type: 'CALL'1Hello Pierre,
You can Override the method
ClassMethod OnPreDispatch(pUrl As %String, pMethod As %String, ByRef pContinue As %Boolean) As %Status
{
set ^Pierre(pUrl)="" /// your implementation
return $$$OK
}If you're receiving unexpected fields(key value pairs) as part of the JSON and the properties are not included in the class definition. You need to add the below parameter in your class definition(%JSON.Adaptor extended class). This will ignore loading the unexpected field.
Parameter %JSONIGNOREINVALIDFIELD As BOOLEAN = 1In addition, The JSON key-value pair data type should match with class definition property datatype.
Hello Scott,
As of m understanding, If your dynObject is actually the expected JSON format. Create a instance for class response class and load the dynObject into object by method obj.%JSONImport(dynObject)