dbgrid与数据库的问题?[:D] 找青岛进销存软件
用dbgrideh来浏览修改数据库表格时,
比如要将某金额改为0值,正确的方法是用户在该单元格中输入0即可。
但是,用些用户习惯按“del”或“back”键将单元格内容删除;
如果这样,则数据库表中对应记录的字段值为NULL,不是想要的0,如果有空值,往往会导致SQL的UPDATE运算不正确。
不知哪位大侠解决过类似问题,在下请教
2楼: 在Update之前处理下 如电脑进销存
3楼: 请问如何处理?
4楼: 你只要在dbgrideh的键盘事件中,当key=#8 or key=#46的时候,你就直接给当前单元赋值为0啊!!!
5楼: 有没有其他如办法?
楼上说的虽然可行,但实际操作时情况较复杂,这样做会导致其他问题的出现
6楼: 在post之前賦值為0
if ...then
=0
销售管理软件版7楼: 帮顶!
╭=========================================╮
80G海量源代码,控件,书籍全免费狂下不停!
http://www.source520.com
╰=========================================╯
8楼: zhenshide方法比较好!
9楼: 我记得delphi里有个函数,名字忘记了。xxx(‘’,0),如果是空就返回0
10楼: 修改ACCESS2000数据库 金额字段的默认值为‘0'', 不准为空
11楼: 楼上办法我也试过,这样程序在操作过程中,如果删除了单元格中内容,则程序会自动提示出错。
12楼: 如上述方法仍不满意
可尝试修改数据库表定义中,该字段允许为空
但在录入中做必要控制,这样界面会友好许多,也容易控制 如好用的财务软件
13楼: 真的没有好的办法了吗?
销售管理软件版14楼: 设置字段可以为空,默认值为0就可以,或者在post之前判断其值,如果为空,就赋0;
15楼: 在改字段的onValidate事件中添加
procedure TForm1.ADOTable1DSDesignerValidate(Sender: TField);
begin
if (sender.Value=null) then
begin
if application.MessageBox(''是否取消修改,否则重新输入合法数值'',''信息'',mb_OKCancel+mb_iconwarning)=1 then
begin
sender.DataSet.Cancel;
abort;
end
else
abort;//重新输入
end;
end;
16楼: 自己写个象SQL Server 里面的IsNull函数就是了
IsNull(''...'',0) 不就可以了?
17楼: 我的作法通常是这样:
在字段的Validate事件里判断字段值是否为0:
if (clddetailBox_Size.AsInteger > 0) and
(clddetailBox_Qty.AsInteger > 0) then
begin
clddetailqty.AsInteger := clddetailBox_Size.AsInteger * clddetailBox_Qty.AsInteger;
end;
18楼: 在数据库beforepost事件中进行判断有关字段
如果 字段.value=null then 字段.value=0
19楼: 在BeforePost之前加上:
Table1.FieldByName(''FieldName'').AsFloat := Table1.FieldByName(''FieldName'').AsFloat;
20楼: 在Access数据库中设置该表的相应字段允许空值以可以。
销售管理软件版21楼: 我同意chen_liang的做法
22楼: 在改字段的onValidate事件中添加
方法测试后,不行 如青岛进销存软件
23楼: 用sender.value=null判断一下,如果为空,可以赋值为0.
24楼: 如果对Sender.value:=0进行赋值,程序运行产生错误?
25楼: 在改字段的onValidate事件中添加
if (sender.value=null) then
begin
showmessage(''请输入正确的值'');
abort;
end;
在:dbedit控件中应用正常,在dbgrid中如清除单元格内容,会自动弹出两次对话框,不知为何?
可能是清除前後都觸發了
你可以用別的事件,比哪用post事件來寫
26楼: 执行你的SQL的UPDATE运算之前能否先执行另外一个Update,也就是把相关的null全部替换为0,这样比较简单。
27楼: 多人接受答案了。