Delphi FastReport 动态生成数据集以及参数

场景:将查询接口返回的json数据,进行数据提取,以进行报表打印。

1. json数据示例如下:

{
	"outHospitalDate": "",
	"chargeDetail": [
		{
			"number": 1,
			"unit": "元",
			"std": 13,
			"amt": 13,
			"remark": "",
			"selfAmt": "",
			"chargeName": "诊察费",
			"chargeCode": "0801"
		},
		{
			"number": 1,
			"unit": "元",
			"std": 1,
			"amt": 1,
			"remark": "",
			"selfAmt": "",
			"chargeName": "挂号费",
			"chargeCode": "0811"
		}
	],
	"patientId": "105735",
	"idCardNo": "测试idCardNo",
	"cashRecharge": 0,
	"medicalInsuranceID": "",
	"remark": "个人现金支付含微信:14.00,",
	"cardNo": "测试cardNo",
	"payer": "测试",
	"payChannelDetail": [
		{
			"payChannelValue": 14,
			"payChannelCode": "13"
		}
	],
	"payee": "微信",
	"selfCashPay": 14.0,
	"inHospitalDate": "",
	"caseNumber": "",
	"otherSpecialParameter": "[]",
	"listDetail": [
		{
			"number": 1.0,
			"chrgtype": "",
			"unit": "次",
			"std": 13.0,
			"code": "G480000006-2",
			"name": "中医辨证论治(门诊副高职称)",
			"amt": 13.0,
			"remark": "",
			"selfAmt": 0.0
		},
		{
			"number": 1.0,
			"chrgtype": "",
			"unit": "次",
			"std": 1.0,
			"code": "G110100001",
			"name": "挂号费",
			"amt": 1.0,
			"remark": "",
			"selfAmt": 0.0
		}
	],
	"selfConceitedAmt": 0,
	"medicalCareType": "自费",
	"busType": "06",
	"placeCode": "001",
	"cashPay": 0,
	"patientNo": "100406010299",
	"author": "测试",
	"accountPay": 0.0,
	"selfPayAmt": 0,
	"sex": "女",
	"cardType": "3101",
	"ownPay": 0,
	"busDateTime": "20250804070014000",
	"medicalInstitution": "中医医院",
	"otherParameter": "[]",
	"otherfundPay": 0.0,
	"totalAmt": 14,
	"busNo": "20250804010100099999",
	"cashRefund": 0,
	"hospitalNo": "",
	"category": "",
	"fundPay": 0.0,
	"age": "57"
}

2. Delphi代码如下:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, frxDBSet, superobject, frxClass, DB, DBClient,
  frxDesgn;

type
  TForm1 = class(TForm)
    btn1: TButton;
    frxrprt1: TfrxReport;
    frxDesigner1: TfrxDesigner;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
  s ,sBillBatchCode,sBillNo,sRandom,Fileld: string;
  inParts, resultData, errMsg: WideString;
  reunt, row, i: Integer;
  fds_xm, fds_qd: TfrxDBDataSet;
  ds_chargeDetail, ds_listDetail: TDataSet;
  js, keys: ISuperObject;
  jsChargeDetail, jsListDetail: TSuperArray;
  function CopyDataSet(dsTemp: TDataSet): TDataSet;
  var
    cdsTemp: TClientDataSet;
  begin
    try
      //创建DataSet
      cdsTemp := TClientDataSet.Create(Application);
      if dsTemp.FieldDefs <> nil then
      begin
        cdsTemp.FieldDefs.Assign(dsTemp.FieldDefs);
        cdsTemp.CreateDataSet;
        result := (cdsTemp as TDataSet);
      end;
    finally
      //内存释放
      dsTemp.Free;
    end;
  end;
  procedure addDataDetailToDataSet(xm: Integer; ds: TDataSet; jsarr: TSuperArray);
  var
    i: Integer;
  begin
    //打开数据集
    ds.Open;
    with ds do
    begin
      if jsarr.Length> 0 then
      begin
        for i:=0 to jsarr.Length- 1 do
        begin
          Append;
          if xm= 0 then  //收费项目明细
          begin
            FieldByName('chargeCode').AsString:= jsarr[i].S['chargeCode'];
            FieldByName('chargeName').AsString:= jsarr[i].S['chargeName'];
            FieldByName('unit').AsString:= jsarr[i].S['unit'];
            FieldByName('std').AsString:= jsarr[i].S['std'];
            FieldByName('number').AsString:= jsarr[i].S['number'];
            FieldByName('amt').AsString:= jsarr[i].S['amt'];
            FieldByName('selfAmt').AsString:= jsarr[i].S['selfAmt'];
            FieldByName('remark').AsString:= jsarr[i].S['remark'];
          end
          else  //清单明细项目
          begin
            FieldByName('chrgtype').AsString:= jsarr[i].S['chrgtype'];
            FieldByName('code').AsString:= jsarr[i].S['code'];
            FieldByName('name').AsString:= jsarr[i].S['name'];
            FieldByName('unit').AsString:= jsarr[i].S['unit'];
            FieldByName('std').AsString:= jsarr[i].S['std'];
            FieldByName('number').AsString:= jsarr[i].S['number'];
            FieldByName('amt').AsString:= jsarr[i].S['amt'];
            FieldByName('selfAmt').AsString:= jsarr[i].S['selfAmt'];
            FieldByName('remark').AsString:= jsarr[i].S['remark'];
          end;
          Post;
        end;
      end;
    end;
  end;
