1

以下に示すように、すべてのCrystalレポートを表示するページがあります。

これらのレポートには、 https://myserver.bla.blaなどを指す(悲しいことにハードコーディングされた)URL式が含まれています。

どういうわけか、プログラムでURLのインスタンスを探し、それらを別のインスタンスに変更したいと思います(これらのレポートは数百あり、現在、すべてのリンクを変更するのに十分な時間がありません)。

FieldObjectsを探していましたが、書式設定式を変更する方法がわからないようです。reportdocument.fieldformulasを見ると、URLの書式設定式がありません。

パブリック部分クラスレポート:System.Web.UI.Page {

    protected void Page_Load(object sender, EventArgs e)
    {
        iLogger logger = LoggingFactory.CreateLogger();

        ReportDocument rd = new ReportDocument();

        string fileName = Request.QueryString["reportfile"];


        if(!Regex.IsMatch(fileName,@"^[ 0-9a-zA-Z-_\\]+.rpt$"))
        {
            ArgumentException aex = new ArgumentException("Invalid file/path specified.");
            logger.LogError(ActionTypes.Administration, HttpContext.Current.User.Identity.Name,
                            "Passed invalid file path to report viewer: " + fileName, aex);
            throw aex;
        }



        if(Path.IsPathRooted(fileName))
        {
            ArgumentException aex = new ArgumentException("Absolute path passed to report viewer.");
            logger.LogError(ActionTypes.Administration, HttpContext.Current.User.Identity.Name,
                         "Passed invalid file path to report viewer: " + fileName, aex);
            throw aex;
        }

        string rootPath = Server.MapPath("~/Reports/");

        string path = Path.Combine(rootPath, fileName);



        if (File.Exists(path))
        {
            rd.Load(path);
        }

        //get all keys starting with Prompt
        var prompts = Request.QueryString.AllKeys.Where(q => q.StartsWith("Prompt"));

        foreach (string promptKey in prompts)
        {
            //try to convert the rest of the string to an int  
            //yes, this should probably not just be a replace here...
                string withoutPrompt = promptKey.Replace("Prompt", "");

                int promptVal;
                if (int.TryParse(withoutPrompt, out promptVal))
                {
                    rd.SetParameterValue(promptVal, Request.QueryString[promptKey]);
                }
                //rd.SetParameterValue(promptKey, Request.QueryString[promptKey]);

        CrystalReportViewer1.ReportSource = rd;                        
    }
}
4

1 に答える 1

2

Ok。少なくともURLの取得方法を見つけたので、取得したものをみんなと共有したいと思いました。

 CrystalDecisions.ReportAppServer.ClientDoc.ISCDReportClientDocument cDoc = rd.ReportClientDocument;

        ReportObjects reportObjects = rd.ReportDefinition.ReportObjects;



        CrystalDecisions.ReportAppServer.ReportDefModel.ReportObjects objects = 
        cDoc.ReportDefController.ReportObjectController.GetReportObjectsByKind(
            CrystalDecisions.ReportAppServer.ReportDefModel.CrReportObjectKindEnum.crReportObjectKindField);


        foreach(ISCRReportObject obj in objects)

        {
            //CrystalDecisions.ReportAppServer.ReportDefModel.ObjectFormatConditionFormulas formulas =obj.Format.ConditionFormulas[];
            ConditionFormula hyperFormulas = obj.Format.ConditionFormulas[CrObjectFormatConditionFormulaTypeEnum.crObjectFormatConditionFormulaTypeHyperlink];

            if (hyperFormulas != null && hyperFormulas.Text != null)
            {
                hyperFormulas.Text = hyperFormulas.Text.Replace(@"https://my/old/url","https://my/new/url");
            }

        }

私は実際にはこれがまだ式を変更しているとは思いませんが:(

残念ながら、値を設定してから変更していると思います。

うわー。とった :)

私の変更ルーチンは次のようになります。

  foreach(ISCRReportObject obj in objects)

        {
            //CrystalDecisions.ReportAppServer.ReportDefModel.ObjectFormatConditionFormulas formulas =obj.Format.ConditionFormulas[];
            ConditionFormula hyperFormulas = obj.Format.ConditionFormulas[CrObjectFormatConditionFormulaTypeEnum.crObjectFormatConditionFormulaTypeHyperlink];

            if (hyperFormulas != null && hyperFormulas.Text != null)
            {
                hyperFormulas.Text = hyperFormulas.Text.Replace(@"{{old url}}",{{new url}});

                cDoc.ReportDefController.ReportObjectController.Modify(
                    cDoc.ReportDefController.ReportDefinition.FindObjectByName(obj.Name), obj);

            }

        }

よく働く!

于 2012-08-24T22:24:36.357 に答える