Sapforum.Biz

Инструменты => SE37 - Построитель функций => ABAP - Инструментальные средства => SE37 - Подскажите ФМ => Тема начата: Паганель от Декабрь 04, 2009, 11:15:16 am

Название: Странный глюк MCHB_EXTEND
Отправлено: Паганель от Декабрь 04, 2009, 11:15:16 am
Раньше все работало нормально, а тут немного поменял, при том этот кусок кода не менял.

В селект-скрине указываю 1 материал, а выбираются куча левых,те которые не задавал.

Код: You are not allowed to view links. Register or Login
SELECT * APPENDING CORRESPONDING FIELDS OF TABLE lt_mchb
    FROM mchb
    WHERE
      matnr IN so_matnr AND
      " matnr IN s_matnr2 AND
      werks = p_werks AND
      lgort = p_lgort AND
      lvorm NE 'X'.

  IF lt_mchb[] IS NOT INITIAL.
    CALL FUNCTION 'MCHB_EXTEND'
    EXPORTING
      kzrfb_ges       = ' '
      kzrfb           = ' '
      maxtz           = ' '
      xvper           = 'X'
*     IMPORTING
*       RMCHBH          =
    TABLES
      mchb_tab        = lt_mchb.
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Uukrul от Декабрь 04, 2009, 11:17:00 am
SELECT * APPENDING... <- таки надо или табличку чистить или... оно будет накапливать данные!
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Паганель от Декабрь 04, 2009, 11:18:40 am
Да она пустая, я проверял.
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Uukrul от Декабрь 04, 2009, 11:22:00 am
You are not allowed to view links. Register or Login
Да она пустая, я проверял.
Так может на INTO заменить.. а то может таки как обычно не то проверял и не там :-)
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Паганель от Декабрь 04, 2009, 11:24:48 am
Заменил, та же фигня выборка  SELECT * into CORRESPONDING CORRESPONDING FIELDS OF TABLE lt_mchb     FROM mchb
возвращает 4 партии с указанным материалом, к-во пустое (добавил clabs NE 0.), табличка пустая, просле вызова   CALL FUNCTION 'MCHB_EXTEND' в табличку попадают левые материалы с указаного склада.
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Паганель от Декабрь 04, 2009, 11:33:32 am
Хм, странно, глюк теперь вообще в другой выборке .... SELECT * APPENDING CORRESPONDING FIELDS OF TABLE lt_mard  ???

Привожу весь код
Код: You are not allowed to view links. Register or Login
FORM data_select .
  DATA: lt_mchb TYPE STANDARD TABLE OF mchb WITH HEADER LINE.

  DATA: lt_mara TYPE STANDARD TABLE  OF mara WITH HEADER LINE.

  DATA: lt_mard TYPE STANDARD TABLE  OF mard WITH HEADER LINE.


  refresh: lt_mchb,lt_mara, lt_mard,  gt_mchb.
  CLEAR:   lt_mchb,lt_mara, lt_mard,  gt_mchb.

  " Расделяем выборки на те материалы которые партионные и те которые не партионные

  " Не партионные товары
  SELECT matnr FROM mara
    INTO CORRESPONDING FIELDS OF TABLE lt_mara
    WHERE matnr IN so_matnr AND
          xchpf NE 'X'.


  LOOP AT lt_mara.
    s_matnr1-sign   = 'I'.
    s_matnr1-option = 'EQ'.
    s_matnr1-low    = lt_mara-matnr.
    APPEND s_matnr1.
  ENDLOOP.

