Текущее время: Вт, апр 23 2024, 20:21

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Чт, мар 10 2016, 11:09 
Специалист
Специалист

Зарегистрирован:
Чт, фев 15 2007, 11:04
Сообщения: 176
Всем привет!

В системе завелся странный полтергейст. Выглядит то следующим образом: Периодически при проводке (предварительно созданной) счет-фактуры в miro или mir4 случается дамп. (Творится это в течение уже 2-х лет, но сейчас проблема стала заметно актуальна). Каких-либо закономерностей обнаружить не удалось. Проблема плохо воспроизводима. Разные счет-фактры у разных пользователей в разное время. Примерно в 5% проводок это происходит. В QAS (копии системы) воспроизвести ни разу не получилось. Дамп - RAISE_EXCEPTION ERROR_DP в программе C_TEXTEDIT_CONTROL================CP. Если попробовать пройти в дебагере, выполняя эту проводку, и сравнить со стеком вызовов из дампа, то видно что развилка в выполнении ABAP когда дамп случается в ФМ MRM_INVOICE_POST на строке IF NOT editor IS INITIAL. Если условие выполняется - то вызывается форма text_save и в ней (а точнее в методе который она в свою очередь вызывает GET_TEXT_AS_R3TABLE) - и случается дамп. Т.е. в тех редких 5% случаев переменная editor (глобальная) каким-то образом получает некое значение (и затем случается дамп). В коде MRM_INVOICE_POST единственная операция с editor выгдядит как MOVE i_editor TO editor. Более ничего через поиск в коде не обнаруживается. В стеке вызовов дампа видно что i_editor подается на вход MRM_INVOICE_POST как INITIAL. Но затем каким-то чудесным образом внутри MRM_INVOICE_POST editor получает некое значение (ссылку на адрес класса - это так же видно в секции дампа Вызовы), вызывает по условию IF форму text_save - ну и далее случается дамп.
Надеюсь описал ситуацию достаточно внятно :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Чт, мар 10 2016, 13:14 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
вероятно открывали закладку нотиса (текст примечаний в заголовке) ,
экран saplmr1m 6160, ссылка на контрол(окошко) с текстом осталась,
а с самим контролом к моменту сохранения что-то произошло,
контрол при попытке сохранения нотиса попытался определить свои
размеры через data provider и не смог


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Чт, мар 10 2016, 14:28 
Специалист
Специалист

Зарегистрирован:
Чт, фев 15 2007, 11:04
Сообщения: 176
trop, спасибо!
Это уже другая проблема что с контролом что-то происходит. Повторюсь - в обычной ситуации дело до C_TEXTEDIT_CONTROL================CP вообще не доходит.
Т.е. при попытке воспроизвести ставим брейкпоинт в text_save - бегаем по всем закладкам - все что видим - и проводим. В точку прерывания не попадаем.
Интересно как так случается, что editor приобретает изневедома значение? Как это может случаться?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Чт, мар 10 2016, 14:43 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
editor только на pbo экрана 6160 может получить значение,
экран вызывается при входе на закладку с примечаниями в заголовке

покажите стэк из дампа: abap->активные вызовы


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Чт, мар 10 2016, 14:47 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
Инициализировать контрол можно и в BADI INVOICE_UPDATE, в методе IF_EX_INVOICE_UPDATE~CHANGE_AT_SAVE , к примеру.
Code:
  DATA: tab_text TYPE TABLE OF text132.
  FIELD-SYMBOLS: <editor> TYPE REF TO c_textedit_control.
 
  ASSIGN ('(SAPLMR1M)EDITOR') TO <editor>.
  CREATE OBJECT <editor>
    EXPORTING
      repid             = sy-cprog.

  APPEND 'Test text' TO tab_text.
  CALL METHOD <editor>->set_text_as_r3table
    EXPORTING
      table           = tab_text
    EXCEPTIONS
      error_dp        = 1
      error_dp_create = 2
      OTHERS          = 3.

  CALL METHOD <editor>->set_textmodified_status
    EXPORTING
      status = 1.

  CALL METHOD c_textedit_control=>flush.

За любителями ASSIGN нужен глаз да глаз.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Чт, мар 10 2016, 14:49 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
Я думаю, что проблема поглубже будет, примерно как в этой теме Abap dump error after putting text into the "Note Tab" of MIRO
Что-то связанное с вызовом ФМ или апдейта с последующим коммитом в расширении.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Чт, мар 10 2016, 14:57 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
остаётся ставить точки на commit, rollback и в конструкторе контрола,
и можно убедиться, что в (sapmssy0)orders[] есть строка saplmr1m editor_reset


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Чт, мар 10 2016, 17:14 
Специалист
Специалист

Зарегистрирован:
Чт, фев 15 2007, 11:04
Сообщения: 176
https://yadi.sk/i/SGVuQCZiq49YN
https://yadi.sk/i/4d58CgPkq49aX
https://yadi.sk/i/is7nypPqq49b6

Это фотки дампа.

Джон, инициализировать editor можно из кучи мест, это мне понятно. Например если заполнить закладку Notes заголовка счет-фактуры (тот самый экран, о котором пишет trop).
НО вот какая фигня (мне неясная) - в этом случае i_editor конечно будет проинициализирована тоже, выше по стеку вызовов в MRM_INVOICE_POST. И тут никакой магии нет.
Просто насколько я понимаю, в случае той последовательности шагов, при которой случается дамп - editor как-то ловко приобретает некое значение. Должно быть видно на этих 3-х фотках.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Чт, мар 10 2016, 17:29 
Специалист
Специалист

Зарегистрирован:
Чт, фев 15 2007, 11:04
Сообщения: 176
Джон, Abap dump error after putting text into the "Note Tab" of MIRO - у этих товарищей немного другой случай. Они сделали в энхансменте соммит. И у них как я понимаю - ВСЕГДА, если заполнить notes - случается этот дамп, поскольку при заполненном notes стандарт вызывает некорректную Z-логику.
У меня же в NOTES все чисто. Никаких пробелов и подобного не замечено. Тем не менее иногда дамп.
Если поле NOTES заполнить - дампа нет. У проведенных счет-фактур, на которых случился дамп - чем-либо заполненного NOTES мной не замечено (возможно потому что в системе нет ни одной счет фактуры с заполненным notes).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Чт, мар 10 2016, 17:51 
Специалист
Специалист

Зарегистрирован:
Чт, фев 15 2007, 11:04
Сообщения: 176
trop, целиком дамп выложить не могу - закрытый контур. Но могу пофоткать нужные части..

Да, к большому сожалению невозможно сторнировать проведенную с дампом счет-фактуру чтобы попытаться повторить трюк (и понять - дамп зависит от данных или от веления господне)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Пт, мар 11 2016, 08:23 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, ноя 03 2004, 14:51
Сообщения: 1912
Откуда: КраснАдар
Пол: Мужской
nazarov_serg303 написал(а):
Джон, Abap dump error after putting text into the "Note Tab" of MIRO - у этих товарищей немного другой случай. Они сделали в энхансменте соммит. И у них как я понимаю - ВСЕГДА, если заполнить notes - случается этот дамп, поскольку при заполненном notes стандарт вызывает некорректную Z-логику.

Вижу, что Вы суть не уловили. В той теме не уточняется для каких фактур вызывается процедура с коммитом. Вполне возможно, что также как и у Вас в 5% случаев срабатывает. Но и это совсем не важно. Основной посыл - ищите проблему в своих расширениях. Вы же продолжаете упорствовать, что это стандартный код все портит.
В принципе, Ваше право - пусть это останется волшебством или фичей, раз Вы уже 2 года с этим живете.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Пт, мар 11 2016, 08:45 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
(saplmr1m)editor прокидывается из подпрогр parked_document_post(saplmr1m)
-> MRM_PARKED_INVOICE_POST -> MRM_INVOICE_CREATE -> MRM_INVOICE_POST
в стандарте i_editor прокидывается в каждом ф/м по ссылке,
а у вас в дампе i_editor=(saplmr1m)editor пуст, а (saplmrmp)editor заполнен
(i_editor и editor в ф/м MRM_INVOICE_POST разведены в разные переменные,
первая из вызывающей гр/ф MR1M, а вторая в гр/ф MRMP)

imho всего 2 варианта:

1) (saplmr1m)editor был пуст и какой -то код заполнил (saplmrmp)editor
в ф/м MRM_INVOICE_POST - между строками :319 move i_editor to editor и :2031 perform text_save,
но если бы было так, то явных причин для дампа вроде нет

2) (saplmr1m)editor был заполнен и передан при вызове подпрогр parked_document_post(saplmr1m),
(saplmrmp)editor заполняется стандартом до вызова ф/м MRM_INVOICE_POST в MRM_INVOICE_PARK :1136
через оператор копирования (move), значением из вызывающей гр/ф - (saplmr1m)editor ,
значит вероятно дело в преждевременном закрытии sap luw через операторы commit|rollback,
т.е. в MRM_INVOICE_POST переменная i_editor, она же (saplmr1m)editor скорее всего очистилась при вызове
commit work где-то в Z через заблаговременный вызов подпрогр perform editor_reset(saplmr1m) on commit
стандартом, контрол был удалён (CALL METHOD editor->destroy_control),
а прежняя ссылка в (saplmrmp)editor осталась, что и привело к дампу

