使用FlexibleSearch查询删除Impex

2020-09-28 06:27发布

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

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


你好

我有一个小问题; 我不完全知道我在做什么错,但这就是问题所在。 我想删除一大堆未使用的产品。

为此,我编写了一个FlexibleSearch查询,该查询获取任何订单条目未使用的所有产品pk:

 从{作为X的操作}中选择{X:pk}在{X:pk}不在的位置({{从{OrderEntry as E}}}中选择productpk
  

这很好。

然后,我想在REMOVE impex语句中使用它,而我写了这个

  REMOVE Action; pk [unique = true]
  "#%impex.exportItems(""从{动作作为X}选择{X:pk},在{X:pk}不在{{选择从{OrderEntry作为E}}}}}}"",Collections.EMPTY_MAP,  Collections.singletonList(Item.class),true,true,-1,-1);"
  

但这执行没有错误; 但什么也没去除...知道吗?

谢谢!

罗曼。

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

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


你好

我有一个小问题; 我不完全知道我在做什么错,但这就是问题所在。 我想删除一大堆未使用的产品。

为此,我编写了一个FlexibleSearch查询,该查询获取任何订单条目未使用的所有产品pk:

 从{作为X的操作}中选择{X:pk}在{X:pk}不在的位置({{从{OrderEntry as E}}}中选择productpk
  

这很好。

然后,我想在REMOVE impex语句中使用它,而我写了这个

  REMOVE Action; pk [unique = true]
  "#%impex.exportItems(""从{动作作为X}选择{X:pk},在{X:pk}不在{{选择从{OrderEntry作为E}}}}}}"",Collections.EMPTY_MAP,  Collections.singletonList(Item.class),true,true,-1,-1);"
  

但这执行没有错误; 但什么也没去除...知道吗?

谢谢!

罗曼。

付费偷看设置
发送
5条回答
微wx笑
1楼 · 2020-09-28 07:12.采纳回答

您是否使用给定的ImpEx导出项目,然后导入导出的文件,并且项目未删除? impex.exportItems(...)导出项目-不确定导入时是否可以使用(是否启用BeanShell脚本)?

如果您要删除项目而不导出/导入(这使您有机会查看要删除的项目),那么可以使用groovy控制台吗?

  result = flexibleSearchService.search(" ....")
  itemsToDelete = result.getResult();
  modelService.removeAll(itemsToDelete);
  

只需记住打开提交(否则所有删除操作都会回滚)。

haha101010
2楼-- · 2020-09-28 07:11
  • modelService.removeAll(..)为每个项目执行一个单独的DELETE。 显然超出了事务超时

  • 在事务中编辑的项目越多,对数据库施加的压力就越大。 一些数据库具有可在事务中执行的最大修改语句数

  • 如果要删除大量项目,则有两个选项可以限制FSQL返回的项目数,或者遍历结果并在达到批处理大小后提交

  • Jalo,拦截器和"部分"物品的删除可能会使您放慢速度

  • 媒体删除性能取决于存储策略

clasier
3楼-- · 2020-09-28 07:02

我创建了一个beanshell,以一种可控的方式执行删除操作,即按您自己的大小批量执行,并且您希望一次运行地删除条目的自定义限制。
使用此beanshell命令的步骤如下:
a)打开HAC。
b)转到控制台->脚本语言->将脚本类型设置为beanshell。
c)粘贴如下所示的bean shell代码:

  import de.hybris.platform.servicelayer.search.FlexibleSearchService;
  导入de.hybris.platform.servicelayer.model.ModelService;
  导入de.hybris.platform.servicelayer.search.FlexibleSearchQuery;
  导入org.apache.log4j.Logger;
     
     
  final String QUERY_STRING =" <请在此处输入您的选择查询>>";
  final int BATCH_SIZE = 2000; //提供一次迭代中要删除的行数。
     
     
  记录器LOG = Logger.getLogger(FlexibleSearchService.class);
  FlexibleSearchService flexibleSearchService = spring.getBean(" flexibleSearchService");
  ModelService modelService = spring.getBean(" modelService");
  FlexibleSearchQuery fQuery =新的FlexibleSearchQuery(QUERY_STRING);
  fQuery.setCount(BATCH_SIZE);
  int count = 0;
  while(true){
          searchResults = flexibleSearchService.search(fQuery);
            if(searchResults.getCount()== 0 ||计数> =(BATCH_SIZE * 5)){
              打破;
            }
            计数=计数+ BATCH_SIZE;
            LOG.info(count);
            modelService.removeAll(searchResults.getResult());
  }

  

请记住在执行之前打开提交模式。

何必丶何苦呢
4楼-- · 2020-09-28 06:53

这实际上与我上面给出的代码相同,因为只有在脚本执行完成后才提交事务(您可以 您可以在脚本运行时使用FSQL对其进行检查-不会批量删除任何项目),有效地意味着活动事务将累积所有更改。 为了使脚本按预期工作,必须添加手动提交并在新批次上启动新事务。

95年老男孩
5楼-- · 2020-09-28 07:10

我遇到了类似的问题。 我使用以下groovy脚本批量删除了这些项目

 导入de.hybris.platform.servicelayer.cronjob.PerformResult
  导入de.hybris.platform.servicelayer.search。*
  导入de.hybris.platform.servicelayer.model。*
  导入de.hybris.platform.servicelayer.search.FlexibleSearchQuery
  导入de.hybris.platform.core.model.user.AddressModel
   
  searchService = spring.getBean(" flexibleSearchService");
  modelService = spring.getBean(" modelService");
  query = new FlexibleSearchQuery("从{地址}中选择前10000个{pk}");
 
  searchService.search(query).getResult()。each {
  
   
    modelService.remove(it)
   
  }
  

尽管我有大约200,000条记录,但我不得不提交脚本几次。 但是这样网关不会发生超时。

一周热门 更多>