TMD的那个王八蛋地中海居然还说有项目奖加班费就免了,想马上走人了,散分
同时也把经常会碰到的一些问题贴出来和大家交流一下,这些方法感觉不大理想,我想了解一下大家通常是怎么处理的{~~~~~~~~~~~~~~~~~~~ 取得下一个单号~~~~~~~~~~~~~~~~~~~~~~~~~ }
{ parameters:iFlag := 0 只读出单号 iFlag := 1 更新下一个单号 }
function TFrmEdit.GetSerialNo(cds: TClientDataSet; iFlag: Integer): OleVariant;
var
sTemp, sTableName: string;
cdsTemp: TClientDataSet;
begin
sTableName := GetTableNameByCds(cds);
sTemp := 'Declare @No varchar(20) ' + #13 + 'Exec GetNo @No output , %s ,%d '
+ #13 + 'select @No as SerialNo';
sTemp := Format(sTemp, [sTableName, iFlag]);
cdsTemp := TClientDataSet.Create(Self);
with cdsTemp do
begin
RemoteServer := (Self.FindComponent('cdsX') as TClientDataSet).RemoteServer;
ProviderName := (Self.FindComponent('cdsX') as TClientDataSet).ProviderName;
SetCdsCmdTxt(cdsTemp, sTemp, 2);
Result := cdsTemp.FieldByName('SerialNo').AsString;
Free;
end;
end;{ 设置ClientDataSet组件CommandText属性 }
procedure TFrmEdit.SetcdsCmdTxt(cds: TClientDataSet; StrSQL: string;
iFlag: Integer);
begin
with cds do
begin
if Active then Close;
CommandText := StrSQL;
if iFlag = 1 then Execute
else if iFlag = 2 then Open
else
begin
Execute;
Open;
end;
end;
end;{ 从简单的SQL语句取得数据表名称 }
function TFrmEdit.GetTableNameFromSQLText(SQLTxt: string): string;
var
I: Integer;
sTemp: string;
begin
I := Pos('from', LowerCase(SQLTxt)) + 4;
sTemp := TrimLeft(Copy(SQLTxt, I, StrLen(PChar(SQLTxt))));
I := Pos(' ', sTemp);
if I = 0 then
Result := sTemp
else
Result := Copy(sTemp, 0, I);
end;{ 从ClientDataSet组件CommandText属性取得连接的数据表名称 }
function TFrmEdit.GetTableNameByCds(cds: TClientDataSet): string;
var
StrSQL: string;
begin
StrSQL := cds.CommandText;
Result := GetTableNameFromSQLText(StrSQL);
end;{说明:建立附加数据表PutNo,根据数据表名称读取下一个单号
SQL脚本
Create Table PutNo(sNo Varchar(12), sTableName Varchar(20), ab Varchar(20), sExplain Varchar(20))
--参数说明 sNo:日期码 sTableName:数据表名称 ab:区分码 sExplain:中文说明
--例:在数据表写入一条记录:200209010001, EmployeeData,YGZLB,员工资料表
执行存储过程传入表名称参数’EmployeeData’,则返回单号’ YGZLB200209010001’
因考虑到用户处理数据的过程中该表单的最新单号有可能已更改,所以在用户提交数据之前需重新读取一次,若新表单保存完毕,则更新下一个单号,例:
procedure TFrmEdit.GetSerialNoEx(iFlag: Integer);
begin
cdsX.FieldByName('sSerialNo').AsString := GetSerialNo(cdsX, iFlag);
end;procedure TFrmEdit.cdsXBeforePost(DataSet: TDataSet);
begin
if cdsX.State = dsInsert then GetSerialNoEx(0);
end;procedure TFrmEdit.cdsXAfterInsert(DataSet: TDataSet);
begin
GetSerialNoEx(0);
end;procedure TFrmEdit.cdsXAfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
GetSerialNo(cdsX, 1);
end;}{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}创建存储过程GetNo SQL脚本CREATE PROCEDURE GetNo
@No varchar(20) output ,
@TableName varchar(50),
@Flag intAS
declare @Year Int,
@Month int,
-- @Day int,
@Temp_No varchar(10),
@RandNo varchar(4),
@No1 varchar(10),
@ab Varchar(30)
BEGIN
select @year=Year(GetDate())
select @Month=Month(GetDate())
select @No=Str(@Year,4,0)+
(select
case
when @Month>=10 then Str(@Month,2,0)
when @Month<10 Then '0'+Str(@Month,1,0)
end
)
select @tablename = Rtrim(@tablename)
select @tablename = Ltrim(@tablename)
SELECT @Temp_No = sNo FROM Number where sTableName= @TableName
SELECT @ab = ab FROM Number where sTableName= @TableName
IF @No <> SUBSTRING( @Temp_No,1,6)
begin
SELECT @No1 = @No+'0001'
SELECT @No = @ab+@No+'0001'
end
ELSE
BEGIN
SELECT @RandNo = STR( CONVERT(int,(SUBSTRING( @Temp_No ,7,4) )+1) , 4, 0 )
SELECT @RandNo = REPLACE( @RandNo,' ','0')
SELECT @No = @No + @RandNo
SELECT @No1 = @No
SELECT @No =@ab + @No
END if @Flag=1
UPDATE Number SET sNo = @No1 where sTableName = @TableName
END
GO{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
同时也把经常会碰到的一些问题贴出来和大家交流一下,这些方法感觉不大理想,我想了解一下大家通常是怎么处理的{~~~~~~~~~~~~~~~~~~~ 取得下一个单号~~~~~~~~~~~~~~~~~~~~~~~~~ }
{ parameters:iFlag := 0 只读出单号 iFlag := 1 更新下一个单号 }
function TFrmEdit.GetSerialNo(cds: TClientDataSet; iFlag: Integer): OleVariant;
var
sTemp, sTableName: string;
cdsTemp: TClientDataSet;
begin
sTableName := GetTableNameByCds(cds);
sTemp := 'Declare @No varchar(20) ' + #13 + 'Exec GetNo @No output , %s ,%d '
+ #13 + 'select @No as SerialNo';
sTemp := Format(sTemp, [sTableName, iFlag]);
cdsTemp := TClientDataSet.Create(Self);
with cdsTemp do
begin
RemoteServer := (Self.FindComponent('cdsX') as TClientDataSet).RemoteServer;
ProviderName := (Self.FindComponent('cdsX') as TClientDataSet).ProviderName;
SetCdsCmdTxt(cdsTemp, sTemp, 2);
Result := cdsTemp.FieldByName('SerialNo').AsString;
Free;
end;
end;{ 设置ClientDataSet组件CommandText属性 }
procedure TFrmEdit.SetcdsCmdTxt(cds: TClientDataSet; StrSQL: string;
iFlag: Integer);
begin
with cds do
begin
if Active then Close;
CommandText := StrSQL;
if iFlag = 1 then Execute
else if iFlag = 2 then Open
else
begin
Execute;
Open;
end;
end;
end;{ 从简单的SQL语句取得数据表名称 }
function TFrmEdit.GetTableNameFromSQLText(SQLTxt: string): string;
var
I: Integer;
sTemp: string;
begin
I := Pos('from', LowerCase(SQLTxt)) + 4;
sTemp := TrimLeft(Copy(SQLTxt, I, StrLen(PChar(SQLTxt))));
I := Pos(' ', sTemp);
if I = 0 then
Result := sTemp
else
Result := Copy(sTemp, 0, I);
end;{ 从ClientDataSet组件CommandText属性取得连接的数据表名称 }
function TFrmEdit.GetTableNameByCds(cds: TClientDataSet): string;
var
StrSQL: string;
begin
StrSQL := cds.CommandText;
Result := GetTableNameFromSQLText(StrSQL);
end;{说明:建立附加数据表PutNo,根据数据表名称读取下一个单号
SQL脚本
Create Table PutNo(sNo Varchar(12), sTableName Varchar(20), ab Varchar(20), sExplain Varchar(20))
--参数说明 sNo:日期码 sTableName:数据表名称 ab:区分码 sExplain:中文说明
--例:在数据表写入一条记录:200209010001, EmployeeData,YGZLB,员工资料表
执行存储过程传入表名称参数’EmployeeData’,则返回单号’ YGZLB200209010001’
因考虑到用户处理数据的过程中该表单的最新单号有可能已更改,所以在用户提交数据之前需重新读取一次,若新表单保存完毕,则更新下一个单号,例:
procedure TFrmEdit.GetSerialNoEx(iFlag: Integer);
begin
cdsX.FieldByName('sSerialNo').AsString := GetSerialNo(cdsX, iFlag);
end;procedure TFrmEdit.cdsXBeforePost(DataSet: TDataSet);
begin
if cdsX.State = dsInsert then GetSerialNoEx(0);
end;procedure TFrmEdit.cdsXAfterInsert(DataSet: TDataSet);
begin
GetSerialNoEx(0);
end;procedure TFrmEdit.cdsXAfterApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
begin
GetSerialNo(cdsX, 1);
end;}{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}创建存储过程GetNo SQL脚本CREATE PROCEDURE GetNo
@No varchar(20) output ,
@TableName varchar(50),
@Flag intAS
declare @Year Int,
@Month int,
-- @Day int,
@Temp_No varchar(10),
@RandNo varchar(4),
@No1 varchar(10),
@ab Varchar(30)
BEGIN
select @year=Year(GetDate())
select @Month=Month(GetDate())
select @No=Str(@Year,4,0)+
(select
case
when @Month>=10 then Str(@Month,2,0)
when @Month<10 Then '0'+Str(@Month,1,0)
end
)
select @tablename = Rtrim(@tablename)
select @tablename = Ltrim(@tablename)
SELECT @Temp_No = sNo FROM Number where sTableName= @TableName
SELECT @ab = ab FROM Number where sTableName= @TableName
IF @No <> SUBSTRING( @Temp_No,1,6)
begin
SELECT @No1 = @No+'0001'
SELECT @No = @ab+@No+'0001'
end
ELSE
BEGIN
SELECT @RandNo = STR( CONVERT(int,(SUBSTRING( @Temp_No ,7,4) )+1) , 4, 0 )
SELECT @RandNo = REPLACE( @RandNo,' ','0')
SELECT @No = @No + @RandNo
SELECT @No1 = @No
SELECT @No =@ab + @No
END if @Flag=1
UPDATE Number SET sNo = @No1 where sTableName = @TableName
END
GO{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
{ EditMask + TMonthCalendar,动态生成TMonthCalendar不好控制该组件的释放,新给一个窗体,给窗体一个TMonthCalendar组件MC,设置窗体属性:AutoSize := True;BorderStyle := bsNone }
{ UnitEdit.pas }
var
vSender: TObject;implementationuses UnitGetCalendar;procedure TFrmEdit.ShowCalendar(Sender: TObject);
var
PT: TPoint;
vDS: TDataSource;
begin
vSender := Sender;
if vSender is TDBEdit then vDS := (vSender as TDBEdit).DataSource
else if vSender is TDBGrid then vDS := (vSender as TDBGrid).DataSource
else Exit;
if vDS.State in [dsEdit, dsInsert] then
begin
GetCursorPos(PT);//取得鼠标位置
Application.CreateForm(TFrmGetCalendar, FrmGetCalendar);
with FrmGetCalendar do
begin
Top := PT.Y + 10;
Left := PT.X - 150;
Show;
end;
end;
end;procedure TFrmEdit.SelectDate(sDate: string);
begin
if vSender is TDBEdit then
SendMessage((vSender as TDBEdit).Handle, WM_SETTEXT, 0, LongInt(PChar(sDate)));
if vSender is TDBGrid then
(vSender as TDBGrid).SelectedField.AsString := sDate;
end;{ UnitGetCalendar.pas }var
xSelected: Boolean;uses UnitEdit;procedure TFrmGetCalendar.MCDblClick(Sender: TObject);
begin
xSelected := True;
Close;
end;procedure TFrmGetCalendar.FormDeactivate(Sender: TObject);
begin
Close;
end;procedure TFrmGetCalendar.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if xSelected then
FrmEdit.SelectDate(DateToStr(MC.Date));
end;{ 说明:因DBGird,DBEdit组件有时是放置在TPanel之类的其他组件上,所以只好以非固定位置显示TmonthCalendar组件,这里考虑是否有好的解决方法
DBEidt:设置OnDblClick事件为ShowCalendar;DBGrid: 在Columns Editor 中添加Column,对应日期类型字段,在Column属性编辑器中设置属性ButtonStyle := cbsEllipsis,设置DBGrid的OnEditButtonClick事件为ShowCalendar }
{ 说明:进入界面时,从指定数据表中相应字段读取记录初始化DBComboBox,ComboBox 的Itmes属性或DBGrid的Column.PickList属性,因这些数据记录有时比较庞大,在用户输入字符串时,对这些数据进行筛选,更新Itmes属性,只显示出以该字符串开头的数据记录 }{ 取得指定数据表指定字段值列表 }
procedure TFrmEdit.GetFieldValueList(TableName,
FieldValue: string; var SL: TStringList);
var
I: Integer;
sTemp: string;
cds: TClientDataSet;
begin
cds := TClientDataSet.Create(Self);
cds.RemoteServer := (Self.FindComponent('cdsX') as TClientDataSet).RemoteServer;
cds.ProviderName := (Self.FindComponent('cdsX') as TClientDataSet).ProviderName;
sTemp := Format('select * from %s', [TableName]);
SetCdsCmdTxt(cds, sTemp, 2);
SL.Clear;
for I := 0 to cds.RecordCount - 1 do
begin
sTemp := cds.FieldByName(FieldValue).AsString;
SL.Append(sTemp);
cds.Next;
end;
cds.Free;
end;procedure TFrmEdit.GetFieldValueListEx(TableName, FieldValue: string;
cbb: TCustomComboBox);
var
SL: TStringList;
begin
SL := TStringList.Create;
try
GetFieldValueList(TableName, FieldValue, SL);
cbb.Items.Assign(SL);
finally
SL.Free;
end;
end;
{ DBComboBox }
procedure TFrmEdit.dbcsNameChange(Sender: TObject);
var
sText: string;
iSelStart: Integer;
begin
iSelStart := Length((Sender as TDBComboBox).Text);
sText := (Sender as TDBComboBox).Text;
GetFieldValueListEx(Format('EmployeeData where sName like ''%s%%''',
[sText]), 'sName', Sender as TCustomComboBox);
(Sender as TDBComboBox).SelStart := iSelStart;{ 很不乐意加上这一句,但不这样每次光标都会跑到最左边 }
end;{ DBGrid }
procedure TFrmEdit.dbgXKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
sText: string;
SL: TStringList;
begin
with Sender as TDBGrid do
begin
SL := TStringList.Create;
if SelectedField <> DataSource.DataSet.FieldByName('sName') then Exit;
if DataSource.State in [dsInsert, dsEdit] then
begin
sText := ((Controls[0] as TInPlaceEdit).Text);{这一句很关键,用SelectedField.AsString无法实时取得文本改动 }
try
GetFieldValueList(Format(' EmployeeData where sName like ''%s%%''',
[sText]), 'sName', SL);
Columns[0].PickList := SL;
finally
SL.Free;
end;
end;
end;
end;
现在公司真TMD的不是东西,骂出来,爽!(也只能如此了:)
然后再仔细看!
祝你好运!
((),).
))) 6(6
((c` _e/
)))'(
((( , \
)\ \ _o___,-
( )\.__,-._\
/ -/ \ |(
___( /_)\ \ _____ _____
'.__,' \_\ -没时,加班累了,我叫她去陪陪你~~~
TNND,真是TLLD的剥削!!
我把父窗体的一个Panel组件删除,改用Label组件,程序调式时出现class TPanel not found 错误,在出错的地方打开那个窗体,出来‘ancestor component not found’提示框,按照默认的选项删除在父窗体中已被删掉的组件,再运行程序,一切正常,保存后关闭所有,再打开时居然同样的问题又出来了!!而且很奇怪有很多个子窗体,就那一个会出错,按理说删除父窗体的组件子窗体的该组件也会自动完全删除掉,不知道是不是Delphi自己的原因,这个问题实在是很讨厌,大家快帮我看一下,解决了我另外贴个帖子给分
--------------------------------------------
,%%%%%%%,
,%%/\%%%%/\%,
,%%%\c "" J/%%,
%. %%%%/ D L \%%%
`%%. __ %%%% _ |%%%
`%% .-' `"~--"`%%%%(=_Y_=)%%' ~~~
// .' `. `%%%%`\7/%%%'____
(( / ; `%%%%%%%'____)))
`.`--' ,' _,`-._____`-, 热爱生活 不爱美女 关注大众 无视权贵 一奋青