Что тут нужно сделать?
Категория Внутренняя ошибка ядра
ДинамОшибка DDIC_TYPE_INCONSISTENCY
Прикладной компонент BC-ABA-LA
Дата и время 03.07.2013 18:04:43
Краткий текст
Inconsistency in the dictionary for the structure «COEP_ONLY».
Что произошло?
Error in the SAP kernel.
The current ABAP «ZBPC_EKP_R» program had to be terminated because the
ABAP processor detected an internal system error.
Что Вы можете сделать?
Note which actions and input led to the error.
For further help in handling the problem, contact your SAP administrator
.
You can use the ABAP dump analysis transaction ST22 to view and manage
termination messages, in particular for long term reference.
Анализ ошибки
There is an internal system error.
eliminated with ABAP/4.
There is an inconsisteny for the DDIC structure «COEP_ONLY», the corresponding
Dictionary runtime object (NAMETAB) is incorrect.
The number of components of the structure (NAMETAB component «fldcnt»)
is specified as 77. If all the substructures are resolved and the
actual total number of components is calculated recursively, a different
value is returned.
Указания по устранению ошибки
The error was probably caused by changes being made to the
DDIC structure «COEP_ONLY» or one of its substructures and an error occurred
afterwards at activation. Check the runtime object of the structure «COEP_ONLY»
in the Dictionary to analyze the exact cause of the error.
If the program RSNTABCONSISTENCY or its predecessor RSDDCHECK exists in
your system, you can check structure «COEP_ONLY» with the help of one of these
programs.
If you cannot solve the problem yourself and want to send an error
notification to SAP, include the following information:
1. The description of the current problem (short dump)
To save the description, choose «System->List->Save->Local File
(Unconverted)».
2. Corresponding system log
Display the system log by calling transaction SM21.
Restrict the time interval to 10 minutes before and five minutes
after the short dump. Then choose «System->List->Save->Local File
(Unconverted)».
3. If the problem occurs in a problem of your own or a modified SAP
program: The source code of the program
In the editor, choose «Utilities->More
Utilities->Upload/Download->Download».
4. Details about the conditions under which the error occurred or which
actions and input led to the error.
Информация о месте прерывания
The termination occurred during generation of the ABAP/4 program «ZBPC_EKP_R».
—
The termination occurred in line 69
of the source code of program «ZBPC_EKP_R_TOP» (when calling the editor 690).
Внутренние указания
The termination was triggered in function «ab_RxDdicTypeError»
of the SAP kernel, in line 1068 of the module
«//bas/720_REL/src/krn/runt/abucutil.c#4».
The internal operation just processed is » «.
Internal mode was started at 20130703180443.
There is an inconsistency in the DDIC structure «COEP_ONLY», the corresponding
dictionary runtime object (NAMETAB) is incorrect.
The number of components of the structure (NAMETAB component «fldcnt»)
is specified using 77. If you dismantle all the substructures and
calculate the actual total number of all the components recursively
then the result is a different value.
The error was caused because structure «COEP_ONLY» or one of its substructures
was changed and an error occurred in the subsequent activation. Please
check the runtime object of the structure «COEP_ONLY» in the dictionary to
analysis the exact error cause.
If the program RSDDCHECK is available on your system, you can also use
it to check structure «COEP_ONLY».
ABAP Managed Database Procedures (AMDP) — новая технология встраивания собственного исходного текста базы данных в приложения на ABAP. Благодаря появлению и развитию SAP HANA разработчики на ABAP теперь могут использовать функции базы данных, превышающие возможности Open SQL. AMDP доступны в SAP NetWeaver 7.40 с пакетом поддержки 5 , но для применения некоторых описанных здесь функций требуются следующие пакеты поддержки.
Ключевое понятие |
|
Технология ABAP Managed Database Procedures позволяет встроить выполнение команд языка базы данных в язык ABAP и среду разработки ABAP. При этом проводятся проверки синтаксиса и анализ динамических ошибок, а также обеспечивается управление жизненным циклом. |
Большинство разработчиков ABAP столкнулись с необходимостью иметь доступ к базе данных, используя родной язык запросов, реализуемый системой управления базой данных. Например, для того, чтобы воспользоваться функциями управления базой данных, которые не входят в объем Open SQL, или оптимизировать код формируемых запросов для конкретной базы данных.
Теперь благодаря технологии ABAP Managed Database Procedures (AMDP) у них появилась возможность применять к базе данных более сложную прикладную логику. В отличие от более ранних решений, здесь это можно выполнить в рамках хорошо структурированного и четкого подхода.
В этой статье AMDP рассматривается с использованием стандартной среды разработки ABAP. Здесь описано синтаксическое встраивание и взаимодействие между сервером приложений ABAP и системой управления базой данных (СУБД). Такая информация поможет разработчикам понять, почему и в каких случаях возникают те или иные синтаксические или динамические ошибки.
Мы рассмотрим устранение связанных с базой данных проблем с помощью знакомых вам инструментов ABAP 9например, отладчика ABAP и анализа динамических ошибок ABAP), а также перечислим возможности расширения и особенности интеграции в структуру Business Add-In (BAdI).
Однако сначала сравним предыдущие возможности с новой функциональностью AMDP.
Прежде и теперь
Кратко вспомним прежние возможности для прямого доступа к базе данных через ABAP.
EXEC SQL
С «доисторических» времен ABAP — или с того периода, который многие современные разработчики назовут «доисторическим» — технология EXEC SQL существовала как способ вставки блока исходного текста на языке управления базой данных в ABAP. Блок EXEC SQL представляет собой всего лишь контейнер для любого языка управления базой данных с исходным текстом внутри. Этот текст, как надеется разработчик, будет распознан и корректно выполнен соответствующей СУБД. В большей или меньшей степени игнорируемые компилятором ABAP, эти фрагменты кода переносятся через системный ландшафт вместе с кодом ABAP. Во время выполнения они отправляются в базу данных для обработки.
Этот самый базовый подход не предполагает большого удобства в отношении таких важных вещей, как синтаксические проверки или анализ динамических ошибок. Чтобы выполнить тщательную проверку синтаксиса, разработчику потребуется дополнительная среда разработки для работы с базой данных. В противном случае придется воспользоваться старым добрым методом проб и ошибок. Работа с динамическими ошибками не идет дальше поиска сообщений об ошибках SQL.
ABAP Database Connectivity (ADBC)
Технология ADBC, появившаяся как альтернатива EXEC SQL, является полностью динамическим методом. Это система на основе классов, которая позволяет повторно использовать вызываемый код доступа к базе данных и применять к нему модульное проектирование. Ошибки возвращаются в виде исключений, которые проще обработать. Обмен данными между сервером приложений ABAP (AS ABAP) и базой данных осуществляется более универсальным способом, чем в EXEC SQL, где использование переменных было ограничено плоскими структурами и элементарными полями.
Несмотря на то, что технология ADBC отличается скоростью и удобством для вызова отдельных команд базы данных, на более длинных текстах исходного кода проявляется ее некоторая громоздкость, что, несомненно, проявится в том случае, если ABAP приложения передают большие фрагменты своего кода на выполнение в базу данных. Тем не менее, ADBC позволяет проводит синтаксические проверки встроенного исходного текста, что очень важно для обеспечения его качества.
CALL DATABASE PROCEDURE
Для компенсации недостатков EXEC SQL и ABDC, в частности, отсутствия статических проверок, команда CALL DATABASE PROCEDURE работает с исходным текстом, который контролируется не средой ABAP (AS ABAP), а непосредственно базой данных (SAP HANA). Соединение между SAP HANA и репозитарием ABAP устанавливается через прокси процедуры.
Результатом является прямое управление жизненным циклом разработки для более эффективной проверки синтаксиса. Разработчикам и администраторам приходится решать задачи синхронизации переносов такого кода в среде разработки ABAP и SAP HANA.
Можно ли улучшить этот процесс?
Да, можно. AMDP возвращается к концепции встраивания исходного текста родных команд управления базой данных в код ABAP, как и в EXEC SQL, но на этот раз со всеми неотъемлемыми удобствами ABAP: выделением синтаксиса, тщательной синтаксической проверкой, автодополнением и навигацией по исходному тексту. И что важнее всего, управление жизненным циклом разработки осуществляется AS ABAP. Как оказалось, это весьма существенно.
Основная идея AMDP заключается в использовании специальных методов ABAP в качестве контейнеров для исходного текста родных команд базы данных. Это означает, что для реализации метода имеются дополнения, указывающие систему базы данных и язык исходного текста.
Во время выполнения разработчики ожидают, что исходный текст будет доступен и исполним в базе данных без дополнительных процедур. В случае сбоя вызова им хотелось бы получать осмысленные сообщения об ошибках. Кроме того, к списку желаний здесь можно добавить поддержку при отладке и расширяемость.
Посмотрим, выполняет ли AMDP эти требования.
Создание метода AMDP
В следующих разделах статьи описан жизненный цикл методов AMDP, начиная с первого примера реализации на рис. 1.

