[转]Select Single And Up To 1 Rows

本文探讨了ABAP中SELECTSINGLE与SELECT...UPTO1ROWS两种查询方式的区别。通过实例演示了这两种查询如何处理数据,并解释了它们在运行效率和内存使用方面的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

What's The Difference?

 

A lot of people use the SELECT SINGLE statement to check for the existence of a value in a database prior to running a large report. Select singles are also used to look up values from a database where that value is going to be constant for the duration of the program run, or the value is being used to validate some user entry.

 

Other people prefer to use the 'UP TO 1 ROWS' variant of the SELECT statement.

So what's the difference between using 'SELECT SINGLE' statement as against a 'SELECT .... UP TO 1 ROWS' statement?

If you're considering the statements

 

Code:

  
SELECT SINGLE field INTO w_field FROM table.

and

 

Code:

  
SELECT field INTO w_field FROM table UP TO 1 ROWS. ENDSELECT.

then looking at the result, not much apart from the extra ENDSELECT statement. Look at the run time and memory usage and they may be worlds apart.

Why is this?? The answer is simple.

The 'SELECT SINGLE' statement selects the first row in the database that it finds that fulfils the 'WHERE' clause. If this results in multiple records then only the first one will be returned and therefore may not be unique.

The 'SELECT .... UP TO 1 ROWS' statement is subtly different. The database selects all of the relevant records that are defined by the WHERE clause or lack of, applies any aggregate, ordering or grouping functions to them and then returns the first record of the resultant result set.

Get the difference ??

If not, then create a Ztable called ZDifference with 2 fields in it, MANDT of type MANDT and POSNR of type POSNR. Make sure both of these are keys. Also create a table maintenance dialog for it (SE11->Utilities->Table Maintenance Generator). Fill the table with ten rows 000001-000010.

Then run the program shown below:

 

Code:

  
************************************************************************ * * Program: Z_Difference * * Purpose: A program that demonstrates the difference * between SELECT SINGLE and SELECT UP TO n ROWS. * * This program requires the data table Z_DIFFERENCE * to have been created according to the structure * outlined in the text above and populated with * at least 10 records. * * Creation Date: 21/04/2004 * * Requested By: * * Reference Doc: * * Author: R Harper * * Modification History: * * Date Reason Transport Who * ************************************************************************ Report Z_Difference Message-id 38 Line-Size 80 Line-Count 0 No Standard Page Heading. * Start-Of-Selection. Data: w_Single type Posnr, t_Rows type standard table of Posnr initial size 0 with header line. * Select single Posnr from zDifference into w_Single. * Select Posnr into table t_Rows from zDifference up to 1 rows order by Posnr descending. * Write :/ 'Select single:', w_Single. Skip 1. Write :/ 'Up to 1 rows :'. Loop at t_Rows. Write t_Rows. EndLoop.

You should see the output:

 

Code:

  
Select single: 000001 Up to 1 rows : 000010

The first 'SELECT' statement has selected the first record in the database according to any selection criteria in the 'WHERE' clause. This is what a 'SELECT SINGLE' does. The second 'SELECT' has asked the database to reverse the order of the records before returning the first row of the result.

In order to be able to do this the database has read the entire table, sort it and then return the first record. If there was no ORDER BY clause then the results would have been identical (i.e. both '000001') but the second select if given a big enough table to look at would be far slower.

Now.

This causes a problem in the Extended Program Check in that if the full key is not specified in a 'SELECT SINGLE' you get a message like this:

 

Quote:
Program: Z_DIFFERENCE Line : 39
Syntax check warning
This warning is only displayed in SLIN.
Select single Posnr
^
Messages:
In "SELECT SINGLE ...", the WHERE condition for the key field "POSNR" does not test
for equality. Therefore, the single record you are searching for may not be
unique.

If you haven't specified a full key and your QA person is complaining that your Extended Check has warnings tell him

"Yes. I can get rid of the warning but the program will run slower and consume more memory."

You could always tell him to "Get Lost" but it's always better to have a valid reason before you do that!

Having said that, not long after I posted this article, ChristianF sent me a text.

The basic gist of this was that the comparison between the two select statements above is unfair.

“In both cases, the way the record is found on the database level is the same and in both cases the number of rows to be selected is known at the database level. Therefore in both cases the database stops after the first found record”

Christian says that the described behaviour or at least a similar behaviour can be watched on the following statement:

 

Code:

  
SELECT field INTO w_field FROM table. Exit. ENDSELECT.

He goes on to say:

“Here the result of the database is transferred back in 30k blocks and then transferred to the application server linewise. So even for larger tables at least 10 or more records are transferred (and maybe even more searched on a database level) where only one is required.”

Another point raised is that you cannot use aggregations in a select single statement, and the “Order” clause is causing them to act differently. I would say that this article is attempting to answer the question “What is the difference between SELECT SINGLE and UP TO 1 Rows”, therefore I think these pertinent.

Thanks to Christian for a lower level insight into the workings of SELECT UP TO 1 ROWS!

转载于:https://www.cnblogs.com/wequst/archive/2009/06/30/1513762.html

