📄 unreportdisplay.pas
字号:
{**********************************************************************
通用报表显示定制类
名称: 报表显示需求参数定制程序
目的: 按照用户要求设制报表显示名称、需要显示的列、显示的顺序
功能: 按照用户要求设制报表显示名称、需要显示的列、显示的顺序
作者: 邓普德
版权: 成都四方信息技术有限公司
使用限制: 最多显示25列,且列名来自于指定数据库
定义时间: 2003-10-10
修改时间:
**********************************************************************}
unit unreportDisplay;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ExtCtrls, StdCtrls, Buttons, Menus,DB,DBTables, ImgList,Variants,
Spin,unCDefine;
{Self Define}
type
TfrmReportDisplay = class(TForm)
StatusBar1: TStatusBar;
GroupBox1: TGroupBox;
Panel1: TPanel;
Splitter1: TSplitter;
GroupBox2: TGroupBox;
Splitter2: TSplitter;
GroupBox3: TGroupBox;
spDown: TSpeedButton;
spUp: TSpeedButton;
spAllUp: TSpeedButton;
lvDisplayDetail: TListView;
lvTableDetail: TListView;
miTV: TImageList;
spSaveDB: TSpeedButton;
GroupBox4: TPanel;
GroupBox9: TGroupBox;
Label3: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ComboBox1: TComboBox;
Label2: TLabel;
MainMenu1: TMainMenu;
N5: TMenuItem;
Bevel1: TBevel;
lvReportName: TListView;
N10: TMenuItem;
N12: TMenuItem;
ImageList1: TImageList;
procedure Splitter2Moved(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure spDownClick(Sender: TObject);
procedure spSaveDBClick(Sender: TObject);
procedure spUpClick(Sender: TObject);
procedure spAllUpClick(Sender: TObject);
procedure lvReportNameClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure lvReportNameKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure lvTableDetailClick(Sender: TObject);
procedure lvDisplayDetailClick(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
procedure ComboBox2KeyPress(Sender: TObject; var Key: Char);
procedure N10Click(Sender: TObject);
procedure N12Click(Sender: TObject);
procedure spRefreshClick(Sender: TObject);
procedure lvReportNameColumnClick(Sender: TObject;
Column: TListColumn);
procedure lvDisplayDetailColumnClick(Sender: TObject;
Column: TListColumn);
procedure lvTableDetailColumnClick(Sender: TObject;
Column: TListColumn);
procedure spExitClick(Sender: TObject);
private
sFormName,sFormCaption,sDiscription: string;
nOldSelectRow,nRowSelected,nRowWidth:Integer;
procedure Refresh;
function bAgreeDel(const FormCaption,
DisplayColumnCaption: string): boolean;
end;
var
frmReportDisplay: TfrmReportDisplay;
implementation
uses
unCDM, UnReportInfo, unCSort;
{$R *.DFM}
procedure TfrmReportDisplay.Splitter2Moved(Sender: TObject);
begin
spDown.Top := Splitter2.Top + 4;
spSaveDB.Top := Splitter2.Top + 4;
spUp.Top := Splitter2.Top + 4;
spAllUp.Top := Splitter2.Top + 4;
spDown.Left := Splitter2.Left + 91;
spSaveDB.Left := Splitter2.Left + 125;
spUp.Left := Splitter2.Left + 59;
spAllUp.Left := Splitter2.Left + 179;
end;
procedure TfrmReportDisplay.FormCreate(Sender: TObject);
begin
Refresh;//调用刷新LISVIEW
end;
//删除一个显示列
procedure TfrmReportDisplay.spDownClick(Sender: TObject);
var nWidth:Integer;
sTemp:string;//用于防止列过长而临时生成的一个变量
begin
if nOldSelectRow<0 then
begin
StatusBar1.Panels.Items[1].Text := '请选择你要查询的报表!';
Exit;
end;
If ((lvDisplayDetail.ItemIndex<0)
OR (lvDisplayDetail.ItemIndex>lvDisplayDetail.Items.Count)) Then
begin
StatusBar1.Panels.Items[1].Text := '请选择你要取消/删除的定制列!';
EXIT;
end;
sFormCaption:= TRIM(lvReportName.Items[nOldSelectRow].Caption);
sTemp:=lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].SubItems[0];
if bAgreeDel(sFormCaption,sTemp)=False then
begin
if ((MessageDlg(' 该列已被选择打印输出,您确认不显示该列吗?' ,
mtConfirmation ,[mbYes,mbNo] ,0) <> mrYes)) then
begin
StatusBar1.Panels.Items[1].Text := '取消操作';
exit;
end;
end;
sTemp:=lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].SubItems[1];
nWidth:=StrToInt(sTemp);
nRowWidth:=nRowWidth-nWidth;
lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].Delete;
StatusBar1.Panels.Items[1].Text := '窗体名称:'+sFormCaption
+',删除显示列成功';
end;
//保存选择
procedure TfrmReportDisplay.spSaveDBClick(Sender: TObject);
var qQryDB:TQuery;
i:integer;
sFormCaption,stemp1,stemp2:string;
begin
i:=nOldSelectRow;//lvReportName.ItemIndex;
sFormCaption:=TRIM(lvReportName.Items[i].Caption);
qQryDB:=TQuery.Create(nil);
qQryDB.DatabaseName:=CDM.dbData.DatabaseName;
qQryDB.SessionName:=CDM.dbData.SessionName;
qQryDB.Close;
qQryDB.Sql.Clear;
//保存前先删除历史显示
qQryDB.sql.Add('DELETE FROM SFRJDISPLAYDETAIL '
+'WHERE SFRJDISPLAYDETAIL.TABLEDETAILID IN '
+'( SELECT SFRJTABLEDETAIL.TABLEDETAILID FROM SFRJTABLEDETAIL'
+' WHERE FORMCAPTION='''+sFormCaption+''')');
qQryDB.ExecSQL;
qQryDB.Close;
i:=0;
while i< lvDisplayDetail.Items.Count do
begin
qQryDB.Close;
qQryDB.sql.Clear;
stemp1:=lvDisplayDetail.Items[i].SubItems[3];
stemp2:=lvDisplayDetail.Items[i].Caption;
qQryDB.sql.Add('INSERT INTO SFRJDISPLAYDETAIL(TABLEDETAILID,DISPLAYTAB)');
qQryDB.sql.Add(' VALUES('+stemp1+','+stemp2+')');
qQryDB.ExecSql;
i:=i+1;
end;
qQryDB.Close;
qQryDB.Free;
qQryDB:=nil;
StatusBar1.Panels.Items[1].Text:='定制显示内容保存成功!窗体名称:'+sFormCaption;
end;
//选取一条显示列
procedure TfrmReportDisplay.spUpClick(Sender: TObject);
var j,i,nWidth:integer;
begin
try
if lvDisplayDetail.Items.Count>25 then
begin
StatusBar1.Panels.Items[1].Text := '本显示定制最多支持25列,请调整!';
EXIT;
end;
IF ((lvTableDetail.ItemIndex<0) OR (lvTableDetail.ItemIndex>lvTableDetail.Items.Count))THEN
begin
StatusBar1.Panels.Items[1].Text := '请选择你要定制的列!';
EXIT;
end;
if nOldSelectRow<0 then
begin
StatusBar1.Panels.Items[1].Text := '请选择你要查询的报表!';
Exit;
end;
GroupBox4.Visible:=False;
i:=lvTableDetail.ItemIndex;
if(i>=0)then
begin
nWidth:=StrToInt(lvTableDetail.Items[i].SubItems[0]);
end;
spUp.Enabled:=False;
ComboBox1.Clear;
j:=0;
//需要判断该列是否已经选取
for j:=1 to 25 do
begin
i:=0;
while i< lvDisplayDetail.Items.Count do
begin
if lvDisplayDetail.Items[i].Caption=IntToStr(j)then
break;
i:=i+1;
end;
if i= lvDisplayDetail.Items.Count then
ComboBox1.Items.Add(IntToStr(j));
end;
nRowSelected:=lvTableDetail.ItemIndex;
ComboBox1.ItemIndex:=0;
GroupBox4.Visible:=True;
Label2.Caption:='选择列:'+lvTableDetail.Items[nRowSelected].Caption;
StatusBar1.Panels.Items[1].Text := '窗体名称:'+sFormCaption
+',选择显示列名称:'+lvTableDetail.Items[nRowSelected].Caption;
except;
end;
END;
//取消刚才未存盘前的操作
procedure TfrmReportDisplay.spAllUpClick(Sender: TObject);
var qQryDB:TQuery;
sFormCaption:string;
begin
if nOldSelectRow<0 then
begin
StatusBar1.Panels.Items[1].Text := '请选择你要查询的报表!';
Exit;
end;
sFormCaption:=lvReportName.Items[nOldSelectRow].Caption;
qQryDB:=TQuery.Create(nil);
qQryDB.DatabaseName:=CDM.dbData.DatabaseName;
qQryDB.SessionName:=CDM.dbData.SessionName;
with qQryDB do
begin
Close;//选择要显示的字段LISTVIEW初始化
SQL.Clear;
SQL.Add('SELECT A.TABLEDETAILID,DISPLAYTAB,CAPTION,'+
' WIDTH,FORMCAPTION FROM SFRJDISPLAYDETAIL A,SFRJTABLEDETAIL B ');
SQL.Add('WHERE A.TABLEDETAILID=B.TABLEDETAILID AND FORMCAPTION='''
+sFormCaption+''' ORDER BY DISPLAYTAB ASC');
Open;
First;
lvDisplayDetail.items.BeginUpdate;
lvDisplayDetail.items.Clear;
nRowWidth:=0;//显示列总宽度
//恢复以前的显示字段信息
While not Eof do
begin
with lvDisplayDetail.Items.Add do
begin
Caption:=FieldByName('DISPLAYTAB').AsString;
SubItems.Add(FieldByName('CAPTION').AsString);
SubItems.Add(FieldByName('WIDTH').Asstring);
nRowWidth:=nRowWidth+FieldByName('WIDTH').AsInteger;
SubItems.Add(sFormCaption);
SubItems.Add(FieldByName('TABLEDETAILID').Asstring);
Next ;
end;
end;
lvDisplayDetail.items.endupdate;
qQryDB.Close;
qQryDB.Free;
qQryDB:=nil;
End;
StatusBar1.Panels.Items[1].Text := '窗体名称:'+sFormCaption;
end;
//查看指定窗体的显示列信息
procedure TfrmReportDisplay.lvReportNameClick(Sender: TObject);
var qQryDB:TQuery;
sFormCaption:string;
begin
if nOldSelectRow=lvReportName.ItemIndex then
Exit;
GroupBox4.Visible:=False;
spUp.Enabled:=True;
spDown.Enabled:=True;
spSaveDB.Enabled:=True;
spAllUp.Enabled:=True;
if ((lvReportName.ItemIndex<0)
or(lvReportName.ItemIndex>lvReportName.Items.Count)) then
exit;
sFormCaption:=lvReportName.Items[lvReportName.ItemIndex].Caption;
qQryDB:=TQuery.Create(nil);
qQryDB.DatabaseName:=CDM.dbData.DatabaseName;
qQryDB.SessionName:=CDM.dbData.SessionName;
with qQryDB do
begin
Close;//选择要显示的字段LISTVIEW初始化
SQL.Clear;
SQL.Add('SELECT A.TABLEDETAILID,DISPLAYTAB,CAPTION,'
+'WIDTH,FORMCAPTION FROM SFRJDISPLAYDETAIL A,SFRJTABLEDETAIL B ');
SQL.Add('WHERE A.TABLEDETAILID=B.TABLEDETAILID AND FORMCAPTION='''
+sFormCaption+''' ORDER BY DISPLAYTAB ASC');
Open;
First;
lvDisplayDetail.items.BeginUpdate;
lvDisplayDetail.items.Clear;
nRowWidth:=0;//显示列总宽度
//显示以前的显示字段信息
While not Eof do
begin
with lvDisplayDetail.Items.Add do
begin
Caption:=FieldByName('DISPLAYTAB').AsString;
SubItems.Add(FieldByName('CAPTION').AsString);
SubItems.Add(FieldByName('WIDTH').Asstring);
nRowWidth:=nRowWidth+FieldByName('WIDTH').AsInteger;
SubItems.Add(sFormCaption);
SubItems.Add(FieldByName('TABLEDETAILID').Asstring);
Next ;
end;
end;
lvDisplayDetail.items.endupdate;
Close;//提供可以选择的字段LISTVIEW初始化
SQL.Clear;
SQL.Add('SELECT TABLEDETAILID,CAPTION,WIDTH,FORMCAPTION '
+'FROM SFRJTABLEDETAIL A WHERE FORMCAPTION='''+sFormCaption
+''' ORDER BY TABLEDETAILID');
Open;
First;
lvTableDetail.items.BeginUpdate;
lvTableDetail.items.Clear;
//显示可提供显示的字段信息
While not Eof do
begin
with lvTableDetail.Items.Add do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -