出于方便的目的,这边将BU_GROUP,SALE_ORG加到了BP搜索里面,因为CRM项目推广了很多国家,每个国家一个SALE ORG,而标准的BP HEADER ADV SEARCH里竟然没有BU_GROUP。。。。所以这边就把这两个字段加到搜索条件里了。

至于怎么加进去的就不说了,已经经历了好几代开发的手了。。。

但是效率一直是用户所追求的,而标准的BP搜索,都是很挫的那种,先做查询优先级,然后根据优先得出的PARTNER KEY再去关联其他信息做过滤。。。

可能是查询条件太多,牵涉的表太多,所以系统才用这种办法吧,但是每次500条,然后过滤,然后再500,再过滤,直到补齐查询的MAX HIT

以上是查询的逻辑,不多说,下面来说说怎么优化性的将这两个字段加入到主查询中(因为这两个字段是最常用的,也最可能单独使用的,所以不加到查询中,只过滤会很慢)

1.复制标准的查询类:CL_BUPA_IL_HEADER_SEARCH->ZL_BUPA_IL_HEADER_SEARCH

此类中的GET_DYNAMIC_QUERY_RESULT会做个优先排序:checked_search_available

然后在GET_RESULT_TABLE_CHECKED中动态拼接查询方法:CALL METHOD me->(lv_method_name)

前面基本不动,因为要把这两个查询条件放到主查询中,所以在上面的lv_method_name 等于‘SEARCH_BP_GENERAL’的时候,增加处理逻辑

增加SEARCH接构:ls_bp_gen_search01 TYPE Zcrmt_bupa_il_bp_gen_search,(额外DATA定义的)

selection处理前,添加parameters:

  1. "add attr to gen field by ly 20170525
  2. IF ME->GV_CONDITION = 'X'.
  3. APPEND 'ZSALES_ORG' to gt_bp_gen_attributes.
  4. APPEND 'ZBP_GROUP' to gt_bp_gen_attributes.
  5. ENDIF.

处理结束后删除:

  1. "delete add attr gen field append up by ly 20170525
  2. IF ME->GV_CONDITION = 'X'.
  3. delete gt_bp_gen_attributes WHERE table_line = 'ZSALES_ORG'.
  4. delete gt_bp_gen_attributes WHERE table_line = 'ZBP_GROUP'.
  5. ENDIF.

调用查询方法增强:

  1. * get partner package matching the but000 criteria:
  2. IF ME->GV_CONDITION = ''."BP查询开关,未开启则走原始逻辑 add by ly 20170526
  3. CALL METHOD cl_bupa_il_search_service=>search_by_bp_general
  4. EXPORTING
  5. is_control = is_control
  6. is_bp_gen_search = ls_bp_gen_search
  7. iv_max_hit = lv_max_hits
  8. it_selection_parameters = lt_bp_gen_params
  9. iv_last_selected_partner = lv_last_selected_partner
  10. CHANGING
  11. ct_partner_keys = lt_partner_keys
  12. ct_return = ct_return.
  13. "CHANGE FROM cl_bupa_il_search_service=>search_by_bp_general TO Zcl_bupa_il_search_service=>search_by_bp_general
  14. "by ly 20170525
  15. ELSE."BP查询开关,未开启则走原始逻辑开启则走新逻辑 add by ly 20170526
  16. CALL METHOD Zcl_bupa_il_search_service=>zsearch_by_bp_general
  17. EXPORTING
  18. is_control = is_control
  19. is_bp_gen_search = ls_bp_gen_search01
  20. iv_max_hit = lv_max_hits
  21. it_selection_parameters = lt_bp_gen_params
  22. iv_last_selected_partner = lv_last_selected_partner
  23. GV_CONDITION = ME->GV_CONDITION
  24. CHANGING
  25. ct_partner_keys = lt_partner_keys
  26. ct_return = ct_return.
  27. ENDIF.

复制cl_bupa_il_search_service的search_by_bp_general到zcl_bupa_il_search_service为:ZSEARCH_BP_GENERAL

而原本的zsearch_by_bp_general改为调用ZSEARCH_BP_GENERAL

  1. METHOD zsearch_by_bp_general.
  2. "CHANGE TO BY LY 20170525
  3. CALL METHOD zcl_bupa_il_search_service=>ZSEARCH_BP_GENERAL"search_by_bp_general
  4. EXPORTING
  5. is_control = is_control
  6. is_bp_gen_search = is_bp_gen_search
  7. iv_max_hit = iv_max_hit
  8. it_selection_parameters = it_selection_parameters
  9. iv_last_selected_partner = iv_last_selected_partner
  10. GV_CONDITION = GV_CONDITION
  11. CHANGING
  12. ct_partner_keys = ct_partner_keys
  13. ct_return = ct_return.
  14. ENDMETHOD.

