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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Dr_Ernhard


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

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