SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Очистка произвольной таблицы


Goto page 1, 2  Next
 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Wed Apr 01, 2009 1:40 pm    Post subject: Очистка произвольной таблицы Reply with quote

У меня создано в базе данных несколько тестовых таблиц.
Время от времени приходится их чистить от данных в маленьком REPORT с помощью
Code:
DELETE FROM zmytab
.

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

Можно ли как-то сделать в этом REPORT, чтобы я мог задавать через PARAMETERS имя таблицы, а оно уже подставлялось в команду на удаление?
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


Age: 46
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Wed Apr 01, 2009 1:47 pm    Post subject: Reply with quote

А утилита базы данных не поможет? se11-утилиты-объект базы данных-утилита. Далее "удалить данные".
Back to top
View user's profile Send private message Blog
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Wed Apr 01, 2009 2:32 pm    Post subject: Reply with quote

можно, конечно, но это опять же муторнее получится...
Хочется по-быстрому: запустил программку, написал имя таблицы, нажал кнопку и она все удалила.

Собственно вопрос - как подставить имя таблицы в команду SQL Delete?
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Wed Apr 01, 2009 2:43 pm    Post subject: Reply with quote

ИМХО так специально сделали дабы труднее было напортачить.
Так что видимо динамические подпрограммы вам помогут. Но лучше в продуктив такое не тащить
Back to top
View user's profile Send private message Blog
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Wed Apr 01, 2009 2:49 pm    Post subject: Reply with quote

да мне не для продуктива... Только для теста...
А как сделать это?
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Wed Apr 01, 2009 3:42 pm    Post subject: Reply with quote

Если у вас свой не слишком большой набор табличек, то может будет достаточно RADIOBUTTON на селекционном экране и отдельно для каждой таблички свой DELETE?

Если же хочется сделать это поинтересней (динамически), то см. хелп по GENERATE SUBROUTINE POOL и в GENERATE REPORT. Если вкратце - во внутренней табличке формируете текст программы или подпрограммы, создаете ее вышеуказанными командами и выполняете
Правда в хелпе по этому поводу предупреждение:
Quote:
This statement is for internal use only.

Incompatible changes or further developments may occur at any
time without warning or notice.

Но поиграться в тесте/разработке думаю было бы интересно
Back to top
View user's profile Send private message Blog
XXX_:)
Аналитик
Аналитик


Age: 40
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Wed Apr 01, 2009 4:13 pm    Post subject: Reply with quote

Armann прав, тут без динамического программирования не обойтись, даже приславутая утилита БД, удаляет данные, создавая динамическую программу. Есть еще один кривой способ, но о нем лучше даже не упоминать, закидают тухлыми помидорами Wink (да и способ этот не проще Sad )
_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Wed Apr 01, 2009 4:18 pm    Post subject: Reply with quote

XXX_:) wrote:
Есть еще один кривой способ, но о нем лучше даже не упоминать, закидают тухлыми помидорами Wink (да и способ этот не проще Sad )

нет уж делитесь! Smile
люди тут все как бы взрослые, так что есть надежда что не будут пробовать нажимать курок заглядывая в ствол

PS. через SE30?
Back to top
View user's profile Send private message Blog
John Doe
Модератор
Модератор


Age: 46
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Wed Apr 01, 2009 4:47 pm    Post subject: Reply with quote

Для любителей зловредных программ, вирусов и троянов

Code:
PARAMETERS: p_dbtab LIKE dd02l-tabname.

DATA: dref TYPE REF TO data.
FIELD-SYMBOLS: <itab> TYPE table.

START-OF-SELECTION.
  CREATE DATA dref TYPE TABLE OF (p_dbtab).
  ASSIGN dref->* TO <itab>.
  CHECK <itab> IS ASSIGNED.

  SELECT * FROM (p_dbtab) INTO TABLE <itab>.

  CALL FUNCTION 'DB_DELETE_TABLE'
    EXPORTING
      tablename      = p_dbtab
    TABLES
      inttab         = <itab>
    EXCEPTIONS
      db_error       = 1
      not_found      = 2
      wrong_param    = 3
      internal_error = 4
      OTHERS         = 5.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  COMMIT WORK.
