User bio
404 bio not found
Member since Dec 30, 2020
Replies:

Hi Marc,

Thanks for your suggestion. I have written the below piece, to remove the individual rule node, as per my requirement.
But , after removing,  to copy that back to rule class, it's not reflecting , if i save and compile the rule. 
What am i missing here ?

 

DelIndRule(RuleId) [tXDataID,tMyRuleClassName,SQLCODE] public 
{
     set tMyRuleClassName="SJHSOCAL.Rule.TestRule"
    
    &SQL(select %id into :tXDataID from %Dictionary.XDataDefinition where parent = :tMyRuleClassName and Name='RuleDefinition')
    
    if (SQLCODE > 0) {
        // Query returned no results. Do some error handling
        quit
    }
    
    Write "tXDataID : "_tXDataID,!

    set tRuleDefinition=##class(%Dictionary.XDataDefinition).%OpenId(tXDataID)
    
    Write "tRuleDefinition : "_tRuleDefinition,!

    /* This stream contains the raw XML of the RuleDefinition. It looks like this:
    <ruleDefinition alias="" context="EnsLib.HL7.MsgRouter.RoutingEngine" production="TESTINGPKG.FoundationProduction">
        <ruleSet name="" effectiveBegin="" effectiveEnd="">
            <rule name="" disabled ="true">
                <when condition="1">
                    <send transform="" target="HL7.File.Out"/>
                    <return/>
                </when>
            </rule>
        </ruleSet>
    </ruleDefinition>
    */
    set tRuleDefinitionXMLStream=##class(%Stream.GlobalCharacter).%New()
    do tRuleDefinitionXMLStream.CopyFrom(tRuleDefinition.Data)
    
    
    set reader=##class(%XML.Reader).%New()
    set status=reader.OpenStream(tRuleDefinitionXMLStream)
    if $$$ISERR(status) {do $System.Status.DisplayError(status) quit status}
    #dim document as %XML.Document
    #dim node as %XML.Node
    set document=reader.Document
    
    Write document.CountNamespace()_"document : "_document,!
    
        Set node = document.GetDocumentElement()
        Write "NodeDocElement"_node,!
        
        Write document.GetDocumentNode(),!
        
        //Set node = document.GetNode(i)
        //Write "node : "_node,!
        
        Set nodeName = node.LocalName
        W "nodeName : "_nodeName,!
        
        Do node.MoveToFirstChild(1)
        Do node.MoveToFirstChild(1)
    
    For i=1:1
    { 

          Set nodeName = node.LocalName
        W "nodeName : "_nodeName,!
        
        If (nodeName = "rule")
        {    
            W i_"    :    inside rule tag    :    "_node.GetAttributeValue("name"),!
            //Get Node Attributes, check disable status            
            If (i=RuleId)
            {
                If (node.GetAttributeValue("disabled")="true")
                {
                    //Remove the node 
                    W "Inside Remove node",!
                    //If remove successfull , move to child node, since the control will go back to parent node.
                    // 1 childnode
                    Do node.Remove()
                    W "after Remove    :    "_node.LocalName,!
                    If 1 
                    {
                        Do node.MoveToFirstChild(1)
                        // move i number of sibiling
                        Set i=i-1
                        For j=1:1:i-1
                        {
                            Do node.MoveToNextSibling(1)
                        }
                        W "after moving to Rule    :    "_node.LocalName,!
                    }
                }

            
               }
               //Write node.MoveToNextSibling(1),!
            Quit:node.MoveToNextSibling(1)=0
        }
        Else 
        {
            Quit
        }
    }
    
    
    // Ok, done making changes to the stream

    //Write tRuleDefinitionXMLStream.%Save()
    // Copy the changed XML back into the RuleDefinition
    do tRuleDefinition.Data.CopyFrom(tRuleDefinitionXMLStream)

    // Save the changees to the rule definition XData
    set tSC=tRuleDefinition.%Save()
    // Check if tSC indicates an error and do something about it
    if $$$ISERR(tSC) {
        // Do some error handling
        W "Save status"_tSC,!
    }

    // Recompile the rule class
    set tSC=$System.OBJ.Compile(tMyRuleClassName,"cuk",.errorlog,1)

    // Check if tSC indicates an error and do something about it
    if $$$ISERR(tSC) {
        // Do some error handling
         W "Compile status"_tSC,!
    } 
    
}

Certifications & Credly badges:
Purushothaman has no Certifications & Credly badges yet.
Global Masters badges:
Purushothaman has no Global Masters badges yet.
Followers:
Purushothaman has no followers yet.
Following:
Purushothaman has not followed anybody yet.