场景:将查询接口返回的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. 效果