壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3164|回复: 21

请问在“物料收货”的“业务伙伴”限定类别?

[复制链接]
发表于 2005/9/7 08:15:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
1、请问在“物料收货”窗口的“业务伙伴”如何实现“收货单”只能输入供应商,而“退货单”只能输入客户?我想通过业务伙伴栏位添加“检验规则”来完成,但是,却由于在规则里面,无法取得单据类型的选择,因此,无法达成效果。
2、请问在“检验规则”如何调用“偏爱设置”->”上下文“的类似”2|SalesRep_ID=1000000“的变量值SalesRep_ID


十分感谢!
发表于 2005/9/7 11:08:15 | 显示全部楼层
1,有个IsSoTrx变量,业务伙伴弹出窗口会根据那个来判断默认显示是Customer还是Vendor, 你把那些CheckBox readonly好了

2,@SalesRep_ID@
发表于 2005/9/7 11:17:33 | 显示全部楼层
1, 其实有几种方法,
或者您修改InfoBPartner.java, 让业务伙伴弹出窗口,只显示供应商,客户,除了IsSOTrx, 试试可以从Env里面拿到AD_Tab_ID,用那个判断就报险了
或者修改Validation, 但是Validation不能阻止你从业务伙伴弹出窗口选择你不希望她选的业务伙伴。
或者你加一个Callout, 用户选了你不希望的业务伙伴,你在callout里面你把它重新set为null
 楼主| 发表于 2005/9/7 15:52:15 | 显示全部楼层
第一情况:
1、给“物料收货”的“业务伙伴”建立一个校验规则规则内容是:@SalesRep_ID@='TOM'

2、从上下文中看到的”2|SalesRep_ID=1000000“,但是,在dos窗口看到生成的SQL语句变成了:Sales Representative='TOM'

第二情况:
1、给“物料收货”的“业务伙伴”建立一个校验规则规则内容是:@IsSoTrx@='Y'

2、但是,在dos窗口看到生成的SQL语句变成了:Sales Transaction='Y'

我不知道做错了什么?请指教。多谢。
发表于 2005/9/7 15:54:26 | 显示全部楼层
能把整个SQL=......................贴出来吗?
你说的情况没遇到过
 楼主| 发表于 2005/9/7 16:17:29 | 显示全部楼层
SELECT C_BPartner.C_BPartner_ID, C_BPartner.Value, C_BPartner.Name,c.Name AS Contact,c.AD_User_ID,
       C_BPartner.SO_CreditLimit-C_BPartner.SO_CreditUsed AS SO_CreditAvailable, C_BPartner.SO_CreditUsed,
       c.Phone, a.Postal,l.C_BPartner_Location_ID, a.City, C_BPartner.TotalOpenBalance, C_BPartner.ActualLifetimeValue
  FROM C_BPartner LEFT OUTER JOIN AD_User c ON (C_BPartner.C_BPartner_ID=c.C_BPartner_ID AND c.IsActive='Y')
       LEFT OUTER JOIN C_BPartner_Location l ON (C_BPartner.C_BPartner_ID=l.C_BPartner_ID AND l.IsActive='Y')
       LEFT OUTER JOIN C_Location a ON (l.C_Location_ID=a.C_Location_ID)
WHERE C_BPartner.IsSummary='N'
   AND C_BPartner.IsActive='Y'
   AND Sales Transaction='Y'
   AND UPPER(C_BPartner.Name) LIKE ?
   AND C_BPartner.IsVendor='Y'
   AND C_BPartner.AD_Client_ID IN(1000000,0)
   AND C_BPartner.AD_Org_ID IN(1000000,0)
ORDER BY C_BPartner.Value
 楼主| 发表于 2005/9/7 16:18:50 | 显示全部楼层
多谢Peter的回复,你真是一个好人
发表于 2005/9/8 11:28:46 | 显示全部楼层
@SalesRep_ID@是用来访问上下文中SalesRep_ID的值
你举的情况,就应该用C_BPartner.SalesRep_ID='TOM'

C_BPartner.IsCustomer=@IsSoTrx@
 楼主| 发表于 2005/9/8 13:12:03 | 显示全部楼层
其实,我是想写这样的规则:
'Y'=case when @单据类型@='收货单' then 'C_BPartner.IsCustomer' else 'C_BPartner.IsVendor' end

