昨天搞了一个晚上,找到了个取值的地方,就是在透视数据集的OnCreateFieldName事件内,该事件
触发的时候,参数AFieldName含有完整的值,可以通过截取这个值获得列维原值.
由于我的透视数据集每次Open前都要进行条件设定,以便过滤掉一些不符合的供应商,所以每次Open得到供应商列维的展开是不同的,我希望能在Open后记录下列维的原值以便在点击列头的
时候使用,但是经过我测试,发现如果直接在信息层定义OnCreateFieldName事件,该事件的触发发
生在AfterOpen事件之前,所以记录下的值是上次Open的结果,后来饶了个弯子,决定在Open前重新
绑定OnCreateFieldName事件,那么在Open时将会重新触发OnCreateFieldName事件,问题得到解决.
部分代码如下:
procedure OpenDataSet;
var
lFilter: string;
begin
if DataSetBroker1.DataSet.Active then
DataSetBroker1.DataSet.Close;
lFilter := '.......'; // 一些条件,不写了
List.Clear; // 用于记录列维域名的TStringList,在激活OnCreateFieldName事件前清除原来记录的值
TPivotDataSet(DataSetBroker1.DataSet).OnCreateFieldName := CreateFieldName; // 重新绑定事件
TBizDataSet(DataSetBroker1.DataSet).SQLFilter := lFilter;
TBizDataSet(DataSetBroker1.DataSet).SQLFiltered := true;
DataSetBroker1.DataSet.Open;
end;
// 需要绑定的OnCreateFieldName事件
procedure CreateFieldName(AKind: TPivotFieldKind; AOriginFields: TOriginFields; const AColumnField, AColumnDisplay: string; var AFieldName, ADisplayName: string);
begin
if AKind = TPivotFieldKind.pfkColField then // 判断列维
begin
// 处理显示中文名称的后缀问题
ADisplayName := StrUtils.LeftStr(ADisplayName,sysutils.StrLen(ADisplayName)-5);
if Assigned(List) and (List <> nil) then
List.Add(AFieldName); // 记录完整的字段名,以便在点击DataGrid列头的时候使用
end;
end;
以上提供给大家分享,不过还是希望能完善这个功能,毕竟对透视数据集展开后获取列维原值的
需求还是有,要是通过字段名截取来获得似乎显得很不专业,应该提供一些存储结构来获取. |