Текущее время: Вт, мар 19 2024, 10:50

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


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


ВНИМАНИЕ!

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



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

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

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


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

Зарегистрирован:
Вт, сен 05 2017, 23:56
Сообщения: 537
Если вторая колонка целочисленная то так можно
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, 13:04 
Ассистент
Ассистент

Зарегистрирован:
Вт, мар 20 2018, 11:16
Сообщения: 27
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, 13:15 
Почетный гуру
Почетный гуру
Аватара пользователя

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

_________________
Алё, это Пакистан? Нам нужен один килограмм


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

Зарегистрирован:
Вт, сен 05 2017, 23:56
Сообщения: 537
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, 15:29 
Почетный гуру
Почетный гуру
Аватара пользователя

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


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

_________________
Алё, это Пакистан? Нам нужен один килограмм


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

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

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


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

Зарегистрирован:
Вт, сен 05 2017, 23:56
Сообщения: 537
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, 17:29 
Почетный гуру
Почетный гуру
Аватара пользователя

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

_________________
Алё, это Пакистан? Нам нужен один килограмм


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

Зарегистрирован:
Вт, сен 05 2017, 23:56
Сообщения: 537
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, 18:19 
Почетный гуру
Почетный гуру
Аватара пользователя

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

_________________
я твой сап эфай внедрял
BAdI-позитив
Взять немножечко абопу, сунь туда кошачью *опу, RFC лапки, БТ старой бабки, на медленном базиснике переносить, тестовое окружение материть, снимать SAT пенку, биться головой о стенку, охапка тайм-шитов, отчет готов!


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

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

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

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


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

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

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


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

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

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

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


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


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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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