解惑

解己之惑,解人之惑

标签:参数

Command中不能添加多值的参数

有一个报表要进行统计,但是按照原来的做法都不太好实现,后来没有办法使用Command来获取数据(说白了就是直接写SQL),但是在Command的界面里面添加的参数的值不能是多选的,但是有一个解决方法就是把参数转换为一个字符串。
一个例子就是Command里面使用到多值参数的时候,就创建一个字符串参数,然后写SQL的时候就设置为:
xxx in ({?parameter})
假设外面的真正的参数是params,那么可以写一个Formula把param转换为那个字符串:
Local StringVar result:="";
Local NumberVar i;
for i:=1 to count({?params}) do (
if i<count({?params}) then
result := result & toText({?params}[i],"0") & ","
else
result := result & toText({?params}[i],"0")
);
result

这样就可以解决Command里面不能使用多值参数的问题了。

动态排序

这个是刚刚提出的一个需求,我开始以为不能实现,但是是可以的,虽然比较麻烦。
Crystal Report Designer中可以选择用来排序的字段可以是数据库字段,也可以是Fomula字段,不能是参数字段,所以一个可行的方法就是创建一个Fomula字段,这个Fomula的任务很简单,就是根据参数的值选择字段:

if {?sortcolumn} =’ID’ then totext({DEVICEGROUPCONFIG.DG_ID},’0000000000000′)
else
{DEVICEGROUPCONFIG.DG_NAME}

需要注意的就是那个totext的使用,Fomula是没有类型的,但是要求其返回值的类型要一致,不能一会是字符串一会是数字,所以我使用了totext把数字转换为字符串,如果有日期类型,也要类似的实现。

取得参数的缺省值列表

我们要求报表可以根据用户的选择来动态进行排序,但是每个报表所显示的列肯定不一样,所以每个报表在实现这个功能的时候,参数提示的时候必然要提供可选的值,到了Java里面,如何从Crystal Report Server上读取这些信息呢?
    public static ValueObjList getReportParameters(int reportID) throws Exception
    {
        String query = "Select SI_PROCESSINFO.SI_PROMPTS From CI_INFOOBJECTS Where si_progid = ‘crystalenterprise.report’ and SI_ID = "
                + reportID;
        IInfoObjects results = query(query);
        ValueObjList result = new ValueObjList();
        if (results == null)
        {
            return result;
        }
        IInfoObject report = (IInfoObject) results.get(0);
        List allParameters = ((IReport) report).getReportParameters();
        IReportParameter reportParameter = null;
        //Fix THRX2282, this maybe crystal report’s bug
        Set parameterNames = new HashSet();
        for (int j = 0; j < allParameters.size(); j++)
        {
            reportParameter = (IReportParameter) allParameters.get(j);
            if (!reportParameter.isInUse())
            {
                continue;
            }
            CrystalReportParamConfigValueObj paramvo = new CrystalReportParamConfigValueObj();
            String name = reportParameter.getParameterName();
            if (name.equals("sortcolumn"))
            {
                IReportParameterValues defaultValues = reportParameter.getDefaultValues();
                Values values = defaultValues.getValues(reportParameter.getValueType());
                for (int m = 0; m < values.size(); m++)
                {
                    ParameterFieldDiscreteValue value = (ParameterFieldDiscreteValue) values.get(m);
                    System.out.println(value.displayText(Locale.ENGLISH));
                }
            }
            if (parameterNames.contains(name))
            {
                continue;
            }
            else
            {
                parameterNames.add(name);
                paramvo.setAttribute(CrystalReportParamConfigAttributes.name, name);
                paramvo.setAttribute(CrystalReportParamConfigAttributes.type, new Integer(reportParameter
                        .getValueType()));
                result.add(paramvo);
            }
        }
        return result;

    }

注意蓝色的代码,特别是defaultValues.getValues(reportParameter.getValueType()),这样我们就可以从服务器上读取到报表随带的参数值列表。

动态设置带参数的onclick事件

本来这个应该不是什么难事,但是我们是在一个受限的情况下写代码,我们有一个RadioSelectEntry类帮助我们生成RadioButton元素,但是又没有提供设置onclick事件的方法,只能在onload里面做,但是可能有多个,我不愿意写几个一样的方法,想根据参数动态设置,这就遇到问题了,因为一般都是这样:
element.onclick=functionName;
这里的functionName就是事件处理函数,但是我的是带参数的,怎么办?呵呵,一个小技巧就可以解决:匿名函数:
    element.onclick=function() {
        functionName(param);
    };

使用参数方式还是页面配置方式

到现在也用了不少的插件了,发现很多插件作者现在很喜欢使用页面配置的方式,但是很巧的是,我刚开始安装的插件都是使用参数的方式,在调用的时候要指定参数或者使用函数默认的参数值,就我而言,我更喜欢参数的方式,因为页面配置只能配置一种使用方式,例如随机日志的功能,我在首页要显示10条,而在每篇日志的下面只想显示4条,如果这个插件使用页面配置方式,我该怎么办?勉强一下都显示5条?页面配置方式可能很适合对变成不是很熟悉的用户,但是像我这样的专业用户,还是让我可以使用参数的方式用吧。

© 2025 解惑

本主题由Anders Noren提供向上 ↑