Текущее время: Вс, июл 20 2025, 01:35

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: READ TABLE и уникальные записи
СообщениеДобавлено: Пт, июн 28 2013, 12:33 
Специалист
Специалист

Зарегистрирован:
Пн, дек 26 2011, 18:05
Сообщения: 110
Откуда: МСК
Пол: Мужской
Коллеги,

в подпрограмме трансформации есть оператор READ TABLE:

READ TABLE standard_table WITH KEY
field1 = 1
field2 = 2

INTO string

Необходимо реализовать проверку на уникальность записи. Т.е. если нашлось больше одной записи - то возникает ошибка, программа заканчивается с сообщением на какой записи все накрылось медным тазом.

Подскажите, плиз, как реализовать эту затею? Заранее спасибо.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: READ RABLE и уникальные записи
СообщениеДобавлено: Пт, июн 28 2013, 13:15 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, окт 22 2009, 12:41
Сообщения: 473
Это наверное больше ABAP.
read по standard table вернет первую попавшуюся строку вероятно. Соответственно адекватного решения с этой конструкцией не вижу. Но можно заменить read на loop и посчитать количество циклов.
Однако разумнее в большинстве случаев заменить стандартную таблицу на сортированную по полям field1 field2 - по ней поиск будет выполняться быстрее тем же loop'ом. Или сделать read и дополнительно прочитать следующую строку за найденной и сравнить обе строки. Тогда можно даже использовать не sorted table, а просто отсортировать существующую (read ... binary search).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: READ RABLE и уникальные записи
СообщениеДобавлено: Пт, июн 28 2013, 15:22 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, ноя 26 2010, 20:07
Сообщения: 240
Пол: Мужской
Добрый день, задача плёвая. Рекомендую все-таки пободные темы создавать в ветке Форум по АВАР


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: READ RABLE и уникальные записи
СообщениеДобавлено: Сб, июн 29 2013, 01:19 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 08:25
Сообщения: 479
Без SORT

Code:
REPORT  ZZZTESTCA01.
TYPES: begin of line_tab1,
          ebeln TYPE EKPO-EBELN,
          ebelp TYPE EKPO-EBELP,
          matnr TYPE EKPO-MATNR,
       END OF line_tab1.

TYPES:   lt_tab1_type TYPE STANDARD TABLE OF line_tab1,
         lt_tab2_type TYPE STANDARD TABLE OF line_tab1.

DATA: lt_tab1 TYPE lt_tab1_type,
      lt_tab2 TYPE lt_tab2_type.

DATA:  wa_tab1 TYPE line_tab1,
       wa_tab2 TYPE line_tab1,
       tabix like sy-tabix value 1,
       text TYPE string,
       is_over TYPE c
       .

" получаем какие-то записи
SELECT ebeln ebelp matnr UP TO 1000 ROWS
  FROM EKPO
  INTO CORRESPONDING FIELDS OF TABLE lt_tab1.

" брем еще записи - скрее всего совпадут
SELECT ebeln ebelp matnr UP TO 30 ROWS
  FROM EKPO
  INTO CORRESPONDING FIELDS OF TABLE lt_tab2.

" перекидываем в таблицу, чтобы сделать повторяющиеся записи
LOOP AT lt_tab2 INTO wa_tab2.
  APPEND wa_tab2 to lt_tab1.
ENDLOOP.

FREE: lt_tab2, wa_tab2.

LOOP AT lt_tab1 INTO wa_tab1.
  WRITE: / wa_tab1-ebeln, '  ' , wa_tab1-ebelp,  '  ' , wa_tab1-matnr.
ENDLOOP.

" lt_tab2[] = lt_tab1[].

LOOP AT lt_tab1 INTO wa_tab1.
  "  write: / wa_ekpo-ebeln, wa_ekpo-ebelp.
  tabix = sy-tabix + 1.
  LOOP AT lt_tab1 INTO wa_tab2 FROM tabix.
    IF wa_tab1 EQ wa_tab2.
    CONCATENATE 'Неуникальная запись' ' _  ' wa_tab1-ebeln ' _ ' wa_tab1-ebelp ' _ '  wa_tab1-matnr INTO text.
      MESSAGE text TYPE 'I'.
      MOVE 'X' to is_over.
    ENDIF.
    IF is_over EQ 'X'.
      EXIT.
    ENDIF.
  ENDLOOP.
  IF is_over EQ 'X'.
    EXIT.
  ENDIF.
ENDLOOP.



Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: READ RABLE и уникальные записи
СообщениеДобавлено: Сб, июн 29 2013, 01:20 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 08:25
Сообщения: 479
SORT

Code:
REPORT  ZZZTESTCA02.
TYPES: begin of line_tab1,
          ebeln TYPE EKPO-EBELN,
          ebelp TYPE EKPO-EBELP,
          matnr TYPE EKPO-MATNR,
       END OF line_tab1.

TYPES:   lt_tab1_type TYPE STANDARD TABLE OF line_tab1,
         lt_tab2_type TYPE STANDARD TABLE OF line_tab1.