begin
  fds_xm:= TfrxDBDataSet.Create(nil);
  fds_qd:= TfrxDBDataSet.Create(nil);
  ds_chargeDetail:= TDataSet.Create(nil);
  ds_listDetail:= TDataSet.Create(nil);
  try
    fds_xm.UserName:= '收费项目明细';
    fds_qd.UserName:= '清单明细项目';
    //收费项目明细
    with ds_chargeDetail do
    begin
      FieldDefs.Add('chargeCode', ftString, 50);  //收费项目代码
      FieldDefs.Add('chargeName', ftString, 100); //收费项目名称
      FieldDefs.Add('unit', ftString, 20);        //计量单位
      FieldDefs.Add('std', ftFloat);              //收费标准
      FieldDefs.Add('number', ftFloat);           //数量
      FieldDefs.Add('amt', ftFloat);              //金额
      FieldDefs.Add('selfAmt', ftFloat);          //自费金额
      FieldDefs.Add('remark', ftString, 200);     //备注
    end;
    ds_chargeDetail:= CopyDataSet(ds_chargeDetail);
    //清单明细项目
    with ds_listDetail do
    begin
      FieldDefs.Add('chrgtype', ftString, 50);    //费用类型
      FieldDefs.Add('code', ftString, 50);        //编码
      FieldDefs.Add('name', ftString, 100);       //药品名称/剂型
      FieldDefs.Add('unit', ftString, 20);        //计量单位
      FieldDefs.Add('std', ftFloat);              //单价
      FieldDefs.Add('number', ftFloat);           //数量
      FieldDefs.Add('amt', ftFloat);              //金额
      FieldDefs.Add('selfAmt', ftFloat);          //自费金额
      FieldDefs.Add('remark', ftString, 200);     //备注
    end;
    ds_listDetail:= CopyDataSet(ds_listDetail);

    try
      resultData:= 'json测试数据';

      //解析数据 begin >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      js:= SO(resultData);
      jsChargeDetail:= js.A['chargeDetail'];
      jsListDetail:= js.A['listDetail'];
      if ((jsListDetail.Length>0) and (jsListDetail.Length>0)) then
      begin
        addDataDetailToDataSet(0, ds_chargeDetail, jsChargeDetail);
        addDataDetailToDataSet(1, ds_listDetail, jsListDetail);
      end
      else
      begin
        ShowMessage('收费项目明细为空或清单明细项目为空!');
        Exit;
      end;

      //数据集
      fds_xm.DataSet:= ds_chargeDetail;
      fds_qd.DataSet:= ds_listDetail;
      frxrprt1.DataSets.Add(fds_xm);
      frxrprt1.DataSets.Add(fds_qd);
      frxrprt1.LoadFromFile('test.fr3');
      //票据信息(在LoadFromFile后添加参数)
      frxrprt1.Variables.Add.Name:= ' 票据信息';
      frxrprt1.Variables.AddVariable('票据信息', '业务流水号', QuotedStr(js.S['busNo']));
      frxrprt1.Variables.AddVariable('票据信息', '业务标识', QuotedStr(js.S['busType']));
      frxrprt1.Variables.AddVariable('票据信息', '患者姓名', QuotedStr(js.S['payer']));
      frxrprt1.Variables.AddVariable('票据信息', '业务发生时间', QuotedStr(js.S['busDateTime']));
      frxrprt1.Variables.AddVariable('票据信息', '开票点编码', QuotedStr(js.S['placeCode']));
      frxrprt1.Variables.AddVariable('票据信息', '收费员', QuotedStr(js.S['payee']));
      frxrprt1.Variables.AddVariable('票据信息', '票据编制人', QuotedStr(js.S['author']));
      frxrprt1.Variables.AddVariable('票据信息', '开票总金额', QuotedStr(js.S['totalAmt']));
      frxrprt1.Variables.AddVariable('票据信息', '备注', QuotedStr(js.S['remark']));
      frxrprt1.Variables.AddVariable('票据信息', '卡类型', QuotedStr(js.S['cardType']));
      frxrprt1.Variables.AddVariable('票据信息', '卡号', QuotedStr(js.S['cardNo']));
      frxrprt1.Variables.AddVariable('票据信息', '性别', QuotedStr(js.S['sex']));
      frxrprt1.Variables.AddVariable('票据信息', '年龄', QuotedStr(js.S['age']));
      frxrprt1.Variables.AddVariable('票据信息', '患者身份证号码', QuotedStr(js.S['idCardNo']));
      frxrprt1.Variables.AddVariable('票据信息', '患者就诊编号', QuotedStr(js.S['patientNo']));
      frxrprt1.Variables.AddVariable('票据信息', '患者唯一ID', QuotedStr(js.S['patientId']));
      frxrprt1.Variables.AddVariable('票据信息', '病历号', QuotedStr(js.S['caseNumber']));
      frxrprt1.Variables.AddVariable('票据信息', '患者住院号', QuotedStr(js.S['hospitalNo']));
      frxrprt1.Variables.AddVariable('票据信息', '就诊科室', QuotedStr(js.S['category']));
      frxrprt1.Variables.AddVariable('票据信息', '住院日期', QuotedStr(js.S['inHospitalDate']));
      frxrprt1.Variables.AddVariable('票据信息', '出院日期', QuotedStr(js.S['outHospitalDate']));
      frxrprt1.Variables.AddVariable('票据信息', '现金预交款金额', QuotedStr(js.S['cashPay']));
      frxrprt1.Variables.AddVariable('票据信息', '补交金额(现金)', QuotedStr(js.S['cashRecharge']));
      frxrprt1.Variables.AddVariable('票据信息', '退还金额(现金)', QuotedStr(js.S['cashRefund']));
      frxrprt1.Variables.AddVariable('票据信息', '医疗机构类型', QuotedStr(js.S['medicalInstitution']));
      frxrprt1.Variables.AddVariable('票据信息', '医保类型名称', QuotedStr(js.S['medicalCareType']));
      frxrprt1.Variables.AddVariable('票据信息', '患者医保编号', QuotedStr(js.S['medicalInsuranceID']));
      frxrprt1.Variables.AddVariable('票据信息', '医保统筹基金支付', QuotedStr(js.S['fundPay']));
      frxrprt1.Variables.AddVariable('票据信息', '其它医保支付', QuotedStr(js.S['otherfundPay']));
      frxrprt1.Variables.AddVariable('票据信息', '个人账户支付', QuotedStr(js.S['accountPay']));
      frxrprt1.Variables.AddVariable('票据信息', '个人自负', QuotedStr(js.S['selfConceitedAmt']));
      frxrprt1.Variables.AddVariable('票据信息', '个人自付', QuotedStr(js.S['selfPayAmt']));
      frxrprt1.Variables.AddVariable('票据信息', '个人现金支付', QuotedStr(js.S['selfCashPay']));
      frxrprt1.Variables.AddVariable('票据信息', '自费金额', QuotedStr(js.S['ownPay']));
      frxrprt1.DesignReport;
      frxrprt1.PrintOptions.ShowDialog := True; //是否弹出打印机选项
      frxrprt1.PrepareReport();
      frxrprt1.Print;
    except
      on e: exception do
      begin
        ShowMessage('[获取发票明细] 发票接口dzfpjk连接失败'+e.message);
      end;
    end;
  finally
    FreeAndNil(fds_xm);
    FreeAndNil(fds_qd);
    FreeAndNil(ds_chargeDetail);
    FreeAndNil(ds_listDetail);
  end;
end;

end.

3. 效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值