?? 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 + -