* SELECT * APPENDING CORRESPONDING FIELDS OF TABLE lt_mchb
*    FROM mard
*    WHERE
*      matnr IN s_matnr1 AND
*      werks = p_werks AND
*      lgort = p_lgort AND
*      lvorm NE 'X'.

  REFRESH lt_mara.
  CLEAR   lt_mara.

  " Партионный материал
  SELECT matnr FROM mara
    INTO CORRESPONDING FIELDS OF TABLE lt_mara
    WHERE matnr IN so_matnr AND
          xchpf EQ 'X'.

  LOOP AT lt_mara.
    s_matnr2-sign   = 'I'.
    s_matnr2-option = 'EQ'.
    s_matnr2-low    = lt_mara-matnr.
    APPEND s_matnr2.
  ENDLOOP.


  IF s_matnr2[] IS NOT INITIAL.
   SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_mchb
    FROM mchb
    WHERE
      "matnr IN so_matnr AND
      matnr IN s_matnr2 AND
      werks = p_werks AND
      lgort = p_lgort AND
      lvorm NE 'X'    AND
      clabs NE 0.
  ENDIF.

  IF lt_mchb[] IS NOT INITIAL.
    CALL FUNCTION 'MCHB_EXTEND'
    EXPORTING
      kzrfb_ges       = ' '
      kzrfb           = ' '
      maxtz           = ' '
      xvper           = 'X'
*     IMPORTING
*       RMCHBH          =
    TABLES
      mchb_tab        = lt_mchb.

    LOOP AT lt_mchb WHERE clabs > 0.
      MOVE-CORRESPONDING lt_mchb TO gt_mchb.
      gt_mchb-ilgort = p_ilgort.
      SELECT SINGLE hsdat INTO gt_mchb-hsdat FROM mch1
            WHERE charg = gt_mchb-charg.
      IF mov_all EQ 'X' .
        gt_mchb-cumlm = lt_mchb-clabs.
      ENDIF.

      SELECT SINGLE maktx INTO gt_mchb-maktx FROM makt
        WHERE matnr = gt_mchb-matnr AND spras = sy-langu.

      APPEND gt_mchb.

    ENDLOOP.

   ENDIF.

  SELECT * APPENDING CORRESPONDING FIELDS OF TABLE lt_mard
    FROM mard
    WHERE
      matnr IN s_matnr1 AND
      werks = p_werks AND
      lgort = p_lgort AND
      lvorm NE 'X'.

  LOOP AT lt_mard.
      MOVE-CORRESPONDING lt_mard TO gt_mchb.
      gt_mchb-ilgort = p_ilgort.
*      SELECT SINGLE hsdat INTO gt_mchb-hsdat FROM mch1
*            WHERE charg = gt_mchb-charg.

      gt_mchb-clabs = lt_mard-labst.

      IF mov_all EQ 'X' .
        gt_mchb-cumlm = lt_mard-labst.
      ENDIF.

      SELECT SINGLE maktx INTO gt_mchb-maktx FROM makt
        WHERE matnr = gt_mchb-matnr AND spras = sy-langu.

      APPEND gt_mchb.

  ENDLOOP.



  " ENDIF.

ENDFORM.                    " data_selct
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Паганель от Декабрь 04, 2009, 11:35:58 am
Не знаю по каким причинам, но  выборка
Код: You are not allowed to view links. Register or Login
SELECT * APPENDING CORRESPONDING FIELDS OF TABLE lt_mard
      FROM mard
      WHERE
        matnr IN s_matnr1 AND
        werks = p_werks AND
        lgort = p_lgort AND
        lvorm NE 'X'.