拼接动态查询时添加:(append_where_cond_to_select原样从cl_bupa_il_search_service中复制过来,包括对应用到的结构)

  1. "add where cluse by ly 20170525 BP查询开关开启 添加查询条件 BEGIN
  2. IF is_bp_gen_search-ZBP_GROUP IS NOT INITIAL AND GV_CONDITION = 'X'.
  3. CALL METHOD cl_bupa_il_search_service=>map_attribute_to_range_tab
  4. EXPORTING
  5. iv_attribute_name = 'ZBP_GROUP'
  6. it_selection_parameters = it_selection_parameters
  7. IMPORTING
  8. et_range_tab = lt_group.
  9. IF lt_group IS NOT INITIAL.
  10. append_where_cond_to_select( EXPORTING iv_where_line = 'BU_GROUP IN lt_group '
  11. CHANGING ct_where_pattern = lt_where_pattern ). "#EC NOTEXT
  12. ENDIF.
  13. ENDIF.
  14.  
  15. IF is_bp_gen_search-ZSALES_ORG IS NOT INITIAL AND GV_CONDITION = 'X'.
  16. CALL METHOD cl_bupa_il_search_service=>map_attribute_to_range_tab
  17. EXPORTING
  18. iv_attribute_name = 'ZSALES_ORG'
  19. it_selection_parameters = it_selection_parameters
  20. IMPORTING
  21. et_range_tab = lt_SALES_ORG.
  22. IF lt_SALES_ORG IS NOT INITIAL.
  23. append_where_cond_to_select( EXPORTING iv_where_line = 'SALES_ORG IN lt_SALES_ORG '
  24. CHANGING ct_where_pattern = lt_where_pattern ). "#EC NOTEXT
  25. ENDIF.
  26. ENDIF.
  27. "add where cluse by ly 20170525 BP查询开关开启 添加查询条件 end

修改查询的对象,从BUT000到新的视图‘ZCRMV_BP_SEARCH’(此视图后面说明)

  1. * DATA: lv_from_clause TYPE string VALUE 'BUT000 '.
  2. DATA: lv_from_clause TYPE string VALUE 'ZCRMV_BP_SEARCH '."CHANGE BY LY 20170525
  3. IF ( is_bp_gen_search-ZSALES_ORG IS INITIAL AND is_bp_gen_search-ZBP_GROUP IS INITIAL ) or is_control-employees = 'X'."add by ly 20170525
  4. lv_from_clause = 'BUT000'.
  5. ENDIF.
  6.  
  7. IF GV_CONDITION = ''."BP查询开关,如果未开启,则走原始逻辑
  8. lv_from_clause = 'BUT000'.
  9. ENDIF.

另外,在查询后的数据过滤,也做个指向更改:FILTER_BY_SEARCH_CRITERIA

  1. DATA ls_search_criteria01 TYPE ZHSCRMT_BUPA_IL_HEADER_SEARCH."change by ly 20170525
  2. DATA ls_search_criteria TYPE crmt_bupa_il_header_search.
  1. * search by general but000 data
  2. IF ls_search_criteria01-bpgeneral IS NOT INITIAL.
  3. IF ME->GV_CONDITION = ''.
  4. CALL METHOD cl_bupa_il_search_service=>search_by_bp_general
  5. EXPORTING
  6. is_control = ls_control
  7. is_bp_gen_search = ls_search_criteria-bpgeneral
  8. it_selection_parameters = lt_selection_parameters
  9. CHANGING
  10. ct_partner_keys = ct_partner_keys
  11. ct_return = lt_return.
  12. APPEND LINES OF lt_return TO ct_return .
  13. IF ct_partner_keys IS INITIAL.
  14. * criteria given, but no result found
  15. RETURN.
  16. ENDIF.
  17. ELSE.
  18. "change by ly 20170525
  19. CALL METHOD zcl_bupa_il_search_service=>ZSEARCH_BP_GENERAL
  20. EXPORTING
  21. is_control = ls_control
  22. is_bp_gen_search = ls_search_criteria01-bpgeneral
  23. it_selection_parameters = lt_selection_parameters
  24. GV_CONDITION = ME->GV_CONDITION
  25. CHANGING
  26. ct_partner_keys = ct_partner_keys
  27. ct_return = lt_return.
  28. APPEND LINES OF lt_return TO ct_return .
  29. IF ct_partner_keys IS INITIAL.
  30. * criteria given, but no result found
  31. RETURN.
  32. ENDIF.
  33. ENDIF.
  34.  
  35. ENDIF.

将GENERAL中的查询字段都添加进这个视图,后面查询时则自动匹配,省去了过滤的时间和效率。

优化效率说明:将查询能卡死或者超过30分钟的,优化到2-3秒,一是因为数据存储和查询条件的无序,二是省略了多次查询BUT000大数据量的表

BUT000数据量:60W,里面的数据是按照推广的顺序依次创建的,那么后面推广的国家的数据会存的最'深'。

只用BU_GROUP和SALE_ORG查询时,会从BUT000中一次500条排序取,然后根据GROUP和SALE过滤,这样直到取到有效的数据需要60W/500 = 1200次,每次查询后还要查询一到两次BUT000,每次大概耗时1-2秒。

优化后从新建的视图中取数,在只用GROUP和SALE时,只取一次,全部满足,不在额外查询BUT000.。。。

影响分析:原始的增强查询是有其他查询条件时先查其他,在用GENERAL过滤,然后再过滤GROUP和SALE

