Fiori中的过滤器列表以及第二个表中的字段。 扩展的OData请求?

2020-08-19 11:38发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)您好,我在Fiori App中拥...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,我在Fiori App中拥有一个母版和一个详细视图。 在主视图中,有用于主列表(EKKO)的服务器过滤器。 现在,我需要一个用于" Matnr"的附加过滤器(详细视图EKPO)。 我想根据关联表(EKKO到EKPO)中提供的字段在主视图中过滤列表。

我在OData Service中尝试了几种不同的实现,但没有成功。 我是OData和ABAP的新手。

我认为在控制器中,过滤器应如下所示:

如果(sQueryMatnr){
 aFilters.push(new Filter({
 路径:" HeadToItemNav/Matnr",
 运算符:"包含",
 值1:sQueryMatnr
 }));
 }
 

我的用于主视图的OData服务显示列表:

 METHOD POHEADERSET_GET_ENTITYSET。
     数据:
       "需要逻辑系统。
       LD_OWN_LOGICAL_SYSTEM类型TBDLS-LOGSYS,
       EKKO的GT_CONTRACT类型表,
       GS_CONTRACT TYPE EKKO,
       "显示来自EKKO和Filter Ebeln的数据
       LR_EBELN类型的EBELN,
       LS_EBELN之类的LR_EBELN,
       "过滤日期有效自/日期
       LR_KDATB KDATB的类型范围,
       LR_KDATB之类的LS_KDATB,
       "过滤日期有效期至/Kdate
       LR_KDATE KDATE的TYPE RANGE,
       LS_KDATE,例如LR_KDATE,
       "过滤器采购组/Ekgrp
       LR_EKGRP EKGRP的类型范围,
       LR_EKGRP之类的LS_EKGRP,
       "筛选器采购组织/Ekgrp
       LR_EKORG EKORG的类型范围,
       LS_EKORG像LR_EKORG的线一样,
       "过滤器采购供应商/Lifnr
       LIFNR的LR_LIFNR类型范围,
       LS_LIFNR像LR_LIFNR的线,
       "过滤器采购逻辑系统
       LR_LOGSY LOGSYSTEM的类型范围,
       LS_LOGSY,例如LR_LOGSY,
       "过滤器EKPO Matnr
       LR_MATNR MATNR的类型范围,
       LR_MATNR之类的LS_MATNR,
       "筛选器已过期
       "的LR_ISEXPIRED类型范围,
       " LR_ISEXPIRED之类的LS_ISEXPIRED,
       "订购desc/asc
       LT_ORDERBY类型/IWBEP/T_MGW_TECH_ORDER,
       LS_ORDERBY类型/IWBEP/S_MGW_TECH_ORDER。




     "更新表EKKO中的逻辑系统。
     "填写表格
     从EKKO中选择*进入表GT_CONTRACT。




     通话功能'OWN_LOGICAL_SYSTEM_GET'
       输入
         OWN_LOGICAL_SYSTEM = LD_OWN_LOGICAL_SYSTEM
       例外情况
         OWN_LOGICAL_SYSTEM_NOT_DEFINED = 1。


     如果SY-SUBRC EQ 0。


       UPDATE EKKO SET LOGSY = LD_OWN_LOGICAL_SYSTEM WHERE BSTYP ='K'或BSTYP ='C'。


     ELSEIF SY-SUBRC EQ 1."异常
       写:"在这里添加例外代码"。
     万一。


 *筛选Ebeln:


     "显示ekko数据的逻辑。
     使用键属性='Ebeln'将表IT_FILTER_SELECT_OPTIONS读入DATA(LS_FILTER)。


     如果SY-SUBRC EQ 0。


       将LS_FILTER-SELECT_OPTIONS循环到数据中(LS_OPTIONS)。
         LS_EBELN-SIGN = LS_OPTIONS-SIGN。
         LS_EBELN-OPTION = LS_OPTIONS-OPTION。
         LS_EBELN-LOW = LS_OPTIONS-LOW。
         LS_EBELN-HIGH = LS_OPTIONS-HIGH。


         将LS_EBELN附加到LR_EBELN。
       结局。


     万一。


 *过滤器Kdatb:
     "显示ekko数据的逻辑。
     用键属性='Kdatb'将表IT_FILTER_SELECT_OPTIONS读入LS_FILTER。


     如果SY-SUBRC EQ 0。


       将LS_FILTER-SELECT_OPTIONS放入LS_OPTIONS。
         LS_KDATB-SIGN = LS_OPTIONS-SIGN。
         LS_KDATB-OPTION = LS_OPTIONS-OPTION。
         LS_KDATB-LOW = LS_OPTIONS-LOW。
         LS_KDATB-HIGH = LS_OPTIONS-HIGH。


         将LS_KDATB附加到LR_KDATB。
       结局。


     万一。




 *过滤器Kdatb:
     "显示ekko数据的逻辑。
     用键属性='Kdate'将表IT_FILTER_SELECT_OPTIONS读入LS_FILTER。


     如果SY-SUBRC EQ 0。


       将LS_FILTER-SELECT_OPTIONS放入LS_OPTIONS。
         LS_KDATE-SIGN = LS_OPTIONS-SIGN。
         LS_KDATE-OPTION = LS_OPTIONS-OPTION。
         LS_KDATE-LOW = LS_OPTIONS-LOW。
         LS_KDATE-HIGH = LS_OPTIONS-HIGH。


         APPEND LS_KDATE至LR_KDATE。
       结局。


     万一。




 *过滤器Ekgrp:
     "显示ekko数据的逻辑。
     使用键属性='Ekgrp'将表IT_FILTER_SELECT_OPTIONS读入LS_FILTER。


     如果SY-SUBRC EQ 0。


       将LS_FILTER-SELECT_OPTIONS放入LS_OPTIONS。
         LS_EKGRP-SIGN = LS_OPTIONS-SIGN。
         LS_EKGRP-OPTION = LS_OPTIONS-OPTION。
         LS_EKGRP-LOW = LS_OPTIONS-LOW。
         LS_EKGRP-HIGH = LS_OPTIONS-HIGH。


         将LS_EKGRP附加到LR_EKGRP。
       结局。


     万一。


 *过滤器Ekorg:
     "显示ekko数据的逻辑。
     使用键属性='Ekorg'将表IT_FILTER_SELECT_OPTIONS读入LS_FILTER。


     如果SY-SUBRC EQ 0。


       将LS_FILTER-SELECT_OPTIONS放入LS_OPTIONS。
         LS_EKORG-SIGN = LS_OPTIONS-SIGN。
         LS_EKORG-OPTION = LS_OPTIONS-OPTION。
         LS_EKORG-LOW = LS_OPTIONS-LOW。
         LS_EKORG-HIGH = LS_OPTIONS-HIGH。


         将LS_EKORG附加到LR_EKORG。
       结局。


     万一。


 *过滤器Lifnr:
     "显示ekko数据的逻辑。
     使用键属性='Lifnr'将表IT_FILTER_SELECT_OPTIONS读入LS_FILTER。


     如果SY-SUBRC EQ 0。


       将LS_FILTER-SELECT_OPTIONS放入LS_OPTIONS。
         LS_LIFNR-SIGN = LS_OPTIONS-SIGN。
         LS_LIFNR-OPTION = LS_OPTIONS-OPTION。
         LS_LIFNR-LOW = LS_OPTIONS-LOW。
         LS_LIFNR-HIGH = LS_OPTIONS-HIGH。


         将LS_LIFNR附加到LR_LIFNR。
       结局。


     万一。


 *过滤器Logsy:
     "显示ekko数据的逻辑。
     用键属性='Logsy'将表IT_FILTER_SELECT_OPTIONS读入LS_FILTER。


     如果SY-SUBRC EQ 0。


       将LS_FILTER-SELECT_OPTIONS放入LS_OPTIONS。
         LS_LOGSY-SIGN = LS_OPTIONS-SIGN。
         LS_LOGSY-OPTION = LS_OPTIONS-OPTION。
         LS_LOGSY-LOW = LS_OPTIONS-LOW。
         LS_LOGSY-HIGH = LS_OPTIONS-HIGH。


         将LS_LOGSY附加到LR_LOGSY。
       结局。


     万一。


 *过滤器EKPO Matnr:
     "显示ekko数据的逻辑。
     使用键属性='Matnr'将表IT_FILTER_SELECT_OPTIONS读入LS_FILTER。


     如果SY-SUBRC EQ 0。


       将LS_FILTER-SELECT_OPTIONS放入LS_OPTIONS。
         LS_LOGSY-SIGN = LS_OPTIONS-SIGN。
         LS_MATNR-OPTION = LS_OPTIONS-OPTION。
         LS_MATNR-LOW = LS_OPTIONS-LOW。
         LS_MATNR-HIGH = LS_OPTIONS-HIGH。


         将LS_MATNR附加到LR_MATNR。
       结局。


     万一。




 *过滤器已过期:
     "用于显示来自CCTRMAINTAIN的数据的逻辑。
 *使用键属性='已过期'将表IT_FILTER_SELECT_OPTIONS读入LS_FILTER。
 *
 *如果SY-SUBRC EQ 0。
 *
 *将LS_FILTER-SELECT_OPTIONS放入LS_OPTIONS。
 * LS_ISEXPIRED-SIGN = LS_OPTIONS-SIGN。
 * LS_ISEXPIRED-OPTION = LS_OPTIONS-OPTION。
 * LS_ISEXPIRED-LOW = LS_OPTIONS-LOW。
 * LS_ISEXPIRED-HIGH = LS_OPTIONS-HIGH。
 *
 *将LS_ISEXPIRED附加到LR_ISEXPIRED。
 * ENDLOOP。
 *
 *    万一。




     选择*从EKKO〜Ebeln上的EKKO JOIN EKPO = EKPO〜Ebeln进入表ET_ENTITYSET的对应字段中,其中EKKO〜LOEKZ =''和EKKO〜EBELN在LR_EBELN和EKKO〜KDATB在LR_KDATB和EKKO〜KDATE和EKKO〜KDATE  LR_EKGRP和EKKO〜EKORG
 IN LR_EKORG和EKKO〜LIFNR IN
 LR_LIFNR和EKKO〜LOGSY输入
 LR_LOGSY中的LR_LOGSY和EKPO〜MATNR和
 EKKO〜BSTYP ='K'或
 EKKO〜BSTYP
 ='C'。


 *按升序和降序排序?$ orderby = Ebeln asc
     LT_ORDERBY = IO_TECH_REQUEST_CONTEXT-> GET_ORDERBY()。
     将LT_ORDERBY表读入LS_ORDERBY索引表1。
     如果SY-SUBRC EQ 0。
       如果LS_ORDERBY-ORDER EQ'desc'。
         案例LS_ORDERBY-PROPERTY。
           当" EBELN"。
             依ESTELN降序排列,排序为ET_ENTITYSET。
           当" KDATB"时。
             依ESTELN降序排列,排序为ET_ENTITYSET。
           当" KDATE"。
             依ESTELN降序排列,排序为ET_ENTITYSET。
         结束。
       ELSEIF LS_ORDERBY-ORDER EQ'asc'。
         案例LS_ORDERBY-PROPERTY。
           当" EBELN"。
             以埃伯恩升序排列,排序为ET_ENTITYSET。
           当" KDATB"时。
             以埃伯恩升序排列,排序为ET_ENTITYSET。
           当" KDATE"。
             以埃伯恩升序排列,排序为ET_ENTITYSET。
         结束。
       万一。
     万一。


   终结法。


 