работает не правильно, если s_matnr1  пустой.
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Uukrul от Декабрь 04, 2009, 11:41:21 am
You are not allowed to view links. Register or Login
работает не правильно, если s_matnr1  пустой.
Если он пустой то это значит что материал тебя не интересует и выберутся все партии что есть.. так что или я что-то не понял из тобой написанного или оно таки работает правильно...
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Паганель от Декабрь 04, 2009, 11:43:23 am
теперь вроде правильно, хотя я думал что если s_matnr1 пустой, то по идее ничего не должно выбратся
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Uukrul от Декабрь 04, 2009, 12:03:16 pm
You are not allowed to view links. Register or Login
теперь вроде правильно, хотя я думал что если s_matnr1 пустой, то по идее ничего не должно выбратся
Не я конечно понимаю.. что оптимизация абапа забывается... но тогда рекомендую ее пересмотреть про конструкция IN: http://sapforum.biz/index.php/topic,174.msg741.html#msg741  ::)
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Паганель от Декабрь 04, 2009, 12:05:05 pm
You are not allowed to view links. Register or Login
Не я конечно понимаю.. что оптимизация абапа забывается... но тогда рекомендую ее пересмотреть про конструкция IN: http://sapforum.biz/index.php/topic,174.msg741.html#msg741  ::)
Так там шла речь о SELECT .... FOR ALL ENTRIES IN itab
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Uukrul от Декабрь 04, 2009, 12:07:06 pm
You are not allowed to view links. Register or Login
Так там шла речь о SELECT .... FOR ALL ENTRIES IN itab
Какая разница.. там операция IN и проблема именно в том как этот IN реализован.
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Паганель от Декабрь 04, 2009, 12:07:54 pm
блин, почему не они не доделали.
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Uukrul от Декабрь 04, 2009, 12:17:55 pm
You are not allowed to view links. Register or Login
блин, почему не они не доделали.
Ну почему не доделали.. все логично если таблица после IN пустая то в результирующий запрос к БД такое сравнение вообще выбрасывается, если же надо выбрать именно пустое значение, то типа надо добавить запись вид I EQ SAPCE тогда будут выбраны именно пустые значения, а так просто такое сравнение будет проигнорировано. Как по мне логично, а дальше уже проверки ставим сами  ::)
Название: Re: Странный глюк MCHB_EXTEND
Отправлено: Uukrul от Январь 09, 2011, 12:25:06 am
Цитата: Uukrul  link=topic=961.msg6015#msg6015 date=1259921875
Ну почему не доделали.. все логично если таблица после IN пустая то в результирующий запрос к БД такое сравнение вообще выбрасывается, если же надо выбрать именно пустое значение, то типа надо добавить запись вид I EQ SAPCE тогда будут выбраны именно пустые значения, а так просто такое сравнение будет проигнорировано. Как по мне логично, а дальше уже проверки ставим сами  ::)
Кстати так чего-то подумал, если бы они доделали так как ты хочешь, то была бы полная засада, смотри наиболее часто используемая структура отчетов это селекционный экран и дальше один или больше запросов которые выбирают данные, селекционный экран имеет вид типа:
Код: You are not allowed to view links. Register or Login
select-options: s_pstyp for rm06e-epstp,
                s_knttp for ekpo-knttp,
                s_eindt for eket-eindt  и т.д.
Далее по тексту есть запрос вид:
Код: You are not allowed to view links. Register or Login
  select * into corresponding fields of table lt_ekpo
  from ekko as k inner join ekpo as p
  on p~ebeln = k~ebeln
  where k~lifnr in s_lifnr             "EKKO-Data
    and k~ekorg in r_ekorg
    and k~bsart in s_bsart
    and k~ekgrp in s_ekgrp
    and k~reswk in s_reswk
    and k~bedat in s_bedat
    and p~matnr in em_matnr            "EKPO-Data
    and p~werks in em_werks
    and p~bstyp in r_bstyp
    and p~wepos in r_wepos
    and p~repos in r_repos
    and p~loekz in r_loekz
    and p~pstyp in r_pstyp
    and p~knttp in s_knttp
    and p~matkl in s_matkl
    and p~ean11 in s_ean11
    and p~idnlf in s_idnlf
    and p~ltsnr in s_ltsnr
    and p~aktnr in s_aktnr
    and p~saiso in s_saiso
    and p~saisj in s_saisj
    and p~ebeln in s_ebeln.
Так вот, поля которые пользователь не заполнил на селекционном экране будут проигнорированы, в противном же случае я даже не знаю, надо было бы что-то мутить с динамическим формированием строки запроса. Так что это они хорошо продумал что пусты значения диапазонов в операторе IN игнорируются в запросе.