处理后,用配置可配置是否走这个增强,原始的查询走向不变,在特定情况会从新视图中查询和过滤,无二次过滤。

在普通情况依然走原始逻辑,特殊情况走新视图。

^_^没怎么好好整理,有点乱

CRM BP SEARCH 优化的更多相关文章

  1. CRM BP函数

    REPORT ZCRM_BP_TEST. """""""""""""& ...

  2. CRM ORDER SEARCH增强查询条件(已有字段)

    ORDER_H表增强的两个字段,很早了,非AET,非EEWB,所以也加不到标准的搜索界面. GENIL_MODEL_BROWSER找到对应的查询和结果结构,append进字段:ZZZBRAND. 然后 ...

  3. SQLite3源程序分析之查询处理及优化

    前言 查询处理及优化是关系数据库得以流行的根本原因,也是关系数据库系统最核心的技术之一.SQLite的查询处理模块很精致,而且很容易移植到不支持SQL的存储引擎(Berkeley DB最新的版本已经将 ...

  4. Dynamics CRM 2016 Web API 消息列表

    Function Name Description CalculateTotalTimeIncident Function Calculates the total time, in minutes, ...

  5. 【翻译】借助 NeoCPU 在 CPU 上进行 CNN 模型推理优化

    本文翻译自 Yizhi Liu, Yao Wang, Ruofei Yu.. 的  "Optimizing CNN Model Inference on CPUs" 原文链接: h ...

  6. 如何通过在线CRM提升企业竞争力?

    随着信息技术的快速发展,在线CRM系统也得到了更加广泛的应用,已经在企业中逐渐开始普及.CRM系统对于优化企业流程有着十分重要的意义,它能够让企业的经营管理更加敏捷,并且可以快速地响应企业的业务流程. ...

  7. 不同规模的企业对CRM的需求是否相同?

    CRM客户管理系统在我们的认知中往往是中大型企业的选择.如今,越来越多中小规模企业开始使用CRM系统.CRM的功能随着发展变得越来越实用,可以满足不同行业不同业务规模的企业的需求.同时,CRM功能类型 ...

  8. CRM的未来发展前景有哪些?

    随着时代的发展,近年来越来越多的国内中小企业开始采用CRM客户关系管理系统,CRM从此不再是大企业的专利,也开始让中小企业得以不断成长.国内CRM行业的发展越来越快, 它的前景是什么?今天小Z就来给大 ...

  9. CRM系统实施中如何避免“踩雷”

    CRM系统实施后,效果没有达到预期是很多企业出现的情况.而最主要的原因就是在实施之前没有足够的思考和相应的计划.那么,企业应如何避免CRM系统实施时"踩雷"?这里有几条建议希望可以 ...

随机推荐

  1. Apple ID双重认证验证码无法输入问题

    问题:用Apple ID登录老版本ios系统时,会提示“”需要提供Apple ID验证码才能登陆.请键入您的密码,并随后键入显示在您其他设备上的验证码”. 解决:老版本系统无输入验证码的地方,那就把验 ...

  2. Druid介绍

    Druid (大数据实时统计分析数据存储) Druid 是一个为在大数据集之上做实时统计分析而设计的开源数据存储.这个系统集合了一个面向列存储的层,一个分布式.shared-nothing的架构,和一 ...

  3. 17秋 软件工程 团队第三次作业 预则立&他山之石

    题目:团队作业-预则立&&他山之石 团队: 我说嘻(xì)哈(hà)你说侠 17秋 软件工程 团队第三次作业 预则立&他山之石 1.确立团队选题,建立和初步熟悉团队git的协作 ...

  4. IIS发布静态页面配置

    第一步:按照正常网站发布添加网站: 第二步:修改该网站的默认文档: 第三步:添加默认文档,把静态页的名称添加进去: 第四步:重启网站,浏览:

  5. 恢复Intellij idea删除的文件

    恢复Intellij idea的删除文件方法: 右键单机项目名称---->Local History---->Show History 可以看到历史操作记录,右键单机想要恢复的文件---- ...

  6. link 和 import的区别

    二者区别: link属于html标签,而@import是css提供的. 页面被加载时,link因为是HTM标签, 把认会同时被加载,而@import引用的css会等到页面加载结束后加载. link是h ...

  7. 滑动验证 和滑动图片验证JS

    滑动验证 先放效果图 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  8. Docker用途 & 和tomcat的区别

    两者不是同一种类型.1.docker 是容器,tomcat是jsp应用服务器2.tomcat可以安装在物理机上,虚拟机上,也可以安装在Docker上.所以从这个角度讲,Docker也可以看做是一种超轻 ...

  9. [mybatis-spring]sqlSessionFactoryBean

    在mybatis中,SqlSessionFactory由SqlSessionFactoryBuilder创建. 在mybatis-spring中,是由SqlSessionFactoryBean创建的. ...

  10. JavaScript 第六章总结: Getting to know the DOM

    前言 这一章节介绍 DOM, 使用 DOM 的目的是使的网页能够变得 dynamic,使得 pages that react, that respond, that update themselves ...