Why so difficult?
This similarly following condition:

WHERE 
(
year(current_date) - year(DOB)
) >= 13

It Besides above was already indicated, why does not follow to use such a code, for example:

select datediff(year,
todate(to_char({'1990-12-31'},'YYYY')||':1','YYYY:MM'), -- birthday
todate(to_char({'2003-01-01'},'YYYY')||':1','YYYY:MM') -- report date
)

This gives an incorrect result - 13, although it should be 12.

Then this:

Include Child

Class Macro.Child Extends Macro.Parent
{

ClassMethod first()
{
  #include Child
}

ClassMethod Test() [ PlaceAfter = first ]
{
  write "Class: " $classname() , ! , "Value: " $$$name
}

}

or this:

ClassMethod Test()
{
  #include Child
  write "Class: " $classname() , ! , "Value: " $$$name
}

Macro.Parent.cls:

Include Parent

Class Macro.Parent
{

ClassMethod Test()
{
  write "Class: " $classname() , ! , "Value: " $$$name 
}

}

Macro.Child.cls:

Include Child

Class Macro.Child Extends Macro.Parent
{

ClassMethod Test()
{
  write "Class: " $classname() , ! , "Value: " $$$name 
}

}

Parent.inc:

#ifndef name
  #define name "Parent"
#endif name

Child.inc:

#define name "Child"

Result:

>do ##class(Macro.Parent).Test()
Class: Macro.Parent
Value: Parent
>do ##class(Macro.Child).Test()
Class: Macro.Child
Value: Child

For better performance you should make a few changes:

  1. add an index on DOB field
  2. rebuild the index and run TuneTable
  3. modify the query
    select DOB from HSAA.Patient
    where
    dob<=dateadd('yy',-13,current_date)
    or dob between
          todate((year(current_date)-13)||'0101','yyyymmdd')
      and todate((year(current_date)-13)||'1231','yyyymmdd')

The result will pleasantly surprise you.

Hi Marco.

CSVTOCLASS creates a new class if it doesn't already exist and then it calls the Import method.

Since you already have created the class, it is not created, but there is no Import method, so nothing works.

Solution:

  1. delete all previously created classes: ZenImport.Country, TestCsv.Csv, etc.
  2. run in terminal:
    USER>set rowtype "Code VARCHAR(2),Name VARCHAR(9)"
    USER>set filename "c:\temp\Country.csv"
    USER>do ##class(%SQL.Util.Procedures).CSVTOCLASS(2, .rowtypefilename,";",,,"Test.CSV")
    
  3. run in Portal:
    select * from Test.CSV

    open and see the class "Test.CSV". Profit!!!

See Sample.Person in "SAMPLES".

