ABAP SQL查询求助:完善可用通行证筛选逻辑
ABAP方法实现:可用通行证列表筛选方案
1. 先处理VSTEL取值逻辑(含ZTSD_WERKPRD扩展)
首先基于ZSLO_VEHICLE_LIST_ALV-VSTEL生成完整的VSTEL范围,包含ZTSD_WERKPRD中对应的VSTEL_P:
DATA: lv_base_vstel TYPE vstel, lt_vstel_range TYPE RANGE OF vstel, ls_vstel_range LIKE LINE OF lt_vstel_range, lt_werkprd TYPE TABLE OF ztsd_werkprd. * 从ALV获取基础VSTEL lv_base_vstel = zslo_vehicle_list_alv-vstel. * 将基础VSTEL加入范围表 ls_vstel_range-sign = 'I'. ls_vstel_range-option = 'EQ'. ls_vstel_range-low = lv_base_vstel. APPEND ls_vstel_range TO lt_vstel_range. * 查询ZTSD_WERKPRD,获取对应VSTEL_P并补充到范围表 SELECT vstel_p FROM ztsd_werkprd INTO TABLE lt_werkprd WHERE vstel = lv_base_vstel. LOOP AT lt_werkprd INTO DATA(ls_werkprd). CLEAR ls_vstel_range. ls_vstel_range-sign = 'I'. ls_vstel_range-option = 'EQ'. ls_vstel_range-low = ls_werkprd-vstel_p. APPEND ls_vstel_range TO lt_vstel_range. ENDLOOP.
2. 修改运输单查询语句(关联VTTS并加入VSTEL条件)
关联VTTK与VTTS,加入DAREG日期范围(系统日期前一天至当天),并使用上面生成的VSTEL范围:
SELECT DISTINCT vttk~tknum FROM vttk INNER JOIN vtts ON vttk~tknum = vtts~tknum INTO TABLE @lt_tknum WHERE vttk~sttrg IN ( @zif_vehicle_model_dao=>mc_s_sttrg-_2, @zif_vehicle_model_dao=>mc_s_sttrg-_6 ) AND vttk~shtyp = 'ZTRR' AND vttk~dareg BETWEEN ( sy-datum - 1 ) AND @sy-datum AND vtts~vstel IN @lt_vstel_range.
关键说明:
- 用
DISTINCT避免同一运输单因多条VTTS记录重复输出 - 引用常量替代硬编码状态值,符合ABAP规范
- DAREG条件调整为需求的日期范围
3. 排除已发放未交付的通行证
从可用通行证列表中移除关联到上述运输单的通行证(假设存在关联表ZTLO_PASS_ASSIGN,若无则需根据实际业务关联逻辑调整):
* 获取已发放的通行证ID SELECT zzpass_id FROM ztlo_pass_assign INTO TABLE DATA(lt_used_pass) WHERE tknum IN @lt_tknum. * 从可用列表中剔除已发放项 DELETE lt_pass WHERE zzpass_id IN @lt_used_pass.
内容的提问来源于stack exchange,提问作者Alexander Chebotarev
相关产品推荐
相关产品推荐

