169 похожих чатов

Я имею ввиду, что если разрешить другие вторичные ключи, то

создаётся generic тип.
А как этому типу можно другие ключи добавить?

19 ответов

15 просмотров
Iurii-Slobodchikov Автор вопроса

Такая строчка не канает.

Iurii-Slobodchikov Автор вопроса

А вот и продолжение вопроса о добавлении дополнительных вторичных ключей, раз никто не знает, можно ли так делать или нет. Предлагаю такой костыль: 1. Есть стандартная таблица с типом MSEG без всяких вторичных ключей. 2. Создаём другой тип MY_MSEG и навешиваем туда другие неуникальные вторичные ключи. 3. Присваиваем MY_MSEG = MSEG и работаем со вторичными ключами MY_MSEG. Внимание, вопрос: будет ли происходить физическое копирование данных таблицы MSEG в таблицу MY_MSEG? Или данные будут браться по ссылке и будут только индексы пересчитываться при первом использовании?

Iurii-Slobodchikov Автор вопроса
Alexandr Zhuravlev
будет

а это точно-преточно?

Iurii Slobodchikov
а это точно-преточно?

Ну глянь в профилировщике памяти, раз не веришь. 🙂

Iurii Slobodchikov
а это точно-преточно?

Точно. Как только начнёшь юзать её - скопируется

Iurii Slobodchikov
а это точно-преточно?

Смотри про table sharing https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenitab_perfo.htm

Iurii Slobodchikov
А вот и продолжение вопроса о добавлении дополните...

костыль в таком случае обычно делается так - тип создаем только с полями для индекса/индексов + поле ref to оригинальный тип строки

Iurii-Slobodchikov Автор вопроса
Alexandr Zhuravlev
костыль в таком случае обычно делается так - тип с...

да, тоже так иногда делаю, но не очень удобно так делать. нам бы вторичных ключей навешать да юзать их...

Iurii-Slobodchikov Автор вопроса
Alexandr Zhuravlev
костыль в таком случае обычно делается так - тип с...

да, я тоже иногда такой костыль использую. о нём, кстати, мало кто знает. ещё похожий интересный способ есть, если нужно по одной и той же таблице делать 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.

Iurii-Slobodchikov Автор вопроса
Iurii Slobodchikov
да, я тоже иногда такой костыль использую. о нём, ...

Ну и раз меня сегодня чего-то пропёрло, то ещё могу сказать что можно делать, например, хэшированные таблицы с ключом-ссылкой. И можно по этой ссылке делать чтение по ключу. Тоже бывает иногда полезным. Но нужно быть осторожным - ссылки могут разыменовываться)

Iurii Slobodchikov
да, я тоже иногда такой костыль использую. о нём, ...

Я не понял смысла, смысла честно: судя по коду, можно сделать всё в первом лупе.

Iurii-Slobodchikov Автор вопроса
Vladimir K
Я не понял смысла, смысла честно: судя по коду, мо...

В первом лупе выбираем ключи для mara, потом читаем mara, а потом заполняем mseg из mara

Iurii Slobodchikov
В первом лупе выбираем ключи для mara, потом читае...

Пропустил кусок теста, сорян. Хорошо придумано. 👍

Vladimir K
Я не понял смысла, смысла честно: судя по коду, мо...

смысл в 1 лупе собрать уникальные поля по условиям потом по собранному сделать select * for all entries во втором лупе записать выбранное в оригинальную таблицу в те же строки, что по условиям из первого цикла, и чтобы не гонять условие 2 раза в первом цикле запоминаем ссылки на нужные строки и во втором гоняем уже только их безусловно

Alexandr Zhuravlev
смысл в 1 лупе собрать уникальные поля по условиям...

Да, спасибо, я уже понял, что пропустил кусок текста про "выбрать до второго лупа"

Iurii Slobodchikov
да, я тоже иногда такой костыль использую. о нём, ...

Только ltr_mseg нельзя делать уникальной по ключам индекса, если они же не являются ключом исходной таблицы

Iurii-Slobodchikov Автор вопроса
Vladimir K
Только ltr_mseg нельзя делать уникальной по ключам...

а зачем её делать уникальной? это же просто ссылки на исходную таблицу

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта