健康一贴灵,专注医药行业管理信息化

winform连接锐浪GridReport打印示例

image

 

image

 

2025-1023 新代码,更强大。

using grproLib;
using LRTMS.Common;
using LRTMS.DB;
using LRTMS.Report;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;

namespace LRTMS.Forms
{
    public partial class FrmDeliverPrint : DockContent
    {
        string printTemplate = "";
        //主表查询SQL
        static string MasterSql = @"select t_ssa.ssa_name,T_HDR.bill_hdr_id,T_HDR.owner_no,T_HDR.BUSINESSBILL_NO,T_HDR.ssa_id,T_HDR.BUSINESSMAN,T_HDR.INVOICE_TIME,T_HDR.BUSINESS_ORGANIZATION,
        T_HDR.MANUFACTURER_ADDRESS,T_HDR.SSA_STORE_ADDR,T_HDR.RECEIVING_CLERK,T_HDR.TEL,
         FNC_UTL_GETFLD('PRINT_SHTXD_ZHIDR',T_HDR.OWNER_NO,'LC001') PRINT_SHTXD_ZHIDR,
         T_HDR.OPERATOR,
       T_HDR.REPORTBILL_CLERK,
       FNC_UTL_GETFLD('TRANSPORT_TYPE',T_HDR.TRANSPORT_TYPE,'LC001') TRANSPORT_TYPE

        from BILL_OUTSTOREHOUSE_HDR T_HDR
        join FD_SUPPLYSALESAGENCY t_ssa on T_HDR.SSA_ID=t_ssa.ssa_id
        where sale_type='201' ";
        string sql = "", billId;
        //根据锐浪报表中随货同行单上的字段列表,建同名的变量;
        string SSA_NAME, RECEIVING_CLERK, SSA_STORE_ADDR, tel, BUSINESSMAN, TRANSPORT_TYPE, INVOICE_TIME, BUSINESSBILL_NO;
        string PRINT_SHTXD_FUHR, PRINT_SHTXD_FAHR, INCHK_COMPLETED_TIME, MANUFACTURER_ADDRESS;
        string LOGISTICS_DESC, DRUG_SPEC, MARKETINGAUTHORISATIONHOLDER, MANUFACTURER_NAME, DOSAGE_FORM, APPROVAL_NO, BASEUNIT_DESC;
        string ACTUAL_QTY, PRICE, SETTLEUP_PRICE, AMOUNT, ACTUAL_PCS, GOODS_LOTNO, PRODUCTION_DATE, VALID_UNTIL, stock_status;
        DataTable dt, dtDetail;
        //定义Grid++Report报表主对象
        GridppReport Report = new GridppReport();
        public FrmDeliverPrint()
        {
            InitializeComponent();

            Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(ReportInitialize);
            Report.FetchRecord += new _IGridppReportEvents_FetchRecordEventHandler(ReportFetchRecord);
            txtDate1.Text = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"); 
            txtDate2.Text = DateTime.Now.ToString("yyyy-MM-dd");
        }

        void ReportInitialize()
        {
            if (dataGridView1.Rows.Count < 0) return;
            int i = dataGridView1.CurrentCell.RowIndex;
            if (i < 0) return;

            //两种方式,一种是从本地文件读入,另一种方式是从数据库的字段中读取。FRAME.SYS_PRINT_TEMPLATE
            //Report.LoadFromFile("Report\\pcd.grf");//这是一个举例,因为有下面的SQL,
            string templateId = cmbShtxd.SelectedValue.ToString(); ;
            if (string.IsNullOrEmpty(templateId))
            {
                MessageBox.Show("请选择打印模版!");
                return;
            }
            sql = "SELECT  TEMPLATE_FILE FROM FRAME.SYS_PRINT_TEMPLATE   T WHERE T.TEMPLATE_ID='"+ templateId+"'";
            printTemplate = DBHelperOracle.ExecuteScalar(sql).ToString();
            //printTemplate = printTemplate.Replace("ConnectionString='currentReport.DetailGrid.Recordset.ConnectionString'","");   
            Report.LoadFromStr(printTemplate);
        }
        private void tsbSearchDeliver_Click(object sender, EventArgs e)
        {
            string deliveryNo = txtDeliverNo.Text.Trim();
            if (string.IsNullOrEmpty(deliveryNo))
            {
                MessageBox.Show("请输入交货单号");
                return;
            }

            Report.PrintPreview(true);
        }

