Adaptive Planning 函数
测试连接函数
“测试连接”函数用于确定 Integration 是否可以连接到外部系统。“测试连接”函数必须返回 true 或 false 来指示结果。
- 相关信息参数
- 测试连接具有 1 个参数“context”。方法参数返回类型描述getDataSource()ai.dataSource返回有效数据源。getCalendar()ai.calendar返回Adaptive Planning日历
- 示例
- function testConnection(context) { // Step 1: Create a https request to send to Earthquake USGS API var url = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.atom'; var method = 'GET'; var body = ``; var headers = {}; // Step 2: Send request and receive response try{ var response = ai.https.request(url, method, body, headers); ai.log.logInfo("Test Connection Successful"); } catch(e) { ai.log.logInfo("Test Connection Failed"); } // Step 3: Interrogate response to see if it was successful. Return true or false depending on the result. if (response.getHttpCode() == '200') { var body = response.getBody(); return true; } else { return false; } }
导入结构函数
“导入结构”函数用于创建/更新由外部系统定义的数据源架构(即表格和列)。“Import Structure”函数必须返回 ai.struct.structuralBuilder 对象。
- 相关信息参数
- 为“Import Structure”函数提供 1 个参数“context”。方法参数返回类型描述getDataSource()ai.dataSource返回有效数据源。getProgressManager()ai.progressManager返回一个对象,该对象可用于更新“导入结构”任务的完成百分比值。getStructureBuilder()ai.structure.structureBuilder返回一个对象,该对象用于创建数据源结构(表格、列、参数等)。getCalendar()ai.calendar返回Adaptive Planning日历
- 示例
- function importStructure(context) { //getDataSource var dataSource=context.getDataSource(); // getStructureBuilder var builder = context.getStructureBuilder(); //getCalendar var calendar= context.getCalendar(); }
- ai.progressManager
- 通过 ai.progressManager 对象,用户可以手动设置正在运行结构导入脚本的任务的完成百分比。脚本执行占任务整体完成百分比的 70%。因此,通过 ai.progressManager 定义的进度值会缩放,以表示整体任务的进度。示例:如果将 ai.progressManager 完成百分比设置为 100%,则相当于正在运行的任务完成了 70%,如果设置为 50%,则相当于正在运行的任务完成了 35%,依此类推。
- 函数
- 方法参数返回类型描述getProgress()数字返回由用户定义的脚本完成百分比。如果用户之前未设置完成百分比,则此函数将返回 0。setProgress( value )
- value:数字,脚本完成百分比的值。
设置脚本完成百分比。其工作原理如下:- 仅接受数值,例如 0、10、22.5、100、110。
- 大于 100 的值将被视为 100。
- 小于当前脚本进度的值将被忽略。示例:先调用 setProgress(50),再调用 setProgress(40)。这将导致脚本完成百分比达到 50%。
- “value”的所有其他输入类型对脚本进度没有影响,
- 示例
- function importStructure(context) { .......... var progressManager = context.getProgressManager(); // Set script progress % to 10 progressManager.setProgress(10); // Increase script progress % to 50 progressManager.setProgress(50.0); // Set progress to 100 by using value greater than 100 progressManager.setProgress(230); progressManager.getProgress(); // returns 100 // Increase progress by 10% based on current progress progressManager.setProgress(progressManager.getProgress() + 10); .......... return builder; }
- ai.structure.structureBuilder
- 函数方法参数退货描述addTable( tableId )
- tableId :表格的唯一字符串编号
ai.structure.editableTable为数据源创建并返回一个新表格。 - 示例
- 提供定义将由数据填充的表格和列结构的功能。function importStructure(context) { ........ //getStructureBuilder var builder = context.getStructureBuilder(); //Example addTable( tableId )-"Sample" var table = builder.addTable("Sample"); ....... }
- ai.structure.editableTable
- 函数方法参数退货描述setDisplayName( displayName )displayName:String 要为表格的显示名称属性设置的值。ai.structure.editableTable设置表格的显示名称。addColumn( columnId )columnId :列的 String RemoteIdai.structure.editableColumn创建并返回表格的新子级列。addRequiredParameter( parameterId )parameterId :参数的字符串编号ai.structure.editableParameter创建并返回表格的新必需参数。如果将此表格用作 ImportData 或 ImportStructure 的一部分,则必须将可指定的参数设置为“必选参数”的值。
- ai.structure.editableColumn
- 函数方法参数退货描述setDisplayName( value )
- value:要将列的 displayName 属性设置为的字符串值
ai.structure.editableColumn设置列的显示名称。setDisplayOrder( value )- value:要将列的 displayOrder 属性设置为的字符串值
ai.structure.editableColumn设置列的显示顺序。setIncludeByDefault( value )- value:布尔值,用于将列的 IsEnabled 属性设置为
ai.structure.editableColumn设置要为数据导入启用的列。setIncludeInKey( value )- value:将列的 includeInKey 属性设置为的布尔值
ai.structure.editableColumn指示列是否是表键的一部分。setMandatoryForImports( value )- value:布尔值,用于指示此列是否必须启用数据导入功能
ai.structure.editableColumn设置要启用数据导入(必填)的列。setNonFilterable( value )- value:布尔值,用于将列的 nonFilterable 属性设置为
ai.structure.editableColumn指示是否可以在远程查询中包括该列。setRemoteColumnType( value )- value:要将列的 RemoteColumnType 属性设置为的字符串值
ai.structure.editableColumn设置列的远程数据类型,例如“字符串”“整数”等setTextColumnType( length )- length:Integer 此列可容纳的值的最大长度
ai.structure.editableColumn使列成为文本列。setIntegerColumnType()ai.structure.editableColumn使列成为整数列。setFloatColumnType()ai.structure.editableColumn使列成为双精度列。setBooleanColumnType()ai.structure.editableColumn将列设为布尔值列。setDateTimeColumnType()ai.structure.editableColumn将列设为日期时间列。 - ai.structure.editableParameter
- 函数方法参数退货描述setDisplayName( value )
- value:要将参数的 displayName 属性设置为的字符串值
设置参数的显示名称。setForDataImport( value )- value:布尔值,指示是否可在 ImportData 脚本中访问参数
为数据导入启用参数。setTypePeriodRange()将参数类型更改为期间范围 - 示例
- function importStructure(context) { ............... //addColumn var valueColumn= table.addColumn('Value'); //setDisplayName valueColumn.setDisplayName('Value'); // Set the data type for the column - Can be Integer, Float, DateTime or Boolean values valueColumn.setFloatColumnType(); //setDisplayOrder valueColumn.setDisplayOrder('0'); //setIncludeByDefault valueColumn.setIncludeByDefault(true); //setRemoteColumnType valueColumn.setRemoteColumnType('float'); // setIncludeInKey valueColumn.setIncludeInKey(false); //setMandatoryForImports valueColumn.setMandatoryForImports(false); .............. }
导入数据函数
“导入数据”函数用于从外部源获取行,并将其导入到 Integration 暂存表中。导入行的机制是 ai.rowset 对象,该对象通过传递到 Import Data 函数的 'context' 参数提供。
- 相关信息参数
- 为“导入数据”函数提供 1 个参数,即“context”。方法参数返回类型描述getRowset()在 2021R1 发行版中,支持人员根据您的请求启用 getRowset(ColumnIds) 后,在日志中生成 API 弃用警告。getRowset() 方法将继续运行,但会忽略任何参数。ai.rowset返回要向其中添加行的 Rowset 对象。“行集”定义了表格、列和最大行数。getRowset([columnIds])在 Workday Customer Center 中提交工单,启用“自定义云服务按指定列读取暂存表”功能标志。[列编号]ai.rowset按指定的列顺序,返回要添加行的 Rowset 对象。“行集”定义了表格、列和最大行数。getDataSource()ai.dataSource返回有效数据源。getCalendar()ai.calendar返回Adaptive Planning日历
- 示例
- 此示例假设行集按顺序包含“整数”列和“文本”列。function importData(context) { ........... var rowset = context.getRowset(); .......... var rowset= context.getRowset([ 'NAME', 'ID']); }
- ai.rowset
- “行集”对象是一种机制,可将用户脚本内的“行”传输到集成堆栈中。“Rowset”对表格的形状(列名称及其数据类型、maxRows 和 tableId)进行建模,用户将针对该表格运行其“PreviewData”或“ImportData”脚本。
- 函数
- 方法参数返回类型描述addRow( cells )cells: Array<Primitive Types> 每列的值组成的数组(按顺序排列)将单元格值数组作为一行添加到行集。单元格值必须为有效字符串(可以为 null)、数字(有限整数或小数)、布尔值或日期对象。每个单元格的值类型都必须按照 getColumnNames 定义的顺序与其相应的列数据类型相匹配。单元格值的数量必须与定义的列数匹配。getTableId()String返回正在预览的表格的表格编号。getMaxRows()整数返回此 Rowset 中允许的最大行数。0 表示未知(由 ImportData 使用)。getColumns()Array<ai.dataSource.table.column>返回为预览选择的表格列。setSmartParsingEnabled( val )
- val:布尔值,指示是开启还是关闭此功能
如果可能,启用此设置将在 addRow() 函数运行期间自动将每个字符串单元格值解析为目标列所需的数据类型。如果当前单元格的值的数据类型与目标列的数据类型不匹配,则用户不必手动查找目标列的数据类型并执行解析。在处理通过 JSON 或 XML 以字符串形式返回所有行值的第三方 API 时,此功能特别有用,并且可以成功将每个单元格值解析为整数、浮点数、布尔值或日期时间值。getSmartParsingEnabled()Boolean如果此设置已启用,则返回 true。默认为 false。function importData(context) { var dataSource = context.getDataSource(); var settings = dataSource.getSettings(); var rowset = context.getRowset(); //Set and Get SmartParsingEnabled() value rowset.setSmartParsingEnabled(true); ai.log.logInfo(getSmartParsingEnabled()); //true //Set a Start date and End date in the Designer Settings tab with the name "Period Range" var startDateString = dataSource.getSetting("Period Range").getValue().getFromPeriodStartDateTime().substring(0, 10); var endDateString = dataSource.getSetting("Period Range").getValue().getToPeriodEndDateTime().substring(0, 10); //get columns var columns = rowset.getColumns(); for (var i = 0; i < dataSample.rows.length; i++) { var colName; var cells = []; for (var j = 0; j < columns.length; j++) { var colValue; var re = /\\\-/g; if ((new Date(dataSample.rows[i]["Effective Date"]) >= new Date(startDateString)) && (new Date(dataSample.rows[i]["Effective Date"]) < new Date(endDateString))) { colName = columns[j].getId(); colValue = dataSample.rows[i][colName]; cells.push(colValue.toString().replace(re, '.')); } } if (cells.length == columns.length) { //add rows rowset.addRow(cells); } } }
预览数据函数
“预览数据”函数用于在外部系统中查询指定表格和列的数据行。它受到外部系统允许用户在预览期间查看的最大行数的限制。
- 相关信息参数
- 为“预览数据”函数提供了 1 个参数“context”。方法参数返回类型描述getDataSource()ai.dataSource返回有效数据源。getRowset()ai.rowset返回要向其中添加行的 Rowset 对象。“行集”定义了表格、列和最大行数。getCalendar()ai.calendar返回Adaptive Planning日历
- 示例
- 提供预览存储在云源中的数据的功能。function previewData(context) { var dataSource = context.getDataSource(); var settings = dataSource.getSettings(); var rowset = context.getRowset(); //Set and Get SmartParsingEnabled() value rowset.setSmartParsingEnabled(true); ai.log.logInfo(getSmartParsingEnabled()); //true //Set a Start date and End date in the Designer Settings tab with the name "Period Range" var startDateString = dataSource.getSetting("Period Range").getValue().getFromPeriodStartDateTime().substring(0, 10); var endDateString = dataSource.getSetting("Period Range").getValue().getToPeriodEndDateTime().substring(0, 10); //get columns var columns = rowset.getColumns(); for (var i = 0; i < dataSample.rows.length; i++) { var colName; var cells = []; for (var j = 0; j < columns.length; j++) { var colValue; var re = /\\\-/g; if ((new Date(dataSample.rows[i]["Effective Date"]) >= new Date(startDateString)) && (new Date(dataSample.rows[i]["Effective Date"]) < new Date(endDateString))) { colName = columns[j].getId(); colValue = dataSample.rows[i][colName]; cells.push(colValue.toString().replace(re, '.')); } } if (cells.length == columns.length) { //add rows rowset.addRow(cells); } } }
组合的测试连接、导入和预览数据示例
//Consider a static JSON Data Sample set dataSample = { rows: [ {"Value": 10, "Measure": "", "Test": "Palo Alto", "Effective Date": "2018-11-01"}, {"Value": 20, "Measure": " ", "Test": "Palo Alto", "Effective Date": "2018-11-01"}, {"Value": 30, "Measure": " ", "Test": "Palo Alto", "Effective Date": "2018-11-01"}, {"Value": 40, "Measure": " ", "Test": "Palo Alto", "Effective Date": "2018-11-01"}, {"Value": 50, "Measure": "1 ", "Test": "Pleasanton", "Effective Date": "2018-11-01"}, {"Value": 10, "Measure": "2 ", "Test": "Pleasanton", "Effective Date": "2018-12-01"}, {"Value": 20, "Measure": "3 ", "Test": "Pleasanton", "Effective Date": "2018-12-01"}, {"Value": 30, "Measure": "4 ", "Test": "Pleasanton", "Effective Date": "2018-12-01"}, {"Value": 40, "Measure": "5 ", "Test": "Pleasanton", "Effective Date": "2018-12-01"} ] }; //Table Definition ExternalMetadataDefinition = { Tables: [{ name: "dataSample", displayName: "Sample", columns: [{ name: "Value", displayName: "Value", type: "float", includeByDefault: true }, { name: "Measure", displayName: "Measure", includeByDefault: true }, { name: "Test", displayName: "Test", includeByDefault: true }, { name: "Effective Date", displayName: "Date", type: "datetime", includeByDefault: true }] }] }; //Since this example uses a static data source,testConnection() function can return true function testConnection(context) { return true; } //Import Structure function importStructure(context) { var addColumn = function(table, column, order) { var recordColumn = table.addColumn(column.name); recordColumn.setDisplayName(column.displayName); switch (column.type) { case "text": recordColumn.setTextColumnType(column.length); break; case "int": recordColumn.setIntegerColumnType(); break; case "float": recordColumn.setFloatColumnType(); break; case "boolean": recordColumn.setBooleanColumnType(); break; case "datetime": recordColumn.setDateTimeColumnType(); break; default: recordColumn.setTextColumnType(200); break; } recordColumn.setDisplayOrder(order); recordColumn.setIncludeByDefault(column.includeByDefault || false); recordColumn.setIncludeInKey(column.includeInKey || false); recordColumn.setMandatoryForImports(column.mandatoryForImport || false); recordColumn.setRemoteColumnType(column.remoteColumnType || "String"); }; var builder = context.getStructureBuilder(); for (var i = 0; i < ExternalMetadataDefinition.Tables.length; i++) { var externalTable = ExternalMetadataDefinition.Tables[i]; var table = builder.addTable(externalTable.name); table.setDisplayName(externalTable.displayName); for (var j = 0; j < externalTable.columns.length; j++) { addColumn(table, externalTable.columns[j], j + 1); } } } function previewData(context) { //Since the data is static, previewData() function can invoke importData() importData(context); } function importData(context) { var dataSource = context.getDataSource(); var settings = dataSource.getSettings(); var rowset = context.getRowset(); //Set and Get SmartParsingEnabled() value rowset.setSmartParsingEnabled(true); ai.log.logInfo(getSmartParsingEnabled()); //true //Set a Start date and End date in the Designer Settings tab with the name "Period Range" var startDateString = dataSource.getSetting("Period Range").getValue().getFromPeriodStartDateTime().substring(0, 10); var endDateString = dataSource.getSetting("Period Range").getValue().getToPeriodEndDateTime().substring(0, 10); //get columns var columns = rowset.getColumns(); for (var i = 0; i < dataSample.rows.length; i++) { var colName; var cells = []; for (var j = 0; j < columns.length; j++) { var colValue; var re = /\\\-/g; if ((new Date(dataSample.rows[i]["Effective Date"]) >= new Date(startDateString)) && (new Date(dataSample.rows[i]["Effective Date"]) < new Date(endDateString))) { colName = columns[j].getId(); colValue = dataSample.rows[i][colName]; cells.push(colValue.toString().replace(re, '.')); } } if (cells.length == columns.length) { //add rows rowset.addRow(cells); } } }
导出数据功能(仅限自定义云加载器)
context.createTableReader()
返回一个读取器。用途 reader.readRow()
来读取源表格的数据行。reader.readRow()
按默认顺序返回数据列。如果 context.createTableReader()
使用列编号数组调用,则系统按参数中的列顺序排列列。- 相关信息参数
- “导出数据函数”具有 1 个参数,即“context”。方法参数返回类型描述createTableReader()可选的源表格列名称数组TableReader返回有效数据源。列顺序与参数中提供的顺序相同。TableReader 对象方法参数返回类型描述readRow()值数组来自数据源的值的数组。
- 示例
- // Manually invoke this method via 'Run manually' function exportData(context) { // Step 1: Get the data var reader = context.createTableReader(); // Step 2: Process and export the data var row = null; // If reader.readRow() returns null, then there are no more records. while ((row = reader.readRow()) !== null) { // Send the row to the external system or process it for a subsequent bulk update. ai.log.logInfo(JSON.stringify(row)); } }