/// Person's age.<br>
/// This is a calculated field whose value is derived from <property>DOB</property>.
Property Age As %Integer CalculatedSqlComputeCode = { Set {Age}=##class(Sample.Person).CurrentAge({DOB})}, SqlComputedSqlComputeOnChange = DOB ];

/// This class method calculates a current age given a date of birth <var>date</var>.
ClassMethod CurrentAge(date As %Date ""As %Integer CodeMode = expression ]
{
$Select(date="":"",1:($ZD($H,8)-$ZD(date,8)\10000))
}
  1. Asynchronous uploading only one file
    Class upload.fileOne Extends %ZEN.Component.page
    {
    
    Parameter DOMAIN = "DC";
    
    XData Style
    {
      <style type="text/css">
      </style>
    }
    
    XData Contents [ XMLNamespace "http://www.intersystems.com/zen" ]
    {
    <page xmlns="http://www.intersystems.com/zen" title="Upload file using XMLHttpRequest" labelPosition="left">
      <hgroup cellVAlign="bottom">
        <fileUpload label="Select the file" id="fileToUpload" onchange="zenPage.fileSelected()"/>
        <button caption="Upload" onclick="zenPage.uploadFile();"/>
      </hgroup>
      <label id="fileType" label="Type: "/>
      <label id="fileName" label="Name: "/>
      <label id="fileSize" label="Size: "/>
      <html>
        <div id="progressNumber">%</div>
        <progress id="progressValue" value="0" max="100.0"></progress>
      </html>
    </page>
    }
    
    ClientMethod uploadFile() [ Language = javascript ]
    {
      var fd new FormData();
      fd.append('fUpload', zen('fileToUpload').findElement('control').files[0]);
      var xhr new XMLHttpRequest();
      xhr.upload.addEventListener('progress'this.uploadProgress, false);
      xhr.addEventListener('load'this.uploadComplete, false);
      xhr.addEventListener('error'this.uploadFailed, false);
      xhr.addEventListener('abort'this.uploadCanceled, false);
      xhr.open('POST''upload.fileOne.cls');
      xhr.send(fd);
    }
    
    ClientMethod uploadProgress(evt) [ Language = javascript ]
    {
      if (evt.lengthComputable) {
        var percentComplete Math.round(evt.loaded * 100 / evt.total);
    
        document.getElementById('progressNumber').innerHTML percentComplete.toString() '%';
        document.getElementById('progressValue').value percentComplete;
      }
      else {
        document.getElementById('progressNumber').innerHTML $$$Text('Cannot compute');
      }
    }
    
    ClientMethod uploadComplete(evt) [ Language = javascript ]
    {
      zenAlert($$$Text('The upload is complete.'));
    }
    
    ClientMethod uploadFailed(evt) [ Language = javascript ]
    {
      zenAlert($$$Text('An error occurred when trying to upload the file.'));
    }
    
    ClientMethod uploadCanceled(evt) [ Language = javascript ]
    {
      zenAlert($$$Text('The upload was canceled by the user or the browser dropped the connection.'));
    }
    
    ClientMethod fileSelected() [ Language = javascript ]
    {
      var file zen('fileToUpload').findElement('control').files[0];
      if (file) {
    
        var fileSize = 0;
        if (file.size > 1024 * 1024)
           fileSize (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() $$$Text('MB');
        else
           fileSize (Math.round(file.size * 100 / 1024/ 100).toString() $$$Text('KB');
    
        zenSetProp('fileType','value',file.type);
        zenSetProp('fileName','value',file.name);
        zenSetProp('fileSize','value',fileSize);
         
      }
    }
    
    ClassMethod %OnPreHTTP() As %Boolean ServerOnly = 1 ]
    {
      #dim %request As %CSP.Request
      #dim stream As %CSP.BinaryStream=%request.GetMimeData("fUpload")
      if $IsObject(stream{
        
        #; here you do with the received file useful work
        
        /*
        set ^tmp("filename")=stream.FileName
        set ^tmp("filesize")=stream.Size
        */
        
        quit $$$NO
      }
      quit $$$YES
    }
    
    }
  2. Asynchronous uploading immediately of several files
    Class upload.fileMany Extends %ZEN.Component.page
    {
    
    Parameter DOMAIN = "DC";
    
    XData Style
    {
    <style type="text/css">
      .ok {
        color:green;
      }
    
      #dropZone {
        width: 360px;
        height: 125px;
        borderdashed 2px #ccc;
        background-color: #fefefe;
        color: #ccc;
        text-aligncenter;
        padding: 125px 0 0 0;
      }
    
    </style>
    }
    
    XData Contents [ XMLNamespace "http://www.intersystems.com/zen" ]
    {
    <page xmlns="http://www.intersystems.com/zen" title="Upload immediately multiple files using XMLHttpRequest">
      <html id="dropZone">Drag files here or click below</html>
      <hgroup cellVAlign="bottom">
        <html id="selectFiles" label="Choose the files">
          <input type="file" class="fileUpload" id="fileToUpload" onchange="zenPage.fileSelected(document.getElementById('fileToUpload').files)" multiple="multiple" />
        </html>
        <button caption="Clear" title="Clear the queue" onclick="zenPage.clearList();"/>
        <spacer width="10"/>
        <button caption="Upload" title="Upload files to the server" onclick="zenPage.uploadFile();"/>
      </hgroup>
      <fieldSet legend="Files waiting to upload">
        <html id="holder"/>
      </fieldSet>
    </page>
    }
    
    ClientMethod clearList() [ Language = javascript ]
    {
      fileQueue=[];
      zen('holder').getEnclosingDiv().innerHTML='';
      zen('selectFiles').refreshContents();
    }
    
    ClientMethod fileSelected(files) [ Language = javascript ]
    {
      var holder zen('holder').getEnclosingDiv();
      for (var = 0; i files.length; i++) {
      
        var file files[i];
    
        var fileSize = 0;
        if (file.size > 1024 * 1024)
          fileSize (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() $$$Text('MB');
        else
          fileSize (Math.round(file.size * 100 / 1024/ 100).toString() $$$Text('KB');
      
        var divInfo document.createElement('div');
        divInfo.innerHTML=file.name+' ('+file.type+') - '+fileSize;
        holder.appendChild(divInfo);
    
        var divProgN document.createElement('div');
        divProgN.id='progressNumber'+i;
        divProgN.innerHTML='%';
        holder.appendChild(divProgN);
    
        var prog document.createElement('progress');
        prog.id='progressValue'+i;
        prog.max='100.0';
        prog.value='0';
        holder.appendChild(prog);
    
        fileQueue.push({i:i,file:file});
      }
    }
    
    ClientMethod uploadFile() [ Language = javascript ]
    {
      while (fileQueue.length > 0) {
        var item=fileQueue.pop();
        uploadFile(item.file,item.i);
      }
    }
    
    ClientMethod onloadHandler() [ Language = javascript ]
    {
      if (typeof FileReader == "undefined") zenAlert($$$Text('Sorry, your browser does not support File API, so this demo will not work correctly'));
      fileQueue new Array();
    
      uploadFile function (file, i) {
        var xhr new XMLHttpRequest(), upload xhr.upload, fd new FormData();
        
        fd.append('fUpload', file);
    
        upload.addEventListener('progress',
        function (evt) {
          if (evt.lengthComputable) {
            var percentComplete Math.round(evt.loaded * 100 / evt.total);
    
            document.getElementById('progressNumber'+i).innerHTML percentComplete.toString() '%';
            document.getElementById('progressValue'+i).value percentComplete;
            
          }
          else {
            document.getElementById('progressNumber'+i).innerHTML $$$Text('Cannot compute');
          }
          
        }, false);
        upload.addEventListener('load'function (ev) {
          var c=document.getElementById('progressNumber'+i);
          c.className='ok';
          c.innerHTML='OK';
        }, false);
        upload.addEventListener('error'function (ev) {zenAlert($$$Text('An error occurred when trying to upload the file.'));}, false);
        upload.addEventListener('abort'function (ev) {zenAlert($$$Text('The upload was canceled by the user or the browser dropped the connection.'));}, false);
        xhr.open('POST','upload.fileMany.cls');
        xhr.setRequestHeader('Cache-Control''no-cache');
        xhr.setRequestHeader('X-Requested-With''XMLHttpRequest');
        xhr.send(fd);
      }
      
      dropZone=zen('dropZone').getEnclosingDiv();
      dropZone.addEventListener('dragenter',  function(ev){
        ev.stopPropagation();
        ev.preventDefault();
      }, false);
      dropZone.addEventListener('dragleave',  function(ev){
        ev.stopPropagation();
        ev.preventDefault();
        this.style['backgroundColor''#FEFEFE';
        this.style['borderColor''#CCC';
        this.style['color''#CCC';
      }, false);
      dropZone.addEventListener('dragover',  function(ev){
        ev.stopPropagation();
        ev.preventDefault();
        this.style['backgroundColor''#F0FCF0';
        this.style['borderColor''#3DD13F';
        this.style['color''#3DD13F';
      }, false);
      dropZone.addEventListener('drop',  function(ev){
      ev.stopPropagation();
      ev.preventDefault();
      this.style['backgroundColor''#FEFEFE';
      this.style['borderColor''#CCC';
      this.style['color''#CCC';
      zenPage.fileSelected(ev.dataTransfer.files);
      }, false);
    }
    
    ClassMethod %OnPreHTTP() As %Boolean ServerOnly = 1 ]
    {
      #dim %request As %CSP.Request
      #dim stream As %CSP.BinaryStream=%request.GetMimeData("fUpload")
      if $IsObject(stream{
        
        #; here you do with the received file useful work
        
        /*
        set ^tmp("filename")=stream.FileName
        set ^tmp("filesize")=stream.Size
        */
        
        quit $$$NO
      }
      quit $$$YES
    }
    
    }

Of course you can do the same on CSP.