Текущее время: Пн, сен 24 2018, 12:16

Часовой пояс: UTC + 4 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 13:14 
Ассистент
Ассистент

Зарегистрирован:
Вт, мар 20 2018, 12:16
Сообщения: 26
Необходимо узнать количество строк внутренней таблицы с определенным условием . Можно ли это как-то сделать без loop?
к примеру, надо узнать сколько строк с цифрой 1 во втором столбце. Хочется узнать наиболее рациональное решение

Code:
14124   1
12341   1
15242   1
21413   2
12132   3


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 13:33 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, сен 06 2017, 00:56
Сообщения: 337
Если вторая колонка целочисленная то так можно
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.

         



Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 14:04 
Ассистент
Ассистент

Зарегистрирован:
Вт, мар 20 2018, 12:16
Сообщения: 26
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 будет, есть еще варианты?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 14:15 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, фев 21 2007, 09:50
Сообщения: 990
Откуда: Москва
Пол: Мужской
А, может, просто скинуть все в другую внутреннюю таблицу, отсортировать по col2, удалить в ней все строки, где col2 не равно искомому значению, а потом подсчитать в ней число строк?
Хотя ИМХО и это, и два последовательных рида по отсортированной таблице будет примерно равносильно лупу.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 15:47 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, сен 06 2017, 00:56
Сообщения: 337
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
только если я правильно помню таблица должна быть сортирована по этому полю


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 16:29 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, фев 21 2007, 09:50
Сообщения: 990
Откуда: Москва
Пол: Мужской
Kuranov.Dmitry написал(а):
READ TABLE tab WITH KEY col2 = 2.
sy-tabix станет 4


Не будет такого... При отсутствии искомого значения вернется sy-subrc = 4, sy-tabix = 0... Потому что нет такой строки.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 17:36 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 19:21
Сообщения: 1141
Наиболее рациональное решение loop :mrgreen:

_________________
я твой сап эфай внедрял
BAdI-позитив


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 18:05 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, сен 06 2017, 00:56
Сообщения: 337
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

в общем если таблица объявлена как сортированная по этому полю, то так сработает, иначе нет

если она не сортирована, то в любом случае надо перебирать все записи.....


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 18:29 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, фев 21 2007, 09:50
Сообщения: 990
Откуда: Москва
Пол: Мужской
Прикольно... если так работает. Не знал такого.
Но немного вводит в заблуждение, ведь запись с номером 4 - это col2 = 3.
Но это, наверное, уже к вопросу отличий tabix и index.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 18:48 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, сен 06 2017, 00:56
Сообщения: 337
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


если таблица произвольная, то быстрее лупа не думаю что что-то быстрее будет работать


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Пн, июн 18 2018, 19:19 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, дек 20 2007, 19:21
Сообщения: 1141
Этот трюк хорошо работает когда надо встравить в таблицу и не потерять сортировку. Читаешь и вставляешь в табикс.

_________________
я твой сап эфай внедрял
BAdI-позитив


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Вт, июн 19 2018, 10:02 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 17:25
Сообщения: 2974
Пол: Мужской
exotik написал(а):
Необходимо узнать количество строк внутренней таблицы с определенным условием . Можно ли это как-то сделать без loop?
к примеру, надо узнать сколько строк с цифрой 1 во втором столбце. Хочется узнать наиболее рациональное решение

Code:
14124   1
12341   1
15242   1
21413   2
12132   3

Рациональное решение или нет - также может зависеть от условий задачи, от контекста.
В каком контексте делаете и в чем проблема в использовании операторов цикла? (То что хотите сделать уже внутри цикла? Проблемы с производительностью?Ваш код потом кому то читать и сопровождать, код должен быть так же понятным, это тоже критерий рациональности)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Вт, июн 19 2018, 10:27 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, дек 02 2010, 09:37
Сообщения: 88
To Kuranov.Dmitry
Цитата:
с несортированными таблицами такой трюк не сработает даже если их сортировать вручную.

Вообще-то, сработает, если отсортировать вручную
и сделать чтение с binary search по ключу сортировки.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Вт, июн 19 2018, 12:20 
Ассистент
Ассистент

Зарегистрирован:
Вт, мар 20 2018, 12:16
Сообщения: 26
Besa написал:
exotik написал(а):
Необходимо узнать количество строк внутренней таблицы с определенным условием . Можно ли это как-то сделать без loop?
к примеру, надо узнать сколько строк с цифрой 1 во втором столбце. Хочется узнать наиболее рациональное решение

Code:
14124   1
12341   1
15242   1
21413   2
12132   3

Рациональное решение или нет - также может зависеть от условий задачи, от контекста.
В каком контексте делаете и в чем проблема в использовании операторов цикла? (То что хотите сделать уже внутри цикла? Проблемы с производительностью?Ваш код потом кому то читать и сопровождать, код должен быть так же понятным, это тоже критерий рациональности)


Да, это будет уже внутри цикла, что не есть хорошо. Может возможно сделать какое-то доп. поле счетчик?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Узнать количество строк внутренней таблицы
СообщениеДобавлено: Вт, июн 19 2018, 12:42 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 17:25
Сообщения: 2974
Пол: Мужской
Обработайте вне цикла данные, создав агрегационную таблицу, к ней уже обратитесь через read table внутри основного цикла.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Ahrefs [Bot], Google Feedfetcher


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB