起步软件技术论坛-X3

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: tang_cy

【结】在透视数据集中,如何获取列维的原值

[复制链接]
 楼主| 发表于 2009-2-10 22:12:36 | 显示全部楼层
这两天开会去了,不好意思

实际情况是我有一张评审表,用透视数据集构造,行维是评审指标,列维是参加评审的供应商,值项是某个供应商对应某项指标的得分值

DataGrid效果下:
                 供应商A   供应商B
指标1       5               3
指标2       4               3

要对供应商的指标进行评分需要浏览对应的供应商的资料,在这里我想通过点击某个供应商列的列头,获取该供应商的编号,通过该编号打开一个对应该供应商资料的浏览窗口.

现在的情况就是我在点击这个供应商列的列头的时候,怎么获取供应商列对应的供应商编号,
由于我存储的供应商编号是32位的GUID字符串编号,在透视数据集列维展开的时候,系统构造
的供应商列的域名都是被截断的,
如:Field_24545VIIA8DYF7Y3FUHUR
这可能是应为长度过长的缘故,总之Field_后面的字符串已经不足32,所以我不能通过zfang在
9楼的方式获取供应商编号.
我想透视数据集在展开时应该在某个地方保存有这些编号的,否则他怎么能够根据表字段定义
中的查找属性将这些编号转换成对应的中文显示?
我现在应该在什么时候在什么地方用什么方式能够获取这些对应的列维编号
回复 支持 反对

使用道具 举报

发表于 2009-2-11 10:13:12 | 显示全部楼层
楼主,我根据你的描述做了例子,在点击DataGrid的列头的时候,在 DataGrid 的 OnColumnClick 事件上看到 Colunm 的 name 后面已经被截取了,但可以通过 Column 的 caption 来转换。

如果不是很着急,你再等等,我们再研究一下,看看是否可以直接获取到,不管怎样,今天肯定能给你一个结果,好吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-11 11:08:47 | 显示全部楼层
昨天搞了一个晚上,找到了个取值的地方,就是在透视数据集的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;

以上提供给大家分享,不过还是希望能完善这个功能,毕竟对透视数据集展开后获取列维原值的
需求还是有,要是通过字段名截取来获得似乎显得很不专业,应该提供一些存储结构来获取.
回复 支持 反对

使用道具 举报

发表于 2009-2-11 11:15:17 | 显示全部楼层
谢谢楼主共享非法,我刚才测试是也这样做了,是可以在OnCreateFieldName记录下值,我跟开发确认一下是否有更好的方法。无论结果怎样,我都会跟贴告知的
回复 支持 反对

使用道具 举报

发表于 2009-2-11 11:48:37 | 显示全部楼层
经过确认,可以这样,跟你的方法类似,参考代码如下
procedure TMainForm.Button2Click(Sender: TObject);
var
  I, J: Integer;
  S, lFieldName, lDisplayName: string;
  lPivotDataSet: TPivotDataSet;
  lPivotField: TPivotField;
  lOriginFields: TOriginFields;
  lOriginField: TOriginField;
begin
  lPivotDataSet := DataSetBroker1.DataSet as TPivotDataSet;

  //以下代码列出透视数据集字段的详细信息:

  lPivotDataSet.Close;
  lPivotDataSet.Open;
  for I := 0 to lPivotDataSet.BizFields.Count - 1 do
  begin
    lFieldName := lPivotDataSet.BizFields[I].ID;
    lDisplayName := lPivotDataSet.BizFields[I].DisplayName;
    lPivotField := lPivotDataSet.PivotFields.FindByFieldName(lFieldName);
    S := lDisplayName + '(' + lFieldName + ') = ';
    case lPivotField.Kind of       //维类型:
      TPivotFieldKind.pfkRowField: //行维
      begin
        S := S + '行维字段';
      end;
      TPivotFieldKind.pfkColField: //列维
      begin
        if lPivotField.IsTotal then
          S := S + '小计字段:'#13#10;
        lOriginFields := lPivotField.OriginFields;
        for J := 0 to lOriginFields.Count - 1 do
        begin
          lOriginField := lOriginFields[J];
          S := S + Variants.VarToStr(lOriginField.Value) + '|' + lOriginField.Text;
        end;
      end;
    else
      Assert(False, '');
    end;
    Memo1.Lines.Add(S);
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-12 09:48:27 | 显示全部楼层
感谢atiger提供的方法,谢谢,可以结贴了
回复 支持 反对

使用道具 举报

发表于 2009-2-12 10:35:23 | 显示全部楼层
好,不客气,结
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-28 03:54 , Processed in 0.040663 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表