        private struct MatchFieldPairType
        {
            public IGRField grField;
            public int MatchColumnIndex;
        }

        private void tsbClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {

        }


        /// <summary>
        /// 将 DataTable 的数据转储到 Grid++Report 的数据集中
        /// </summary>
        /// <param name="Report">报表对象</param>
        /// <param name="dt">DataTable对象</param>
        public void FillRecordToReport(IGridppReport Report, DataTable dt)
        {
            MatchFieldPairType[] MatchFieldPairs = new MatchFieldPairType[Math.Min(Report.DetailGrid.Recordset.Fields.Count, dt.Columns.Count)];

            //根据字段名称与列名称进行匹配,建立DataReader字段与Grid++Report记录集的字段之间的对应关系
            int MatchFieldCount = 0;
            var st = Report.DetailGrid.Recordset.Fields;
            string sttype = "";
            for (int i = 0; i < dt.Columns.Count; ++i)
            {
                foreach (IGRField fld in Report.DetailGrid.Recordset.Fields)
                {
                    if (i == 0)
                    {
                        sttype += fld.Name;
                        sttype += ";";
                    }
      
                    if (string.Compare(fld.Name, dt.Columns[i].ColumnName, true) == 0)
                    {
                        MatchFieldPairs[MatchFieldCount].grField = fld;
                        MatchFieldPairs[MatchFieldCount].MatchColumnIndex = i;
                        ++MatchFieldCount;
                        break;
                    }
                }
            }

            // 将 DataTable 中的每一条记录转储到 Grid++Report 的数据集中去
            foreach (DataRow dr in dt.Rows)
            {
                Report.DetailGrid.Recordset.Append();
                for (int i = 0; i < MatchFieldCount; ++i)
                {
                    var columnIndex = MatchFieldPairs[i].MatchColumnIndex;
                    if (!dr.IsNull(columnIndex))
                    {
                        MatchFieldPairs[i].grField.Value = dr[columnIndex];
                    }
                }
                Report.DetailGrid.Recordset.Post();
            }
        }


        //在C#中一次填入一条记录不能成功,只能使用一次将记录全部填充完的方式
        private void ReportFetchRecord()
        {
            if (dtDetail.Rows.Count == 0) return;
            FillRecordToReport(Report, dtDetail);

        }
        private void tsmFilter_Click(object sender, EventArgs e)
        {


        }
        //主表点击事件,根据主表的TASK_ID,显示子表的数据
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {

            if (e.RowIndex < 0) return;

            billId = dataGridView1.Rows[e.RowIndex].Cells["bill_hdr_id"].Value.ToString();
            sql = @"select T_DTL.LOGISTICS_DESC,T_DTL.DRUG_SPEC,T_DTL.APPROVAL_NO,T_DTL.ACTUAL_QTY,T_DTL.ACTUAL_PCS,T_DTL.PRICE,T_DTL.AMOUNT,T_DTL.GOODS_LOTNO,T_DTL.
            PRODUCTION_DATE_CHAR,T_DTL.VALID_UNTIL_CHAR,T_DTL.
            ZZMEDERE,T_DTL.ZZYYZCH,T_DTL.MARKETINGAUTHORISATIONHOLDER,T_DTL.MANUFACTURER_NAME,T_DTL.BILL_DTL_ID,T_DTL.DOSAGE_FORM,T_DTL.BASEUNIT_DESC,T_DTL.bill_hdr_id,T_G.GOODS_GROUP,
            T_G.MANUFACTURER_LICENSE MANUFACTURER_LICENSE_1,SETTLEUP_PRICE,
            REPLACE(decode(substr(T_G.goods_group,1,4),'2001',SUBSTR(PRODUCTION_DATE_CHAR,1,7),'2011',SUBSTR(PRODUCTION_DATE_CHAR,1,7),PRODUCTION_DATE_CHAR),'-','.') PRODUCTION_DATE,
REPLACE(decode(substr(T_G.goods_group,1,4),'2001',SUBSTR(VALID_UNTIL_CHAR,1,7),'2011',SUBSTR(VALID_UNTIL_CHAR,1,7),VALID_UNTIL_CHAR),'-','.') VALID_UNTIL,
 case when T_DTL.STOCK_STATUS='1' then '合格' else '未知' end STOCK_STATUS,PRODUCT_CODE
            
                 from BILL_OUTSTOREHOUSE_dtl T_DTL , FD_GOODS T_G 
                  where  T_DTL.GOODS_ID = T_G.GOODS_ID AND bill_hdr_id='" + billId + "'";

            sql = string.Format(sql, billId);
            dtDetail = DBHelperOracle.GetTable(sql);
            dataGridView2.DataSource = dtDetail;
        }

        void getPrintData(int rowIndex)
        {
            billId = dataGridView1.Rows[rowIndex].Cells["bill_hdr_id"].Value.ToString();
            SSA_NAME = dataGridView1.Rows[rowIndex].Cells["SSA_NAME"].Value.ToString();
            RECEIVING_CLERK = dataGridView1.Rows[rowIndex].Cells["RECEIVING_CLERK"].Value.ToString();
            SSA_STORE_ADDR = dataGridView1.Rows[rowIndex].Cells["SSA_STORE_ADDR"].Value.ToString();
            tel = dataGridView1.Rows[rowIndex].Cells["tel"].Value.ToString();
            BUSINESSMAN = dataGridView1.Rows[rowIndex].Cells["BUSINESSMAN"].Value.ToString();
            INVOICE_TIME = dataGridView1.Rows[rowIndex].Cells["INVOICE_TIME"].Value.ToString();
            TRANSPORT_TYPE = dataGridView1.Rows[rowIndex].Cells["TRANSPORT_TYPE"].Value.ToString();
            BUSINESSBILL_NO = dataGridView1.Rows[rowIndex].Cells["BUSINESSBILL_NO"].Value.ToString();

            dtDetail.Columns.Add("SSA_NAME", typeof(string));
            dtDetail.Columns.Add("RECEIVING_CLERK", typeof(string));
            dtDetail.Columns.Add("SSA_STORE_ADDR", typeof(string));
            dtDetail.Columns.Add("tel", typeof(string));
            dtDetail.Columns.Add("BUSINESSMAN", typeof(string));
            dtDetail.Columns.Add("INVOICE_TIME", typeof(string));
            dtDetail.Columns.Add("TRANSPORT_TYPE", typeof(string));
            dtDetail.Columns.Add("BUSINESSBILL_NO", typeof(string));
            dtDetail.Columns.Add("PRINT_SHTXD_FAHR", typeof(string));
            dtDetail.Columns.Add("PRINT_SHTXD_FUHR", typeof(string));
            dtDetail.Columns.Add("MANUFACTURER_ADDRESS", typeof(string));
            dtDetail.Columns.Add("INCHK_COMPLETED_TIME", typeof(string));
            dtDetail.Columns.Add("PRINT_TIMES", typeof(string));
            //dtDetail.Columns.Add("INCHK_COMPLETED_TIME", typeof(string));
            PRINT_SHTXD_FUHR = cmbCheckMan.Text.Trim();
            PRINT_SHTXD_FAHR = cmbDeliverMan.Text.Trim();
            MANUFACTURER_ADDRESS = cmbAddress.Text.Trim();
            INCHK_COMPLETED_TIME = dateTimePicker1.Text;

            foreach (DataRow row in dtDetail.Rows)
            {
                row["SSA_NAME"] = SSA_NAME;
                row["RECEIVING_CLERK"] = RECEIVING_CLERK;
                row["BUSINESSBILL_NO"] = BUSINESSBILL_NO;
                row["SSA_STORE_ADDR"] = SSA_STORE_ADDR;
                row["tel"] = tel;
                row["BUSINESSMAN"] = BUSINESSMAN;
                row["INVOICE_TIME"] = INVOICE_TIME;
                row["TRANSPORT_TYPE"] = TRANSPORT_TYPE;
                row["PRINT_SHTXD_FAHR"] = PRINT_SHTXD_FAHR;
                row["PRINT_SHTXD_FUHR"] = PRINT_SHTXD_FUHR;
                row["MANUFACTURER_ADDRESS"] = MANUFACTURER_ADDRESS;
                row["INCHK_COMPLETED_TIME"] = INCHK_COMPLETED_TIME;
                row["PRINT_TIMES"] = "1";
                row["INCHK_COMPLETED_TIME"] = INCHK_COMPLETED_TIME;


            }
            dataGridView2.DataSource = dtDetail;
        }

