Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => Тема розпочата: knopix від Червень 30, 2011, 09:08:39 ДП

Назва: Проблема с AT NEW ... END AT.
Відправлено: knopix від Червень 30, 2011, 09:08:39 ДП
Здравствуйте...

Не могу понять почему код между "AT NEW ... " и "ENDAT" отрабатывает несмотря на то, что значение поля не менялось.
Код примерно следующий:

...

SORT valtab BY ZWBGOSNUM ASCENDING.

LOOP AT valtab.
...
AT NEW ZWBGOSNUM.
...
ENDAT.
ENDLOOP.


Поле не уникальное и не ключевое. Наверное, тут могут быть какие-то нюансы. Подскажите, пожалуйста, в чём может быть дело.
Назва: Re: Проблема с AT NEW ... END AT.
Відправлено: Uukrul від Червень 30, 2011, 09:52:40 ПП
Цитата: knopix від Червень 30, 2011, 09:08:39 ДП
Поле не уникальное и не ключевое. Наверное, тут могут быть какие-то нюансы. Подскажите, пожалуйста, в чём может быть дело.
Если я правильно помню, то сортировка должна быть выполнена по этому полю перед циклом LOOP AT.... ENDLOOP.
Назва: Re: Проблема с AT NEW ... END AT.
Відправлено: knopix від Липень 01, 2011, 05:26:19 ДП
Я так и делаю... В отладчике посмотрел содержимое внутренней таблицы - всё корректно отсортировано. Тем не менее, "AT NEW" отрабатывает на каждой строчке.  :(
Назва: Re: Проблема с AT NEW ... END AT.
Відправлено: Uukrul від Липень 01, 2011, 08:57:56 ДП
Цитата: knopix від Липень 01, 2011, 05:26:19 ДП
Я так и делаю... В отладчике посмотрел содержимое внутренней таблицы - всё корректно отсортировано. Тем не менее, "AT NEW" отрабатывает на каждой строчке.  :(
Давай пример кода и содержимое таблицы перед входом в цикл.. пяток записей, если это возможно.
Назва: Re: Проблема с AT NEW ... END AT.
Відправлено: knopix від Липень 01, 2011, 09:52:44 ДП
В общем, проблема решилась тем, что отказался от использования этого поля (гос. номер) и использовал внешний ключ (id ТС) который поместил в начало структуры, которую использую для вывода. Видимо, необходимо, чтобы поле стояло на первом месте.
Назва: Re: Проблема с AT NEW ... END AT.
Відправлено: Dmitriy від Липень 01, 2011, 10:06:50 ДП
Цитата: knopix від Липень 01, 2011, 09:52:44 ДП
В общем, проблема решилась тем, что отказался от использования этого поля (гос. номер) и использовал внешний ключ (id ТС) который поместил в начало структуры, которую использую для вывода. Видимо, необходимо, чтобы поле стояло на первом месте.
Похоже на то, вот цитата из HELP по F1:
ЦитатаControl levels are defined by the beginning or end of a group of lines with the same content in the component compi (where i = 1, 2, and so on) and in the components to the left of compi. The control breaks take place when the content of the component compi or another component to the left of compi changes.
Если хотя бы один из компонентов "левее" названного (включая его самого) меняется, то срабатывает...
Назва: Re: Проблема с AT NEW ... END AT.
Відправлено: knopix від Липень 01, 2011, 10:37:28 ДП
Спасибо... Буду приучать себя внимательно читать help  :)
Назва: Re: Проблема с AT NEW ... END AT.
Відправлено: Dmitriy від Липень 01, 2011, 11:09:01 ДП
Если не секрет, какое действие выполняете на данном уровне контроля (AT NEW ... ENDAT)? Агрегируете суммы по ZWBGOSNUM?
Назва: Re: Проблема с AT NEW ... END AT.
Відправлено: knopix від Липень 04, 2011, 05:17:39 ДП
Да... я сначала считал прмежуточные суммы в переменную и выводил в exel-форму. Теперь делаю немного по-другому, по количеству строк определяю адрес последней ячейки и вывожу '=sum(R[1]C:R[' rcnt ']C)'.


AT NEW zwbsrn. "zwbgosnum.

      copycell 8 1 8 13 i 1.
.....

      crnt = i.
      i = i + 1.

ENDAT.

.....

    i = i + 1.

AT END OF zwbsrn.
      rcnt = i - crnt - 1.

      CONCATENATE '=sum(R[1]C:R[' rcnt ']C)' INTO sumrcrg.
      CONCATENATE '=sum(R[1]C:R[' rcnt ']C)' INTO sumfuel.
      CONCATENATE '=sum(R[1]C:R[' rcnt ']C)' INTO sumnorm.
      CONCATENATE '=sum(R[1]C:R[' rcnt ']C)' INTO sumfact.

      putcell crnt 4 sumrcrg.
      putcell crnt 8 sumfuel.
      putcell crnt 9 sumnorm.
      putcell crnt 10 sumfact.

ENDAT.