Рис. 1. Реализация метода AMDP
Этот метод не содержит ABAP-кода, но строки между METHOD и ENDMETHOD являются исходным текстом текстом на языке используемой базы данных. В отличие от EXEC SQL, оператор метода обогащен синтаксическими добавлениями для указания базы данных (в данном случае HDB, т.е. SAP HANA) и указания используемого языка базы данных (здесь SQLSCRIPT). Это база для выделения синтаксиса и выполнения подробной синтаксической проверки.
Инфраструктура AMDP подготовлена для поддержки различных платформ и языков управления базами данных. Сегодня всеобщее внимание устремлено на SAP HANA, а реализация осуществляется только на базе SAP HANA с языком базы данных SQLScript. На рис. 2 показан часть класса AMDP с определением.

Рис. 2. Определение класса AMDP
В верхней части определения класса отображается интерфейс с именем IF_AMDP_MARKER_HDB. Этот интерфейс является обязательным и помечает класс как класс, содержащий методы AMDP (для HDB). Такой класс называется классом AMDP. Он также может содержать методы ABAP. В удобном интерфейсе несложно найти все классы AMDP, находящиеся в системе.
Сигнатура метода AMDP не отличается от метода ABAP. По сути, с первого взгляда читатель даже не поймет, что метод реализован как метод вызова в терминах родного языка базы данных. Однако, как мы узнаем ниже, в отношении параметров метода применяется ряд ограничений.
Методы AMDP могут являться статическими методами или методами экземпляра класса, общедоступными (Public) или частными (Private). Решение о выборе типа метода принимается в зависимости от структуры программного обеспечения или согласно личным предпочтениям разработчика.
Перенос данных между ABAP и базой данных с помощью методов AMDP
Поскольку методы AMDP встраиваются в приложения ABAP, они обязательно взаимодействуют с данными ABAP. С одной стороны, процедуры базы данных оперируют таблицами, ракурсами или объектами базы данных в целом. В теле метода разработчики должны иметь возможность обращаться к этим объектам.
Параметры
Методы AMDP могут иметь параметры EXPORTING, IMPORTING и CHANGING, но не RETURNING. Последний используется только в функциях базы данных AMDP, которые представляют собой вариант методов AMDP, описанных ниже.
Как было видно на предыдущем примере фрагмента кода (рис. 2), сигнатура метода AMDP выглядит как сигнатура метода ABAP с параметрами на основе типов данных ABAP. Несмотря на то, что тело реализовано на другом языке с другими типами системы, разработчикам не стоит беспокоиться о том, что в результате преобразования данных между языками возникнет масса ошибок. Система AMDP гарантирует корректное преобразование соответствующих типов базы данных в типы языка ABAP.
AMDP поддерживает элементарные типы ABAP и внутренние структурные типы, что упрощает обработку параметров, которая всегда была достаточно трудоемкой задачей в EXEC SQL или ADBC. Внутренние таблицы могут содержать вложенные структуры, поскольку создать аналог для глубоких структур в базе данных невозможно.
При импорте параметров возможно использование значений по умолчанию, которые устанавливаются в сигнатуре метода. Здесь AMDP также преобразует значения по умолчанию согласно системе соответствия типов из базы данных.
Единственным ограничением в отношении параметров метода AMDP является обязательный вызов по значению. Это очевидно, поскольку вызов метода AMDP означает выход из стека ABAP. Как при выполнении Remote Function Call (RFC), вызываемая сторона (в данном случае база данных) не получает доступа к данным ABAP.
Использование объектов ABAP-словаря
В теле метода AMDP разработчикам может потребоваться обратиться к другим объектам базы данных: таблицам и объектам в схеме базы данных (далее — схема SAPSID), а также к таблицам в других схемах, не относящихся к текущему AS ABAP.
Управление большей частью объектов базы данных в схеме SAPSID осуществляет ABAP-словарь. Таким образом, инфраструктура AMDP может проверять их наличие, табличные структуры и версии. Она позволяет выявить возможные синтаксические ошибки на очень ранних этапах проверки для любого типа базы данных. Вы можете воспользоваться преимуществами, которые дает такая информация, и получить максимально эффективные сообщения синтаксической проверки и средства навигации по исходному тексту. Таким образом, метод AMDP содержит описание USING, которое перечисляет таблицы, ракурсы или объекты базы данных, используемые в методе и хранящиеся в схеме SAPSID (рис. 3).