        //打印按钮
        private void tsbPrint_Click(object sender, EventArgs e)
        {

            if (string.IsNullOrEmpty(cmbAddress.Text.Trim()))
            {
                MessageBox.Show("发货地址不能为空!");
                return;
            }
            if (string.IsNullOrEmpty(cmbDeliverMan.Text.Trim()))
            {
                MessageBox.Show("发货员不能为空!");
                return;
            }

            if (string.IsNullOrEmpty(cmbCheckMan.Text.Trim()))
            {
                MessageBox.Show("复核员不能为空!");
                return;
            }
            //最最重要的一句代码,Report.FetchRecord

            int i = dataGridView1.CurrentRow.Index;
            if (i <= 0) return;
            getPrintData(i);
            Report.PrintPreview(true);
        }

        private void FrmDeliverPrint_Load(object sender, EventArgs e)
        {
            sql = MasterSql + "  and INVOICE_TIME BETWEEN to_date('{0}', 'yyyy-MM-dd') and to_date('{1}','yyyy-MM-dd') ";
            sql = string.Format(sql, txtDate1.Text,txtDate2.Text);
            dt = DBHelperOracle.GetTable(sql);
            dataGridView1.DataSource = dt;

            sql = "SELECT  TEMPLATE_ID,TEMPLATE_DESCRIPTION FROM FRAME.SYS_PRINT_TEMPLATE   T where template_id like 'shtxd%'";
            cmbShtxd.DataSource = DBHelperOracle.GetTable(sql);
            cmbShtxd.DisplayMember = "TEMPLATE_DESCRIPTION";
            cmbShtxd.ValueMember = "TEMPLATE_ID";

        }

        /*
         * /2025-7-24器械类型的单独打印模板 shtxd_ylpsqx  if("@vcpz@"=="20" && "@vtweg: == “3l” ) 
         * 其它31 渠道的   shtxd_lryy3l"
         * 633移动类型的寄售出库单模板shtxd_lryy633
         * 2025-8-28 季托生产的品种订单单独打 shtxd_lrsw_dg"
         * //冷藏品交接单 llypjjd
         * */

    }
}
View Code

 

using grproLib;
using LRTMS.Common;
using LRTMS.DB;
using LRTMS.Report;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;

namespace LRTMS.Forms
{
    public partial class FrmDeliverPrint : DockContent
    {
        string sql = "";
        string taskId="0", taskNo, carNo, driverName, superCargoName, Taskdate;
        DataTable dt,dtDetail;
        //定义Grid++Report报表主对象
        GridppReport Report = new GridppReport();
        public FrmDeliverPrint()
        {
            InitializeComponent();

            Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(ReportInitialize);
         }

        void ReportInitialize()
        {
            if (dataGridView1.Rows.Count < 0) return;
            int i = dataGridView1.CurrentCell.RowIndex;
            if (i < 0) return;
            taskNo = dataGridView1.Rows[i].Cells["TASK_BILL_NO"].Value.ToString();
            carNo = dataGridView1.Rows[i].Cells["car_number"].Value.ToString();
            driverName = dataGridView1.Rows[i].Cells["driver_name"].Value.ToString();
            Taskdate = dataGridView1.Rows[i].Cells["create_time"].Value.ToString();
            superCargoName = dataGridView1.Rows[i].Cells["SUPERCARGO_NAME"].Value.ToString();
            taskId = dataGridView1.Rows[i].Cells["task_id"].Value.ToString();

            Report.LoadFromFile("Report\\pcd.grf");
            
            Report.ParameterByName("task_no").AsString = taskNo;//主报表传参
            Report.ParameterByName("car_no").AsString = carNo;//主报表传参
            Report.ParameterByName("driver_name").AsString = driverName;//主报表传参
            Report.ParameterByName("supercargo").AsString = superCargoName;//主报表传参
            Report.ParameterByName("bill_date").AsString = Taskdate;//主报表传参

            Report.DetailGrid.Recordset.ConnectionString = "Provider=OraOLEDB.Oracle;" + CommFunc.GetConnString();
            Report.DetailGrid.Recordset.QuerySQL = "select * from lrtms_task_dtl where task_id=" + taskId;
        }

