Текущее время: Вт, июл 08 2025, 23:59

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Работа с INIT_TEXT / SAVE_TEXT и т.д.
СообщениеДобавлено: Пт, сен 06 2013, 17:45 
Начинающий
Начинающий

Зарегистрирован:
Ср, янв 28 2009, 12:06
Сообщения: 13
Пол: Мужской
Всем привет

Вопрос больше теоритический, т.к., возможно, я что-то не так понимаю...

Для примера возьму ту задачу с которой как раз работаю:
есть Заказ, к нему создаётся Поставка;
есть стандартный функционал переноса текстов в поставку из предшествующего документа (тр. VOTXN);
Задача сгенерировать 1 текст по какому-то там хитрому правилу.

Тексты эти копируются в недрах ФМа RV_TEXT_COPY "Texte im Vertriebsbeleg kopieren". В группе функций есть USER-exit:
DATEN_KOPIEREN_01
DATEN_KOPIEREN_02
DATEN_KOPIEREN_03
Которые можно включить для текстов поставки в узле ракурса ведения "Последовательность доступа для ид. текста" (это в тр. VOTXN).

Это всё присказка. А теперь в DATEN_KOPIEREN_03 имеется пример кода (или же просто стандартный кусок) как же этимим USER-exit можном пользоваться:
Code:
FORM DATEN_KOPIEREN_03 .
*{   INSERT         KA5K035869                                        1
*---------------------------------------------------------------------*
*       FORM - Routine User-EXIT ( Kopieren von Texten )              *
*---------------------------------------------------------------------*

*---------------------------------------------------------------------*
*       FORM DATEN_KOPIEREN_99                                        *
*---------------------------------------------------------------------*
*       Folgende Workareas stehen zur Verfuegung:                     *
*                                                                     *
*         FTVCOM   - KommunikationsblocK                              *
*         FXTHEAD  - Textkoepfe                                       *
*         FXVBPA   - Partner                                          *
*         REFERENZ - Workarea für zu referierenden Textbaustein       *
*                                                                     *
*       Um einen Text zu referieren, ist die Workarea REFERENZ zu     *
*       fuellen. Die Sprachherkunft des zu referierenden Textes       *
*       wird aus der TTXVR abgeleitet.                                *

*       Die Meldungen sind in Tabelle 100 der Message-ID 'VX' zuge-   *
*       ordnet.                                                       *
*---------------------------------------------------------------------*
*       Beispiel:                                                     *
*       Um den Standardtext RV_USER_EXIT_99 zu ziehen, sind folgende  *
*       Eintraege in der Workarea REFERENZ zu machen :                *
*         REFERENZ-TDID     = 'ST  '.                                 *
*         REFERENZ-TDOBJECT = 'TEXT      '.                           *
*         REFERENZ-TDNAME   = 'RV_USER_EXIT_99'.                      *
*       In der TTXVR ist die Sprachherkunft mit TTXVR-SPRAS = 'D'     *
*       anzugeben.                                                    *
*---------------------------------------------------------------------*
  type-pools: adkb.

  data: begin of i_tline occurs 1.
          include structure tline.
  data: end of i_tline.
  data: begin of i_thead occurs 1.
          include structure thead.
  data: end of i_thead.
  data: name like i_thead-tdname,
        matnr_ex(40).
  data: bestandstext type adkb_t001,
        line like line of bestandstext.
  data: save_langu like sy-langu.

* Generischen Namen für Standardtext aus Kunden-, Beleg- und
* Positionsnummer zusammenkochen
  write 'AD'         to name.
  write ftvcom-matnr to name+3(10).
  write ftvcom-kunnr to name+14(10).
  write ftvcom-vbelv to name+21(10).

* Standardtext initialisieren
  call function 'INIT_TEXT'
        exporting
            id       = 'ST'
            language = fxvbpa-spras
            name     = name
            object   = 'TEXT'
       importing
            header   = i_thead
       tables
            lines    = i_tline
*    EXCEPTIONS
*         ID       = 1
*         LANGUAGE = 2
*         NAME     = 3
*         OBJECT   = 4
*         OTHERS   = 5
            .

* Lagerbestand in i_tline holen
  move sy-langu to save_langu.
  move fxvbpa-spras to sy-langu.
  call function 'SPCKB_STOCK_INFORMATION'
       exporting
            matnr        = ftvcom-matnr
            vrkme        = ftvcom-vrkme
       importing
            bestandstext = bestandstext
       exceptions
            others       = 4.
  move save_langu to sy-langu.

  loop at bestandstext into line.
    move ' *' to i_tline-tdformat.
    move line to i_tline-tdline.
    append i_tline.
  endloop.

  call function 'SAVE_TEXT'
       exporting
           client             = sy-mandt
           header             = i_thead
       tables
           lines              = i_tline
           .

* referenz-workarea füllen
  referenz-tdid     = 'ST'.
  referenz-tdobject = 'TEXT'.
  referenz-tdname   = name.
*eject

*}   INSERT
ENDFORM.


После просмотра этого кода становится понятно, что основная идея это -- создать свой стандартный текст, как-то его сформировать и в струкутру referenz закинуть ID, OBJECT и NAME своего "временного" текста, после чего стандартный код копирования текстов этот текстик и подтянет в нужный текстик поставки.

