To 沐枫:设计有没有实用价值,是看是否能满足客户的需要,客户的要求很明确,就是这样,编码人员的工作只是负责把他的设计要求解释给计算机而已;第二,我的例表只是一个范例,“同一种货需要同时取出不同数量的两次”的可能是有的,同一天会出同一种货物多次的可能性也是有的。我建议在CSDN论坛大家能够只回答编程技术上的问题,讨论过多设计意图这种话有什么意思?设计意图是客户订的,我们只需要考虑他的需要,就算不合理,有没有实用价值是他的事,其实很简单:他的要求-》我的编码-》他满意付钱。你为什么只在骂人,而不回答有关我的问题上一些纯技术的东西呢?难道这就代表你的水平高吗?那你应该当策划人员,而不该当编码人员。
1> 库存管理
2> 出货管理
库存中没有的货物,是无法出货的,因此,你的第一个问题的解决方法是在进货时,就要登记货物,而不是在出货时登记。
同时,第二个问题 是站不住脚的。因为在取货的时候,不可能同一种货需要同时取出不同数量的两次。查看你上表,就可以明白,你的取货是在不同日期完成的,因此,不存在数据还没ApplyUpdates的情况(你不可以保存数据到第二天、第三天还没提交吧)如果你一定要按你设想的做的话,那么,我可以说,你的设计根本没有实用价值,只是小孩玩过家家罢了。
也就是说,Post的缓冲区就是可以直接通过DataSet访问的。
做一个临时表, post 到临时表中, 需要ApplyUpdates时从临时表中取数据,然后清
空临时表。这样似乎可以解决你的问题,对否请高手指正。
我常用的结构是:
数据库服务器:(NT)+SQL7
中间件:MTS/COM+
服务程序采用: MIDAS
网络联接采用: ScktSrvr.exe (LAN)
客户端:SocketConnection MIDAS
该方法需要使用TDataSetProvider控件和TClientDataSet控件(都在Midas页)。
将原来的Database控件保持不动,将Query控件(如果你用的是Query)的CachedUpdates改成false,rquestLive改成true,updateObject改成空,用一个DataSetProvider1和Query控件连接(DataSetProvider1.DataSet:=Query),再用一个clientDataSEt1控件和DataSetProvider连接(ClientDataSet1.Provider:=DataSetProvider1),然后将你原来和Query相连的DataSource和ClientDataSEt1相连。
ClientDataSet中有一个Delta属性,用户对数据集进行的所有修改都记录在Delta当中,你可以用另外的一个ClientDataSet2来解析Delta,来知道用户的修改,具体的方法就是:ClientDataSet2.Data:=ClientDataSet1.Delta,此时就可以用通常访问数据集的方法来访问ClientDataSet2,来获取已修改的记录。
你可以用一个DBgrid和ClientDataSet2连接,修改记录(增加、删除等)然后用一个按钮执行ClientDataSet2.Data:=ClientDataSet1.Delta,看DBGrid有何变化。
更具体的,你可以在需要检查缓冲区的时候,用ClientDataSet2.Locate(..)或者诸如此类的方法来判断某条记录是否在ClientDataSet1的缓冲区中。
在更新数据的时候,用ClientDataSet1.ApplyUpdate(0),来更新。
我说得可能不太清楚,如果有不明白的地方请继续提问。