在POST前触发事件,如果判断某个FIELD修改才触发? 找免费档案管理软件
化,若某个FIELD发生了变化则不触发.
不用cacheupdate的模式下可否?
SQL Server + ADOTable
2楼: 补充一下事件起因:
某表的filed1大数情况下是通过其它FILED的值计算出来的,但是要求也可以手工输入,所以
就想在表保存前计算一下,但如果刚好FIELD1是手工输入的,则也 如会计算一下,程式出错, 如免费财务管理软件
3楼: 还是用批量模式吧,管它手工,还是公式,给个条件一起判断下,不合适就不保存
4楼: procedure TDM.ADOtable1BeforePost(DataSet: TDataSet);
//這個是提交前用來檢查的事件
begin
if DataSet.fieldbyname(''預計產量'').value - DataSet.fieldbyname(''生產量'').value < 0 then
begin
MessageDlg(''對不起,你的輸入已經超出原預計產量!'', mtWarning, [mbOK], 0);
ADOtable1.Cancel;
Abort;
end;
end;
你自己可以改改。就在這個事件寫
5楼: 同意楼上,这是正宗办法!
6楼: To:漂流的雲,
不是这个意思,不是field1与其它字段比较,而是判断field1 有没有被修改.Table没有启
用cacheupdate,用newvalue和oldvalue无效.
进销存软件版7楼: procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);
begin
end;
procedure TForm1.ADOQuery1AfterPost(DataSet: TDataSet);
begin
end;
在前、後要處理的事物,加以判斷字段就可以了。
8楼: procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);
var
i:Integer;
begin
for i:=0 to DataSet.FieldCount-1 do
begin
if DataSet.FieldByName(''FieldName'').OldValue<>DataSet.FieldByName(''FieldByName'').Value then
ShowMessage(''该字段值已经发生变化'');
end;
9楼: 重申要求:
field1 在大数情况下是由 field2*field3 计算出来的, 但有时也要求用手工方法输入,
如何在用DbGrid编辑时实现上述功能.
10楼: 定义一个全局变量 FieldEdited 记录要跟踪的字段,初始值为 false
在数据集的DataChange中判断一下:
if Filed.FiledName=''Filed1'' then
FieldEdited:=true;
然后在BeforePost中检查这个变量,做相应处理。
没实验过,应该可以。
11楼: To:漂流的雲,
不是这个意思,不是field1与其它字段比较,而是判断field1 有没有被修改.Table没有启
用cacheupdate,用newvalue和oldvalue无效.
那你還不如用觸發器來做
12楼: To:漂流的雲,
愿说详解 如免费档案管理软件
13楼: To:漂流的雲,
愿听详解
进销存软件版14楼: 我想加分,可是同一题 不能加分,我将另开贴加分
15楼: 如果field1 在大数情况下是由 field2*field3 计算出来的,而且可以手动输入,
那么可以先计算出结果,如果用户修改了,就以修改的值存入.最多就是用户输入的值和计算出来的不相等,这时候可以给出提示,看用户是否接受!我的程序一般都是这样处理的.
16楼: TO:babibean
问题是何时执行计算的程式?是放在OnCalcField里吗?
17楼: 我再加100分,另开题.
高手出手啦.........
我急我急我急急急
18楼: “要求:field1 在大数情况下是由 field2*field3 计算出来的, 但有时也要求用手工方法输入”,这里的业务应该是要保证field1=field2*field3
不用理会用户输入的是什么值,只需要在BEFOREPOST事件中判断是否:
[b] field1=field2*field3 [/b]
若不相等,提示用户即可。
如:
if adotable1.fields[1].asinteger<>adotable1.fields[2].asinteger*adotable1.fields[3].asinteger then
begin
ShowMessage(''字段1的值不等于字段2乘以字段3的值,请确认'');
end;
19楼: 谢 谢 回 复
如果计算过程放在 OnCalcField 事件里, 就无法手工输入啦, 因为输完之后又会马上计
算一次, 填入计算值,而不是手工输入的值
20楼: 计算过程放在 OnCalcField 事件里:
with DataSet do
if FieldByName(''Field1'').IsNull then
FieldByName(''Field1'').Integer:=
FieldByName(''Field2'').Integer * FieldByName(''Field3'').Integer;
进销存软件版21楼: TO:kaida,
如果用户只是修改field2或者field3呢? 用你的方法 field1 就不会自动进行计算了.
哪位兄弟再献个良策
22楼: 你可以在 Field2,Field3 的关联录入控件的 OnKeyPress 中加2行:
if xxxxxx.State not in [dsInsert, dsEdit] then xxxxxx.edit;
xxxxxx.FieldByName(''Field1'').Assign(Nil);。
23楼: 帮顶!
╭=========================================╮
80G海量源代码,控件,书籍全免费狂下不停!
http://www.source520.com
个人网站站长开发推广同盟,让所有人知道你的世界!
http://www.source520.com/search/search.asp
╰=========================================╯
24楼: 不成功
25楼: 上面代码确实有问题。
如果你用 DBGridEh,[brown]不要用计算字段[/brown],只要在 DBGridEh 的 Field2 和 Field3 的 OnUpdateData 中写:
(我已测试通过)
procedure TForm1.DBGridEh1Columns2UpdateData(Sender: TObject;
var Text: String; var Value: Variant; var UseText, Handled: Boolean);
begin
Table1.FieldByName(''Field1'').AsInteger:=
Table1.FieldByName(''Field2'').AsInteger *
Table1.FieldByName(''Field3'').AsInteger
end;
procedure TForm1.DBGridEh3Columns1UpdateData(Sender: TObject;
var Text: String; var Value: Variant; var UseText, Handled: Boolean);
begin
Table1.FieldByName(''Field1'').AsInteger:=
Table1.FieldByName(''Field2'').AsInteger *
Table1.FieldByName(''Field3'').AsInteger
end;
26楼: 谢谢kaida
27楼: kaida
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3351033
进销存软件版28楼: 还有一题,可有兴趣
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3324256