Такая строчка не канает.
А вот и продолжение вопроса о добавлении дополнительных вторичных ключей, раз никто не знает, можно ли так делать или нет. Предлагаю такой костыль: 1. Есть стандартная таблица с типом MSEG без всяких вторичных ключей. 2. Создаём другой тип MY_MSEG и навешиваем туда другие неуникальные вторичные ключи. 3. Присваиваем MY_MSEG = MSEG и работаем со вторичными ключами MY_MSEG. Внимание, вопрос: будет ли происходить физическое копирование данных таблицы MSEG в таблицу MY_MSEG? Или данные будут браться по ссылке и будут только индексы пересчитываться при первом использовании?
а это точно-преточно?
Ну глянь в профилировщике памяти, раз не веришь. 🙂
Точно. Как только начнёшь юзать её - скопируется
Смотри про table sharing https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenitab_perfo.htm
костыль в таком случае обычно делается так - тип создаем только с полями для индекса/индексов + поле ref to оригинальный тип строки
да, тоже так иногда делаю, но не очень удобно так делать. нам бы вторичных ключей навешать да юзать их...
да, я тоже иногда такой костыль использую. о нём, кстати, мало кто знает. ещё похожий интересный способ есть, если нужно по одной и той же таблице делать LOOP с одинаковыми WHERE (и не фильтровать строки 2 раза, а только один раз): DATA ltr_mseg TYPE REF TO mseg. DATA lt_mara TYPE HASHED TABLE OF mara WITH UNIQUE KEY matnr. LOOP AT mseg ASSIGN FIELD-SYMBOL<ls_mseg> WHERE shkzg = 'H' AND koart = 'D' OR zeile < 10 OR mkpf CP '*400*' AND menge BETWEEN 100 AND 1000. INSERT REF #( <ls_mseg> ) INTO TABLE ltr_mseg. " Собираем ключи для выборки INSERT VALUE #( matnr = <ls_mseg>-matnr ) INTO TABLE lt_mara. ENDLOOP. " Выбираем справочные данные по ключам из выборки IF NOT lt_mara[] IS INITIAL. SELECT * FROM mara FOR ALL ENTRIES IN @lt_mara INTO CORRESPONDING FIELDS OF @lt_mara. ENDIF. LOOP AT ltr_mseg REFERENCE INTO DATA(lrs_mseg). " Читаем справочные данные по ключам READ TABLE lt_mara ASSIGNING FIELD-SYMBOL(<ls_mara>) WITH TABLE KEY matnr = lrs_mseg->matnr. CHECK sy-subrc = 0. " И меняем только те, данные, которые были выше в WHERE lrs_mseg->menge = <ls_mara>-menge. ENDLOOP.
да такое тоже применяем
Ну и раз меня сегодня чего-то пропёрло, то ещё могу сказать что можно делать, например, хэшированные таблицы с ключом-ссылкой. И можно по этой ссылке делать чтение по ключу. Тоже бывает иногда полезным. Но нужно быть осторожным - ссылки могут разыменовываться)
Я не понял смысла, смысла честно: судя по коду, можно сделать всё в первом лупе.
В первом лупе выбираем ключи для mara, потом читаем mara, а потом заполняем mseg из mara
Пропустил кусок теста, сорян. Хорошо придумано. 👍
смысл в 1 лупе собрать уникальные поля по условиям потом по собранному сделать select * for all entries во втором лупе записать выбранное в оригинальную таблицу в те же строки, что по условиям из первого цикла, и чтобы не гонять условие 2 раза в первом цикле запоминаем ссылки на нужные строки и во втором гоняем уже только их безусловно
Да, спасибо, я уже понял, что пропустил кусок текста про "выбрать до второго лупа"
Только ltr_mseg нельзя делать уникальной по ключам индекса, если они же не являются ключом исходной таблицы
а зачем её делать уникальной? это же просто ссылки на исходную таблицу
Обсуждают сегодня