正在做餐饮点单输入界面.涉及到的主要两个表为:
tblGoodsInfo(fGoodsID,fGoodsName, fUnit, fPrice) 商品信息表(商品编号,名称,计量单位,单价)
tblGoodsBuyList(fId, fConsumeID, fGoodsID, fGoodsNum, fMemo,fIsPrinted)商品点单列表(自增编号,消费单号,商品编号,数量,备注, 是否打印)
注(是否打印,是由其它地方来管理,录入是为False
上面两个表的关系及含义,我想大家一定明白.做点单时,我希望的界面是这样子的.
主界面上,一个DBGridEh居中,下面放几个按钮"新增","修改","删除","确定","取消".主界面上,DBGridEh显示的内容为:
消费单号,商品编号,商品名称,计量单位,点单数量,金额小计,备注,是否打单,(如已打单,则这条记录显示为灰色,不可以修改了).
点"新增"时,弹出一个页面,用户可在弹出的页面中,根据各种组合条件,查询到客人要点的商品.同时,还可以得到其它的信息,如:商品名称,计量单位,单价,因此,用户只需要在"数量"处,输入点单数量,然后自动计算"金额小计","备注"信息,则直接在表格中输入.由于可能会出现各种情况,比如:客户点了三个商品,忽然要全部取消,或者,点多了,如果有没有打单的商品,就取消掉..等等..
因此,只有在客人同意"确定"时,才将所有修改写入数据库. "取消"则放弃当前所有修改.
(即便是客户同意"确定"了,还可以再次进入该页面,来修改的.)
("修改"和"删除",是针对于还没有打单的明细而言的,比如厨房还没有开始做这个菜,客户是可以取消的.)

解决方案 »

  1.   

    现在,有这几个地方觉得有点难,
    一, DBGridEh对应的SQL语句,很显然,要显示上面的内容,肯定要两关连两个表的数据,才能显示这些字段.
    如:select L.fConsumeID, L.fGoodsID, G.fGoodsName, G.fUnit, G.fPrice, L.fNum, G.fPrice*L.fNum as fTotalPrice, L.fMemo, L.fIsPrinted from tblGoodsInfo G, tlbGoodsBuyList L where L.fGoodsID = G.fGoodsID如果用这个语句,那么,我就不能这样新增或修改了:
    DBGridEh1.DataSet.Append;//DBGridEh1.DataSet.Edit;
    DBGridEh1.Dataset.fieldbyname('XX').value = '001';
    DBGridEh1.Post; 
    因为SQL语句涉及到了两个表,所以不能这样操作了.可是,如果SQL语句仅为这样:select * from tblGoodsBuyList where fConsumeID= 'XXX' 这样的话,显然能进行修改及新增,但是: 界面上显示的内容也太少了,实再是太不友好了..
    采用DBGridEh下面可以设置Foots,有一些汇总信息, 可以看到点了多少商品,共多少钱.界面比较好看..
      

  2.   

    ADOTable1.LockType:= ltBatchOptimistic ;
    ADOTable1.Open ;ADOTable1.UpdateBatch(arAll); //一次性批量写入数据库如果已经写入数据库的时候厨房已经打单出来了
    但是没有做菜你这时候可以在点个退单
    也就所谓的 -1鲍鱼  厨房一看 
    A001 包厢点入 -1鲍鱼 退单下面的事情你自己考虑了
    我感觉你上面的想的太复杂了
      

  3.   

    在DBGridEh可以顯示完你要的字段
    把不要刪除的字段設成 FieldKind := fkLookup
    這樣你就可以新增或修改了
      

  4.   

    谢谢楼上,
    ADOTable1.UpdateBatch(arAll); //一次性批量写入数据库采用UpdateBatch的方式,运用过了的,主要的问题不在这里,
    而是在:DBGridEh对应的数据集,不是一个表,而是两个表连合查询得到的. 那么就不能直接对它进行编号了.
    例如:
    ADOQuery1.sql.text := 'select T1.a, T1.b, T2.f1, T2.f2 from T1, T2 where T1.a = T2.f1';那么,就不能使用下面的语句来修改了:
    ADOQuery1.Edit;
    ADOQuery1.FieldByname('f1').value := 'XXXX';
    ADOQuery1.Post;可是,如果只采用这种方式:
    ADOQuery1.Sql.text := 'select * from T1 where ...';
    可以查询到数据,也可以采用上面的方式编辑数据, 可问题是:T1表里的字段太少了,不能全面地反应当前操作的一些信息,
    必须要把其它表里的字段,也跟着显示组来,用户才看得明白.
      

  5.   

    to: galant2008 不好意思,回复完上面的内容后,才看到你的回复.你说的方法果然可以实现, 但是,这种方法,只能添加其它表里已存在的字段,但是,比如,我想求和呢?
    比如我想得的到数据集如下:
    select T1.*, T2.fName, T1.num *T1.Price as fTotalPrice from T1, T2 where T1.f1 = T2.IDT2.fName 可以用你说的方法,来添加,不知T1.num*T1.Price as fTotalPrice 这个小计的价格,怎样出现在数据集里呢?
    因为:DBGridEh1 对应的SQL语句只能为:select * from T1, 否则,不能对它进行修改, 另外的字段,只能有别的方式来处理了.
      

  6.   

    to: galant2008 
    不好意思,英语太差了,查了一下这个单词的意思 calculated 应该可以实现的.
      

  7.   

    BS结构,贴个图给你参考一下,不需要更新的字段,可以pflnUpdate属性设置为false
      

  8.   

    to: galant2008 原以为,在ADOQuery1 的字段里,点右键,新建一个"New field" 输入它的 Name, Type, Size, 以及选择"Filed Type"
    为"Calculated", 然后在代码中,为这个字段计算,并赋值,就可以了.但是,实际上,向ADOQuery1 里添加了一条记录, 我新增的那个字段,它可以自动计算出来,并且也显示出来了. 可是,当我新增第二条的时候,上面那条记录的自动计算的值就不见了. 
      

  9.   

    采用ADO的批量更新模式,只在点击确定后,才会更新到数据库
    Qry.lockType := ltBatchOptimistic;
    保存时,Qry.UpdateBatch;