The CreatorCon Call for Content is officially open! Get started here.

Script to create an import set, and run the tranform, when the Import Set table already exists?

thomaskennedy
Tera Guru

I need to populate an import set through script, mark the rows up with additional values looked up from elsewhere, and then run a transform to push the result into the target table. (Of course I could script all of this, but that's what the map is for.)

 

The data source, the import set table and the transform map already exist, as these were created when I was planning to have the transform map do everything. I'm looking over the scripting options in Utah, and I see classes like GlideImportSetTable, and instructions like this:

 

  • To execute an Import Set transform:
  • Create an Import Set table using the GlideImportSetTable API.
  • Create a Transform Map using the GlideImportSetTransformMap API.
  • Create or use an existing Import Set using the GlideRecord API.
  • Execute an Import Set Transform using the GlideImportSetTransformer API.

But I already have all that stuff. I want to create an import set, populate my import set rows, associate them with the import set, and then hand the import set off to the transformer. But I don't find any code samples of any one doing that, except through the methods shown above. Is there a reason I should not do all that through GlideRecord, by  creating a new row in sys_import_set, and so on? It seems strange to create a new import set table and a new map every time I run this import.

1 ACCEPTED SOLUTION

Hi,

Not sure I follow the first part about your excel file but anyway here is a script example. I use scripts like this when I fetch data using REST API calls. This will load data into an existing Import Set and then transform using the connected Transform Map.

 

import();


function import(){


try {


		//Create Import Set

		var impSet = new GlideRecord ('sys_import_set');
		impSet.initialize();
		impSet.mode = "asynchronous";
		impSet.state = "loading";
		impSet.table_name = "u_import_xxxx";
		impSet.short_description = "Importing Data from XXXX";
		var impSet_id = impSet.insert();


		
		/*

		Populate import set table with data rows - Insert code here


			var importData = new GlideRecord(impSet.table_name);
			importData.initialize();
			importData.u_a = '1';
			importData.u_b = '2';
			importData.u_c = '3';
			importData.sys_import_set = impSet.sys_id; //Sys_id of the newly created import set
			importData.insert();


		*/

		
		
		//Finished loading the import set
		impSet.state = "loaded";
		impSet.load_completed = gs.nowDateTime();
		impSet.update();

  
		
		//Transforming the data
		
		var transformer = new GlideImportSetTransformer();
		transformer.transformAllMaps(impSet);  //Transform the import set rows
		
		
		if(transformer.isError()) {
		gs.error('Error executing the transform');
		}
		
		
		
	}

}
catch(ex) {
 var message = ex.message;
	gs.log('Error: ' + message, 'Import XXXX'); 
}
}

 Is this something that will help you?

 

Regards,
Niklas

View solution in original post

7 REPLIES 7

@Niklas Peterson 
I want to load data from an excel attached in the data source using script. Is it possible? Is there any api similar to [GlideImportSetLoader] which can run on scoped application as well?

 

Thanks in advance.

Something like this:

 

// First, get the data source sys_id
var gr_ds = new GlideRecord("sys_data_source");
gr_ds.addQuery("name", "DatasourceName");
gr_ds.addQuery("sys_scope", "your_scope_sys_id");
gr_ds.setLimit(1);
gr_ds.query();
gr_ds.next();
var ds_sys_id = gr_ds.getValue("sys_id");

// Get the first attachment on that row
// Not shown: check that there is an attachment, check name, check data type, get only most recent attachment etc
var gr_att = new GlideRecord("sys_attachment");
gr_att.addQuery("table_name", "sys_email");
gr_att.addQuery("table_sys_id", email_sys_id);
gr_att.setLimit(1);
gr_att.query();
gr_att.next();
var attachment_sys_id = gr_att.getValue("sys_id");

// assuming that attachment was an xlsx...
var parser = new sn_impex.GlideExcelParser();
var attachment = new GlideSysAttachment();
var attachmentStream = attachment.getContentStream(attachment_sys_id);
parser.parse(attachmentStream);

// we assume data starts at row 2
var row_number = 1;

// Move to the first data row
while (parser.next()) {
  var row = parser.getRow();

  // increment the rowNumber so the first value is 2
 row_number++;

 var column_value = row["your column_name"] || "";
 // ...
}

RiteshSwarnakar
Giga Guru

If there are multiple Transform Maps for the same Import Source Table you can use the below code:

 

var impSet = new GlideRecord('sys_import_set'); 
impSet.initialize();
impSet.mode = 'asynchronous';
impSet.table_name = 'u_import_tablename';
impSet.state = 'loading';
impSet.insert();

            //creating record in import table
	var impRec = new GlideRecord("u_import_tablename");
	impRec.u_id = 'testID';   
        impRec.u_name = 'testName';  
	impRec.sys_import_set = impSet.sys_id;
	impRec.insert();
					
				//runs all transform maps for that source table
				var mapsList = this.getMap(impSet.table_name);
				var t = new GlideImportSetTransformerWorker(impSet.sys_id, mapsList);
				t.setProgressName("Transforming: " + impSet.number);
				t.setBackground(true);
				t.start();
	


		function getMap(sTable){
			var mapGR = new GlideRecord("sys_transform_map");
			mapGR.addQuery("source_table", sTable);
			mapGR.addActiveQuery();
			mapGR.query();
			var mapsList = [];
			while(mapGR.next())
			mapsList.push(mapGR.getUniqueValue());
			return mapsList.join();
		}