crystalReportViewer+ReceiveCrystalReport.rpt+DataSet.xsd做报表

本文详细介绍了如何使用Crystal Report创建报表,并通过配置数据集、设置参数、调整布局等步骤来实现定制化的报表展示效果。包括固定条数、调整节高、写公式、换行显示、主副表关联显示等功能的实现方法,以及如何进行横打和不预览直接打印的操作。同时,展示了如何利用对象传递数据源到报表中,以实现更灵活的数据展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://blog.youkuaiyun.com/happy09li/article/details/6931959


crystalReportViewer(报表查看器)+ReceiveCrystalReport.rpt(报表文件)+DataSet.xsd(数据集)

1.crystalReportViewer 的ReportSource属性指定一个ReceiveCrystalReport.rpt文件
2.添加一个dataset.xsd文件,添加报表要显示的字段信息(一定要与数据库中一致)
3.打开ReceiveCrystalReport.rpt文件,在右边窗口DatabaseFields右键(Database EXpert)

  


在左边窗口打开ProjectData>ADO.NET Datasets 选择一个DataSet,添加到右边,点确定,
再将其字段拖入打开的报表文件中即可

        private void PrintReceiveOrder_Load(object sender, EventArgs e)
        {
            try
            {
                ReceiveCrystalReport rpt = new ReceiveCrystalReport();
                DataSet ds = new DataSet();
                string strConn = "Data Source=192.168.1.1;Initial Catalog=Test;User ID=sa;Password=123456";
                SqlConnection conn = new SqlConnection(strConn);
                SqlDataAdapter da = new SqlDataAdapter("Select id,pay_time,type,remark from  test", conn);
                da.Fill(ds, "test");
                rpt.SetDataSource(ds.Tables["test"]);
                this.crystalReportViewer1.ReportSource = rpt;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

 

1.固定条数,调整节高或是写公式: 
在detail节按右键,Format     section...     
选择     New     Page     after,然后点击右边的公式按钮,输入:     
RecordNumber     mod         5=     0     
则会每五条记录翻页。

2.换行显示
选中有一个字段 右键 Fromat Object  勾选 Can Grow 即可

 

3设置主副表报关联显示

选择子报表 
点右键   选择   change   subreport   links
 选择关联字段即可


4.纸张横打

右键->打印设计->


5.横打,左右双打(一页打双份)




把宽度设置为页面的一半即可,最好是比页面的一半还要少点




------------------------------------------------------------------不预览直接选择打印机打印-----------------------------------------------------

                PrintDialog print = new PrintDialog();
                print.ShowDialog();//选择打印机
                PrintUPSCrystalReport ups = new PrintUPSCrystalReport();//报表设计
                ups.SetParameterValue("Code", "PH20120327");//设置参数
                ups.SetParameterValue("Telephone", "123456792");
                ups.PrintOptions.PrinterName = print.PrinterSettings.PrinterName;//用选择的打印机进行打印,不选择则用默认打印机打印
                ups.PrintToPrinter(1, true, 1, 1);//关键这句,不用预览,直接打印

                 ups.SetDataSource(dt);//设置数据源


---------------------------------------------------------------------------用对象做做报表数据-----------------------------------------

        public PrintReceiveOrder(receiveShipmentOrder orderInfo,List<receiveShipmentOrderItem> orderItem)
        {     
            InitializeComponent();
            BindReport(orderInfo, orderItem);           
        }
        //绑定报表
        private void BindReport(receiveShipmentOrder orderInfo, List<receiveShipmentOrderItem> orderItem)
        {

            ParameterFields parameterFields = LoadOrderInfo(orderInfo);
            try
            {
               this.crystalReportViewer1.ParameterFieldInfo = parameterFields;
                ReceiveCrystalReport rpt = new ReceiveCrystalReport();
                rpt.SetDataSource(LoadDetailInfo(orderItem).Tables["orderItem"]);
                this.crystalReportViewer1.ReportSource = rpt;
            }
            catch (Exception ex)
            {

            }
   
        }

        //数据源
        private DataSet LoadDetailInfo(List<receiveShipmentOrderItem> orderItem)
        {
            DataSet ds = CreateReportDataSet();
            if (orderItem != null)
            {
                DataTable deliveryorderTable = ds.Tables["orderItem"];
                foreach (receiveShipmentOrderItem item in orderItem)
                {
                    DataRow dr = deliveryorderTable.NewRow();
                    dr["id"] = item.purchaseProduct.id;
                    dr["orderCode"] = item.purchaseProduct.orderCode;
                    dr["receiveShipmentQty"] = item.receiveShipmentQty.ToString();
                    dr["reimburseMark"] = (item.purchaseProduct.reimburseMark ? "是" : "否"); 
                    dr["image"] = item.purchaseProduct.image;//二进制类型
                    deliveryorderTable.Rows.Add(dr);
                }
            }
            return ds;
        }

        private DataSet CreateReportDataSet()
        {
            DataSet ds = new DataSet();
            DataTable deliveryorderTable = new DataTable("orderItem");
            deliveryorderTable.Columns.Add(new DataColumn("Image",System.Type.GetType("System.Byte[]"))));        
            deliveryorderTable.Columns.Add(new DataColumn("orderCode"));
            deliveryorderTable.Columns.Add(new DataColumn("receiveShipmentQty"));
            deliveryorderTable.Columns.Add(new DataColumn("reimburseMark"));
            ds.Tables.Add(deliveryorderTable);

            return ds;
        }


//设置头参数

        private ParameterFields LoadOrderInfo(receiveShipmentOrder orderview)
        {
            ParameterFields orderInfo = new ParameterFields();
            if (orderview != null)
            {
                orderInfo.Add(GetParameterField("supplierName", orderview.supplier.name));
                orderInfo.Add(GetParameterField("name", orderview.createUser.name));
                string state="";
                orderInfo.Add(GetParameterField("state", state));
                orderInfo.Add(GetParameterField("receiveCode", orderview.code));
            }
            return orderInfo;
        }

        //设置参数字段
        private ParameterField GetParameterField(string name, string value)
        {
            ParameterField field = new ParameterField();
            ParameterDiscreteValue fieldValue = new ParameterDiscreteValue();
            field.ParameterFieldName = name;
            fieldValue.Value = value;
            field.CurrentValues.Add(fieldValue);
            return field;
        }

 

 

 

------------------------------------------------------------------主副报表关联显示------------------------------------------------------------------

    private void bindList(List<WaitDeliveryView> deliveryList)
        {
            OrderCrystalReport rpt = new OrderCrystalReport();
            rpt.SetDataSource(LoadDetailInfo(deliveryList).Tables["packageItem"]);
            rpt.Subreports["OrderDetailReport.rpt"].SetDataSource(LoadDetailInfo(deliveryList).Tables["ProductItem"]);
            this.crystalReportViewer1.ReportSource = rpt;
        }

        //数据源
        private DataSet LoadDetailInfo(List<WaitDeliveryView> deliveryList)
        {
            DataSet ds = CreateReportDataSet();
            if (deliveryList != null)
            {
                DataTable packageTable = ds.Tables["packageItem"];

                DataTable ProductTable = ds.Tables["ProductItem"];

                int total = 0;
                int i = 0;
                foreach (WaitDeliveryView item in deliveryList)
                {
                    DataRow dr = packageTable.NewRow();
                    dr["Id"] = item.Package.id;
                    dr["OrderCode"] = item.Package.code;
                    dr["CustomName"] = item.Package.order.buyer.fullName;
                    dr["DeliveryWay"] = item.Package.delivery.name;
                    dr["Total"] = total;
                    packageTable.Rows.Add(dr);

                    foreach (orderProduct items in item.Package.orderProducts)
                    {
                        DataRow drs = ProductTable.NewRow();
                        drs["Id"] =item.Package.id;
                        drs["No"] = i + 1;
                        //显示商品编号 + (SKU)
                        drs["Item"] = items.code + " " + items.SKU;
                        drs["Qty"] = items.productQty;
                        total += items.productQty;
                        ProductTable.Rows.Add(drs);
                    }
                }
            }
            return ds;
        }

        private DataSet CreateReportDataSet()
        {
            DataSet ds = new DataSet();
            DataTable packageTable = new DataTable("packageItem");
            packageTable.Columns.Add(new DataColumn("Id"));
            packageTable.Columns.Add(new DataColumn("OrderCode"));
            packageTable.Columns.Add(new DataColumn("CustomName"));
            packageTable.Columns.Add(new DataColumn("DeliveryWay"));
            packageTable.Columns.Add(new DataColumn("Total"));
            ds.Tables.Add(packageTable);

            DataTable ProductTable = new DataTable("ProductItem");
            ProductTable.Columns.Add(new DataColumn("Id"));
            ProductTable.Columns.Add(new DataColumn("No"));
            ProductTable.Columns.Add(new DataColumn("Item"));
            ProductTable.Columns.Add(new DataColumn("Qty"));
            ds.Tables.Add(ProductTable);
            return ds;
        }


<think>首先,用户的问题是关于CK命令比较两个report_global_slack.rpt文件时出现FAILED错误的原因。用户提到了引用,但这些引用是关于report_timing、report_constraint等命令的选项和用法,可能与全局slack报告相关。 关键点: - 用户说:“我想用户希望了解在执行CK命令时出现FAILED消息的原因,具体是两个report_global_slack.rpt文件的比较出现了不匹配的情况。” - 所以,核心是为什么比较两个report_global_slack.rpt文件时会失败。 我需要回想report_global_slack是什么。在EDA工具中,如Synopsys Design Compiler (DC),report_global_slack命令用于报告全局时序slack,这可能包括设计中的最差路径的slack信息。 用户引用了几个来源: - [^1]: 关于report_timing选项的详细参数。 - [^2]: 关于如何提取report_constraint中的big negative slack violators。 - [^3]: 关于report_timing报告的分析,包括选项如-significant_digits和-input_pins。 这些引用可能提供了线索,但用户的问题具体是关于report_global_slack.rpt文件的比较失败。 可能的原因: 1. **文件格式或内容差异**:两个报告文件可能有不同的格式、精度或单位,导致比较失败。例如,一个文件可能使用不同的有效数字位数,另一个可能包含额外信息。 2. **时序数据不一致**:由于设计状态变化、时序分析设置不同或工具版本差异,导致slack值不同。 3. **工具命令选项不匹配**:生成报告时使用的命令选项不同,比如-report_timing的选项影响输出。 4. **路径或环境问题**:文件路径错误、权限问题或文件损坏。 5. **比较脚本或工具问题**:CK命令本身可能是一个自定义脚本或工具,用于比较报告,脚本可能有bug或对输入敏感。 从引用中提取相关信息: - 引用[^3]提到report_timing可以使用选项如-significant_digits来控制小数点后位数。如果report_global_slack也类似,精度差异可能导致比较失败。 - 引用[^2]是关于过滤violators的,表明报告中可能有特定格式需要处理。 用户的问题:"请问CK命令比较report_global_slack.rpt文件时出现FAILED错误的原因是什么?" 我需要构建一个结构清晰的回答: - 解释可能的原因。 - 提供解决方案或调试步骤。 - 使用中文回答。 - 在行内数学表达式使用$...$,独立公式用$$...$$(但这里可能不需要数学公式)。 - 生成相关问题。 回答结构: 1. **引言**:简述问题。 2. **可能原因分析**:列出和解释常见原因。 3. **解决方案建议**:提供如何诊断和修复。 4. **引用相关部分**:自然地引用提供的引用。 5. **生成相关问题**:在末尾添加相关问题。 确保回答真实可靠:基于EDA工具的一般知识,但避免猜测具体工具细节,除非引用支持。 可能原因: - **精度差异**:如果报告使用不同的-significant_digits选项,slack值可能有不同小数位,导致字符串比较失败。 - **报告内容变化**:设计修改后,时序路径变化,slack值不同。 - **选项不一致**:生成报告时,report_global_slack的选项不同,如-path_type或-delay_type。 - **文件格式问题**:报告可能有时间戳、头信息等动态内容。 - **比较方法问题**:CK命令可能使用简单的文本比较,忽略了容忍度或特定部分。 从引用[^3]:"报告中,小数点后默认的位数是二,如果要增加有效数(字),在用report_timing命令时,加上命令选项“-significant_digits”。" 这暗示精度设置可能导致输出差异。 类似地,report_global_slack可能也有类似选项。 解决方案: 1. 检查生成报告的脚本,确保选项一致。 2. 比较文件内容手动,查看具体差异。 3. 使用工具提供的比较功能或带容忍度的比较。 生成相关问题: 1. 如何确保report_global_slack报告的一致性? 2. 在时序分析中,全局slack的重要性是什么? 3. 如何调试时序比较失败的问题? 在回答中引用: - 例如,"如果报告的有效数字位数不同,可能导致比较失败,如引用[^3]所述。" 最终回答框架: - 回答用户问题。 - 然后添加相关问题。</think>### CK命令比较report_global_slack.rpt文件时出现FAILED错误的原因分析 在执行CK命令(可能是一个自定义脚本或工具命令)比较两个`report_global_slack.rpt`文件时出现"FAILED"错误,通常表示报告文件内容不匹配或比较过程失败。这种错误在电子设计自动化(EDA)工具如Synopsys Design Compiler(DC)中常见,尤其是在时序分析阶段。以下我将逐步解释可能的原因、诊断方法和解决方案,确保回答基于时序分析的一般原理和相关引用。 #### 可能原因分析 1. **报告文件格式或精度不一致**: - `report_global_slack`命令生成的报告可能因选项设置不同而导致输出格式差异。例如: - 如果两个报告使用不同的有效数字位数(如一个默认保留两位小数,另一个使用`-significant_digits`选项增加精度),数值的字符串表示会不同,导致比较失败[^3]。 - 报告可能包含动态内容,如时间戳、路径信息或头尾注释,这些内容在多次运行中变化,使简单文本比较失败。 - 引用[^3]提到:"报告中,小数点后默认的位数是二,如果要增加有效数(字),在用report_timing命令时,加上命令选项‘-significant_digits’。" 类似地,`report_global_slack`也可能受此影响。 2. **时序数据内容不匹配**: - **设计状态变化**:如果在生成两个报告之间,设计被修改(如逻辑优化、约束更新),全局slack值(如最差路径的负slack)可能发生变化,导致文件内容差异。例如,引用[^2]讨论如何提取"big negative slack violators",如果设计有新的时序违规,报告会不同。 - **分析设置不一致**:生成报告时使用的命令选项不统一,如: - `-delay_type`(min/max)、`-path_type`(short/full)或`-nworst`选项影响报告内容[^1]。如果选项不同,报告会聚焦不同的路径或延迟类型。 - 引用[^1]说明:"report_timing 的全部参数[ -delay_type min | min_rise | ... ]",类似选项可能适用于`report_global_slack`。 3. **比较脚本或工具问题**: - CK命令可能是一个简单的文本比较脚本(如`diff`工具),它: - 没有处理数值容忍度(例如,slack值差异小于0.01ns应视为相等)。 - 忽略了报告中的无关部分(如注释行或空白字符),导致假性失败。 - 脚本本身可能有bug,或对文件编码、行尾符敏感。 4. **文件或环境问题**: - 文件路径错误、权限不足或文件损坏,导致一个报告未完整生成。 - EDA工具版本升级或环境变量变化,影响报告生成逻辑。 #### 诊断和解决方案 为了定位问题,请按以下步骤操作: 1. **检查报告生成命令**: - 确保两个`report_global_slack.rpt`文件使用完全相同的命令选项生成。例如: - 统一设置`-significant_digits 4`(增加精度)和`-path_type full`(确保完整路径报告),避免格式差异[^3]。 - 在DC脚本中,添加日志记录选项,如: ```tcl report_global_slack -significant_digits 4 -path_type full -output report_global_slack.rpt ``` - 引用[^3]建议:"如要分别报告连线延迟和单元延迟,在使用report_timing命令时,加上命令选项‘-input_pins’。" 如果`report_global_slack`支持类似选项,需保持一致。 2. **手动比较文件内容**: - 使用文本编辑器或命令行工具(如`diff -u file1.rpt file2.rpt`)查看具体差异行。 - 关注关键部分: - **Slack值**:检查是否因设计变更导致slack变化(如新violator出现)。引用[^2]提供过滤方法:"提取DC综合report_constrain all violator中big neg slack",可类似地分析slack部分。 - **动态内容**:忽略时间戳或路径ID,聚焦数值部分。 - 如果差异微小(如小数位不同),在比较脚本中添加数值容忍度处理(例如使用Python脚本解析数值并比较)。 3. **验证比较脚本**: - 如果CK命令是自定义脚本,检查其逻辑: - 是否跳过无关行(如以"#"开头的注释)? - 是否使用数值比较而非字符串比较?例如,在Python中: ```python import re def compare_slack(file1, file2, tolerance=0.001): # 提取slack值(假设报告行如 "Global Slack: -0.05ns") slack1 = re.findall(r"Slack:\s*(-?\d+\.\d+)", open(file1).read()) slack2 = re.findall(r"Slack:\s*(-?\d+\.\d+)", open(file2).read()) if len(slack1) != len(slack2): return "FAILED: Slack count mismatch" for s1, s2 in zip(slack1, slack2): if abs(float(s1) - float(s2)) > tolerance: return f"FAILED: Slack value diff {abs(float(s1)-float(s2))} > tolerance" return "PASSED" ``` - 测试脚本:用已知相同文件验证脚本是否误报。 4. **重新生成报告**: - 在相同设计状态和工具环境下重新运行`report_global_slack`,确保无临时错误。 - 如果问题持续,检查DC日志文件,查看报告生成时是否有警告或错误。 #### 总结 CK命令比较失败的主要原因是报告文件内容不一致,常见于格式精度、时序数据变化或比较方法缺陷。通过统一命令选项、手动验证差异和增强比较脚本,通常能解决此问题。如果设计有更新,需重新评估时序收敛性[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值