起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 650|回复: 13

【结】RunFunc和Context

[复制链接]
发表于 2010-2-10 14:47:24 | 显示全部楼层 |阅读模式
直接运行功能调用系统函数库的方法SystemUtils.TContextUtils.GetOperatorPositions(Context, lPtnList)
得到了当前人员所有的岗位,没问题
问题:现在在另一个功能,用RunFunc运行这个功能,取到的就只有一个岗位了,代码是:
FuncNew := SYSTEMCORE.TSystemCore.FuncManager.RunFunc(Self.Context, ParameterInit,FuncStr_MarketMoldDetail,ParameterInit,nil,false);
回复

使用道具 举报

发表于 2010-2-10 15:13:45 | 显示全部楼层
Self.Context
与当前的执行环境有关,请检查一下是在哪里运行这个语句的。
回复 支持 反对

使用道具 举报

发表于 2010-2-10 15:16:30 | 显示全部楼层
RunFunc在哪里写的,把代码贴上来吧!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-10 15:29:01 | 显示全部楼层
功能A,调用GetOperatorPositions没问题
功能B,调用FuncNew := SYSTEMCORE.TSystemCore.FuncManager.RunFunc(Self.Context, 'aaa', 功能A的URL, 'aaa', nil, false); 这个时候调用A里的GetOperatorPositions就不对了,确实和环境有关系
具体原因呢
回复 支持 反对

使用道具 举报

发表于 2010-2-10 16:48:19 | 显示全部楼层
原因应该是你传入的参数导致的问题
Self.Context
3楼让你贴代码,就是想知道,你传入的Context的情况。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-10 17:04:51 | 显示全部楼层
就是功能B的窗体,放一个按钮,代码已经贴在1楼和4楼了
self是功能B的窗体
回复 支持 反对

使用道具 举报

发表于 2010-2-10 17:41:09 | 显示全部楼层
看代码主要是想了解context的情况,只那一句是不够的

这样吧,你在“系统空间\系统运行库\系统函数库”static procedure TContextUtils.GetOperatorPositions函数设置一个断点,调试一下看看原因吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-10 17:44:42 | 显示全部楼层

原因找到一部分了,但是还不明白

我这边测试的步骤和结果如下:
1、象上面所说,我有个A功能,直接调用GetOperatorPositions得到当前人有3个岗位没错
2、在功能B的窗体中RunFunc运行A,得到当前人有1个岗位没错,错
3、我在一个空白库的空白功能里,直接GetOperatorPositions得到居然也是1个岗位没错,错
。找了原因发现:如果在一个分配了业务信息的功能里得到的就是3,正确。
不知道步骤3对前面步骤2出错有帮助吗

你可以按照我上述步骤先重现一下这个问题,很容易重现的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-2-11 09:16:57 | 显示全部楼层
怎么样了
回复 支持 反对

使用道具 举报

发表于 2010-2-11 13:07:17 | 显示全部楼层
楼主,应该与是否分配业务信息无关。
而是与你传入的参数Self.Context有关。

你读一下GetOperatorPositions的代码,会发现:
当你传入的环境Context,上一级是岗位时,只返回上级的岗位对象
反之,则找到当前操作员的所有岗位,返回。

应该是你在功能B中运行A时,传入了功能B的环境,那么A的上级环境就不是岗位环境了,所以函数返回了当前操作员的全部岗位。
你可以在A运行起来后,按ctrl+ALT+SHIFT+O来查看他们的运行环境

static procedure TContextUtils.GetOperatorPositions(AContext: TContext; AList: TList);
var
  I: Integer;
  lOperator: TOperator;
begin
  if TOrgUtils.GetIsPersonMember(AContext) then
    AList.Add(AContext.GetParentContext(BizSys.IL_POSITION).Owner)
  else
  begin
    lOperator := GetOperator(AContext);

    for I := 0 to lOperator.PositionCount - 1 do
      AList.Add(lOperator.Positions[I]);
  end;
end;
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-11 08:47 , Processed in 0.040255 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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