各位前辈,小弟现在在练习一个工资管理程序(随书带的),程序的主窗口有5个dbgrid,其中dbgrid1显示
员工号和员工姓名,dbgrid2,dbgrid3,dbgrid4,dbgrid5分别显示固定福利津贴、月度奖金、月度福利津贴、
月度扣发,当在主窗口输入员工号后,固定福利津贴、月度奖金、月度福利津贴、扣发就分别显示出该员工的福利津贴、
月度奖金、月度福利津贴、扣发,另有按纽用于添加固定福利津贴、月度奖金、月度福利津贴、扣发。
dbgrid2,dbgrid3,dbgrid4,dbgrid5的datasource属性取值分别为DM——main.Ds_salary_1,
DM——main.Ds_salary_2,DM——main.Ds_salary_3,DM——main.Ds_salary_4;
Ds_salary_1,Ds_salary_2,Ds_salary_3,Ds_salary_4,的dataset属性的取值分别是
T_salary_1,T_salary_2,T_salary_3,T_salary_4;
T_salary_1,T_salary_2,T_salary_3,T_salary_4的tablename都是salary_other,用不同的filter条件在
4个dbgrid显示相应的内容。
有这么一个问题:程序中删除固定福利津贴、月度奖金、月度福利津贴、扣发是在dbgrid2,dbgrid3,dbgrid4,dbgrid5
中单击右键(主窗口放置了一个popmenu,name是M——delete,caption是“删除当前记录”),删除当前员工
的不需要的固定福利津贴、月度奖金、月度福利津贴、扣发;程序中代码如下:
在procedure TF_main.M_deleteClick(Sender: TObject);
begin
if Sender is TDBGrid then
(Sender as TDBGrid).DataSource.DataSet.Delete;
end;
但实际操作发现删除不掉,在
end;行设了断点,查看如下:
(Sender as TDBGrid).DataSourc=expression illegal in evaluator
(Sender as TDBGrid).DataSource.DataSet.=nil
(Sender as TDBGrid).DataSource.DataSet.Delete=inaccessible value
是哪里有什么问题?
小弟多谢了!!!
员工号和员工姓名,dbgrid2,dbgrid3,dbgrid4,dbgrid5分别显示固定福利津贴、月度奖金、月度福利津贴、
月度扣发,当在主窗口输入员工号后,固定福利津贴、月度奖金、月度福利津贴、扣发就分别显示出该员工的福利津贴、
月度奖金、月度福利津贴、扣发,另有按纽用于添加固定福利津贴、月度奖金、月度福利津贴、扣发。
dbgrid2,dbgrid3,dbgrid4,dbgrid5的datasource属性取值分别为DM——main.Ds_salary_1,
DM——main.Ds_salary_2,DM——main.Ds_salary_3,DM——main.Ds_salary_4;
Ds_salary_1,Ds_salary_2,Ds_salary_3,Ds_salary_4,的dataset属性的取值分别是
T_salary_1,T_salary_2,T_salary_3,T_salary_4;
T_salary_1,T_salary_2,T_salary_3,T_salary_4的tablename都是salary_other,用不同的filter条件在
4个dbgrid显示相应的内容。
有这么一个问题:程序中删除固定福利津贴、月度奖金、月度福利津贴、扣发是在dbgrid2,dbgrid3,dbgrid4,dbgrid5
中单击右键(主窗口放置了一个popmenu,name是M——delete,caption是“删除当前记录”),删除当前员工
的不需要的固定福利津贴、月度奖金、月度福利津贴、扣发;程序中代码如下:
在procedure TF_main.M_deleteClick(Sender: TObject);
begin
if Sender is TDBGrid then
(Sender as TDBGrid).DataSource.DataSet.Delete;
end;
但实际操作发现删除不掉,在
end;行设了断点,查看如下:
(Sender as TDBGrid).DataSourc=expression illegal in evaluator
(Sender as TDBGrid).DataSource.DataSet.=nil
(Sender as TDBGrid).DataSource.DataSet.Delete=inaccessible value
是哪里有什么问题?
小弟多谢了!!!
解决方案 »
- OverbyteIcs控件问题
- 我把文件映射到内存中,应该怎样读出文件?
- ? 关于dbgrid的问题,大侠帮帮我啊,急
- 如何通过Internet连接某一局域网(路由器连接)内的一台服务器上的SQL7.0?在线等待!!!
- 问:Delphi调用VC编译的Dll疑问?
- 谁愿意给俺介绍一个典型的MIDAS框架?
- 数据库问题,帮忙!
- 熟悉ACM控件的大虾进来!
- 怎样将控件及几个form中共同的操作集成起来,做成一个独立的对象(类)啊?
- 我想把一个已经编译好的程序,从新编译成DLL,哪位大侠能告诉我该如何去做,将不胜感激。
- 一个控件装好后拖拉到from就delphi非法操作或类没有注册提示为什么?
- 现在公司接了LOTUS的项目,老板要我熟悉一下这东西开发,无从下手,纳闷
或query中的记录就行了.
语句:
table.edit;
table.delete;
或
query.edit;
query.delete;
谢谢你的回答。是我的问题提的不明确,还有要说明的我补充一下,设置固定福利津贴、月度奖金、月度福利津贴、扣发都是操作的salary-other表,salary-other表结结构如下:/* Table: SALARY_OTHER, Owner: MISDBA */
CREATE TABLE SALARY_OTHER (ID INTEGER NOT NULL,
YEARMONTH CHAR(7) NOT NULL,
PERSON CHAR(6) NOT NULL,
OTHER_TYPE CHAR(1) NOT NULL,
NAME VARCHAR(10) NOT NULL,
MONEY FLOAT,
DESCRIPTION VARCHAR(200),
CONSTRAINT SALARY_OTHER_ID PRIMARY KEY (ID));其中的OTHER_TYPE CHAR(1) NOT NULL是类型(0奖金,1福利,2津贴,3扣发),程序中有相应的代码procedure TF_main.i_person_idChange(Sender: TObject);
begin
if (Pos(' ',i_person_id.Text)=0) and DM_main.Database.Connected then
begin //判断输入完整并且数据库连接
With DM_main do
begin
Q_person.Close;
Q_person.Params.ParamValues['PERSON']:=i_person_id.Text;
Q_person.Open;
if Q_person.RecordCount=1 then
begin
i_person_name.Text:=Q_person['NAME'];
//i_depart_id.Text:=Q_person['DEPARTMENT'];
T_salary_set.Filter:='PERSON='''+i_person_id.Text+'''';
T_salary_set.Filtered:=True;
T_salary_set.Open;
if T_salary_set.RecordCount=0 then
T_salary_set.AppendRecord([i_person_id.Text,0]);
T_salary_1.Filter:='PERSON='''+i_person_id.Text
+''' AND YEARMONTH=''0000000'''; //固定福利津贴
T_salary_1.Filtered:=True;
T_salary_1.Open;
T_salary_2.Filter:='PERSON='''+i_person_id.Text
+''' AND YEARMONTH='''+i_yearmonth.Text
+''' AND OTHER_TYPE=''0'''; //月度奖金
T_salary_2.Filtered:=True;
T_salary_2.Open;
T_salary_3.Filter:='PERSON='''+i_person_id.Text
+''' AND YEARMONTH='''+i_yearmonth.Text
+''' AND (OTHER_TYPE=''1'' OR OTHER_TYPE=''2'')';//福利津贴
T_salary_3.Filtered:=True;
T_salary_3.Open;
T_salary_4.Filter:='PERSON='''+i_person_id.Text
+''' AND YEARMONTH='''+i_yearmonth.Text
+''' AND OTHER_TYPE=''3''';//月度扣发
T_salary_4.Filtered:=True;
T_salary_4.Open;
end;
Q_person.Close;
end;
end
else
begin //数据不完整
with DM_main do
begin
T_salary_set.Close;
T_salary_1.Close;
T_salary_2.Close;
T_salary_3.Close;
end;
i_person_name.Text:='';
end;
end;用于显示当员工号输入框的内容改变时,在4个DBGRID中显示出固定福利津贴、月度奖金、月度福利津贴、扣发。
现在关键问题是如何区分应该删除哪个DBGRID中的,比如我想删除DBGRID1中固定福利津贴中的奖金,200和DBGRID4月度扣发中的扣发1,300。他们在2个DBGRID中,该如何判断是哪个DBGRID发出请求?
请各位前辈多指点啊!!!
如需要原码请留下EMAIL,共同学习。
table.edit; table.delete; 或 query.edit;query.delete;2.如果你想清空某个dbgird中的某项(比如说奖金),根据员工号找到那个字段值,将其置零。
用locate或lookup方法可找到某个员工的纪录,在edit模式下对某字段值进行修改,再post就行。修改了表,那么dbgrid中自然就会显示出改后的结果。
dbgrid显示的只是table或query中的数据集的内容,操作当然还是针对table或query进行。
是想删除某个员工的一条记录(在表中一个员工有多条记录,奖金、扣发都是一条记录),你说的方法我明白,但这里关键问题是sender的类型问题,sender必须是TDBGrid才能删除
而右键菜单有时候发出的sender是cell之类的对象,如何解决?
procedure TF_main.M_deleteClick(Sender: TObject);
begin
if Sender is TDBGrid then
(Sender as TDBGrid).DataSource.DataSet.Delete;
end;
类似这段代码的意思。
如果你想看Sender的具体类名的话:showmessage(Sender.ClassName)
非常感谢你的回答,加了showmessage(Sender.ClassName),发现Sender的具体类名是TMenuItem,不是TDBgrid,有什么方法可以使Sender返回的是TDBgrid?
小弟不胜感激!!!
当然是m_delete,但可以回朔到是哪一个dbgrid.showmessage((((Sender As TMenuItem).GetParentComponent) as TPopupMenu).PopupComponent.Name)(Sender As TMenuItem).GetParentComponent得到sender(TMenuItme)所属
的TPopupMenu,
(... As TPopupMenu).PopupComponent获得当前正在使用该Menu的控件,这
就是你要找的DBGrid
前辈,太谢谢了!!!程序改成procedure TF_main.M_deleteClick(Sender: TObject);
begin
showmessage((((Sender As TMenuItem).GetParentComponent) as TPopupMenu).PopupComponent.Name);
if Sender is TDBGrid then
(((((Sender As TMenuItem).GetParentComponent) as TPopupMenu).PopupComponent) AS TDBGRID).DataSource.DataSet.EDIT;
(((((Sender As TMenuItem).GetParentComponent) as TPopupMenu).PopupComponent) AS TDBGRID).DataSource.DataSet.DELETE;
end;
功能实现了!!!
真是太感谢CSDN和热心帮助我的朋友们了,特别是NIGHTCLOUD精确的解答,是你们让我从郁闷变的舒畅无比。
I LOVE CSDN。
另外问一下NIGHTCLOUD前辈,你帮我解答的有关回朔方面的知识是怎么学到的,有哪些书和文章介绍啊,小弟初学,还请前辈多多指教啊。:)
procedure TF_main.M_deleteClick(Sender: TObject);
var
aDBGrid:TDBGrid;
begin
aDBGrid:=TDBGrid(((((Sender As TMenuItem).GetParentComponent) as
TPopupMenu).PopupComponent));
aDBGrid.DataSource.DataSet.DELETE;
end;