与关联关联的第二张表:

方法POITEMSET_GET_ENTITYSET。

   数据:LS_KEY_TAB TYPE/IWBEP/S_MGW_NAME_VALUE_PAIR,
         LV_EBELN TYPE EBELN。

 *获取关键属性值
   将具有键名='Ebeln'的表IT_KEY_TAB读入LS_KEY_TAB。
   如果SY-SUBRC = 0。
     LV_EBELN = LS_KEY_TAB-VALUE。
   万一。

 *这是用于过滤器选项
   使用键属性='Ebeln'将表IT_FILTER_SELECT_OPTIONS读入DATA(LS_FILTER)。
   如果SY-SUBRC EQ 0。
     将LS_FILTER-SELECT_OPTIONS表读入DATA(LS_OPTION)索引1。
     如果SY-SUBRC EQ 0。
       LV_EBELN = LS_OPTION-LOW。
     万一。
   万一。

   如果LV_EBELN不是INITIAL。

     从EKPO中选择*到表ET_ENTITYSET的对应字段中
     WHERE EBELN = LV_EBELN。
   其他。

     从EKPO中选择*到表ET_ENTITYSET的相应字段中。

   万一。

 ENDMETHOD。
方法POITEMSET_GET_ENTITY。

   数据:LS_KEY_TAB TYPE/IWBEP/S_MGW_NAME_VALUE_PAIR,
         LV_EBELN TYPE EBELN,
         LV_EBELP TYPE EBELP。

 *获取关键属性值
   使用键名='Ebeln'将表IT_KEY_TAB读入LS_KEY_TAB。
   如果SY-SUBRC = 0。
     LV_EBELN = LS_KEY_TAB-VALUE。
   万一。

 *获取关键属性值
   使用键名='Ebelp'将表IT_KEY_TAB读入LS_KEY_TAB。
   如果SY-SUBRC = 0。
     LV_EBELP = LS_KEY_TAB-VALUE。
   万一。

 *选择一行
   从EKPO中选择单个*到ER_ENTITY的相应字段中
   哪里EBELN = LV_EBELN
   AND EBELP = LV_EBELP。

 ENDMETHOD。

就像这样,我有一个Duplikate,但来自EKPO的Matnr过滤无法正常工作。 我该如何实现?

显示带有EKKO条目的列表,并由EKPO的Matnr过滤此列表。

3条回答
ZJXianG
2020-08-19 11:45 .采纳回答

嗨,

当前在OData V2版本中,不支持具有1 ..许多基数的扩展过滤器。 所以,

POHeaderSet?$ expand = HeadToItemNav&$ filter = HeadToItemNav/Matnr eq'TG11'将不起作用,因为HeadToItemNav的基数为1..n。

OData V4版本支持此功能。 示例:

POHeaderSet?$ expand = HeadToItemNav($ filter = Matnr eq'TG11')

此致

Samson

一周热门 更多>