主要功能是从多个数据库表中查询返利结算单(ZRET0018)及其相关的协议、公司、供应商等信息。以下是添加了详细注释的代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
*----------------------------------------------------------------------* * 定义范围变量(RANGES)用于存储动态查询条件 *----------------------------------------------------------------------* * 定义返利结算单(zret0018)的结算期限(zjsd_qx)的范围变量 RANGES: lr_zjsd_qx FOR zret0018-zjsd_qx. * 定义返利结算单(zret0018)的结算对方(zjsd_df)的范围变量 RANGES: lr_zjsd_df FOR zret0018-zjsd_df. * 定义返利协议(zret0006)的协议类型(zxybstyp)的范围变量 RANGES: lr_zxybstyp FOR zret0006-zxybstyp. * 定义返利结算单(zret0018)的结算类型(zjstype)的范围变量 RANGES: lr_zjstype FOR zret0018-zjstype. *----------------------------------------------------------------------* * 定义变量 *----------------------------------------------------------------------* * 定义字符串变量,用于存储动态WHERE条件 DATA: lv_where TYPE string. *----------------------------------------------------------------------* * 根据条件设置范围变量的值 *----------------------------------------------------------------------* * 如果r_b选择不为空 IF r_b IS NOT INITIAL. * 设置结算期限为空值 lr_zjsd_qx[] = VALUE #( ( sign = 'I' option = 'EQ' low = '' ) ). * 设置结算类型不等于'C' lr_zjstype[] = VALUE #( ( sign = 'I' option = 'NE' low = 'C' ) ). ENDIF. *----------------------------------------------------------------------* * 根据当前事务代码设置不同的参数 *----------------------------------------------------------------------* * 如果当前事务代码是'ZRED0017' IF sy-tcode = 'ZRED0017'. * 设置协议类型为'F'或'Q' lr_zxybstyp[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'F' ) ( sign = 'I' option = 'EQ' low = 'Q' ) ). * 设置活动权限为'A0' gv_activ_auth = 'A0'. ELSE. * 否则设置活动权限为'03' gv_activ_auth = '03'. ENDIF. *----------------------------------------------------------------------* * 根据复选框状态设置动态WHERE条件 *----------------------------------------------------------------------* * 如果p_nesqf复选框被选中 IF p_nesqf = 'X'. * 设置WHERE条件为:返利结算单的返利收取方不等于返利协议的公司代码 lv_where = 'ZRET0018~ZFLSQF <> ZRET0006~ZBUKRS'. ENDIF. *----------------------------------------------------------------------* * 从多个数据库表中查询返利结算单及相关信息 *----------------------------------------------------------------------* SELECT zret0018~*, "返利结算单所有字段 zret0006~zxy_txt, "协议名称 zret0018~zflsqf, "返利收取方 zret0018~zflzff, "返利支付方 zret0006~zbukrs, "公司代码 zret0006~ekgrp, "采购组 zret0006~zhtlx, "合同类型 zret0006~zbegin, "开始日期 zret0006~zend, "结束日期 zret0016~zbegin AS zbegin16, "开始日期(来自zret0016表) zret0016~zend AS zend16, "结束日期(来自zret0016表) CASE WHEN t001~butxt IS NOT NULL "返利收取方描述 THEN t001~butxt ELSE but000~name_org1 END AS zflsqf_t, lfa1~name1 AS zflzff_t, "返利支付方描述 g~butxt, "公司描述 zret0006~zxybstyp, "协议类型 zreta002~ztk_id, "条款ID zreta002~ztk_txt, "条款描述 zreta002~zht_id, "合同ID zreta002~ekgrp AS ekgrp_tk, "采购组(来自条款表) h~budat, "过账日期 CASE zret0006~zdffs "支付方式(优先使用协议表的值) WHEN ' ' THEN zreta002~zdffs ELSE zret0006~zdffs END AS zdffs_xy, CASE zret0018~zjsd_lx "结算类型描述 WHEN 'Q' THEN '数量' WHEN 'M' THEN '金额' ELSE zret0018~zjsd_lx END AS zjsdlx_t, CASE zret0018~zjsd_jz "结算基准描述 WHEN 'P' THEN '采购' WHEN 'S' THEN '销售' WHEN 'D' THEN '配送' WHEN 'A' THEN '实付款' WHEN 'U' THEN '应付款' ELSE zret0018~zjsd_jz END AS zjsdjz_t, CASE zret0018~zdffs "支付方式描述 WHEN 'A' THEN '账扣' WHEN 'C' THEN '返现' WHEN 'O' THEN '票折' WHEN 'M' THEN '货返' ELSE zret0018~zdffs END AS zdffs_t, '@BZ@' AS icon "图标 INTO CORRESPONDING FIELDS OF TABLE @gt_zret0018 "结果存入内表gt_zret0018 FROM zret0018 "主表:返利结算单 INNER JOIN zret0006 ON zret0018~zxy_id = zret0006~zxy_id "内连接:返利协议 LEFT JOIN zret0016 ON zret0016~zxy_id = zret0018~zxy_id "左连接:返利期间 AND zret0016~zjsqj_id = zret0018~zjsqj_id LEFT JOIN zreta002 ON zreta002~ztk_id = zret0006~ztk_id "左连接:返利条款 LEFT JOIN t001 ON zret0018~zflsqf = t001~bukrs "左连接:公司代码 LEFT JOIN but000 ON zret0018~zflsqf = but000~partner "左连接:业务伙伴 LEFT JOIN lfa1 ON zret0018~zflzff = lfa1~lifnr "左连接:供应商 LEFT JOIN mara AS a ON zret0018~matnr = a~matnr "左连接:物料主数据 LEFT JOIN makt AS b ON zret0018~matnr = b~matnr "左连接:物料描述 AND b~spras = '1' "语言为中文 LEFT JOIN mara AS d ON zret0018~zdfsp = d~matnr "左连接:返利商品 LEFT JOIN makt AS f ON zret0018~zdfsp = f~matnr "左连接:返利商品描述 AND f~spras = '1' "语言为中文 LEFT JOIN t001 AS g ON zret0006~zbukrs = g~bukrs "左连接:公司代码 LEFT JOIN bkpf AS h ON zret0018~bukrs = h~bukrs "左连接:会计凭证抬头 AND zret0018~belnr = h~belnr AND zret0018~gjahr = h~gjahr WHERE zret0018~zxy_id IN @s_zxy_id "协议ID选择条件 AND zret0018~zjsd_id IN @s_zjsdid "结算单ID选择条件 AND zret0018~zjstype IN @s_jstype "结算类型选择条件 AND zret0018~zjsd_qx IN @lr_zjsd_qx[] "结算期限范围条件 AND zret0018~zjsd_df IN @lr_zjsd_df[] "结算对方范围条件 AND zret0006~zxybstyp IN @lr_zxybstyp[] "协议类型范围条件 AND zret0018~zjstype IN @lr_zjstype[] "结算类型范围条件 AND zret0018~zcjrq IN @s_zcjrq "创建日期选择条件 AND zret0018~zjsstate IN @s_jsdta "结算状态选择条件 AND zret0018~zflsqf IN @s_zflsqf "返利收取方选择条件 AND zret0018~zflzff IN @s_zflzff "返利支付方选择条件 AND zret0018~zdffs IN @s_zdffs "支付方式选择条件 AND zret0018~zjsd_dffi IN @s_zdffi "结算对方选择条件 AND zret0006~zbukrs IN @s_zbukrs "公司代码选择条件 AND zret0006~zhtlx IN @s_zhtlx "合同类型选择条件 AND zret0006~zfllx IN @s_zfllx "返利类型选择条件 AND h~budat IN @s_budat "过账日期选择条件 AND (lv_where). "动态WHERE条件 |
这段代码主要功能是:
- 定义了多个范围变量(RANGES)用于存储动态查询条件
- 根据不同的条件(如选择屏幕输入、事务代码等)设置这些范围变量的值
- 构建一个复杂的SELECT语句,从多个数据库表中查询返利结算单及其相关信息
- 使用CASE语句将代码值转换为描述文本
- 使用INNER JOIN和LEFT JOIN连接多个相关表
- 应用多个WHERE条件,包括选择屏幕输入和动态条件
- 将查询结果存入内表gt_zret0018中
这个查询非常复杂,涉及多个表的连接和多种条件的组合,主要用于获取返利结算单的完整信息,包括相关的协议、公司、供应商、物料等详细信息。