Рис. 3. Объявление таблиц словаря данных со ссылкой в условии USING
Дважды щелкните по любому объекту в списке USING для перехода к определению данных (например, транзакция SE11).
Объекты базы данных для схем, отличных от SAPSID, ABAP-словарем не контролируются, поэтому AMDP приходится полагаться на то, что они существуют и являются корректными. Указывать их в условии USING не обязательно, но обращаться к ним необходимо посредством префикса схемы.
Наконец, методы AMDP могут вызывать другие методы AMDP (рис. 4). Поскольку сами методы AMDP являются управляемыми ABAP объектами, они должны быть указаны в условии USING с полным именем.

Рис. 4. Объявление другого метода AMDP, вызванного в теле метода AMDP в условии USING
Синтаксическая проверка
Оформите подписку sappro и получите полный доступ к материалам SAPPRO
Оформить подписку
У вас уже есть подписка?
Войти
Предисловие — Этот пост является частью ABAP-новичок серии.
Введение
Программист всегда старается кодировать таким образом, чтобы в его коде не было ошибок и чтобы он был полностью проверен. Но есть определенные сценарии, когда его коды могут дать сбой. В таком случае, если кодер уже знает сценарии, он обрабатывает их в форме обработки ошибок. Но в случае ситуаций, когда ошибка может быть сгенерирована из-за неизвестных ситуаций и не обработана, это может привести к серьезным дампам. Для этих сценариев у нас есть обработка исключений в SAP. В этой статье мы рассмотрим все сценарии обработки исключений и ошибок в отчетах ABAP.
Обработка исключений и ошибок в отчетах SAP ABAP
Как обсуждалось выше, кодировщик должен обрабатывать известные проблемы, а также предполагаемые сообщения об ошибках. Эти сообщения отображаются пользователю в выводе с помощью оператора MESSAGE.
Различные способы обнаружения ошибок/исключений
ABAP предоставляет различные способы обнаружения ошибок в программе ABAP.
-
Использование системной переменной
Самый простой способ — использовать их системные переменные.
SY-SUBRC EQ 0. «Этот оператор указывает, что операция завершена успешно. SY-SUBRC NE 0. «Этот оператор указывает, что операция не удалась.
Этот способ работает напрямую, если весь код отчета обрабатывался в рамках одной программы. Это означает, что он не может напрямую поймать ошибку, если вы обработали операторы функционального модуля или класса ABAP. Для этих объектов нам нужно вызвать исключение с их конца, а затем исключение можно обработать в отчете и соответствующим образом обработать.
-
Отлов ошибок на основе исключения
В случае, если мы реализуем функциональный модуль или метод класса, важно вызвать исключение из этих классов, а затем мы можем поймать эти исключения в отчете и показать соответствующую ошибку.
Например:
CALL FUNCTION 'Test_Function' EXPORTING DELIMITER = ':' STRING = lv_string IMPORTING HEAD = lv_head TAIL = lv_tail EXCEPTIONS NOT_FOUND = 1 OTHERS = 2. CASE SY-SUBRC. КОГДА 1. ... // Показать сообщение об ошибке КОГДА 2. ... // Показать сообщение об ошибке КОГДА ДРУГОЕ. // Показать сообщение об ошибке ENDCASE.
-
Использование TRY CATCH ENDTRY
Если исключение возникает с помощью метода класса или возникает неожиданное исключение, в этих случаях мы используем функцию TRY CATCH SAP ABAP. Это один из лучших способов полного доказательства для обработки всех типов исключений.
Пример:
ПЫТАТЬСЯ. //Здесь вызовите свой класс или функциональный модуль CATCH CX_SY_ZERODIVIDE INTO O_REF. // Исключение, которое вы там вызвали СООБЩЕНИЕ «Ваше сообщение об ошибке». КОНЕЦ.
Различные способы отображения сообщений
-
Использование оператора ABAP
Синтаксис:
СООБЩЕНИЕ ' ' TYPE 'Введите тип сообщения здесь'.
Типы сообщений
ABAP предоставляет следующие 6 типов сообщений:
| Тип сообщения | Смысл | объяснение |
| A | прекращение | Это сообщение отображается при завершении программы. |
| E | Ошибка | Это сообщение отображается во время Ошибка. |
| I | Информация | Это сообщение используется для отображения любой информации. |
| S | Успех | Это отображается в состоянии экрана вывода. |
| W | Предупреждение | Он ведет себя как сообщение об ошибке. |
| X | Выход | Это вызывает короткий дамп с сообщением об ошибке. |
-
Использование предопределенных функциональных модулей
ABAP предоставляет следующие функциональные модули, которые можно использовать для хранения, форматирования и отображения сообщений:
| Функциональный модуль | Применение |
| MESSAGES_INITIALIZE | Для инициализации сообщений. |
| MESSAGE_STORE | Чтобы сохранить сообщения для отображения. |
| MESSAGES_SHOW | Отображать все сообщения вместе во всплывающем окне |
| FORMAT_MESSAGE | Форматировать сообщения |
| HR_DISPLAY_ERROR_LIST | Для отображения всех сообщений об ошибках |
Пример:
- Использование оператора сообщения
СООБЩЕНИЕ 'Это сообщение об ошибке' ТИП 'E'.
- Использование нескольких функций для хранения и отображения сообщений:
" Инициализируется только изначально... * Инициализируйте свои сообщения CALL FUNCTION 'MESSAGES_INITIALIZE' EXCEPTIONS log_not_active = 1 неправильно_идентификация = 2 OTHERS = 3. "Одно за другим добавьте сюда все ваши сообщения PERFORM store_messages USING 'E' w_pn w_batch2 w_werks ' ' w_msgno . FORM store_messages ИСПОЛЬЗОВАНИЕ p_msgty p_msgv1 p_msgv2 p_msgv3 p_msgv4 p_txtnr. IF p_msgty EQ 'E'. w_err_fg = 'Х'. КОНЕЦ. * Храните все ваши сообщения, предназначенные для отображения. CALL FUNCTION 'MESSAGE_STORE' EXPORTING arbgb = 'ZCCH001' msgty = p_msgty msgv1 = p_msgv1 msgv2 = p_msgv2 msgv3 = p_msgv3 msgv4 = p_msgv4 txtnr = p_txtnr EXCEPTIONS = 1 not_valid = RM.2 not_valid message_type_not_valid = OTH. . " STORE_MESSAGES "В конце получить все ваши сообщения и показать их целиком * Это отображает все сообщения во всплывающем окне ФУНКЦИЯ ВЫЗОВА 'MESSAGES_SHOW' ЭКСПОРТ show_linno = ' ' ИМПОРТ e_exit_command = wa_exit_command ИСКЛЮЧЕНИЯ inconsistent_range = 3 no_messages = 1 OTHERS = 2.
- Использование HR_DISPLAY_ERROR_LIST
ДАННЫЕ: it_error TYPE СТАНДАРТНАЯ ТАБЛИЦА HRERROR,"TABLES PARAM wa_error LIKE LINE OF it_error . DATA(ld_no_popup) = 'здесь какой-то текст'. DATA(ld_no_print) = 'здесь какой-то текст'. DATA(ld_no_img) = 'здесь какой-то текст' .DATA(ld_no_msgno) = 'здесь какой-то текст'. DATA(ld_linesize) = '123'. DATA(ld_listheader) = 'Проверка типа требуемых данных'. DATA(ld_colheader) = 'Проверка типа требуемых данных'. DATA(ld_hidemsg ) = 'некоторый текст здесь'. "заполнить поля структуры и добавить к itab добавить wa_error к it_error. . CALL FUNCTION 'HR_DISPLAY_ERROR_LIST' * EXPORTING * no_popup = ld_no_popup * no_print = ld_no_print * no_img = ld_no_img * no_msgno = ld_no_msgno * linesize = ld_linesize * listheader = ld_listheader * colheader = ld_colheader * hidemsg = ld_hidemsg * TABLES * error = it " HR_DISPLAY_ERROR_LIST IF SY-SUBRC EQ 1. "Все в порядке ELSEIF SY-SUBRC EQ 0. "Exception" "Добавьте сюда код исключения ENDIF.