ABAP 7.40版本下不同域字段内连接(Inner Join)的单查询实现方案问询
Yes, you absolutely can handle this with a single OPEN SQL query in ABAP 7.40, avoiding the need for splitting into multiple steps with FOR ALL ENTRIES. Here are two clean, efficient approaches to fix the field mismatch between EKPO-EBELP (5-character) and LIPS-VGPOS (6-character):
Approach 1: String Concatenation (Simple & Direct)
Since your mapping shows EKPO-EBELP = '00010' maps to LIPS-VGPOS = '000010', you can directly prepend a '0' to the 5-character EBELP to match the 6-character length of VGPOS. ABAP 7.40 supports string concatenation in OPEN SQL using the && operator:
SELECT a~matnr AS material, b~aedat AS date, SUM( c~ormng ) AS dummy INTO TABLE @gt_dummy FROM ekpo AS a INNER JOIN ekko AS b ON b~ebeln = a~ebeln INNER JOIN lips AS c ON c~vgbel = a~ebeln AND c~vgpos = '0' && a~ebelp -- Prepend '0' to EBELP to match VGPOS length INNER JOIN likp AS d ON d~vbeln = c~vbeln WHERE a~matnr IN @gr_dummy1 AND a~werks IN @gr_dummy2 GROUP BY a~matnr, b~aedat ORDER BY a~matnr, b~aedat.
This works because EBELP is stored with leading zeros (e.g., '00010'), so adding an extra leading zero gives you the exact 6-character format expected by VGPOS.
Approach 2: Conversion Exit Function (Robust & Standards-Compliant)
For a more robust solution that adheres to SAP's data format standards, use the ALPHA conversion exit (which handles leading zeros for numeric-like fields). Since both EBELP and VGPOS use the ALPHA exit, you can convert EBELP to the 6-character format expected by VGPOS:
SELECT a~matnr AS material, b~aedat AS date, SUM( c~ormng ) AS dummy INTO TABLE @gt_dummy FROM ekpo AS a INNER JOIN ekko AS b ON b~ebeln = a~ebeln INNER JOIN lips AS c ON c~vgbel = a~ebeln AND c~vgpos = CONVERSION_EXIT_ALPHA_OUTPUT( CONV i( a~ebelp ) ) INNER JOIN likp AS d ON d~vbeln = c~vbeln WHERE a~matnr IN @gr_dummy1 AND a~werks IN @gr_dummy2 GROUP BY a~matnr, b~aedat ORDER BY a~matnr, b~aedat.
Here's what this does:
CONV i( a~ebelp )converts the 5-characterEBELPto an integer (stripping leading zeros, e.g., '00010' → 10).CONVERSION_EXIT_ALPHA_OUTPUT()converts the integer back to a 6-character string with leading zeros (10 → '000010'), which perfectly matchesVGPOS.
Why These Are Better Than Your Current Plan
- Performance: Single OPEN SQL queries leverage database-level optimization (like join indexes) which is typically faster than
FOR ALL ENTRIESfollowed by manual summation, especially with large datasets. - Maintainability: Less code means fewer opportunities for bugs, and the logic is contained in one place.
- Simplicity: No need to handle intermediate tables or post-processing steps.
Just make sure to test with a variety of EBELP values (e.g., '00100' → '000100') to confirm the conversion works as expected for all cases.
内容的提问来源于stack exchange,提问作者mmgro27