只要能得到一个分辨订单类型的任何变量都可以。
发表于 2005/9/8 21:37:51 | 显示全部楼层
试试这个:
(C_Bpartner.IsCustomer='Y' AND @AD_Tab_ID@=XXXX) OR (@AD_Tab_ID@!=XXX)
 楼主| 发表于 2005/9/9 12:54:10 | 显示全部楼层
设定为@AD_Tab_ID@=’123'时,因为无法解释AD_Tab_ID上下文,会被解释成:Tab ='123',所以,也就无法达到效果。

不过,新建一个窗口,引用同一个表,通过单据类型的偏爱设置(一个窗口设定“收货单”,另一个设定“退货单”),然后,把窗口的单据类型字段变成只读,是可以勉强达到想要的效果。
 楼主| 发表于 2005/9/9 17:08:42 | 显示全部楼层
前面忘写了一点:“需要增加相应的检验规则"
发表于 2005/9/9 17:14:21 | 显示全部楼层
compiere什么时候变样了吗?AD_Tab_ID尽然人不出来?
 楼主| 发表于 2005/9/15 09:47:41 | 显示全部楼层
由于收货单和发货单用的是同一个表,所以,我前面的方法也不行。现在改用DB TRIGGER来完成。
CREATE OR REPLACE TRIGGER COMPIERE.TR_PRE_UI_ROW_M_INOUT
BEFORE INSERT OR UPDATE OF C_BPARTNER_ID
ON COMPIERE.M_INOUT
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
  DECLARE
    /* 业务伙伴只允许是供应商的单据列表 - 收货单 */
    v_doctype4vendor   VARCHAR2(200) := '*1000013*';  -- 不同版本可能不同,需要确认

    /* 业务伙伴只允许是客户的单据列表 - 退货单 */
    v_doctype4customer VARCHAR2(200) := '*1000014*';  -- 不同版本可能不同,需要确认

    v_for_what         VARCHAR2(2);
  BEGIN
    SELECT isvendor||iscustomer
    INTO   v_for_what
    FROM   c_bpartner
    WHERE  c_bpartner_id = :NEW.c_bpartner_id;

    IF INSTR(v_doctype4vendor,'*'||TO_CHAR(:NEW.c_doctype_id)||'*') > 0 AND SUBSTR(v_for_what,1,1) = 'N' THEN
      RAISE_APPLICATION_ERROR(-20001,'本单据的业务伙伴只能是-供应商');
    ELSE
        IF INSTR(v_doctype4customer,'*'||TO_CHAR(:NEW.c_doctype_id)||'*') > 0 AND SUBSTR(v_for_what,2,1) = 'N' THEN
           RAISE_APPLICATION_ERROR(-20002,'本单据的业务伙伴只能是-客户');
        END IF;
    END IF;
  END;
END;
 楼主| 发表于 2005/9/16 16:53:46 | 显示全部楼层

ok

ok

[ Last edited by tomsontomson on 2005-9-16 at 16:56 ]
 楼主| 发表于 2005/9/16 16:54:32 | 显示全部楼层

我又有一个新问题了

我用DB Trigger来扩充功能的时候,如何实现多语言的特征?由于Compiere是使用同一个DB用户登录,应用用户是由程序来完成。因此,如果在DB Tigger里面无法确定每一个用户的登陆语言,我就无法实现DB Trigger的多语言特性了。请问各位,该如何解决?多谢指点。

[ Last edited by tomsontomson on 2005-9-16 at 16:56 ]
发表于 2005/9/16 16:59:04 | 显示全部楼层
这个问题弄得够久了。应该没办法。
用callout吧。
发表于 2005/9/16 17:07:07 | 显示全部楼层
哦,想起来了,你说过不打算用java, 想尽量用oracle的功能。
我知道如果用sp 写的process,返回参数的时候, 如果参数里用了
@code@, compiere就会从Message里找相应的message,安多语言要求显示出来。

不过trigger应该没做处理。 你可以试试
 楼主| 发表于 2005/9/16 19:45:08 | 显示全部楼层
如果能把一个oracle sp嵌入到一个窗口的存盘之前,能达成效果,但是,我不知道如何做?请指教。多谢。
发表于 2005/9/17 08:27:06 | 显示全部楼层
没用,我说的是process, process的返回消息,compiere回另外处理
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 22:08 , Processed in 0.021664 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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