Текущее время: Сб, июл 19 2025, 22:10

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


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

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


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

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