И вот тут я перестаю понимать! Чтоб такое сработало, этот "временный" текст должен быть сохранён. Тут в примере формируется динамическое имя по номеру Заказа, материала и т.п., т.е. для каждой поставки такой текст будет оседать в таблице текстов. Именно по этому слово временный я брал в кавычки. Что с нимим потом делать? Или я не так понимаю функционал ФМов работы с текстами INIT_TEXT / SAVE_TEXT и т.д. Может, они не сохраняются в БД, или, может, чистятся как-то?

Придумал чистить эти временные тексты сам, но не смог найти подходящего места для вызова чистки (да и не нравится мне такое). Пробовал BAdI LE_SHP_DELIVERY_PROC. Но его методы INITIALIZE_DELIVERY, FILL_DELIVERY_HEADER вызываются до создания временных текстов, а метод DELIVERY_FINAL_CHECK, SAVE_AND_PUBLISH_DOCUMENT запускаются уже после показа пользователю интерфеса создания поставки (при не фоновом режиме) при нажатии кнопки сохранить (а при отмене сохранения, эти тексты, конечно же, остаются). Конечно же, при создании, всё таки, поставки к этому заказу, текст удалится, но если потом (после отмены сохранения) поставка так и не будет создана, то этот текст зависнет там на всегда. В фоновом режиме худо-бедно метод SAVE_AND_PUBLISH_DOCUMENT справляется с задачей.

Ну и как постскриптум:
* Почему использую именно эти экситы? Потому что стандартными настройками текста можно показать его (сгенерированный екст) в попап окошке там и всякое такое.

Много написал. Надеюсь, хоть кто-то прочтёт это до конца ))


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Работа с INIT_TEXT / SAVE_TEXT и т.д.
СообщениеДобавлено: Вс, сен 08 2013, 23:57 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, окт 08 2009, 05:37
Сообщения: 70
Пол: Мужской
Делал подобную разработку (правда для фактур, но все так же как у вас).
Для удаление "временных" текстов использую программу которая запускается по расписанию (раз в день, ночью) и удаляет все ненужные тексты.
Тоже искал экзиты и хотел использовать WF, но этот вариант показался самым простым.

PS.
Тексты сохраняются в БД с помощью фм COMMIT_TEXT, он вызывается где-то в конце работы программы.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Работа с INIT_TEXT / SAVE_TEXT и т.д.
СообщениеДобавлено: Пн, сен 09 2013, 07:52 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 07:32
Сообщения: 777
Откуда: Москва
Пол: Мужской
Помимо INIT_TEXT, READ_TEXT и SAVE_TEXT есть еще несколько замечательных ФМ. Один из них - RENAME_TEXT.
Насколько я понимаю, если идентификатор текста неизвестен на этапе вызова SAVE_TEXT, то оперируют с "временным" идентификатором.
Этот временный идентификатор заменяют вызовом RENAME_TEXT в процедуре, когда ID текста уже можно установить однозначно, но до (!) вызова COMMIT (в том числе COMMIT_TEXT).
Посмотрите на ФМ группы функций STXD - длинные тексты до записи в БД обрабатываются в контексте этой группы функций и хранятся в некотором каталоге в памяти. До обработки COMMIT'а они в вашем полном распоряжении :)

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Работа с INIT_TEXT / SAVE_TEXT и т.д.
СообщениеДобавлено: Ср, июл 09 2014, 20:18 
Начинающий
Начинающий

Зарегистрирован:
Ср, янв 28 2009, 12:06
Сообщения: 13
Пол: Мужской
nicky555, спасибо. RENAME_TEXT действительно от меня как-то ускользал, хотя я и штудировал группу функций STXD :)

Но в контексте того, что я писал в первом посте, ренейм мне уже не может помочь. Чтоб отработал стандартный код копирования текстов SAVE_TEXT уже должен отработать. Вот и получается что текст остаётся в БД.

Я воспользовался ФМ-ом SELECT_TEXT для чистки всех текстов удовлетворяющих условиям (т.к. я сам создаю тексты ST, то могу подстроить удобный мне фильтр) и старше какого-то срока. Получается что у меня первый создатель документа чистит временные тексты за всеми.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Работа с INIT_TEXT / SAVE_TEXT и т.д.
СообщениеДобавлено: Чт, июл 10 2014, 10:03 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Если текст нужно сгенерировать, то зачем делать это в подпрограмме копирования?
Может записать текст напрямую, в USEREXIT_SAVE_DOCUMENT, когда уже известен номер документа?

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с INIT_TEXT / SAVE_TEXT и т.д.
СообщениеДобавлено: Чт, июл 10 2014, 15:52 
Начинающий
Начинающий

Зарегистрирован:
Ср, янв 28 2009, 12:06
Сообщения: 13
Пол: Мужской
Удав написал(а):
Если текст нужно сгенерировать, то зачем делать это в подпрограмме копирования?
Может записать текст напрямую, в USEREXIT_SAVE_DOCUMENT, когда уже известен номер документа?

В принципе да, есть разные другие места реализации задачи в глобальной постановке (созадть текст к поставке на основе значений полей заказа). Была выбрана подпрограмма копирования, из-за двух причин:
1. Её использование позволяет настроить показ попап экранчиков со скопированными/сгенерированными текстами штатными средствами, с возможностью изменить/подтвердить правильность текста. В общем унификация.
2. Такое решение советует SAP (ну или советовал 10 лет назад :) ).

Как раз из-за второго пункта я и создавал тему, т.к. считал каким-то "неправильным". Один из USEREXIT как раз и имел код для примера, так сказать идеальную реализацую ;), которая и представлена в первом посте.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

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


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

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


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

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