我是要做一个主从表的表单,但由于子表是要用交叉表的形式体现...
主表:是一个学生的一个学期的基本情况...子表是该学生在本学期的学习成绩...
主表:RefId,StudId,....
子表:RefId,课程名称(每个学生一个学期修的课程已是在另一个表设好的,但每个人的课程是不一样的),课程成绩
因为每个学生的所修课是不固定的,所以该子表的的列数是不固定的)
界面形式是老板要求..(没法改变)且给了这种界面的例子(不知在那边找来的好像是服装业的分色分码类似的),没有源码,想说别人可以,我应该也可以实现..第一天..看到例子好像是用StringGrid做的,由于以前没有用过,去CSDN找了N多关于是StringGrid使用的贴子,给个总体概念..
第二天...想说先把基本界面体现出来..于是,通过循环查询课程和成绩..经过老半天的调试,终于实现...
第三天...真正的问题出现了...和主表关联的问题...还有子表内容编辑,更新...涉及到太多的东西....没有进展
第四天...第五天...第六天...到今天还是没有进展.....超度郁闷中....每天眼睛都不敢和老板对视啦.....
那个兄弟有这方面经验或有什么好的构思给落难的我一个建议吧.....

解决方案 »

  1.   

    因为每个学生的所修课是不固定的,所以该子表的的列数是不固定的。==>用选修课程作为行,而不是列。1. form.show中获得stringgrid的title,即cell[n,0]
    2. 子表内容编辑,更新:将stringgrid的position中添加editing,可以编辑。
      

  2.   

    楼上的说的没错,我做过大学里的成绩管理系统,各年级每学期学的课程可能不一样,比如这一界大一和下一界大一所学的课程也许不一样,所以每学期每个年级的课程表都是变动的,我的方法是在成绩表中动态插入新增加课程的列而输出时,只根据学生信息和课程信息从成绩表中选取该生所学课程的成绩。SQL中有系统表syscolumns和sysobjects,可以有帮助的。
      

  3.   

    不能用DBGRID吗?可以动态的确定从表显示的字段的阿。我想实现起来并不难阿。可以的话,将表结构和要求发给我阿,让我看看?[email protected]
      

  4.   

    老大,你说的问题我没看明白!如果是简单的主从表的话,我帮你!!!1、窗口上放置两个Table控件,并且加上相应的字段
    2、窗口上放置两个DBGrid控件,分别与上面两个表空间关联(需要DataSource)
    3、点击成绩表的MasterFields属性的按钮,在现实的窗口中设置关联,你的关联字段是RefId
    4、然后运行之!!!
    5、搞定!!!
      

  5.   

    一、将主表内容以TEDIT等控件形式放在FORM的上面,在下面放一个TSTRINGGRID控件用于操作子表内容;
    二、主表可以和一个TADOQUERY控件建立关联,其实是一个处于打开状态的数据集,并不是要和界面上的控件绑定;每当数据集的指针滚动时,先取主表的当前记录的内容,更新界面上主表内容的控件,再根据主表的ID(子表中当然也必须有)查询该ID对应的子表内容,填充到TSTRINGGRID控件中(填充子表的操作可以写在主表数据集控件,比如TADOQUERY的AFTERSCROLL事件中)
    三、新建操作:初始化界面上的所有控件;修改操作按照第二步做;删除操作当然也好做:根据当前主表记录的ID先删除对应的子表记录,成功后再删除主表记录
    四、保存操作:先保存主表内容,再保存子表内容;其中保存子表内容(网格控件中的内容)是关键,如果不想偷懒,则需要在网格中记录每个子表记录的ID,并根据是新建操作还是修改操作使用不同的方法(通常情况下,新建操作没有什么问题,但是在修改操作时,网格控件中可能既有原来的记录,也有新录入的记录,还有可能有些原来的记录被删除,所有这些都要记录,操作是可以的,但是很烦),所以本人建议,对于没把握的程序员来说,不要使用该方法;比较稳妥的方法是,在保存子表内容时,无论是新建操作还是修改操作,我不记录网格中的记录是原来的还是新增加的,一概先全部删除之,然后遍历网格中的所有记录都作为新记录添加到子表中去(我想你一定知道整个保存操作要放到“事务”中进行,以确保整个操作可以被恢复)。
    五、关键是:1、记录主表的ID作为主子表的ID;2、标志当前是新建操作还是修改操作(在界面上放置新建、编辑按钮,当用户CLICK按钮时,用一个变量保存);3、事务处理如果还有什么不清楚的,请跟帖!
      

  6.   

    SORRY,上面“1、记录主表的ID作为主子表的ID”描述不准确,应该是“主表ID作为连接主子表的唯一标识”
      

  7.   

    表结构很简单的...
    表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
    要能实现课程能动态变化,,,成绩录入后,合计与总成绩能自动计算.
    子表在录入数据能实现增加,编辑,删除,取消编辑等功能.
      

  8.   

    错了.
    子表中的
    fStudId  int 4 (学生id)
    fKCid  int 4 (课程id)
    是在表3班级表中的
    就是班级表中
    存有所属学生和该班级所修的课程..(目前只要求同一个班级选修的课程是一样的)