当前位置:主页>销售管理软件> 列表

在POST前触发事件,如果判断某个FIELD修改才触发? 找免费档案管理软件

进销存软件版1楼: 我想TABLE在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