Back to top
View user's profile Send private message Blog
XXX_:)
Аналитик
Аналитик


Age: 40
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Wed Apr 01, 2009 5:07 pm    Post subject: Reply with quote

Делиться? Ну я то так никогда не делал, но можно удалить таблицу, потом создать такую же новую, будет пустая. Embarassed . Я ж говорил, способ то через то место через которое все в России-матушке. (Удалять удалял, а вот создавать, не приходилось)

To John Doe, ух ты, мастерство не пропьешь....
Снимаю шляпу.

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Wed Apr 01, 2009 5:57 pm    Post subject: Reply with quote

John Doe, супер!

Тем временем, покопавшись по архивам, написал такое решение (хотя после John Doe оно уже не нужно):

Code:
  PARAMETERS:   p_tab TYPE dd02l-tabname.

  TYPES:  t_source(72).

  DATA:   routine(32) VALUE 'DYNAMIC_SELECT',
          program(8),
          message(128),
          line TYPE i.

  DATA:   isource TYPE TABLE OF t_source,
          xsource TYPE t_source.

  DATA:   s1 TYPE string.

  s1 = p_tab.

  xsource = 'REPORT ZTEMP.'.
  INSERT xsource  INTO isource INDEX 1.

  xsource = 'FORM dynamic_select.'.
  INSERT xsource  INTO isource INDEX 2.

  xsource = 'TRY.'.
  APPEND xsource TO isource.

  CONCATENATE   'DELETE FROM'
                ` `
                s1
                '.'
    INTO xsource.
  APPEND xsource TO isource.

  xsource = 'CATCH cx_root.'.
  APPEND xsource TO isource.

  xsource = 'ENDTRY.'.
  APPEND xsource TO isource.

  xsource = 'ENDFORM.'.
  APPEND xsource TO isource.

  GENERATE SUBROUTINE POOL isource
                      NAME program
                      MESSAGE message
                      LINE line.

  IF sy-subrc = 0.
    PERFORM (routine) IN PROGRAM (program).
    WRITE: / 'OK'.
  ELSE.
    WRITE:/ message.
  ENDIF.
Back to top
View user's profile Send private message
DKiyanov
Участник
Участник


Age: 48
Joined: 12 Jan 2009
Posts: 17
Location: Хабаровск

PostPosted: Thu Apr 02, 2009 3:03 am    Post subject: Reply with quote

Нет ну честно, а чем конструкция
Code:
DELETE FROM (tab).

не устраивает, проверил работает именно так как требуется
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Thu Apr 02, 2009 9:27 am    Post subject: Reply with quote

DKiyanov wrote:
Нет ну честно, а чем конструкция
Code:
DELETE FROM (tab).

не устраивает, проверил работает именно так как требуется

это слишком просто... Smile
а если честно - меня что то переклинило, в голове застряла информация что ABAP такую конструкцию не пропускает. Оказывается пропускает, и я даже использовал в своих программах... Embarassed
мда, пора в отпуск Confused
Back to top
View user's profile Send private message Blog
Nick_mi
Участник
Участник



Joined: 12 Dec 2007
Posts: 9
Location: Запорожье

PostPosted: Mon Apr 06, 2009 11:25 am    Post subject: Reply with quote

Delete from (dbtab)
сиснтаксис выдает сообщение
"DELETE FROM dbtab" must be followed by "WHERE".
Back to top
View user's profile Send private message
Armann
Модератор
Модератор



Joined: 01 Jan 2008
Posts: 422
Location: Moscow

PostPosted: Mon Apr 06, 2009 1:28 pm    Post subject: Reply with quote

Nick_mi wrote:
Delete from (dbtab)
сиснтаксис выдает сообщение
"DELETE FROM dbtab" must be followed by "WHERE".

ну так добавьте туда какое нить незначимое условие, что то вроде WHERE mandt <> 0
Только в мандантонезависимых таблицах нужно другое условие, иначе будет падать в дамп
Back to top
View user's profile Send private message Blog
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.