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

本文深入探讨了使用Crystal Reports创建、布局、关联显示及打印报表的详细步骤,包括固定条数、换行显示、主副报表关联显示、纸张横打等高级功能。通过实例代码展示如何使用C#与Crystal Reports进行报表设计与打印操作。

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

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();

          DataSet ds = new DataSet();
                ds.Tables.Add(getInoData());
                ds.Tables.Add(getItemsData());
                rpt.SetDataSource(ds);
                this.crystalReportViewer1.ReportSource = rpt;
            }
            catch (Exception ex)
            {

            }
  
        }

///报表头参数,InStockOrderInfo---DataSet.xsd 中的表

   private ReportDs.InStockOrderInfoDataTable getInoData()
        {
            ReportDs.InStockOrderInfoDataTable infoData = new ReportDs.InStockOrderInfoDataTable();
            infoData.TableName = "InStockOrderInfo";
            ReportDs.InStockOrderInfoRow newRow = infoData.NewInStockOrderInfoRow();
            newRow.BoxQty = txtBoxQty.Text;
            newRow.Remark = txtRemark.Text;
            newRow.OrderBarCode =txtCode.text;
            newRow.DeliveryWay = txtDeliveryWay.Text;
            infoData.Rows.Add(newRow);
            return infoData;
        }

///报表详细,InStockOrderItems---DataSet.xsd 中的表
        private ReportDs.InStockOrderItemsDataTable getItemsData()
        {
            ReportDs.InStockOrderItemsDataTable itemData = new ReportDs.InStockOrderItemsDataTable();
            itemData.TableName = "InStockOrderItems";
            foreach (DataRow dr in _dtSource.Rows)
            {
                ReportDs.InStockOrderItemsRow newRow = itemData.NewInStockOrderItemsRow();
                newRow.BoxNo = dr["No"].ToString();
                newRow.PackageCode = dr["PackageCode "].ToString();
                newRow.Size = dr["Size"].ToString();
                newRow.Info= dr["Info"].ToString();
                newRow.ProductSize = dr["ProductSize"].ToString();
                newRow.Qty = dr["Qty"].ToString();
                itemData.Rows.Add(newRow);
            }
            return itemData;
        } 

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

    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;
        }


 


报表详细相关设置


资料


资料2


资料,,全


Crystal Reports 9.2 中文版(水晶报表) 下载,,软件版本:9.2.0.448不过现已出了Crystal Reports Professional v9.2.2.634 (c) Crystal Decisions,有足够的空间就提供.这是一个很不错的报表控件,我相信很多朋友都听说过吧!Crystal Reports 用于处理数据库,帮助用户分析和解释重要信息。使用 Crystal Reports 可以方便地创建简单报表,同时它也提供了创建复杂或专用的报表所需的整套工具。 创建所能想象的任何报表 Crystal Reports几乎可以从任何数据源生成您需要的报表。内置报表专家在您生成报表和完成一般的报表任务过程中,会一步一步地指导您进行操作。报表专家通过公式、交叉表、子报表和设置条件格式帮助表现数据的实际意义,揭示可能被隐藏掉的重要关系。如果文字和数字确实不够充分,则用地理地图和图形进行形象的信息交流。 将报表扩展到 Web Crystal Reports 的灵活性并未停留在创建报表这一功能上 ?您可以用各种各样的格式发布报表,包括用 Microsoft 的 Word 和 Excel 发布、通过电子邮件甚至 Web 发布。高级的 Web 报表功能允许工作组中的其他成员在他们自己的 Web 浏览器中查看或更新共享报表。 将报表并入应用程序通过将 Crystal Reports报表处理功能整合到自己的数据库应用程序中,应用程序和 Web 开发人员可以节省开发时间并满足用户的需求。Crystal Reports 支持大多数流行的开发语言,可以方便地在任何应用程序中添报表。 不论您是 IT 行业的站点管理员,还是营销推广经理,也无论您是金融业的数据库管理员还是 CEO,Crystal Reports 都堪称是一个功能强大的工具,它可以帮助每一个人分析、解释重要信息。感谢 revenant 上传!
<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]。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值