关于网格控件向数据库添加数据的问题(50分)

  • 主题发起人 主题发起人 dwzjs
  • 开始时间 开始时间
D

dwzjs

Unregistered / Unconfirmed
GUEST, unregistred user!
我是新手,想做一个类似于进销存系统中进货单或出库单的程序。
数据库采用Access,有两个表,一个保存基本信息如单据号、日期、业务员等,一个表保存明细,这两个表有一个相同的字段id(单据号)。
以前在VB里是采用循环的方式向数据库里添加记录,delphi里也可以这样,是用stringgrid,但是我在一个软件看到了用dbgrid向数据库添加记录的,它和DBNavigator控件配合添加,我也试着做了一下,发现如果和DBNavigator配合,代码中无需添加post命令,就已经添加到数据库里了,(除了最后一条)我的程序中还要对数据进行检查,如某一列数据不能有重复,某一列不能为空等,这样的话就不行,不知道我该怎样处理,有这方面的源码?能否给一个编程思路?
 
事件,如果用dbgrid 做 master/detail 类型的容易出错误,你必须掌握各种事件,最好使用非感知控.

事件有dataset的字段编辑事件(每个字段3个事件),可以用来检查重复id,是否必须不为空白.
onnew 事件 可以给默认值,

而这些代码我们一般用 非感知 控件 ,可以全部放到保存的时候处理.

总结一下,master/detail类表单处理方式:
1.stringgird 等非关联control,添加明细记录,使用单独form或者 多个edit,combox,等
2.使用关联db control ,对事件非常熟悉
3.使用内存表,或者3层结构.
 
检查数据重复,只要在写数据库前做一个查询,如果返回的行数为0则表示没有重复数据,如果行数=1则表明有重复数据
with ADOQuery1 do
begin
Close;
SQL.Text := 'SELECT * FROM 用户表 WHERE 用户名=:s0';
Parameters.ParamByName('s0').Value := edit1.text;
Open;

if RecordCount=0 then
begin
Append;
FieldByName('').AsString := 's0';
Post;
end else
ShowMessage('已存在');
end;
 
LS说的是用非感知的,edit一类的,如果要在dbgrid的话,找到相关字段,onchange 里面处理,存在的话,abort 这个事件,并提示 messagebox('已经 存在');
 
数据集有个BeforePost事件,在里面写控制代码,发现重复的就给出提示并终止提交
 
如果用非感知控件stringgrid我也就不需要提问了,我的意思是能否用dbgrid批量向数据库提交数据?而且能够检查数据是否有重复的?我想了一阵子,是否可以这样,在数据库里添加一个临时表,首先将dbgrid绑定到这个表,先将数据添加到这个表里,然后用sql 语句将这个表里的数据添加到我指定的表,最后将临时表里的数据清空。
 
给你提供一个思路: 可以重新做一个dbgrid用stringgrid的SetEditText事件来重载.
 
能做个小源码发过来吗?邮箱:xiong19720715@163.com
 
后退
顶部