7
« on: December 11, 2015, 09:21:10 am »
It has been confirmed to me that Repository.RunModelSearch method does not work with the XML returned from Repository.SqlQuery method. My point is why it doesn't. Certainly an improvement can be easily made here even if it wasn't in the original intention of the RunModelSearch method.
I understand now that converting the SqlQuery returned XML to the format acceptable to RunModelSearch is the only way. There is an sample script (model search operations) describing the expected XML format. I was also provided sample conversioin code (from SQLQuery output) as follows:
!INC Local Scripts.EAConstants-JScript
!INC EAScriptLib.JScript-XML
// The columns that will apear in the Model Search window
var SEARCH_SPECIFICATION = "<ReportViewData>" +
"<Fields>" +
"<Field name=\"CLASSGUID\" />" +
"<Field name=\"CLASSTYPE\" />" +
"<Field name=\"Name\" />" +
"</Fields>" +
"<Rows/>" +
"</ReportViewData>";
function main()
{
var theElement as EA.Element;
theElement = Repository.GetContextObject();
var objID = theElement.ElementID;
var sql = " select ea_guid as CLASSGUID,'Attribute' as CLASSTYPE, Name from t_attribute where Object_ID="+objID;
Session.Output( sql );
var queryResult = Repository.SQLQuery( sql );
Session.Output( "queryResult.length=" + queryResult.length );
if ( queryResult.length > 0 )
{
Session.Output( queryResult );
var resultDOM = XMLParseXML( queryResult );
// Create a DOM object to represent the search tree
var xmlDOM = CreateXMLObject();
// Load the search template
if( xmlDOM.loadXML(SEARCH_SPECIFICATION) )
{
var node = xmlDOM.selectSingleNode( "//ReportViewData//Rows" );
//loop over xml rows returned from sql query
var rows = resultDOM.selectNodes("//EADATA//Dataset_0//Data//Row");
for (var i=0; i < rows.length; i++)
{
var row = rows.item(i);
//available data from the sql statement:
var CLASSGUID = row.selectSingleNode("CLASSGUID").text;
var CLASSTYPE = row.selectSingleNode("CLASSTYPE").text;
var attName = row.selectSingleNode("Name").text;
// Add this element to the XML tree
AddRow( xmlDOM, node, CLASSGUID, CLASSTYPE, attName );
}
}
if ( xmlDOM )
Repository.RunModelSearch( "", "", "", xmlDOM.xml );
}
}
function CreateXMLObject()
{
var xmlDOM;
try
{
xmlDOM = new ActiveXObject( "MSXML2.DOMDocument.4.0" );
}
catch(e)
{
xmlDOM = new ActiveXObject( "MSXML2.DOMDocument.6.0" );
}
xmlDOM.validateOnParse = false;
xmlDOM.async = false;
return xmlDOM;
}
function AddRow( xmlDOM, rowsNode, CLASSGUID, CLASSTYPE, attName )
{
// Create a Row node
var row = xmlDOM.createElement( "Row" );
// Add the Model Search row data to our DOM
AddField( xmlDOM, row, "CLASSGUID", CLASSGUID );
AddField( xmlDOM, row, "CLASSTYPE", CLASSTYPE );
AddField( xmlDOM, row, "Name", attName );
// Append the newly created row node to the rows node
rowsNode.appendChild( row );
}
function AddField( xmlDOM, row, name, value )
{
var fieldNode = xmlDOM.createElement( "Field" );
// Create first attribute for the name
var nameAttribute = xmlDOM.createAttribute( "name" );
nameAttribute.value = name;
fieldNode.attributes.setNamedItem( nameAttribute );
// Create second attribute for the value
var valueAttribute = xmlDOM.createAttribute( "value" );
valueAttribute.value = value;
fieldNode.attributes.setNamedItem( valueAttribute );
// Append the fieldNode
row.appendChild( fieldNode );
}
main();