        private void DefineReport()
        {
            int Selected = 0;

            Report.Clear();

            Report.Printer.PaperOrientation = GRPaperOrientation.grpoLandscape;

            //<<定义报表头
            IGRReportHeader Reportheader = Report.InsertReportHeader();
            Reportheader.Height = 1.38;

            //插入一个静态文本框,显示报表标题文字
            IGRStaticBox StaticBox = Reportheader.Controls.Add(GRControlType.grctStaticBox).AsStaticBox;
            if (Selected == 0)
                StaticBox.Text = "客户清单打印";
            else
                StaticBox.Text = "产品清单打印";
            StaticBox.Center = GRCenterStyle.grcsHorizontal; //使部件框在节中水平方向上居中对齐
            StaticBox.Font.Point = 15;
            StaticBox.Font.Bold = true;
            StaticBox.Top = 0.40;
            StaticBox.Width = 5.64;
            StaticBox.Height = 0.58;
            //>>定义报表头


            //<<根据DataGridView的列信息定义明细网格
            Report.InsertDetailGrid();
            Report.DetailGrid.ColumnTitle.Height = 0.58;
            Report.DetailGrid.ColumnContent.Height = 0.58;

            IGRRecordset RecordSet = Report.DetailGrid.Recordset;
            for (int i = 0; i < dataGridView1.ColumnCount; ++i)
            {
                string ColumnName = dataGridView1.Columns[i].Name;
                RecordSet.AddField(ColumnName, GRFieldType.grftString);
                double ReportColumnWidth = Convert.ToDouble(dataGridView1.Columns[i].Width) / 50;
                Report.DetailGrid.AddColumn(ColumnName, dataGridView1.Columns[i].HeaderText, ColumnName, ReportColumnWidth);
            }

        }
        private void tsbSearchDeliver_Click(object sender, EventArgs e)
        {
            string deliveryNo = txtDeliverNo.Text.Trim();
            if (string.IsNullOrEmpty(deliveryNo))
            {
                MessageBox.Show("请输入交货单号");
                return;
            }

            Report.PrintPreview(true);

  



        }
   
        private struct MatchFieldPairType
        {
            public IGRField grField;
            public int MatchColumnIndex;
        }

        private void tsbClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        /// <summary>
        /// 将 DataTable 的数据转储到 Grid++Report 的数据集中
        /// </summary>
        /// <param name="Report">报表对象</param>
        /// <param name="dt">DataTable对象</param>
        public void FillRecordToReport(IGridppReport Report, DataTable dt)
        {
            MatchFieldPairType[] MatchFieldPairs = new MatchFieldPairType[Math.Min(Report.DetailGrid.Recordset.Fields.Count, dt.Columns.Count)];

            //根据字段名称与列名称进行匹配,建立DataReader字段与Grid++Report记录集的字段之间的对应关系
            int MatchFieldCount = 0;
            for (int i = 0; i < dt.Columns.Count; ++i)
            {
                foreach (IGRField fld in Report.DetailGrid.Recordset.Fields)
                {
                    if (string.Compare(fld.Name, dt.Columns[i].ColumnName, true) == 0)
                    {
                        MatchFieldPairs[MatchFieldCount].grField = fld;
                        MatchFieldPairs[MatchFieldCount].MatchColumnIndex = i;
                        ++MatchFieldCount;
                        break;
                    }
                }
            }

            // 将 DataTable 中的每一条记录转储到 Grid++Report 的数据集中去
            foreach (DataRow dr in dt.Rows)
            {
                Report.DetailGrid.Recordset.Append();
                for (int i = 0; i < MatchFieldCount; ++i)
                {
                    var columnIndex = MatchFieldPairs[i].MatchColumnIndex;
                    if (!dr.IsNull(columnIndex))
                    {
                        MatchFieldPairs[i].grField.Value = dr[columnIndex];
                    }
                }
                Report.DetailGrid.Recordset.Post();
            }
        }

        void dt_FetchREcord()
        {
            FillRecordToReport(Report, dtDetail);

        }
        private void tsmFilter_Click(object sender, EventArgs e)
        {


        }
        //主表点击事件,根据主表的TASK_ID,显示子表的数据
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0) return;
            string taskId = dataGridView1.Rows[e.RowIndex].Cells["task_id"].Value.ToString();
            dtDetail = DBHelperOracle.GetTable("select * from lrtms_task_dtl where task_id=" + taskId);
            dataGridView2.DataSource = dtDetail;

        }
        //打印按钮
        private void tsbPrint_Click(object sender, EventArgs e)
        {

            //最最重要的一句代码,Report.FetchRecord
           // Report.FetchRecord += dt_FetchREcord;
            Report.PrintPreview(true);
        }

        private void FrmDeliverPrint_Load(object sender, EventArgs e)
        {
            sql = "select * from lrtms_task_hdr";
            dt = DBHelperOracle.GetTable(sql);
            dataGridView1.DataSource = dt;
    
        }
    }
}

  

posted @ 2025-10-20 14:22  一贴灵  阅读(11)  评论(0)    收藏  举报
学以致用,效率第一