DATA: lt_tab1 TYPE lt_tab1_type,
      lt_tab2 TYPE lt_tab2_type.

DATA:  wa_tab1 TYPE line_tab1,
       wa_tab2 TYPE line_tab1,
       tabix like sy-tabix value 1,
       text TYPE string,
       is_over TYPE c
       .

" получаем какие-то записи
SELECT ebeln ebelp matnr UP TO 10 ROWS
  FROM EKPO
  INTO CORRESPONDING FIELDS OF TABLE lt_tab1.

" брем еще записи - скрее всего совпадут
SELECT ebeln ebelp matnr UP TO 3 ROWS
  FROM EKPO
  INTO CORRESPONDING FIELDS OF TABLE lt_tab2.

" перекидываем в таблицу, чтобы сделать повторяющиеся записи
LOOP AT lt_tab2 INTO wa_tab2.
  APPEND wa_tab2 to lt_tab1.
ENDLOOP.

FREE: lt_tab2.
CLEAR: wa_tab1, wa_tab2.

LOOP AT lt_tab1 INTO wa_tab1.
  WRITE: / wa_tab1-ebeln, '  ' , wa_tab1-ebelp,  '  ' , wa_tab1-matnr.
ENDLOOP.


SORT lt_tab1.
LOOP AT lt_tab1 INTO wa_tab1.
  IF wa_tab1 EQ wa_tab2.
    CONCATENATE 'Неуникальная запись' ' _  ' wa_tab1-ebeln ' _ ' wa_tab1-ebelp ' _ '  wa_tab1-matnr INTO text.
    MESSAGE text TYPE 'I'.
    MOVE 'X' to is_over.
  ELSE.
    wa_tab2 = wa_tab1.
  ENDIF.
  IF is_over EQ 'X'.
    EXIT.
  ENDIF.
ENDLOOP.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: READ RABLE и уникальные записи
СообщениеДобавлено: Сб, июн 29 2013, 01:21 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 08:25
Сообщения: 479
а зачем READ RABLE ? :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: READ RABLE и уникальные записи
СообщениеДобавлено: Вт, июл 02 2013, 11:39 
Специалист
Специалист

Зарегистрирован:
Пн, дек 26 2011, 18:05
Сообщения: 110
Откуда: МСК
Пол: Мужской
READ TABLE исторически сложился :)

Спасибо за ваш пример. Попробую прикрутить его в свою программу.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: READ RABLE и уникальные записи
СообщениеДобавлено: Вт, июл 02 2013, 14:08 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Вт, янв 30 2007, 17:10
Сообщения: 488
А про HASHED TABLE вам не рассказывали? Ваша програмка очень сократится в этом случае. Очень советую почитать какую-нибудь книжку по ABAP - откроете много нового ;)

_________________
Карма - это суперпозиция граблей, на которые мы уже успели наступить, но которые еще не долетели...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: READ RABLE и уникальные записи
СообщениеДобавлено: Ср, июл 03 2013, 08:21 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, сен 21 2010, 23:23
Сообщения: 83
DELETE ADJACENT DUPLICATES FROM itab.
Additions
1. ... COMPARING f1 f2 ...
2. ... COMPARING ALL FIELDS

Effect
Deletes neighboring, duplicate entries from the internal table itab . If there are n duplicate entries, the first entry is retained and the other n - 1 entries are deleted.
Two lines are considered to be duplicated if their default keys match.
The return code value is set as follows:

SY-SUBRC = 0 At least one duplicate exists, at least one entry deleted.
SY_SUBRC = 4 No duplicates exist, no entry deleted.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: READ RABLE и уникальные записи
СообщениеДобавлено: Ср, июл 03 2013, 10:36 
Специалист
Специалист

Зарегистрирован:
Пн, дек 26 2011, 18:05
Сообщения: 110
Откуда: МСК
Пол: Мужской
antitrust написал(а):
DELETE ADJACENT DUPLICATES FROM itab.
Additions
1. ... COMPARING f1 f2 ...
2. ... COMPARING ALL FIELDS

Effect
Deletes neighboring, duplicate entries from the internal table itab . If there are n duplicate entries, the first entry is retained and the other n - 1 entries are deleted.
Two lines are considered to be duplicated if their default keys match.
The return code value is set as follows:

SY-SUBRC = 0 At least one duplicate exists, at least one entry deleted.
SY_SUBRC = 4 No duplicates exist, no entry deleted.


Прикольно. Правда непонятно, возможно ли при помощи этой чудо команды вывести какие именно записи дублировались...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: READ TABLE и уникальные записи
СообщениеДобавлено: Вт, июл 09 2013, 09:36 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, сен 21 2010, 23:23
Сообщения: 83
Сделай таблицу вторую, из первой удали все, потом перебери вторую и удали что в первой и получишь то что дублировалось :mrgreen:


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: READ TABLE и уникальные записи
СообщениеДобавлено: Вт, июл 09 2013, 13:07 
Ассистент
Ассистент

Зарегистрирован:
Чт, июл 08 2010, 07:35
Сообщения: 42
Пол: Мужской
Можно так попробовать
Code:
  DATA: lt_tab1 TYPE TABLE OF ztable,
        lt_tab2 TYPE TABLE OF ztable.
  DATA: l_dupl TYPE i.
  FIELD-SYMBOLS: <fs1> TYPE ztable,
                 <fs2> TYPE ztable.

  SELECT * INTO TABLE lt_tab1 FROM field1.
  SORT lt_tab1 BY field1 field2.
  lt_tab2[] = lt_tab1[].

  DELETE ADJACENT DUPLICATES FROM lt_tab2 COMPARING field1 field2.
  IF sy-subrc <> 0.
    "нет повторяющихся записей
  ELSE.
    LOOP AT lt_tab2 ASSIGNING <fs2>.
      CLEAR: l_dupl.
      LOOP AT lt_tab1 ASSIGNING <fs1> WHERE field1 = <fs2>-field1 AND field1 = <fs2>-field1.
        ADD 1 TO l_dupl.
        if l_dupl > 1.
          WRITE:/ <fs2>."вывод строки, для которой нашли дубликаты
          exit.
        endif.
      ENDLOOP.
    ENDLOOP.
  ENDIF.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: READ TABLE и уникальные записи
СообщениеДобавлено: Вт, июл 09 2013, 22:28 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Code:
SORT lt_tab BY field1 field2.
LOOP AT lt_tab INTO ls_tab.
  AT LAST.
    EXIT.
  ENDAT.
  lv_subrc = sy-subrc + 1 .
  READ TABLE lt_tab INTO ls_tab2 INDEX lv_tabix.
  CHECK sy-subrc = 0 and ls_tab-field1 = ls_tab2-field1 AND ls_tab-field2 = ls_tab2-field2.
  WRITE:/ 'Duplicate record:', ls_tab-field1, ls_tab-field2.
  DELETE lt_tab INDEX sy-subrc.
ENDLOOP.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: READ TABLE и уникальные записи
СообщениеДобавлено: Ср, июл 10 2013, 00:21 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
как вариант:
Code:
data: begin of          tj301
      , stsma           type tj30-stsma               " Статусная схема
      , estat           type tj30-estat               " ПользовСтатус
      , stonr           type tj30-stonr               " Порядковый No.
      , txt04           type tj30t-txt04              " Стату
      , txt30           type tj30t-txt30              " Статус
    , end of            tj301
    .
data: source_table      like table of tj301
    .
data: tj30_t            like sorted table of tj301
                        with non-unique key
                        stsma     " Статусная схема
                        estat     " ПользовСтатус
    , tj30_i            like tj30_t[]
    , i1                type i
    , n1                type i
    .

... " fill source_table

tj30_t[] = source_table[].  " <- sort

i1 = 1.
do.

  read table tj30_t   into tj301  index i1.
  if sy-subrc eq 0.
  else.
    exit.
  endif.

  n1 = 0.

  loop at tj30_t            into tj301 
    from i1
    where stsma             eq tj301-stsma           " Статусная схема
      and estat             eq tj301-estat           " ПользовСтатус
    .
    add 1 to n1.
    insert tj301  into table tj30_i.
  endloop.  " loop at table tj30_t     into tj301

  case n1.
    when 0.
      exit.
    when 1.
      delete tj30_i   index sy-tfill.   " no duplicates -> exclude
    when others.
  endcase.

  add n1  to i1.

enddo.

write: / 'Duplicate records:'.
write: /(20) 'STSMA', (10) 'ESTAT', (6) 'INDEX'.

* gen1
loop at tj30_i            into tj301
*  where stsma             eq #-stsma           " Статусная схема
*    and estat             eq #-estat           " ПользовСтатус
  .
  read table tj30_t   from tj301  transporting no fields.
  write
  : / tj301-stsma   under 'STSMA'      " Статусная схема
  , tj301-estat     under 'ESTAT'      " ПользовСтатус
  , sy-tabix        under 'INDEX'
  .
endloop.  " loop at table tj30_i     into tj301



Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: READ TABLE и уникальные записи
СообщениеДобавлено: Чт, июл 11 2013, 07:54 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
Еще вариант
Code:
TYPES:
  BEGIN OF t_row,
     field1 TYPE c,
     field2 TYPE c,
  END OF t_row.

DATA:
  ls_tab TYPE t_row,
  lt_tab TYPE STANDARD TABLE OF t_row,
  lt_tab2 TYPE SORTED TABLE OF t_row WITH UNIQUE KEY field1 field2.

LOOP AT lt_tab INTO ls_tab.
  INSERT ls_tab INTO TABLE lt_tab2.
  IF sy-subrc <> 0.
    WRITE:/ 'Duplicate record:', ls_tab-field1, ls_tab-field2.
  ENDIF.
ENDLOOP.


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

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


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

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


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

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