📄 unpersonreportdisplay.pas
字号:
{**********************************************************************
通用报表显示定制类
名称: 报表显示需求参数定制程序
目的: 按照用户要求设制报表显示名称、需要显示的列、显示的顺序
功能: 按照用户要求设制报表显示名称、需要显示的列、显示的顺序
作者: 邓普德
版权: 成都四方信息技术有限公司
使用限制: 最多显示25列,且列名来自于指定数据库
定义时间: 2003-10-27
修改时间:
**********************************************************************}
unit unPersonReportDisplay;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ExtCtrls, StdCtrls, Buttons, Menus,DB,DBTables, ImgList,Variants,
Spin,unCDefine;
{Self Define}
type
TfrmPersonReportDisplay = class(TForm)
miTV: TImageList;
ImageList1: TImageList;
Panel1: TPanel;
spDown: TSpeedButton;
spSaveDB: TSpeedButton;
spUp: TSpeedButton;
spAllUp: TSpeedButton;
GroupBox2: TGroupBox;
lvDisplayDetail: TListView;
GroupBox3: TGroupBox;
lvTableDetail: TListView;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure spDownClick(Sender: TObject);
procedure spSaveDBClick(Sender: TObject);
procedure spUpClick(Sender: TObject);
procedure spAllUpClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure lvTableDetailClick(Sender: TObject);
procedure lvDisplayDetailClick(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 lvDisplayDetailColumnClick(Sender: TObject;
Column: TListColumn);
procedure lvTableDetailColumnClick(Sender: TObject;
Column: TListColumn);
procedure spExitClick(Sender: TObject);
procedure lvTableDetailDblClick(Sender: TObject);
procedure lvDisplayDetailDblClick(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
sFormName,sFormCaption,sDiscription: string;
nRowSelected:Integer;
bReShow:boolean;//是否需要重新显示
aShowColum:array of string;//按顺序保存显示列名称
nShowNum:integer;//从数组中取得的显示数量
procedure Refresh;
function bAgreeDel(const FormCaption,
DisplayColumnCaption: string): boolean;
procedure SelectShow;
procedure ChangeShowCloumn(const GoUp: boolean);
public
procedure IniShow(FormCaption: String);
Function Execute:boolean;
end;
var
frmPersonReportDisplay: TfrmPersonReportDisplay;
implementation
uses
unCDM, UnReportInfo, unCSort;
{$R *.DFM}
procedure TfrmPersonReportDisplay.FormCreate(Sender: TObject);
begin
bReShow:=False;
nShowNum:=0;
end;
// 取消/删除的定制列
procedure TfrmPersonReportDisplay.spDownClick(Sender: TObject);
var nWidth:Integer;
sTemp:string;//用于防止列过长而临时生成的一个变量
begin
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].Caption;
if bAgreeDel(sFormCaption,sTemp)=False then
begin
if ((MessageDlg(' 该列已被选择打印输出,您确认不显示该列吗?' ,
mtConfirmation ,[mbYes,mbNo] ,0) <> mrYes)) then
begin
StatusBar1.Panels.Items[1].Text := '取消操作';
exit;
end;
end;
// begin
sTemp:=lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].SubItems[0];
nWidth:=StrToInt(sTemp);
StatusBar1.Panels.Items[1].Text := '取消显示列:'
+lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].Caption;
lvDisplayDetail.Items[lvDisplayDetail.ItemIndex].Delete;
end;
//存盘
procedure TfrmPersonReportDisplay.spSaveDBClick(Sender: TObject);
var qQryDB:TQuery;
i:integer;
begin
StatusBar1.Panels[1].Text := '正在保存修改和刷新显示,请稍后......';
Application.ProcessMessages;
bReShow:=False;
if lvDisplayDetail.Items.Count=nShowNum then//判断出
begin
for i:=0 to nShowNum-1 do//判断是否有变化
begin
if aShowColum[i]<>lvDisplayDetail.Items[i].Caption then
Break;
end;
if i=nShowNum then
begin
close;
Exit;
end;
end;
bReShow:=True;//此种情况都需要重新刷新显示
qQryDB:=TQuery.Create(nil);
qQryDB.DatabaseName:=CDM.dbData.DatabaseName;
qQryDB.SessionName:=CDM.dbData.SessionName; qQryDB.Close;
qQryDB.Sql.Clear;
//删掉该员工该窗体设置的历史数据
qQryDB.sql.Add('DELETE FROM SFRJPERSONDISPLAY WHERE (STAFFID='''
+sUserID+''') AND SFRJPERSONDISPLAY.TABLEDETAILID IN'
+' ( SELECT SFRJTABLEDETAIL.TABLEDETAILID FROM SFRJTABLEDETAIL '
+'WHERE FORMCAPTION='''+sFormCaption+''')');
qQryDB.ExecSQL;
i:=0;
//循环写入当前的显示字段信息
while i< lvDisplayDetail.Items.Count do
begin
qQryDB.Close;
qQryDB.sql.Clear;
qQryDB.sql.Add('INSERT INTO SFRJPERSONDISPLAY(STAFFID,TABLEDETAILID,DISPLAYTAB)');
qQryDB.sql.Add(' VALUES('''
+sUserID+''','+lvDisplayDetail.Items[i].SubItems[1]
+','+IntToStr(i)+')');
qQryDB.ExecSql;
i:=i+1;
end;
qQryDB.Close;
qQryDB.Free;
qQryDB:=nil;
StatusBar1.Panels.Items[1].Text := '定制显示方案保存成功!';
close;
end;
//选取一行,最多不得超过25行
procedure TfrmPersonReportDisplay.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;
nRowSelected:=lvTableDetail.ItemIndex;
SelectShow;//选取该行到右边
StatusBar1.Panels.Items[1].Text := '选择显示列名称:'
+lvTableDetail.Items[nRowSelected].Caption;
except;
end;
END;
//选取一行信息的具体实现
procedure TfrmPersonReportDisplay.SelectShow;
var i,nWidth:Integer;
sCaption,StrSerial:String;
begin
i:=nRowSelected;
if(i>=0)then
begin
sCaption:=lvTableDetail.Items[i].Caption;
nWidth:=StrToInt(lvTableDetail.Items[i].SubItems[0]);
StrSerial:=lvTableDetail.Items[i].SubItems[1];
//合乎要求继续
i:=0;
while i< lvDisplayDetail.Items.Count do
begin
if(lvDisplayDetail.Items[i].Caption =sCaption)then
break;
i:=i+1;
end;
if(i = lvDisplayDetail.Items.Count)then
begin
lvDisplayDetail.items.BeginUpdate;
with lvDisplayDetail.Items.Add do//加入到右边列中
begin
Caption:=sCaption;
SubItems.Add(IntToStr(nWidth));
SubItems.Add(StrSerial);
end;
lvDisplayDetail.items.EndUpdate;
end
else
Application.MessageBox(' 你选择的显示列已经存在,请检查是否重复!',
'系统信息管理窗',0);
end;
StatusBar1.Panels.Items[1].Text := '添加显示列成功';
end;
//取消存盘前的操作
procedure TfrmPersonReportDisplay.spAllUpClick(Sender: TObject);
var qQryDB:TQuery;
begin
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 SFRJPERSONDISPLAY A,SFRJTABLEDETAIL B ');
SQL.Add('WHERE (A.STAFFID='''+sUserID+''') '
+'AND (A.TABLEDETAILID=B.TABLEDETAILID) AND (FORMCAPTION='''
+sFormCaption+''' )ORDER BY DISPLAYTAB ASC');
Open;
First;
//在个性化中无显示内容时以统一的显示为准 begin
if qQryDB.RecordCount<=0 then//只有当有查询的记录数时才执行下面的操作
begin
qQryDB.Close;//选择要显示的字段LISTVIEW初始化
qQryDB.SQL.Clear;
qQryDB.SQL.Add('SELECT INARYSERIALID,DISPLAYTAB,CAPTION,B.TABLEDETAILID,'
+' COLUMNNAME,WIDTH,DATATYPE FROM SFRJDISPLAYDETAIL A,SFRJTABLEDETAIL B '
+'WHERE (A.TABLEDETAILID=B.TABLEDETAILID) AND (FORMCAPTION='''+sFormCaption
+''') ORDER BY DISPLAYTAB ASC');
qQryDB.Open;
qQryDB.First;
end;
lvDisplayDetail.items.BeginUpdate;
lvDisplayDetail.items.Clear;
While not Eof do//重新写入
begin
with lvDisplayDetail.Items.Add do
begin
Caption:=FieldByName('CAPTION').AsString;
SubItems.Add(FieldByName('WIDTH').Asstring);
SubItems.Add(FieldByName('TABLEDETAILID').Asstring);
Next ;
end;
end;
lvDisplayDetail.items.endupdate;
qQryDB.Close;
qQryDB.Free;
qQryDB:=nil;
END;
end;
//窗体关闭,并清空相应LISTVIEW
procedure TfrmPersonReportDisplay.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
lvTableDetail.Items.Clear;
lvDisplayDetail.Items.Clear;
end;
procedure TfrmPersonReportDisplay.BitBtn1Click(Sender: TObject);
var i,nWidth:Integer;
sCaption,StrSerial:String;
begin
i:=nRowSelected;
if(i>=0)then
begin
sCaption:=lvTableDetail.Items[i].Caption;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -