Sapforum.Biz
Инструменты => SE37 - Построитель функций => ABAP - Инструментальные средства => SE37 - Подскажите ФМ => Тема начата: Паганель от Декабрь 04, 2009, 11:15:16 am
-
Раньше все работало нормально, а тут немного поменял, при том этот кусок кода не менял.
В селект-скрине указываю 1 материал, а выбираются куча левых,те которые не задавал.
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.
-
SELECT * APPENDING... <- таки надо или табличку чистить или... оно будет накапливать данные!
-
Да она пустая, я проверял.
-
Да она пустая, я проверял.
Так может на INTO заменить.. а то может таки как обычно не то проверял и не там :-)
-
Заменил, та же фигня выборка SELECT * into CORRESPONDING CORRESPONDING FIELDS OF TABLE lt_mchb FROM mchb
возвращает 4 партии с указанным материалом, к-во пустое (добавил clabs NE 0.), табличка пустая, просле вызова CALL FUNCTION 'MCHB_EXTEND' в табличку попадают левые материалы с указаного склада.
-
Хм, странно, глюк теперь вообще в другой выборке .... SELECT * APPENDING CORRESPONDING FIELDS OF TABLE lt_mard ???
Привожу весь код
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
-
Не знаю по каким причинам, но выборка
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 пустой.
-
работает не правильно, если s_matnr1 пустой.
Если он пустой то это значит что материал тебя не интересует и выберутся все партии что есть.. так что или я что-то не понял из тобой написанного или оно таки работает правильно...
-
теперь вроде правильно, хотя я думал что если s_matnr1 пустой, то по идее ничего не должно выбратся
-
теперь вроде правильно, хотя я думал что если s_matnr1 пустой, то по идее ничего не должно выбратся
Не я конечно понимаю.. что оптимизация абапа забывается... но тогда рекомендую ее пересмотреть про конструкция IN: http://sapforum.biz/index.php/topic,174.msg741.html#msg741 ::)
-
Не я конечно понимаю.. что оптимизация абапа забывается... но тогда рекомендую ее пересмотреть про конструкция IN: http://sapforum.biz/index.php/topic,174.msg741.html#msg741 ::)
Так там шла речь о SELECT .... FOR ALL ENTRIES IN itab
-
Так там шла речь о SELECT .... FOR ALL ENTRIES IN itab
Какая разница.. там операция IN и проблема именно в том как этот IN реализован.
-
блин, почему не они не доделали.
-
блин, почему не они не доделали.
Ну почему не доделали.. все логично если таблица после IN пустая то в результирующий запрос к БД такое сравнение вообще выбрасывается, если же надо выбрать именно пустое значение, то типа надо добавить запись вид I EQ SAPCE тогда будут выбраны именно пустые значения, а так просто такое сравнение будет проигнорировано. Как по мне логично, а дальше уже проверки ставим сами ::)
-
Ну почему не доделали.. все логично если таблица после IN пустая то в результирующий запрос к БД такое сравнение вообще выбрасывается, если же надо выбрать именно пустое значение, то типа надо добавить запись вид I EQ SAPCE тогда будут выбраны именно пустые значения, а так просто такое сравнение будет проигнорировано. Как по мне логично, а дальше уже проверки ставим сами ::)
Кстати так чего-то подумал, если бы они доделали так как ты хочешь, то была бы полная засада, смотри наиболее часто используемая структура отчетов это селекционный экран и дальше один или больше запросов которые выбирают данные, селекционный экран имеет вид типа:
select-options: s_pstyp for rm06e-epstp,
s_knttp for ekpo-knttp,
s_eindt for eket-eindt и т.д.
Далее по тексту есть запрос вид:
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 игнорируются в запросе.