解惑

解己之惑,解人之惑

日:2007年3月7日

动态排序

这个是刚刚提出的一个需求,我开始以为不能实现,但是是可以的,虽然比较麻烦。
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()),这样我们就可以从服务器上读取到报表随带的参数值列表。

© 2025 解惑

本主题由Anders Noren提供向上 ↑