SAPфорум.RU https://www.sapboard.ru/forum/ |
|
Узнать количество строк внутренней таблицы https://www.sapboard.ru/forum/viewtopic.php?f=13&t=96517 |
Страница 1 из 2 |
Автор: | exotik [ Пн, июн 18 2018, 12:14 ] |
Заголовок сообщения: | Узнать количество строк внутренней таблицы |
Необходимо узнать количество строк внутренней таблицы с определенным условием . Можно ли это как-то сделать без loop? к примеру, надо узнать сколько строк с цифрой 1 во втором столбце. Хочется узнать наиболее рациональное решение Code: 14124 1
12341 1 15242 1 21413 2 12132 3 |
Автор: | Kuranov.Dmitry [ Пн, июн 18 2018, 12:33 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
Если вторая колонка целочисленная то так можно Code: DATA: BEGIN OF TABLE tab OCCURS 0, col1(10), col2 TYPE i, END OF tab. DATA n1 type i. data n2 type i. data value_to_find type i. data total type i. PERFORM fill_table. SORT tab BY col2. value_to_find = 1. READ TABLE tab WITH KEY col2 = value_to_find. n1 = sy-tabix. ADD 1 value_to_find. READ TABLE tab WITH KEY col2 = value_to_find. n2 = sy tabix. total = n2 - n1. |
Автор: | exotik [ Пн, июн 18 2018, 13:04 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
Kuranov.Dmitry написал(а): Если вторая колонка целочисленная то так можно Code: DATA: BEGIN OF TABLE tab OCCURS 0, col1(10), col2 TYPE i, END OF tab. DATA n1 type i. data n2 type i. data value_to_find type i. data total type i. PERFORM fill_table. SORT tab BY col2. value_to_find = 1. READ TABLE tab WITH KEY col2 = value_to_find. n1 = sy-tabix. ADD 1 value_to_find. READ TABLE tab WITH KEY col2 = value_to_find. n2 = sy tabix. total = n2 - n1. шаг не обязательно в 1 будет, есть еще варианты? |
Автор: | Yozhhhhh [ Пн, июн 18 2018, 13:15 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
А, может, просто скинуть все в другую внутреннюю таблицу, отсортировать по col2, удалить в ней все строки, где col2 не равно искомому значению, а потом подсчитать в ней число строк? Хотя ИМХО и это, и два последовательных рида по отсортированной таблице будет примерно равносильно лупу. |
Автор: | Kuranov.Dmitry [ Пн, июн 18 2018, 14:47 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
exotik написал(а): шаг не обязательно в 1 будет, есть еще варианты? предположим содержимое таблицы № строки значение 1 1 2 1 3 1 4 3 5 4 у сортированной таблицы READ TABLE tab WITH KEY col2 = 2 вернет то место где 2 должна быть. т.е READ TABLE tab WITH KEY col2 = 2. sy-tabix станет 4 только если я правильно помню таблица должна быть сортирована по этому полю |
Автор: | Yozhhhhh [ Пн, июн 18 2018, 15:29 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
Kuranov.Dmitry написал(а): READ TABLE tab WITH KEY col2 = 2. sy-tabix станет 4 Не будет такого... При отсутствии искомого значения вернется sy-subrc = 4, sy-tabix = 0... Потому что нет такой строки. |
Автор: | Kengur [ Пн, июн 18 2018, 16:36 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
Наиболее рациональное решение loop |
Автор: | Kuranov.Dmitry [ Пн, июн 18 2018, 17:05 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
Yozhhhhh написал: Kuranov.Dmitry написал(а): READ TABLE tab WITH KEY col2 = 2. sy-tabix станет 4 Не будет такого... При отсутствии искомого значения вернется sy-subrc = 4, sy-tabix = 0... Потому что нет такой строки. Code: TYPES: BEGIN OF t_row, col1(10), col2 type i, END OF t_row. DATA tab TYPE SORTED TABLE OF t_row WITH NON-UNIQUE KEY col2. data line type t_row. line-col1 = 'a'. line-col2 = 1. insert line into TABLE tab. line-col1 = 'b'. line-col2 = 1. insert line into TABLE tab. line-col1 = 'c'. line-col2 = 1. insert line into TABLE tab. line-col1 = 'd'. line-col2 = 3. insert line into TABLE tab. line-col1 = 'e'. line-col2 = 5. insert line into TABLE tab. line-col1 = 'f'. line-col2 = 5. insert line into TABLE tab. read TABLE tab into line WITH TABLE KEY col2 = 2. write: / 'SY-SUBRC= ', sy-subrc , 'sy-tabix=',sy-tabix. read TABLE tab into line WITH TABLE KEY col2 = 4. write: / 'SY-SUBRC= ', sy-subrc , 'sy-tabix=',sy-tabix. выдал: SY-SUBRC= 4 sy-tabix= 4 SY-SUBRC= 4 sy-tabix= 5 в общем если таблица объявлена как сортированная по этому полю, то так сработает, иначе нет если она не сортирована, то в любом случае надо перебирать все записи..... |
Автор: | Yozhhhhh [ Пн, июн 18 2018, 17:29 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
Прикольно... если так работает. Не знал такого. Но немного вводит в заблуждение, ведь запись с номером 4 - это col2 = 3. Но это, наверное, уже к вопросу отличий tabix и index. |
Автор: | Kuranov.Dmitry [ Пн, июн 18 2018, 17:48 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
Yozhhhhh написал: Прикольно... если так работает. Не знал такого. Но немного вводит в заблуждение, ведь запись с номером 4 - это col2 = 3. Но это, наверное, уже к вопросу отличий tabix и index. sy-tabix станет тем индексом, где должна была бы находиться отсутствующая запись. с несортированными таблицами такой трюк не сработает даже если их сортировать вручную. sy-index это сколько раз цикл прокрутился sy-tabix это место курсора в таблице, если сделать LOOP AT tab WHERE <cond> sy-index будет 1 2 3 sy-tabix будет для примера 2 4 5 если таблица произвольная, то быстрее лупа не думаю что что-то быстрее будет работать |
Автор: | Kengur [ Пн, июн 18 2018, 18:19 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
Этот трюк хорошо работает когда надо встравить в таблицу и не потерять сортировку. Читаешь и вставляешь в табикс. |
Автор: | Besa [ Вт, июн 19 2018, 09:02 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
exotik написал(а): Необходимо узнать количество строк внутренней таблицы с определенным условием . Можно ли это как-то сделать без loop? к примеру, надо узнать сколько строк с цифрой 1 во втором столбце. Хочется узнать наиболее рациональное решение Code: 14124 1 12341 1 15242 1 21413 2 12132 3 Рациональное решение или нет - также может зависеть от условий задачи, от контекста. В каком контексте делаете и в чем проблема в использовании операторов цикла? (То что хотите сделать уже внутри цикла? Проблемы с производительностью?Ваш код потом кому то читать и сопровождать, код должен быть так же понятным, это тоже критерий рациональности) |
Автор: | baboon [ Вт, июн 19 2018, 09:27 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
To Kuranov.Dmitry Цитата: с несортированными таблицами такой трюк не сработает даже если их сортировать вручную. Вообще-то, сработает, если отсортировать вручную и сделать чтение с binary search по ключу сортировки. |
Автор: | exotik [ Вт, июн 19 2018, 11:20 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
Besa написал: exotik написал(а): Необходимо узнать количество строк внутренней таблицы с определенным условием . Можно ли это как-то сделать без loop? к примеру, надо узнать сколько строк с цифрой 1 во втором столбце. Хочется узнать наиболее рациональное решение Code: 14124 1 12341 1 15242 1 21413 2 12132 3 Рациональное решение или нет - также может зависеть от условий задачи, от контекста. В каком контексте делаете и в чем проблема в использовании операторов цикла? (То что хотите сделать уже внутри цикла? Проблемы с производительностью?Ваш код потом кому то читать и сопровождать, код должен быть так же понятным, это тоже критерий рациональности) Да, это будет уже внутри цикла, что не есть хорошо. Может возможно сделать какое-то доп. поле счетчик? |
Автор: | Besa [ Вт, июн 19 2018, 11:42 ] |
Заголовок сообщения: | Re: Узнать количество строк внутренней таблицы |
Обработайте вне цикла данные, создав агрегационную таблицу, к ней уже обратитесь через read table внутри основного цикла. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |