页面树结构
转至元数据结尾
转至元数据起始

该宏示例在V10.5上验证通过

提示:本文档的示例代码仅适用于本文档中的示例报表/场景。若实际报表/场景与示例代码无法完全适配(如使用功能不一致,或多个宏代码冲突等),需根据实际需求开发代码。

1. 示例效果

1.1. 宏代码效果

显示离指定日期最近的一段时间范围内的数据。

1.2. 预期效果

只显示最近几个月的数据。

  • 原始数据:不做任何修改
  • 最近3个月:显示筛选器指定日期的 “2017年5月” 前 3 个月的数据
  • 最近5个月:显示筛选器指定日期的 “2017年5月” 前 5 个月的数据

2. 操作步骤

  • 步骤一:新建一个空白的仪表盘

  • 步骤二:拖入三个图形到画布中,图表类型都选择“柱图”,接着选择数据模型“订单模型”

  • 步骤三:拖拽相同的字段(维度:订单日期时间维-年月;度量:销售量)到三个图表上,

  • 步骤四:拖拽 “维度>订单表>订单日期”到任意图表的筛选器区域内,将筛选器应用于所有图表

由于维度值为“年月”,因此筛选器类型需要同步,右键选择筛选器“订单日期”,设置筛选器类型为“日期>年月”。

该筛选器类型仅供参考,跟所选维度字段的类型一致即可

右键选择筛选器“订单日期”,选择“筛选器设置”

设置操作符为“小于等于”,设置默认值为静态值“2017-05”。

  • 步骤五:编写宏代码

① 显示最近三个月的数据

进入宏管理界面,新建宏,在新建模块中选择对象为“组件”,对象组件为柱图(该柱图组件名称为“最近3个月”),事件:“ onBeforeRender(组件渲染前)

把下面宏代码复制到代码区域:

最近一段时间-适用于柱图、线图、单Y联合如图、双Y联合图
//适用于柱图、线图、单Y联合如图、双Y联合图
//筛选器的标题为“订单日期”,若修改筛选器则需要修改下方获取筛选器中的“订单日期”字眼(var datePortlet = page.getPortletsByTitle("订单日期")[0];)
function main(page: IPage, portlet: IEChartsPortlet) {
    //近N年,N年月,N年月日,设置输出的条数
    var recentCount = 3;
    //根据筛选器标题来获取筛选器组件
    var datePortlet = page.getPortletsByTitle("订单日期")[0];
    //当筛选器没有标题时,需要通过筛选器ID去获取
    //var datePortlet = page.getPortletById("替换为筛选器的id")[0]; 根据ID去获取

    var datePortletvalue = datePortlet.getValue()[0];
    if (!datePortletvalue) {
        return;
    }

    //判断日期维度
    var judgeValue = datePortletvalue.split("-");
    var dateType = dateTypes(judgeValue);
    if (dateType === 0) {
        return;
    }

    //设置近N年(月日)时间列表
    datePortletvalue = datePortletvalue.replace(/-/g, "/");
    var dateValue = new Date(datePortletvalue);
    var dateArry = setArray(dateValue, dateType, recentCount);

    let options = portlet.getChartOptions();
    let datas = options.series[0].data;
    if (!datas || datas.length <= 0) {
        return;
    }

    //判断筛选器维度是否符合图表日期维度
    var dataType = (datas[0].displayValue[0]).split("-");
    if (dataType.length != dateType) {
        return;
    }

    //设置series和坐标轴
    var hasData = setData(options, datas, dateArry);

    //获取并设置ToolTip
    getToolTip(portlet, options, dateArry);

    if (hasData) {
        portlet.setChartOptions(options);
    } else {
        portlet.setChartOptions({});
    }
}

//判断日期值类型
function dateTypes(judgeValue: any) {
    //年
    if (judgeValue.length === 1) {
        return  1;
    }
    //年月
    else if (judgeValue.length === 2) {
        return 2;
    }
    //年月日
    else if (judgeValue.length === 3) {
        return 3;
    }
    return 0;
}

