DSP

adoquery + dsp + clientdataset + dbgrideh 数据排序的问题;

2019-07-13 15:51发布

在维护COM+结构的三层结构的软件时,如果在服务端使用adoquery 查询后由 DSP 打包再传到客户端。 这种方式,效率很低,,通常查询结果,是不再需要 apply 到服务器的。 所以,我自己采用的方式,是在服务器端用 adoquery 查询,然后直接将 ADO结果直接传到客户端(不再经过DSP),然后再在客户端使用 adoquery 来接收数据;这样数据高效。 但是在客户端直接使用datasource 去连接 adouqery ,再使用 dbgrideh 来显示数据,在使用 dbgrideh 的数据排序就不能简单的使用ehlib 提供的简单的排序功能; 因为客户端的adoquery组件是没有设置 connection 及 connectioinstring 属性。所以,会出错错误; 所以,客户端的结构改为: 服务器 adoqery -> 客户 adoquery + dsp + clientdataset + dbgrideh 。
由于 clientdataset 是一个很优秀的数据集,但是仍然有些问题,所以我使用了 wwclientdataset  组件。 就算这样,仍然不能简单的使用Ehlib简单的排序功能,所以要自己写代码去支持它;
procedure TDM.PubP_OnTitleBtnClick(Sender: TObject; ACol: Integer; Column: TColumnEh;C:TwwClientDataSet); var OldIndex,NewIndex: string; begin C.DisableControls; OldIndex:= C.IndexName; NewIndex:= Column.FieldName; if OldIndex <> '' then begin C.IndexName:= ''; C.DeleteIndex(OldIndex); end; case Column.Title.SortMarker of smNoneEh, smDownEh: begin C.AddIndex('px', NewIndex, [ixPrimary]); Column.Title.SortMarker:= smDownEh; end; smUpEh : begin C.AddIndex('px', NewIndex, [ixDescending]); Column.Title.SortMarker:= smUpEh; end; end; C.IndexName:= 'px'; C.First; C.EnableControls; end;调用:
在 DBGRIDEH的 onTitleBtnClick 中写代码
dm.PubP_OnTitleBtnClick(Sender,ACol,Column ,CDS_QueryPOSat);