以下代码哪里定义了查询功能: *&---------------------------------------------------------------------* *& REPORT ZPM_YZ_BPBJLONG3 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT zmal. TABLES:zqm_wlz_yz,makt,mara,zmal,zpm_cs_mal_st. DATA ok_code TYPE sy-ucomm . DATA save_ok TYPE sy-ucomm . CLASS lcl_application DEFINITION DEFERRED . DATA custom_container TYPE REF TO cl_gui_custom_container . DATA gcontainer TYPE REF TO cl_gui_custom_container . DATA tree_control TYPE REF TO cl_gui_simple_tree . DATA grid TYPE REF TO cl_gui_alv_grid . DATA gs_layout TYPE lvc_s_layo. DATA gt_fieldcat TYPE STANDARD TABLE OF lvc_s_fcat . DATA gw_fieldcat LIKE LINE OF gt_fieldcat . DATA node_table LIKE TABLE OF mtreesnode . DATA node1 TYPE mtreesnode . DATA: BEGIN OF st_vbak OCCURS 0, matkl LIKE zqm_wlz_yz-matkl, num1 LIKE zqm_wlz_yz-num1, num2 LIKE zqm_wlz_yz-num2, num3 LIKE zqm_wlz_yz-num3, num(1) , END OF st_vbak. DATA: n1 LIKE zqm_wlz_yz-num1, n2 LIKE zqm_wlz_yz-num2, n3 LIKE zqm_wlz_yz-num3. DATA:t_vbak LIKE st_vbak OCCURS 0 WITH HEADER LINE. DATA:w_vbak LIKE t_vbak OCCURS 0 WITH HEADER LINE. DATA g_application TYPE REF TO lcl_application . **************************************************************************************** *ALV用到的类库 TYPE-POOLS:slis. DATA: wa_alv_filed TYPE slis_fieldcat_alv, "列描述 wa_alv_filedcat TYPE slis_t_fieldcat_alv. "列描述内表,列清单 DATA: BEGIN OF mdezx OCCURS 0. INCLUDE STRUCTURE mdez. DATA: END OF mdezx. DATA: BEGIN OF mdpsx OCCURS 0. INCLUDE STRUCTURE mdps. DATA: END OF mdpsx. DATA: BEGIN OF mdsux OCCURS 0. INCLUDE STRUCTURE mdsu. DATA: END OF mdsux. DATA: BEGIN OF i_zqm OCCURS 0. INCLUDE STRUCTURE zqm_wlz_yz. DATA: END OF i_zqm. DATA:BEGIN OF itabb OCCURS 0, edmxcdm(30) TYPE c, edmxcsm(20) TYPE c, ztext(30) TYPE c, box TYPE char01, END OF itabb. * DATA: BEGIN OF t_zmal OCCURS 0, matnr LIKE mard-matnr, "物料号 tlines LIKE zmal-tlines, "物料描述 mtart LIKE mara-mtart, "物料类型 matkl LIKE mara-matkl, lgort LIKE mard-lgort, " 库存地点 bismt LIKE mara-bismt, "库格 meins LIKE mara-meins, "单位 eisbe LIKE marc-eisbe, "安全库存 labst LIKE mard-labst, "非限制库存 open_po LIKE mdez-mng01, "在途库存 bstmi LIKE marc-bstmi, "最小采购量 bstfe LIKE marc-bstfe, "固定采购量 bdmng LIKE resb-bdmng, labst1 LIKE mard-labst, werks LIKE mard-werks, END OF t_zmal. DATA:BEGIN OF z_mal OCCURS 0, matnr LIKE zpm_yz_mal_st-matnr, lgort LIKE zpm_yz_mal_st-lgort, werks LIKE zpm_yz_mal_st-werks, bismt LIKE zpm_yz_mal_st-bismt, END OF z_mal. DATA:t_zmal1 LIKE t_zmal OCCURS 0 WITH HEADER LINE. DATA t_vbap LIKE STANDARD TABLE OF t_zmal. DATA: v_vbap LIKE LINE OF t_vbap. DATA: zmatnr TYPE zpm_yz_mal-matnr, ztlines TYPE zpm_yz_mal-tlines, zkw TYPE mard-lgort, zkg TYPE zpm_yz_mal_st-bismt. DATA: ztlines1 TYPE zmal-tlines. DATA: ztlines2 TYPE zmal-tlines. DATA: ztlines3 TYPE zmal-tlines. DATA: zkg1 LIKE zpm_yz_mal_st-bismt. DATA: zkg2 LIKE zpm_yz_mal_st-bismt. DATA: zkg3 LIKE zpm_yz_mal_st-bismt. DATA:i1(1),i2(1),i3(1). DATA:fxk01(1). *----------------------------------------------------------------------* * CLASS LCL_APPLICATION DEFINITION *----------------------------------------------------------------------* **----------------------------------------------------------------------* CLASS lcl_application DEFINITION . PUBLIC SECTION . METHODS handle_selection_changed FOR EVENT selection_changed OF cl_gui_simple_tree IMPORTING node_key . ENDCLASS . "LCL_APPLICATION DEFINITION *----------------------------------------------------------------------* * CLASS LCL_APPLICATION IMPLEMENTATION *------------------------------------------ *----------------------------* * *----------------------------------------------------------------------* CLASS lcl_application IMPLEMENTATION . METHOD handle_selection_changed . READ TABLE node_table WITH KEY node_key = node_key INTO node1 . PERFORM get_data_grid USING node_key node1-relatkey node1-n_image. CALL METHOD grid->refresh_table_display. ENDMETHOD . "HANDLE_SELECTION_CHANGED ENDCLASS . "LCL_APPLICATION IMPLEMENTATION * SELECTION-SCREEN BEGIN OF BLOCK A WITH FRAME TITLE TEXT-001 . * PARAMETERS P_VKORG TYPE TVKOT-VKORG OBLIGATORY DEFAULT '2030'. * PARAMETERS P_VTWEG TYPE TVTWT-VTWEG OBLIGATORY DEFAULT '11'. * SELECTION-SCREEN END OF BLOCK A . START-OF-SELECTION . PERFORM get_data . CREATE OBJECT g_application. CALL SCREEN 0100 . *----------------------------------------------------------------------* * MODULE STATUS_0100 OUTPUT *----------------------------------------------------------------------* * *------------ *----------------------------------------------------------* MODULE status_0100 OUTPUT . SET PF-STATUS '0100'. IF tree_control IS INITIAL. PERFORM create_tree . ENDIF. ENDMODULE . "STATUS_0100 OUTPUT *----------------------------------------------------------------------* * MODULE USER_COMMAND_0100 INPUT *----------------------------------------------------------------------* * *----------------------------------------------------------------------* MODULE user_command_0100 INPUT . save_ok = ok_code . CLEAR ok_code . CASE save_ok. WHEN 'BACK'. SET SCREEN 0. * CLEAR ITABB. * FREE ITABB. WHEN 'EXIT'. LEAVE PROGRAM. WHEN OTHERS. ENDCASE. ENDMODULE . "USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------**& FORM *CREATE_TREE *&---------------------------------------------------------------------* * TEXT *----------------------------------------------------------------------* * --> P1 TEXT * <-- P2 TEXT *----------------------------------------------------------------------* FORM create_tree . DATA events TYPE cntl_simple_events . DATA event1 TYPE cntl_simple_event . DATA num(1). DATA num1 LIKE zqm_wlz_yz-num1 . DATA num2 LIKE zqm_wlz_yz-num2 . DATA num3 LIKE zqm_wlz_yz-num3 . DATA matkl LIKE zqm_wlz_yz-matkl . DATA l_txt LIKE zqm_wlz_yz-txt1. DATA l_txt1 LIKE zqm_wlz_yz-txt1. DATA l_txt2 LIKE zqm_wlz_yz-txt2 . DATA l_txt3 LIKE zqm_wlz_yz-txt3 . DATA str1(255) . CREATE OBJECT custom_container EXPORTING container_name = 'TREE'. CREATE OBJECT tree_control EXPORTING parent = custom_container node_selection_mode = cl_gui_simple_tree=>node_sel_mode_single. CREATE OBJECT gcontainer EXPORTING container_name = 'GCONTAINER'. CREATE OBJECT grid EXPORTING i_parent = gcontainer. PERFORM frm_write_data. gs_layout-grid_title = '物料显示' . * GS_LAYOUT-CWIDTH_OPT = 'X' . gs_layout-zebra = 'X' . * CONCATENATE P_VKORG P_VTWEG INTO NODE1-NODE_KEY . * NODE1-RELATKEY = P_VKORG . PERFORM get_data_grid USING node1-node_key node1-relatkey node1-n_image . * CALL METHOD grid->set_table_for_first_display EXPORTING is_layout = gs_layout CHANGING it_fieldcatalog = gt_fieldcat it_outtab = t_vbap. LOOP AT t_vbak INTO w_vbak. CLEAR l_txt . CLEAR l_txt1 . CLEAR l_txt2 . CLEAR l_txt3 . l_txt = '物料分类'. *-----ECCUpgradeS4--------AB_ZACK--------20221028--------START * SELECT SINGLE * txt1 * INTO l_txt1 * FROM zqm_wlz_yz * WHERE num1 = w_vbak-num1 . * * SELECT SINGLE * txt2 * INTO l_txt2 * FROM zqm_wlz_yz * WHERE num1 = w_vbak-num1 AND num2 = w_vbak-num2. * SELECT SINGLE * txt3 * INTO l_txt3 * FROM zqm_wlz_yz * WHERE num1 = w_vbak-num1 AND num2 = w_vbak-num2 AND num3 = w_vbak-num3. SELECT txt1 INTO l_txt1 FROM zqm_wlz_yz UP TO 1 ROWS WHERE num1 = w_vbak-num1 ORDER BY PRIMARY KEY.ENDSELECT. SELECT txt2 INTO l_txt2 FROM zqm_wlz_yz UP TO 1 ROWS WHERE num1 = w_vbak-num1 AND num2 = w_vbak-num2 ORDER BY PRIMARY KEY. ENDSELECT. SELECT txt3 INTO l_txt3 FROM zqm_wlz_yz UP TO 1 ROWS WHERE num1 = w_vbak-num1 AND num2 = w_vbak-num2 AND num3 = w_vbak-num3 ORDER BY PRIMARY KEY. ENDSELECT. *-----ECCUpgradeS4--------ABA_ZACK--------20221028--------END "在创建根节点的同时需要创建下级以及次级子节点 IF num NE w_vbak-num . CLEAR node1 . node1-node_key = w_vbak-num . "FIRST LAYER CLEAR node1-relatkey . CLEAR node1-relatship . "SET THE ICON AS FOLDER node1-hidden = '' . node1-disabled = '' . node1-isfolder = 'X' . "CLEAR THE ICON OF THE NODE CLEAR node1-n_image . CLEAR node1-exp_image . node1-expander = 'X'. * NODE1-TEXT = L_TXT1 . node1-text = l_txt . APPEND node1 TO node_table . ************************************************************** CLEAR node1 . CONCATENATE w_vbak-num w_vbak-num1 INTO node1-node_key . node1-relatkey = w_vbak-num . node1-relatship = cl_gui_simple_tree=>relat_last_child . node1-hidden = '' . node1-disabled = '' . node1-isfolder = 'X' . CLEAR node1-n_image . CLEAR node1-exp_image . node1-expander = 'X'. "DISPLAY THE NODE VTWEG * NODE1-TEXT = L_TXT2 . CONCATENATE w_vbak-num1 l_txt1 INTO node1-text . APPEND node1 TO node_table . ************************************************************************** CLEAR node1 . CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 INTO node1-node_key . CONCATENATE w_vbak-num w_vbak-num1 INTO str1 . node1-relatkey = str1 . node1-relatship = cl_gui_simple_tree=>relat_last_child . node1-hidden = '' . node1-disabled = '' . node1-isfolder = 'X' . CLEAR node1-n_image . CLEAR node1-exp_image . node1-expander = 'X'. "DISPLAY THE NODE VTWEG * NODE1-TEXT = L_TXT2 . CONCATENATE w_vbak-num2 l_txt2 INTO node1-text . APPEND node1 TO node_table . ************************************************************************ CLEAR node1 . CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 w_vbak-num3 INTO node1-node_key. CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 INTO str1 . node1-relatkey = str1 . node1-relatship = cl_gui_simple_tree=>relat_last_child . node1-hidden = '' . node1-disabled = '' . node1-isfolder = 'X' . node1-n_image = '@5B@' . node1-exp_image = '@5B@' . node1-expander = 'X'. * NODE1-TEXT = W_VBAK-NUM3 . CONCATENATE w_vbak-num3 l_txt3 INTO node1-text . APPEND node1 TO node_table . ENDIF. "在创建次级节点的同时需要创建其字节点 IF ( num = w_vbak-num ) AND ( num1 <> w_vbak-num1 ). CLEAR node1 . CONCATENATE w_vbak-num w_vbak-num1 INTO node1-node_key . node1-relatkey = w_vbak-num . node1-relatship = cl_gui_simple_tree=>relat_last_child . node1-hidden = '' . node1-disabled = '' . node1-isfolder = 'X' . CLEAR node1-n_image . CLEAR node1-exp_image . node1-expander = 'X'. "DISPLAY THE NODE VTWEG * NODE1-TEXT = L_TXT2 . CONCATENATE w_vbak-num1 l_txt1 INTO node1-text . APPEND node1 TO node_table . ************************************************************************** CLEAR node1 . CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 INTO node1-node_key . CONCATENATE w_vbak-num w_vbak-num1 INTO str1 . node1-relatkey = str1 . node1-relatship = cl_gui_simple_tree=>relat_last_child . node1-hidden = '' . node1-disabled = '' . node1-isfolder = 'X' . CLEAR node1-n_image . CLEAR node1-exp_image . node1-expander = 'X'. "DISPLAY THE NODE VTWEG * NODE1-TEXT = L_TXT2 . CONCATENATE w_vbak-num2 l_txt2 INTO node1-text . APPEND node1 TO node_table . ************************************************************************ CLEAR node1 . CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 w_vbak-num3 INTO node1-node_key. CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 INTO str1 . node1-relatkey = str1 . node1-relatship = cl_gui_simple_tree=>relat_last_child . node1-hidden = '' . node1-disabled = '' . node1-isfolder = 'X' . node1-n_image = '@5B@' . node1-exp_image = '@5B@' . node1-expander = 'X'. * NODE1-TEXT = W_VBAK-NUM3 . CONCATENATE w_vbak-num3 l_txt3 INTO node1-text . APPEND node1 TO node_table . ENDIF. "在创建次级节点的同时需要创建其字节点 IF ( num = w_vbak-num ) AND ( num1 = w_vbak-num1 ) AND num2 <> w_vbak-num2. CLEAR node1 . CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 INTO node1-node_key . CONCATENATE w_vbak-num w_vbak-num1 INTO str1 . node1-relatkey = str1 . node1-relatship = cl_gui_simple_tree=>relat_last_child . node1-hidden = '' . node1-disabled = '' . node1-isfolder = 'X' . CLEAR node1-n_image . CLEAR node1-exp_image . node1-expander = 'X'. "DISPLAY THE NODE VTWEG * NODE1-TEXT = L_TXT2 . CONCATENATE w_vbak-num2 l_txt2 INTO node1-text . APPEND node1 TO node_table . ************************************************************************ CLEAR node1 . CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 w_vbak-num3 INTO node1-node_key. CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 INTO str1 . node1-relatkey = str1 . node1-relatship = cl_gui_simple_tree=>relat_last_child . node1-hidden = '' . node1-disabled = '' . node1-isfolder = 'X' . node1-n_image = '@5B@' . node1-exp_image = '@5B@' . node1-expander = 'X'. * NODE1-TEXT = W_VBAK-NUM3 . CONCATENATE w_vbak-num3 l_txt3 INTO node1-text . APPEND node1 TO node_table . ENDIF. IF ( num = w_vbak-num ) AND ( num1 = w_vbak-num1 ) AND num2 = w_vbak-num2 AND num3 <> w_vbak-num3. CLEAR node1 . CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 w_vbak-num3 INTO node1-node_key. CONCATENATE w_vbak-num w_vbak-num1 w_vbak-num2 INTO str1 . node1-relatkey = str1 . node1-relatship = cl_gui_simple_tree=>relat_last_child . node1-hidden = '' . node1-disabled = '' . node1-isfolder = 'X' . node1-n_image = '@5B@' . node1-exp_image = '@5B@' . node1-expander = 'X'. * NODE1-TEXT = W_VBAK-NUM3 . CONCATENATE w_vbak-num3 l_txt3 INTO node1-text . APPEND node1 TO node_table . ENDIF. num = w_vbak-num. num1 = w_vbak-num1 . num2 = w_vbak-num2 . num3 = w_vbak-num3 . matkl = w_vbak-matkl . ENDLOOP. CALL METHOD tree_control->add_nodes EXPORTING table_structure_name = 'MTREESNODE' node_table = node_table EXCEPTIONS error_in_node_table = 1 failed = 2 dp_error = 3 table_structure_name_not_found = 4 OTHERS = 5. * EVENT1-EVENTID = CL_GUI_SIMPLE_TREE=>EVENTID_NODE_DOUBLE_CLICK . * EVENT1-APPL_EVENT = 'X' . * APPEND EVENT1 TO EVENTS . event1-eventid = 21 . event1-appl_event = 'X' . APPEND event1 TO events . CALL METHOD tree_control->set_registered_events EXPORTING events = events EXCEPTIONS cntl_error = 1 cntl_system_error = 2 illegal_event_combination = 3 OTHERS = 4. SET HANDLER g_application->handle_selection_changed FOR tree_control . ENDFORM. " CREATE_TREE *316 *&---------------------------------------------------------------------* *317 *& FORM GET_DATA *318 *&---------------------------------------------------------------------* *319 * TEXT *320 *----------------------------------------------------------------------* *321 * --> P1 TEXT *322 * <-- P2 TEXT *323 *----------------------------------------------------------------------* FORM get_data . SELECT matkl num1 num2 num3 INTO TABLE t_vbak FROM zqm_wlz_yz . IF sy-subrc = 0. LOOP AT t_vbak. t_vbak-num = '1'. MODIFY t_vbak. ENDLOOP. ENDIF. SORT t_vbak BY num matkl . ENDFORM. " GET_DATA *336 *&---------------------------------------------------------------------* *337 *& FORM GET_DATA_GRID *338 *&---------------------------------------------------------------------* *339 * TEXT *340 *----------------------------------------------------------------------* *341 * -->P_NODEKEY TEXT *342 *----------------------------------------------------------------------* FORM get_data_grid USING p_nodekey p_relatkey p_image. DATA: n1 LIKE zqm_wlz_yz-num1, n2 LIKE zqm_wlz_yz-num2, n3 LIKE zqm_wlz_yz-num3. DATA: l_len1 TYPE i. DATA: l_len2 TYPE i. DATA: l_len3 TYPE i. DATA: l_len11 TYPE i. DATA: l_len22 TYPE i. DATA:l1 LIKE node1-relatkey. DATA:l2 LIKE node1-node_key. DATA: dynpfields TYPE TABLE OF dynpread WITH HEADER LINE. CLEAR:zkg1,zkg2,zkg3,ztlines1,ztlines2,ztlines3. CLEAR: dynpfields, dynpfields[]. dynpfields-fieldname = 'ZKW'. "填入需要读值的字段名 APPEND dynpfields. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-repid dynumb = sy-dynnr translate_to_upper = 'X' TABLES dynpfields = dynpfields EXCEPTIONS OTHERS = 9. IF sy-subrc = 0. READ TABLE dynpfields WITH KEY fieldname = 'ZKW'. zkw = dynpfields-fieldvalue. "备注 ENDIF. CLEAR: dynpfields, dynpfields[]. dynpfields-fieldname = 'ZTLINES'. "填入需要读值的字段名 APPEND dynpfields. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-repid dynumb = sy-dynnr translate_to_upper = 'X' TABLES dynpfields = dynpfields EXCEPTIONS OTHERS = 9. IF sy-subrc = 0. READ TABLE dynpfields WITH KEY fieldname = 'ZTLINES'. ztlines = dynpfields-fieldvalue. "备注 ENDIF. IF p_nodekey = '1' AND p_relatkey = ''. p_nodekey = ''. IF zmatnr <> ''. SELECT mard~matnr "物料号 mara~mtart "物料类型 mard~lgort " 库存地点 mara~meins "单位 mara~matkl "物料组 marc~eisbe "安全库存 marc~bstmi "最小采购量 marc~bstfe "固定采购量 mard~labst "非限制库存 mara~bismt "库格 mard~werks INTO CORRESPONDING FIELDS OF TABLE t_zmal FROM mard INNER JOIN marc ON marc~matnr = mard~matnr AND marc~werks = mard~werks INNER JOIN mara ON mara~matnr = mard~matnr " INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL WHERE ( mard~werks = '1011' OR ( mard~werks = '1010' AND mard~lgort = 'EL01' ) ) AND mara~mstae <> '01' "AND MARA~MTART = 'ERSA' "and ( mard~lgort = 'WL01' or mard~lgort = 'MT01') AND mara~matkl <> '' AND mard~matnr = zmatnr. LOOP AT t_zmal. IF t_zmal-matkl(1) = 'S' . t_zmal-matkl+0(1) = '0'. MODIFY t_zmal. ENDIF. ENDLOOP. LOOP AT t_zmal. READ TABLE t_vbak WITH KEY matkl = t_zmal-matkl. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDLOOP. * SELECT MARA~MATNR * MARA~MTART * MARA~BISMT * MARA~MEINS * INTO CORRESPONDING FIELDS OF TABLE T_ZMAL * FROM MARC * INNER JOIN MARA ON MARA~MATNR = MARC~MATNR * INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL * WHERE MARC~WERKS = '7010' AND MARA~MSTAE <> '01' AND MARA~MTART = 'ERSA' * AND MARA~MATKL <> '' AND MARA~MATNR = ZMATNR. ELSE. SELECT mard~matnr "物料号 mara~mtart "物料类型 mard~lgort " 库存地点 mara~meins "单位 mara~matkl "物料组 marc~eisbe "安全库存 marc~bstmi "最小采购量 marc~bstfe "固定采购量 mard~labst "非限制库存 mara~bismt "库格 mard~werks INTO CORRESPONDING FIELDS OF TABLE t_zmal FROM mard INNER JOIN marc ON marc~matnr = mard~matnr AND marc~werks = mard~werks INNER JOIN mara ON mara~matnr = mard~matnr " INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL WHERE ( mard~werks = '1011' OR ( mard~werks = '1010' AND mard~lgort = 'EL01' ) ) AND mara~mstae <> '01' AND mara~mtart = 'ERSA' " and ( mard~lgort = 'WL01' or mard~lgort = 'MT01' ) AND mara~matkl <> ''. LOOP AT t_zmal. IF t_zmal-matkl(1) = 'S' . t_zmal-matkl+0(1) = '0'. MODIFY t_zmal. ENDIF. ENDLOOP. LOOP AT t_zmal. READ TABLE t_vbak WITH KEY matkl = t_zmal-matkl. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDLOOP. " SELECT MARA~MATNR " MARA~MTART " MARA~BISMT " MARA~MEINS " INTO CORRESPONDING FIELDS OF TABLE T_ZMAL " FROM MARC " INNER JOIN MARA ON MARA~MATNR = MARC~MATNR " INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL " WHERE MARC~WERKS = '7010' AND MARA~MSTAE <> '01' AND MARA~MTART = 'ERSA' " AND MARA~MATKL <> '' . ENDIF. ELSEIF p_relatkey <> ''. l_len11 = strlen( p_relatkey ) . l_len11 = l_len11 - 1. IF l_len11 <= 0. l1 = ''. ELSE. l1 = p_relatkey+1(l_len11). ENDIF. p_relatkey = l1. l_len22 = strlen( p_nodekey ). l_len22 = l_len22 - 1. IF l_len22 <= 0. l2 = ''. ELSE. l2 = p_nodekey+1(l_len22). ENDIF. p_nodekey = l2. ENDIF. IF p_nodekey = '' AND p_relatkey = '' AND p_image = ''. * SELECT MARA~MATNR * MARA~MTART * MARA~BISMT * MARA~MEINS * INTO CORRESPONDING FIELDS OF TABLE T_ZMAL * FROM MARC * INNER JOIN MARA ON MARA~MATNR = MARC~MATNR * INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL * WHERE MARC~WERKS = '' * AND MARA~MATKL <> ''. ELSEIF p_relatkey IS INITIAL AND p_nodekey <> ''. IF zmatnr <> ''. SELECT mard~matnr "物料号 mara~mtart "物料类型 mard~lgort " 库存地点 mara~meins "单位 mara~matkl "物料组 marc~eisbe "安全库存 marc~bstmi "最小采购量 marc~bstfe "固定采购量 mard~labst "非限制库存 mara~bismt "库格 mard~werks INTO CORRESPONDING FIELDS OF TABLE t_zmal FROM mard INNER JOIN marc ON marc~matnr = mard~matnr AND marc~werks = mard~werks INNER JOIN mara ON mara~matnr = mard~matnr " INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL WHERE ( mard~werks = '1011' OR ( mard~werks = '1010' AND mard~lgort = 'EL01' ) ) AND mara~mstae <> '01' AND mara~mtart = 'ERSA' " and ( mard~lgort = 'WL01' or mard~lgort = 'MT01' ) " AND ZQM_WLZ_YZ~NUM1 = P_NODEKEY AND mara~matkl <> '' AND mard~matnr = zmatnr. LOOP AT t_zmal. IF t_zmal-matkl(1) = 'S' . t_zmal-matkl+0(1) = '0'. MODIFY t_zmal. ENDIF. ENDLOOP. LOOP AT t_zmal. READ TABLE t_vbak WITH KEY matkl = t_zmal-matkl num1 = p_nodekey. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDLOOP. * SELECT MARA~MATNR * MARA~MTART * MARA~BISMT * MARA~MEINS * INTO CORRESPONDING FIELDS OF TABLE T_ZMAL * FROM MARC * INNER JOIN MARA ON MARA~MATNR = MARC~MATNR * INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL * WHERE MARC~WERKS = '7010' AND MARA~MSTAE <> '01' AND MARA~MTART = 'ERSA' * AND MARA~MATNR = ZMATNR * AND ZQM_WLZ_YZ~NUM1 = P_NODEKEY * AND MARA~MATKL <> ''. ELSE. SELECT mard~matnr "物料号 mara~mtart "物料类型 mard~lgort " 库存地点 mara~meins "单位 mara~matkl "物料组 marc~eisbe "安全库存 marc~bstmi "最小采购量 marc~bstfe "固定采购量 mard~labst "非限制库存 mara~bismt "库格 mard~werks INTO CORRESPONDING FIELDS OF TABLE t_zmal FROM mard INNER JOIN marc ON marc~matnr = mard~matnr AND marc~werks = mard~werks INNER JOIN mara ON mara~matnr = mard~matnr " INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL WHERE ( mard~werks = '1011' OR ( mard~werks = '1010' AND mard~lgort = 'EL01' ) ) AND mara~mstae <> '01' AND mara~mtart = 'ERSA' " and ( mard~lgort = 'WL01' or mard~lgort = 'MT01' ) " AND ZQM_WLZ_YZ~NUM1 = P_NODEKEY AND mara~matkl <> '' . LOOP AT t_zmal. IF t_zmal-matkl(1) = 'S' . t_zmal-matkl+0(1) = '0'. MODIFY t_zmal. ENDIF. ENDLOOP. LOOP AT t_zmal. READ TABLE t_vbak WITH KEY matkl = t_zmal-matkl num1 = p_nodekey. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDLOOP. * SELECT MARA~MATNR * MARA~MTART * MARA~BISMT * MARA~MEINS * INTO CORRESPONDING FIELDS OF TABLE T_ZMAL * FROM MARC * INNER JOIN MARA ON MARA~MATNR = MARC~MATNR * INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL * WHERE MARC~WERKS = '7010' AND MARA~MSTAE <> '01' AND MARA~MTART = 'ERSA' AND * ZQM_WLZ_YZ~NUM1 = P_NODEKEY * AND MARA~MATKL <> ''. ENDIF. ELSE. IF p_image IS INITIAL. l_len1 = strlen( p_nodekey ). l_len2 = strlen( p_relatkey ). l_len3 = l_len1 - l_len2. n1 = p_nodekey+l_len2(l_len3). IF zmatnr <> ''. SELECT mard~matnr "物料号 mara~mtart "物料类型 mard~lgort " 库存地点 mara~meins "单位 mara~matkl "物料组 marc~eisbe "安全库存 marc~bstmi "最小采购量 marc~bstfe "固定采购量 mard~labst "非限制库存 mara~bismt "库格 mard~werks INTO CORRESPONDING FIELDS OF TABLE t_zmal FROM mard INNER JOIN marc ON marc~matnr = mard~matnr AND marc~werks = mard~werks INNER JOIN mara ON mara~matnr = mard~matnr " INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL WHERE ( mard~werks = '1011' OR ( mard~werks = '1010' AND mard~lgort = 'EL01' ) ) AND mara~mstae <> '01' AND mara~mtart = 'ERSA' " and ( mard~lgort = 'WL01' or mard~lgort = 'MT01' ) " AND ZQM_WLZ_YZ~NUM1 = P_RELATKEY " AND ZQM_WLZ_YZ~NUM2 = N1 AND mara~matkl <> '' AND mard~matnr = zmatnr. LOOP AT t_zmal. IF t_zmal-matkl(1) = 'S' . t_zmal-matkl+0(1) = '0'. MODIFY t_zmal. ENDIF. ENDLOOP. LOOP AT t_zmal. READ TABLE t_vbak WITH KEY matkl = t_zmal-matkl num1 = p_relatkey num2 = n1. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDLOOP. * SELECT MARA~MATNR * MARA~MTART * MARA~BISMT * MARA~MEINS * INTO CORRESPONDING FIELDS OF TABLE T_ZMAL * FROM MARC * INNER JOIN MARA ON MARA~MATNR = MARC~MATNR * INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL * WHERE MARC~WERKS = '7010' AND MARA~MSTAE <> '01' AND MARA~MTART = 'ERSA' AND * MARA~MATNR = ZMATNR AND * ZQM_WLZ_YZ~NUM1 = P_RELATKEY * AND ZQM_WLZ_YZ~NUM2 = N1 * AND MARA~MATKL <> ''. ELSE. SELECT mard~matnr "物料号 mara~mtart "物料类型 mard~lgort " 库存地点 mara~meins "单位 mara~matkl "物料组 marc~eisbe "安全库存 marc~bstmi "最小采购量 marc~bstfe "固定采购量 mard~labst "非限制库存 mara~bismt "库格 mard~werks INTO CORRESPONDING FIELDS OF TABLE t_zmal FROM mard INNER JOIN marc ON marc~matnr = mard~matnr AND marc~werks = mard~werks INNER JOIN mara ON mara~matnr = mard~matnr " INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL WHERE ( mard~werks = '1011' OR ( mard~werks = '1010' AND mard~lgort = 'EL01' ) ) AND mara~mstae <> '01' AND mara~mtart = 'ERSA' " and ( mard~lgort = 'WL01' or mard~lgort = 'MT01' ) * AND ZQM_WLZ_YZ~NUM1 = P_RELATKEY * AND ZQM_WLZ_YZ~NUM2 = N1 AND mara~matkl <> ''. LOOP AT t_zmal. IF t_zmal-matkl(1) = 'S' . t_zmal-matkl+0(1) = '0'. MODIFY t_zmal. ENDIF. ENDLOOP. LOOP AT t_zmal. READ TABLE t_vbak WITH KEY matkl = t_zmal-matkl num1 = p_relatkey num2 = n1. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDLOOP. * SELECT MARA~MATNR * MARA~MTART * MARA~BISMT * MARA~MEINS * INTO CORRESPONDING FIELDS OF TABLE T_ZMAL * FROM MARC * INNER JOIN MARA ON MARA~MATNR = MARC~MATNR * INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL * WHERE MARC~WERKS = '7010' AND MARA~MSTAE <> '01' AND MARA~MTART = 'ERSA' AND * ZQM_WLZ_YZ~NUM1 = P_RELATKEY * AND ZQM_WLZ_YZ~NUM2 = N1 * AND MARA~MATKL <> ''. ENDIF. ELSE. IF zmatnr <> ''. SELECT mard~matnr "物料号 mara~mtart "物料类型 mard~lgort " 库存地点 mara~meins "单位 mara~matkl "物料组 marc~eisbe "安全库存 marc~bstmi "最小采购量 marc~bstfe "固定采购量 mard~labst "非限制库存 mara~bismt "库格 mard~werks INTO CORRESPONDING FIELDS OF TABLE t_zmal FROM mard INNER JOIN marc ON marc~matnr = mard~matnr AND marc~werks = mard~werks INNER JOIN mara ON mara~matnr = mard~matnr " INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL WHERE ( mard~werks = '1011' OR ( mard~werks = '1010' AND mard~lgort = 'EL01' ) ) AND mara~mstae <> '01' AND mara~mtart = 'ERSA' " and ( mard~lgort = 'WL01' or mard~lgort = 'MT01' ) " AND ZQM_WLZ_YZ~MATKL = P_NODEKEY AND mara~matkl <> '' AND mard~matnr = zmatnr. LOOP AT t_zmal. IF t_zmal-matkl(1) = 'S' . t_zmal-matkl+0(1) = '0'. MODIFY t_zmal. ENDIF. ENDLOOP. LOOP AT t_zmal. READ TABLE t_vbak WITH KEY matkl = t_zmal-matkl . IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDLOOP. LOOP AT t_zmal. IF t_zmal-matkl <> p_nodekey. DELETE t_zmal. ENDIF. ENDLOOP. * SELECT MARA~MATNR * MARA~MTART * MARA~BISMT * MARA~MEINS * INTO CORRESPONDING FIELDS OF TABLE T_ZMAL * FROM MARC * INNER JOIN MARA ON MARA~MATNR = MARC~MATNR * INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL * WHERE MARC~WERKS = '7010' AND MARA~MSTAE <> '01' AND MARA~MTART = 'ERSA' AND * MARA~MATNR = ZMATNR AND * ZQM_WLZ_YZ~MATKL = P_NODEKEY * AND MARA~MATKL <> ''. ELSE. SELECT mard~matnr "物料号 mara~mtart "物料类型 mard~lgort " 库存地点 mara~meins "单位 mara~matkl "物料组 marc~eisbe "安全库存 marc~bstmi "最小采购量 marc~bstfe "固定采购量 mard~labst "非限制库存 mara~bismt "库格 mard~werks INTO CORRESPONDING FIELDS OF TABLE t_zmal FROM mard INNER JOIN marc ON marc~matnr = mard~matnr AND marc~werks = mard~werks INNER JOIN mara ON mara~matnr = mard~matnr " INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL WHERE ( mard~werks = '1011' OR ( mard~werks = '1010' AND mard~lgort = 'EL01' ) ) AND mara~mstae <> '01' AND mara~mtart = 'ERSA' " and ( mard~lgort = 'WL01' or mard~lgort = 'MT01') " AND ZQM_WLZ_YZ~MATKL = P_NODEKEY AND mara~matkl <> '' . LOOP AT t_zmal. IF t_zmal-matkl(1) = 'S' . t_zmal-matkl+0(1) = '0'. MODIFY t_zmal. ENDIF. ENDLOOP. LOOP AT t_zmal. READ TABLE t_vbak WITH KEY matkl = t_zmal-matkl. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDLOOP. LOOP AT t_zmal. IF t_zmal-matkl <> p_nodekey. DELETE t_zmal. ENDIF. ENDLOOP. * SELECT MARA~MATNR * MARA~MTART * MARA~BISMT * MARA~MEINS * * INTO CORRESPONDING FIELDS OF TABLE T_ZMAL * FROM MARC * INNER JOIN MARA ON MARA~MATNR = MARC~MATNR * INNER JOIN ZQM_WLZ_YZ ON ZQM_WLZ_YZ~MATKL = MARA~MATKL * WHERE MARC~WERKS = '7010' AND MARA~MSTAE <> '01' AND MARA~MTART = 'ERSA' AND * ZQM_WLZ_YZ~MATKL = P_NODEKEY * AND MARA~MATKL <> ''. ENDIF. ENDIF. ENDIF. IF zkw <> ''. LOOP AT t_zmal. IF t_zmal-lgort <> zkw. DELETE t_zmal. ENDIF. ENDLOOP. ENDIF. *LOOP AT T_ZMAL. * *SELECT MATNR * LGORT * WERKS * BISMT * INTO CORRESPONDING FIELDS OF TABLE Z_MAL * FROM ZPM_YZ_MAL_ST * WHERE WERKS = '1010' AND MATNR = T_ZMAL-MATNR AND LGORT = T_ZMAL-LGORT. * IF SY-SUBRC = 0. * LOOP AT Z_MAL . * IF T_ZMAL-BISMT = '' . * CONCATENATE '/' Z_MAL-BISMT INTO T_ZMAL-BISMT. * ELSE. * CONCATENATE T_ZMAL-BISMT '/' Z_MAL-BISMT INTO T_ZMAL-BISMT. * ENDIF. * * ENDLOOP. * MODIFY T_ZMAL. * ENDIF. * *ENDLOOP. IF zkg <> ''. LOOP AT t_zmal. SEARCH t_zmal-bismt FOR zkg. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDLOOP. ENDIF. * IF SY-SUBRC <> 0. * MESSAGE '此物料组没有对应的物料!' TYPE 'E'. * EXIT. * ENDIF. IF ztlines <> ''. SPLIT ztlines AT '*' INTO ztlines1 ztlines2 ztlines3. ENDIF. LOOP AT t_zmal. SELECT SINGLE tlines INTO t_zmal-tlines FROM zmal WHERE matnr = t_zmal-matnr. * AND TLINES IN S_TLINES. * SELECT SINGLE EISBE BSTMI BSTFE * INTO (T_ZMAL-EISBE,T_ZMAL-BSTMI,T_ZMAL-BSTFE) * FROM MARC * WHERE MATNR = T_ZMAL-MATNR * AND WERKS = '7010'. * * SELECT SINGLE LABST * INTO T_ZMAL-LABST * FROM MARD * WHERE MATNR = T_ZMAL-MATNR * AND WERKS = '7010' * AND ( LGORT = 'WL61' OR LGORT = 'MT61' OR LGORT = 'EL61' OR LGORT ='WL65' OR LGORT = 'WL66'). MODIFY t_zmal. ENDLOOP. i1 = 0.i2 = 0.i3 = 0. IF ztlines <> ''. LOOP AT t_zmal. IF ztlines1 <> ''. SEARCH t_zmal-tlines FOR ztlines1. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDIF. IF ztlines2 <> ''. SEARCH t_zmal-tlines FOR ztlines2. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDIF. IF ztlines3 <> ''. SEARCH t_zmal-tlines FOR ztlines3. IF sy-subrc <> 0. DELETE t_zmal. ENDIF. ENDIF. ENDLOOP. ENDIF. CLEAR t_zmal1.REFRESH t_zmal1. *LOOP AT T_ZMAL. *SELECT MATNR BISMT *INTO CORRESPONDING FIELDS OF TABLE Z_MAL *FROM ZPM_YZ_MAL *WHERE MATNR = T_ZMAL-MATNR. *IF SY-SUBRC = 0. *LOOP AT Z_MAL. *MOVE T_ZMAL TO T_ZMAL1. *T_ZMAL1-BISMT = Z_MAL-BISMT. *APPEND T_ZMAL1. *ENDLOOP. *ELSE. *MOVE T_ZMAL TO T_ZMAL1. *APPEND T_ZMAL1. *ENDIF. *ENDLOOP. *CLEAR T_ZMAL.REFRESH T_ZMAL. *LOOP AT T_ZMAL1. *MOVE T_ZMAL1 TO T_ZMAL. *APPEND T_ZMAL. *ENDLOOP. * *IF ZKG <> ''. *SPLIT ZKW AT '*' INTO ZKG1 ZKG2 ZKG3. *ENDIF. *LOOP AT T_ZMAL. *IF ZKW1 <> ''. *SEARCH T_ZMAL-BISMT FOR ZKW1. * IF SY-SUBRC <> 0. * DELETE T_ZMAL. *ENDLOOP.* ENDIF. *ENDIF. *IF ZKW2 <> ''. *SEARCH T_ZMAL-BISMT FOR ZKW2. * IF SY-SUBRC <> 0. * DELETE T_ZMAL. * ENDIF. *ENDIF. *IF ZKW3 <> ''. *SEARCH T_ZMAL-BISMT FOR ZKW3. * IF SY-SUBRC <> 0. * DELETE T_ZMAL. * ENDIF. *ENDIF. LOOP AT t_zmal . * PERFORM GET_MD04_DATA USING T_ZMAL-MATNR T_ZMAL-WERKS. * MOVE-CORRESPONDING ITAB0 TO I_OUT. * LOOP AT MDEZX WHERE PLAAB = '02'. * EXCESS = EXCESS + MDEZX-MNG01. "可用库存 * IF MDEZX-DELB0 = 'STOCK' OR MDEZX-DELKZ = 'QM'. * STOCK = STOCK + MDEZX-MNG01. "STOCK * ENDIF. * IF MDEZX-PLUMI = '-'. "DEMAND * TOTAL_DEMAND = TOTAL_DEMAND + MDEZX-MNG01 * -1. * ELSE. * IF MDEZX-DELKZ = 'LA' "SHIPPING NOTIFICATION * OR MDEZX-DELKZ = 'LE' "NORMAL PO * OR MDEZX-DELKZ = 'BE'. "SA SCHEDULE LINE * OPEN_PO = OPEN_PO + MDEZX-MNG01. "OPEN PO * ENDIF. * ENDIF * PERFORM GET_MD04_DATA USING T_ZMAL-MATNR '7010'. * DATA:OPEN_PO LIKE MDEZ-MNG01. * LOOP AT MDEZX WHERE PLAAB = '02'. * IF MDEZX-DELKZ = 'BA' "NORMAL PO * OR MDEZX-DELKZ = 'BE'. "SA SCHEDULE LINE * OPEN_PO = OPEN_PO + MDEZX-MNG01. "OPEN PO * ENDIF. * ENDLOOP. * MOVE: OPEN_PO TO T_ZMAL-OPEN_PO . * CLEAR: OPEN_PO. SELECT SINGLE labst INTO t_zmal-open_po FROM mard WHERE matnr = t_zmal-matnr AND lgort = t_zmal-bismt AND werks = t_zmal-werks. MODIFY t_zmal. ENDLOOP. DATA:zbismt LIKE zpm_cs_mal_st-bismt. LOOP AT t_zmal . CLEAR:zbismt. *-----ECCUpgradeS4--------AB_ZACK--------20221028--------START * SELECT SINGLE bismt INTO zbismt FROM zpm_cs_mal_st WHERE matnr = t_zmal-matnr . SELECT bismt INTO zbismt FROM zpm_cs_mal_st UP TO 1 ROWS WHERE matnr = t_zmal-matnr ORDER BY PRIMARY KEY.ENDSELECT. *-----ECCUpgradeS4--------ABA_ZACK--------20221028--------END IF sy-subrc = 0 . t_zmal-bismt = zbismt. MODIFY t_zmal. ENDIF. ENDLOOP. PERFORM wlc_labst."2020.6.18 可用库存修改(去除预留) PERFORM wlc_eisbe."2021.3.25 安全库存筛选 REFRESH t_vbap. LOOP AT t_zmal . APPEND t_zmal TO t_vbap. ENDLOOP. * PERFORM FRM_WRITE_DATA. ENDFORM. " GET_DATA_GRID FORM frm_write_data. CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'MATNR' . gw_fieldcat-scrtext_l = '物料号' . gw_fieldcat-outputlen = 18. APPEND gw_fieldcat TO gt_fieldcat . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'MEINS' . gw_fieldcat-scrtext_l = '单位' . gw_fieldcat-outputlen = 4. APPEND gw_fieldcat TO gt_fieldcat . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'TLINES' . gw_fieldcat-scrtext_l = '字段长文本' . gw_fieldcat-outputlen = 50. APPEND gw_fieldcat TO gt_fieldcat . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'LGORT' . gw_fieldcat-scrtext_l = '库位' . gw_fieldcat-outputlen = 5. APPEND gw_fieldcat TO gt_fieldcat . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'BISMT' . gw_fieldcat-scrtext_l = '库格' . gw_fieldcat-outputlen = 10. APPEND gw_fieldcat TO gt_fieldcat . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'MTART' . gw_fieldcat-scrtext_l = '物料类型' . gw_fieldcat-outputlen = 8. APPEND gw_fieldcat TO gt_fieldcat . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'LABST' . gw_fieldcat-scrtext_l = '库存余量' . gw_fieldcat-outputlen = 8. APPEND gw_fieldcat TO gt_fieldcat . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'BDMNG' . gw_fieldcat-scrtext_l = '预留数量' . gw_fieldcat-outputlen = 8. APPEND gw_fieldcat TO gt_fieldcat . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'LABST1' . gw_fieldcat-scrtext_l = '实际可用库存' . gw_fieldcat-outputlen = 10. APPEND gw_fieldcat TO gt_fieldcat . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'EISBE' . gw_fieldcat-scrtext_l = '安全库存' . gw_fieldcat-outputlen = 8. APPEND gw_fieldcat TO gt_fieldcat . * CLEAR GW_FIELDCAT . * GW_FIELDCAT-FIELDNAME = 'OPEN_PO' . * GW_FIELDCAT-SCRTEXT_L = '在途库存' . * GW_FIELDCAT-OUTPUTLEN = 8. * APPEND GW_FIELDCAT TO GT_FIELDCAT . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'BSTMI' . gw_fieldcat-scrtext_l = '最小采购量' . gw_fieldcat-outputlen = 10. APPEND gw_fieldcat TO gt_fieldcat . CLEAR gw_fieldcat . gw_fieldcat-fieldname = 'BSTFE' . gw_fieldcat-scrtext_l = '固定采购量' . gw_fieldcat-outputlen = 10. APPEND gw_fieldcat TO gt_fieldcat . * **定义列信息 *WA_ALV_FILED-COL_POS = 10. *WA_ALV_FILED-FIELDNAME = 'BSTFE'. " 对应的内表中的字段名称 *WA_ALV_FILED-SELTEXT_M = '固定采购量'. "ALV中显示的标题 *WA_ALV_FILED-OUTPUTLEN = 10. " 列的显示宽度,可以不设置 *APPEND WA_ALV_FILED TO WA_ALV_FILEDCAT. *CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' * EXPORTING * IT_FIELDCAT = WA_ALV_FILEDCAT * TABLES * T_OUTTAB = T_ZMAL. ENDFORM. FORM get_md04_data USING p_matnr p_werks. CLEAR: mdpsx,mdezx,mdsux. CLEAR: mdpsx[],mdezx[],mdsux[]. CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API' EXPORTING matnr = p_matnr werks = p_werks TABLES mdpsx = mdpsx mdezx = mdezx mdsux = mdsux EXCEPTIONS material_plant_not_found = 1 plant_not_found = 2. ENDFORM. " GET_MD04_DATA *&---------------------------------------------------------------------* *& MODULE ZMATNR INPUT *&---------------------------------------------------------------------* * TEXT *----------------------------------------------------------------------* MODULE zmatnr INPUT. DATA: BEGIN OF i_mara OCCURS 0, *-----ECCUpgradeS4--------AB_ZACK--------20221027--------START * matnr type char22, matnr TYPE matnr, *-----ECCUpgradeS4--------AB_ZACK--------20221027--------END END OF i_mara. SELECT mara~matnr INTO CORRESPONDING FIELDS OF TABLE i_mara FROM marc INNER JOIN mara ON mara~matnr = marc~matnr WHERE marc~werks = '7010'. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'MATNR' dynpprog = sy-repid dynpnr = sy-dynnr dynprofield = 'ZMATNR' value_org = 'S' TABLES value_tab = i_mara EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3. ENDMODULE. " ZMATNR INPUT MODULE zkw INPUT. DATA: BEGIN OF i_zkw OCCURS 0, zkw TYPE char6, lgobe TYPE char16, END OF i_zkw. CLEAR i_zkw.REFRESH i_zkw. i_zkw-zkw = 'WL61'. APPEND i_zkw. i_zkw-zkw = 'MT61'. APPEND i_zkw. i_zkw-zkw = 'EL61'. APPEND i_zkw. i_zkw-zkw = 'WL65'. APPEND i_zkw. i_zkw-zkw = 'WL66'. APPEND i_zkw. LOOP AT i_zkw. SELECT SINGLE lgobe INTO i_zkw-lgobe FROM t001l WHERE werks = '7010' AND lgort = i_zkw-zkw. MODIFY i_zkw. ENDLOOP. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'ZKW' dynpprog = sy-repid dynpnr = sy-dynnr dynprofield = 'ZKW' value_org = 'S' TABLES value_tab = i_zkw EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3. ENDMODULE. " ZMATNR INPUT MODULE zkg INPUT. DATA: BEGIN OF i_zkg OCCURS 0, bismt TYPE char50, END OF i_zkg. DATA:zkw1(6). DATA: dynpfields TYPE TABLE OF dynpread WITH HEADER LINE. CLEAR: dynpfields, dynpfields[],zkw1.CLEAR i_zkg.REFRESH i_zkg. dynpfields-fieldname = 'ZKW'. "填入需要读值的字段名 APPEND dynpfields. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-repid dynumb = sy-dynnr translate_to_upper = 'X' TABLES dynpfields = dynpfields EXCEPTIONS OTHERS = 9. IF sy-subrc = 0. READ TABLE dynpfields WITH KEY fieldname = 'ZKW'. zkw1 = dynpfields-fieldvalue. "备注 ENDIF. IF zkw1 <> ''. SELECT bismt INTO CORRESPONDING FIELDS OF TABLE i_zkg FROM zpm_yz_mal_st WHERE werks = '7010' AND lgort = zkw1. ELSE. SELECT bismt INTO CORRESPONDING FIELDS OF TABLE i_zkg FROM zpm_yz_mal_st WHERE werks = '7010'. ENDIF. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'BISMT' dynpprog = sy-repid dynpnr = sy-dynnr dynprofield = 'ZKG' value_org = 'S' TABLES value_tab = i_zkg EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3. ENDMODULE. " ZMATNR INPUT *&---------------------------------------------------------------------* *& Form WLC_LABST *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM wlc_labst . DATA:bdmng LIKE resb-bdmng, enmng LIKE resb-enmng. DATA:shkzg LIKE resb-shkzg. LOOP AT t_zmal. SELECT bdmng enmng shkzg INTO ( bdmng,enmng,shkzg ) FROM resb WHERE xloek = '' AND kzear = '' AND matnr = t_zmal-matnr AND werks = t_zmal-werks AND lgort = t_zmal-lgort. IF shkzg = 'H'. t_zmal-bdmng = t_zmal-bdmng + bdmng - enmng. ELSE. t_zmal-bdmng = t_zmal-bdmng - bdmng + enmng. ENDIF. CLEAR:bdmng,enmng,shkzg. ENDSELECT. t_zmal-labst1 = t_zmal-labst - t_zmal-bdmng. MODIFY t_zmal. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form WLC_EISBE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM wlc_eisbe . IF fxk01 <> ''. LOOP AT t_zmal. IF t_zmal-labst1 >= t_zmal-eisbe. DELETE t_zmal. ENDIF. ENDLOOP. ENDIF. ENDFORM.
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值