если вариант 2), то надо поставить точку прерывания на MRM_INVOICE_PARK :1136
в месте копирования ссылки на контрол, остановиться там и поставить точку на оператор commit и rollback,
если такой вызовется не однократно в стандарте, а где-то в Z, то надо найти виновника и замучать его


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Пт, мар 11 2016, 12:38 
Специалист
Специалист

Зарегистрирован:
Чт, фев 15 2007, 11:04
Сообщения: 176
1)вариант - если сделать поиск "where used" для editor - то между строками 319 и 2031 MRM_INVOICE_POST ничего нет. М.б. не так ищу? Не АБАПер :J

2)вариант - про присвоение editor в MRM_INVOICE_PARK - хорошо понятно. А далее - совсем не понятно :J. Как я понимаю из инфы дампа,
на вход в MRM_INVOICE_POST i_editor была передана чистой. Или не так? Т.е. в моем понимании не важно как и было ли вообще присвоено значение в MRM_INVOICE_PARK,
если затем уже в MRM_INVOICE_POST editor был перезаписан значением i_editor (строка :319).
"скорее всего очистилась при вызове commit work где-то в Z" - это речь про Z внутри MRM_INVOICE_POST? Но там нет нигде ни editor ни i_editor, либо я не верно ищу.
B не уверен что там есть Z вообще (сори, не умею отличать стандартные энхансменты от кастом).
Верно ли я понял, что должно быть: 1) что-то, что вызывается в MRM_INVOICE_POST и возвращает i_editor? 2) либо что-то, что вызывается внутри MRM_INVOICE_POST и обращается с editor?


Последний раз редактировалось nazarov_serg303 Пт, мар 11 2016, 12:43, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Пт, мар 11 2016, 12:41 
Специалист
Специалист

Зарегистрирован:
Чт, фев 15 2007, 11:04
Сообщения: 176
Джон, сенкс, я только пытаюсь найти ошибку в своем понимании как тут все это работает.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глобальная переменная ref type to obj волшебным образом становится not initial
СообщениеДобавлено: Сб, мар 12 2016, 11:27 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
емнип, вероятный сценарий того, что происходит по времени:
1) MR1M: заполнено примечание в заголовке
2) MR1M: т.к. примечание заполнено, произойдет вызов -
perform text_save(saplmr1m), в котором отложенный вызов - perform editor_reset(saplmr1m) on commit,
т.е. отложена подпрограмма удаления контрола в момент срабатывания оператора
commit work (завершение sap luw).
в любой транзакции sap (не путать с транзакцией бд) commit work д.б. единственным
для атомарности, т.к. он запускает задачу обновления (update вызовы, отложенные вызовы arfc/qrfc/trfc)
3) MR1M -> MRMP: нажата кнопка моделирования (передача управления mr1m -> mrmp, копирование ссылки на контрол (editor)),
на этот момент в (saplmr1m)editor и (saplmrmp)editor содержат одинаковую ссылку
4) MRMP: вероятно где-то в z коде был вызван оператор commit work (sap luw закрыт преждевременно при моделировании),
при этом произошел вызов подпрограммы editor_reset(saplmr1m) который был отложен в шаге 2,
контрол удалился, (saplmr1m)editor очистился, но копия ссылки в (saplmrmp)editor осталась
5) MRMP: копия невалидной ссылки (saplmrmp)editor осталась (гр/ф MRMP)
и поэтому произошёл вызов подпрограммы (saplmrmp)text_save
(не путать с (saplmr1m)text_save в которой отложенный вызов)
в котором вызов метода get_text_as_r3table

если правильно понял нерабочего примера у вас нет,
заполняете примечание в заголовке и нажимаете моделирование, но перед этим
надо поставить 2 точки:
- ф/м MRM_INVOICE_PARK в нём происходит копировние ссылки i_editor=(saplmr1m)editor в (saplmrmp)editor,
- строка условия перед вызовом text_save(saplmrmp) в MRM_INVOICE_POST

после того как остановится на первой точке нужно пошагово (через F5) протыкать всё подпрограммы и методы до второй точки -
т.к. в дамп у вас не падает, значит не срабатывают какие-то предпосылки к тому z коду в котором вызов commit work,
и поэтому нужно смотреть внимательно все условные операторы и вызовы в которые не заходит при отладке,
искать там вызов commit work,
смотрите внимательно - в начале подпрограмм|методов|ф/м слева на текущей строке бывает иконка в виде спиральки,
если она есть, то нужно обязательно провалиться (F5), иначе не попадёте в секцию расширения


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

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


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

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


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

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