//设置数据和坐标轴
function setData(options: any, datas: any, dateArry: any) {
    var sData = [];
    var xaxis = [];
    var count = 0;
    for (var i = 0; i < datas.length; i++) {
        var item = datas[i];
        //判断是否在符合条件的日期列表中
        if (dateArry.includes(item.displayValue[0])) {
            item.rowIndex[0] = count;
            item.rowIndex[1] = count;
            item.value[0] = count;
            sData.push(item);
            xaxis.push(options.xAxis.data[i]);
            count++;
        }
    }
    //符合条件数据为空
    if (sData.length == 0) {
        return false;
    }
    options.series[0].data = sData;
    options.xAxis.data = xaxis;
    return true;
}

// 获取Tooltip数据
function getToolTip(portlet:any, options:any, dateArry:any) {
     let rows: any = []
    // 获取Tooltip数据
    portlet.getTooltipHandler((row: ITooltipRow, column: ITooltipColumn, rowIndex: number, columnIndex: number, fieldIndex: number) => {
        let obj = {
            '行数据': row.getValues(),
            '字段信息': row.getFields()
        }
        let ridx: number = Number(rowIndex)
        if (!rows[ridx]) rows[ridx] = []
        rows[ridx] = obj
    })
    // 自定义Tooltip信息
    setTooltipInfo(options, { rows }, dateArry);
}

//设置TooltipInfo
function setTooltipInfo(options: any, data: any,dateArry:any) {
    let result: any = [] // 提示信息
    data.rows.forEach((el: any, index: number) => {
        let rowData = el['行数据']
        let fieldData = el['字段信息']
        if (dateArry.includes(rowData[0].value)) {
            let buf :any= []
            // 构造原来的Tooltip数据信息
            rowData.forEach((em:any, edx:number) => {
                buf.push(`${fieldData[edx].alias}:${em.value}<br>`)
            })
            result.push(buf.join(''));
        }
    })
    // 覆写ECharts中tooltip.formatter格式化信息
    options.tooltip.formatter = (params: any) => {
        return result[params.dataIndex];
    }
}

//设置匹配的列表
function setArray(dateValue: any, dateType: any, recentCount: any) {
    var arry = []
    //年
    if (dateType == 1) {
        for (var i = 0; i < recentCount; i++){
            arry.push(String(dateValue.getFullYear()));
            dateValue.setYear(dateValue.getFullYear() - 1);
        }
    }
    //年月
    else if (dateType == 2) {
        for (var i = 0; i < recentCount; i++){
            var month = parseInt(dateValue.getMonth()) + 1;
            var dates;
            if (month < 9) {
                dates = dateValue.getFullYear() + "-" + "0" + month;
            } else {
                dates = dateValue.getFullYear() + "-" + month;
            }
            arry.push(dates);
            dateValue.setMonth(dateValue.getMonth() - 1);
        }
    }
    //年月日
    else {
        for (var i = 0; i < recentCount; i++){
            var month = parseInt(dateValue.getMonth()) + 1;
            var dates;
            if (month < 9) {
                dates = dateValue.getFullYear() + "-" + "0" + month + "-" + "0" + dateValue.getDate();
            } else {
                dates = dateValue.getFullYear() + "-" + month + "-" + dateValue.getDate();
            }
            arry.push(dates);
            dateValue.setDate(dateValue.getDate() - 1);
        }
    }
    return arry;
}

适配饼图的宏代码则如下所示:

