如題,我是用FastReport做的一個dll,用來列印的。
我在主程式中,處理好了多個資料集,然后再呼叫dll。
代碼大概如下:
function TSysPrint.xpprint(order_code: string; bo: boolean = true): Integer;
var
sql, sl, s2, s, youhui: string;
qry, qry1, qry2, qry4: TSynQry;
i: Integer;
DataSet: TClientDataSet;
json: tjson;
list: TStringList;
plist: TStrings;
begin
if Syssetup.Printbool = false then
begin
Exit;
end;
if FmoneyCom.bool then
syssdk.OpenUSBMoneyBox;
try
try
qry := FTReport.Query;
qry1 := FTReport.Query;
qry2 := FTReport.Query;
qry4 :=FTReport.Query;
list := TStringList.Create;
i := 0;
sql := 'select * from retail_order where order_code=' + QuotedStr(order_code);
syssdk.SqlQuery(sql, qry2);
sql := 'select 數量,type from vi_xiao where 訂單號=' + QuotedStr(order_code);
syssdk.SqlQuery(sql, qry);
while not qry.Eof do
begin
if qry.FieldByName('type').AsInteger = 2 then
i := i + 1
else
i := i + qry.FieldByName('數量').AsInteger;
qry.Next;
end;
sl := inttostr(i);
//,
sql := 'SELECT 原價-現價 as 優惠,* from vi_xiao where 訂單號=' + QuotedStr(order_code);
qry.Filter := '商品串列';
syssdk.SqlQuery(sql, qry);
sql := 'SELECT sum(price) as price,attr_name FROM vi_attr_vs where order_code=' + QuotedStr(order_code) + ' group by attr_code';
syssdk.SqlQuery(sql, qry4);
qry4.Filter := '商品屬性';
sql := 'select * from vi_xiao where 狀態=2 and 訂單號=' + QuotedStr(order_code);
syssdk.SqlQuery(sql, qry1);
DataSet := TClientDataSet.Create(nil);
sysJSON.QuerytoDataSet(qry1.DataSet, DataSet, 'Fsum,id');
DataSet.First;
i := DataSet.RecordCount;
i := 0;
while not DataSet.Eof do
begin
DataSet.Edit;
DataSet.FieldByName('id').AsInteger := i;
DataSet.FieldByName('Fsum').AsString := syssdk.sfloat(DataSet.FieldByName('金額').AsFloat);
DataSet.Post;
DataSet.Next;
Inc(i);
end;
s := DataSet.FieldByName('pay_method').AsString;
s := DataSet.FieldByName('Fsum').AsString;
i := DataSet.RecordCount;
DataSet.Filter := '支付串列';
plist := TStringList.Create;
print_storexx('零售', plist);
plist.AddPair('收銀員', userjson._[0].s['cas_name']);
plist.AddPair('下單時間', syssdk.UnixDateToDateTime(qry2.FieldByName('addtime').AsInteger));
plist.AddPair('訂單號', order_code);
syssdk.frxprint(plist, qry.DataSet, qry4.DataSet, DataSet, Forder_print.printfile, Forder_print.Name, Forder_print.copies,Forder_print.Line_number,Forder_print.wholeprint,Forder_print.cuttingbool, bo);
dll中對應的frxprint涵數大致如下:
procedure TTest.Frxprint(Alist: Pointer{TStrings}; FileName, PrinterName: pchar; Number: Integer; Openpreview: BOOL; ds1: Pointer{TDataSet}; ds2: Pointer{TDataSet}; ds3: Pointer{TDataSet}; ds4: Pointer{TDataSet});
var
i: Integer;
Category: TfrxVariable;
FileNames, PrinterNames, uname: AnsiString;
frxbrcdbjct1: TfrxBarCodeObject;
Ffrxrprt1: TfrxReport;
frxdsgnr1: TfrxDesigner;
Ffrxdbdtst1: TfrxDBDataset;
Ffrxdbdtst2: TfrxDBDataset;
Ffrxdbdtst3: TfrxDBDataset;
Ffrxdbdtst4: TfrxDBDataset;
begin
try
Flist := TStringList.Create;
frxbrcdbjct1 := TfrxBarCodeObject.Create(Self);
Ffrxrprt1 := TfrxReport.Create(Self);
frxdsgnr1 := TfrxDesigner.Create(self);
Ffrxdbdtst1 := TfrxDBDataset.Create(Self);
Ffrxdbdtst2 := TfrxDBDataset.Create(Self);
Ffrxdbdtst3 := TfrxDBDataset.Create(Self);
Ffrxdbdtst4 := TfrxDBDataset.Create(Self);
Ffrxrprt1.OnGetValue := Ffrxrprt1GetValue;
FileNames := FileName;
PrinterNames := PrinterName;
if tstrings(Alist) <> nil then
Flist.CommaText := tstrings(Alist).CommaText;
Ffrxdbdtst1.UserName := '空';
Ffrxdbdtst2.UserName := '空';
Ffrxdbdtst3.UserName := '空';
Ffrxdbdtst4.UserName := '空';
if ds1 <> nil then
begin
Ffrxdbdtst1.DataSet := TDataSet(ds1);
uname := TDataSet(ds1).Filter;
Ffrxdbdtst1.UserName := uname;
end;
if ds2 <> nil then
begin
Ffrxdbdtst2.DataSet := TDataSet(ds2);
uname := TDataSet(ds2).Filter;
Ffrxdbdtst2.UserName := uname;
end;
if ds3 <> nil then
begin
Ffrxdbdtst3.DataSet := TDataSet(ds3);
uname := TDataSet(ds3).Filter;
Ffrxdbdtst3.UserName := uname;
end;
if ds4 <> nil then
begin
Ffrxdbdtst4.DataSet := TDataSet(ds4);
uname := TDataSet(ds4).Filter;
Ffrxdbdtst4.UserName := uname;
end;
Test.log(PChar('PReportZZQ:TDataSet(ds3).FieldsCount=' + TDataSet(ds3).FieldCount.tostring + ' Ffrxdbdtst3.FieldsCount=' + Ffrxdbdtst3.FieldsCount.ToString));
現在就是發現TDataSet(ds3).FieldsCount跟主程式中的值是一樣的,是正確的。
而Ffrxdbdtst3.FieldsCount確不對。
對應的Ffrxdbdtst1和Ffrxdbdtst2也是正確的。
求大師指點下,我是哪個地方弄的不對?或是要怎么處理才可以?
uj5u.com熱心網友回復:
不明白dll中為何Ffrxdbdtst3.DataSet := TDataSet(ds3);
這里有什么問題,而導至資料集不對?
而
Ffrxdbdtst2.DataSet := TDataSet(ds2);和
Ffrxdbdtst1.DataSet := TDataSet(ds1);
確都是正常的。
uj5u.com熱心網友回復:
有大神愿意幫幫我么?
uj5u.com熱心網友回復:
實在是找不到是哪的原因了。奇怪。delphi的大神們,能幫忙診斷下不?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20780.html
標籤:語言基礎/算法/系統設計
