我是要做一个主从表的表单,但由于子表是要用交叉表的形式体现...
主表:是一个学生的一个学期的基本情况...子表是该学生在本学期的学习成绩...
主表:RefId,StudId,....
子表:RefId,课程名称(每个学生一个学期修的课程已是在另一个表设好的,但每个人的课程是不一样的),课程成绩
因为每个学生的所修课是不固定的,所以该子表的的列数是不固定的)
界面形式是老板要求..(没法改变)且给了这种界面的例子(不知在那边找来的好像是服装业的分色分码类似的),没有源码,想说别人可以,我应该也可以实现..第一天..看到例子好像是用StringGrid做的,由于以前没有用过,去CSDN找了N多关于是StringGrid使用的贴子,给个总体概念..
第二天...想说先把基本界面体现出来..于是,通过循环查询课程和成绩..经过老半天的调试,终于实现...
第三天...真正的问题出现了...和主表关联的问题...还有子表内容编辑,更新...涉及到太多的东西....没有进展
第四天...第五天...第六天...到今天还是没有进展.....超度郁闷中....每天眼睛都不敢和老板对视啦.....
那个兄弟有这方面经验或有什么好的构思给落难的我一个建议吧.....
主表:是一个学生的一个学期的基本情况...子表是该学生在本学期的学习成绩...
主表:RefId,StudId,....
子表:RefId,课程名称(每个学生一个学期修的课程已是在另一个表设好的,但每个人的课程是不一样的),课程成绩
因为每个学生的所修课是不固定的,所以该子表的的列数是不固定的)
界面形式是老板要求..(没法改变)且给了这种界面的例子(不知在那边找来的好像是服装业的分色分码类似的),没有源码,想说别人可以,我应该也可以实现..第一天..看到例子好像是用StringGrid做的,由于以前没有用过,去CSDN找了N多关于是StringGrid使用的贴子,给个总体概念..
第二天...想说先把基本界面体现出来..于是,通过循环查询课程和成绩..经过老半天的调试,终于实现...
第三天...真正的问题出现了...和主表关联的问题...还有子表内容编辑,更新...涉及到太多的东西....没有进展
第四天...第五天...第六天...到今天还是没有进展.....超度郁闷中....每天眼睛都不敢和老板对视啦.....
那个兄弟有这方面经验或有什么好的构思给落难的我一个建议吧.....
2. 子表内容编辑,更新:将stringgrid的position中添加editing,可以编辑。
2、窗口上放置两个DBGrid控件,分别与上面两个表空间关联(需要DataSource)
3、点击成绩表的MasterFields属性的按钮,在现实的窗口中设置关联,你的关联字段是RefId
4、然后运行之!!!
5、搞定!!!
二、主表可以和一个TADOQUERY控件建立关联,其实是一个处于打开状态的数据集,并不是要和界面上的控件绑定;每当数据集的指针滚动时,先取主表的当前记录的内容,更新界面上主表内容的控件,再根据主表的ID(子表中当然也必须有)查询该ID对应的子表内容,填充到TSTRINGGRID控件中(填充子表的操作可以写在主表数据集控件,比如TADOQUERY的AFTERSCROLL事件中)
三、新建操作:初始化界面上的所有控件;修改操作按照第二步做;删除操作当然也好做:根据当前主表记录的ID先删除对应的子表记录,成功后再删除主表记录
四、保存操作:先保存主表内容,再保存子表内容;其中保存子表内容(网格控件中的内容)是关键,如果不想偷懒,则需要在网格中记录每个子表记录的ID,并根据是新建操作还是修改操作使用不同的方法(通常情况下,新建操作没有什么问题,但是在修改操作时,网格控件中可能既有原来的记录,也有新录入的记录,还有可能有些原来的记录被删除,所有这些都要记录,操作是可以的,但是很烦),所以本人建议,对于没把握的程序员来说,不要使用该方法;比较稳妥的方法是,在保存子表内容时,无论是新建操作还是修改操作,我不记录网格中的记录是原来的还是新增加的,一概先全部删除之,然后遍历网格中的所有记录都作为新记录添加到子表中去(我想你一定知道整个保存操作要放到“事务”中进行,以确保整个操作可以被恢复)。
五、关键是:1、记录主表的ID作为主子表的ID;2、标志当前是新建操作还是修改操作(在界面上放置新建、编辑按钮,当用户CLICK按钮时,用一个变量保存);3、事务处理如果还有什么不清楚的,请跟帖!
表1:学生表
fId int 4 (*) +
fCode nvarchar 20 编号
fName nvarchar 20 姓名
表2:课程表
fId int 4 (*) +
fCode nvarchar 20 编号
fName nvarchar 20 课程
表3:班级表
fId int 4 (*) +
fCode nvarchar 20 编号
fName nvarchar 20 班级名称
表4:成绩单主表
fRefId int 4 (*) +
fDate datetime 日期
fNo varchar(20) 学期
表5:
成绩单子表
fRefID int 4 (外键)
fGrageId int 4 (班级id)
fStudId int 4 (学生id)
fKCid int 4 (课程id)
fgrade Float (成绩)录入界面:
表头:
录入主表的信息
表体(从表)有两个类似DbGrid组成
左边:
班级 总成绩
一班 326
右边:
学生 课程一 课程二.....合计 王 98 68 166
李 80 80 160
要能实现课程能动态变化,,,成绩录入后,合计与总成绩能自动计算.
子表在录入数据能实现增加,编辑,删除,取消编辑等功能.
子表中的
fStudId int 4 (学生id)
fKCid int 4 (课程id)
是在表3班级表中的
就是班级表中
存有所属学生和该班级所修的课程..(目前只要求同一个班级选修的课程是一样的)