Всем привет
Вопрос больше теоритический, т.к., возможно, я что-то не так понимаю...
Для примера возьму ту задачу с которой как раз работаю:
есть Заказ, к нему создаётся Поставка;
есть стандартный функционал переноса текстов в поставку из предшествующего документа (тр. 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 справляется с задачей.
Ну и как постскриптум:
* Почему использую именно эти экситы? Потому что стандартными настройками текста можно показать его (сгенерированный екст) в попап окошке там и всякое такое.
Много написал. Надеюсь, хоть кто-то прочтёт это до конца ))