最近一段时间-仅适用于饼图
//适用于饼图
//筛选器的标题为“订单日期”,若修改筛选器则需要修改下方获取筛选器中的“订单日期”字眼(var datePortlet = page.getPortletsByTitle("订单日期")[0];)
function main(page: IPage, portlet: IEChartsPortlet) {
    //近N年,N年月,N年月日
    var recentCount = 5;
     //获取筛选器组件
    var datePortlet = page.getPortletsByTitle("订单日期")[0];
    //当筛选器没有标题时,需要通过筛选器ID去获取
    //var datePortlet = page.getPortletById("替换为筛选器的id")[0]; 根据ID去获取
    var datePortletvalue = datePortlet.getValue()[0];
    if (!datePortletvalue) {
        return;
    }
    var judgeValue = datePortletvalue.split("-");
    var dateType = dateTypes(judgeValue);
    if (dateType === 0) {
        return;
    }
    datePortletvalue = datePortletvalue.replace(/-/g, "/");
    var dateValue = new Date(datePortletvalue);
    //设置近N年(月日)时间列表
    var dateArry = setArray(dateValue, dateType, recentCount);
    let options = portlet.getChartOptions();
    let datas = options.series[0].data;
    if (!datas || datas.length <= 0) {
        return;
    }
    //判断筛选器维度是否符合图表日期维度
    var dataType = (datas[0].displayValue[0]).split("-");
    if (dataType.length != dateType) {
        return;
    }
    var hasData = setData(options, datas, dateArry);
    if (hasData) {
        portlet.setChartOptions(options);
    } else {
        portlet.setChartOptions({});
    }
}
//判断日期值类型
function dateTypes(judgeValue: any) {
    //年
    if (judgeValue.length === 1) {
        return  1;
    }
    //年月
    else if (judgeValue.length === 2) {
        return 2;
    }
    //年月日
    else if (judgeValue.length === 3) {
        return 3;
    }
    return 0;
}
//设置数据和图例
function setData(options: any, datas: any, dateArry: any) {
    var sData = [];
    var itemName = [];
    for (var i = 0; i < datas.length; i++) {
        var item = datas[i];
        //判断是否在符合条件的日期列表中
        if (dateArry.includes(item.displayValue[0])) {
            sData.push(item);
            itemName.push(item.name);
        }
    }
    //符合条件数据为空
    if (sData.length == 0) {
        return false;
    }
    //设置数据项
    options.series[0].data = sData;
    //设置图例
    options.legend.data = itemName;
    return true;
}
//设置匹配的列表
function setArray(dateValue: any, dateType: any, recentCount: any) {
    var arry = []
    //年
    if (dateType == 1) {
        for (var i = 0; i < recentCount; i++){
            arry.push(String(dateValue.getFullYear()));
            dateValue.setYear(dateValue.getFullYear() - 1);
        }
    }
    //年月
    else if (dateType == 2) {
        for (var i = 0; i < recentCount; i++){
            var month = parseInt(dateValue.getMonth()) + 1;
            var dates;
            if (month < 9) {
                dates = dateValue.getFullYear() + "-" + "0" + month;
            } else {
                dates = dateValue.getFullYear() + "-" + month;
            }
            arry.push(dates);
            dateValue.setMonth(dateValue.getMonth() - 1);
        }
    }
    //年月日
    else {
        for (var i = 0; i < recentCount; i++){
            var month = parseInt(dateValue.getMonth()) + 1;
            var dates;
            if (month < 9) {
                dates = dateValue.getFullYear() + "-" + "0" + month + "-" + "0" + dateValue.getDate();
            } else {
                dates = dateValue.getFullYear() + "-" + month + "-" + dateValue.getDate();
            }
            arry.push(dates);
            dateValue.setDate(dateValue.getDate() - 1);
        }
    }
    return arry;
    
}

② 显示最近5个月的数据:

具体参考“最近3个月”的操作步骤,宏代码仅需更改“recentCount”的值为5即可。

//近N年,N年月,N年月日,设置输出的条数
var recentCount = 3;
  • 步骤六:点击 保存 保存该宏代码。重新访问报表,可看到效果已实现

3. 下载资源

最近几个月-筛选器宏.xml

  • 无标签