#abap #hana #opensql
#abap #hana #opensql
Вопрос:
Я должен объединить две табличные ACDOCA и BKPF. Я написал для этого следующий код.
SELECT a~rbukrs,
a~racct,
a~bldat,
a~blart,
a~kunnr,
a~belnr,
a~sgtxt,
b~xblnr,
a~budat,
a~hsl,
a~prctr
INTO TABLE @it_final
FROM acdoca AS a
LEFT OUTER JOIN bkpf AS b
ON a~rbukrs = b~bukrs
AND a~gjahr = b~gjahr
WHERE a~rbukrs IN @s_bukrs
AND a~Kunnr IN @s_kunnr
AND a~Budat IN @s_budat
AND a~Belnr IN @s_belnr
AND a~rldnr IN @s_rldnr
AND a~blart = 'DR' OR a~blart = 'ZK' OR a~blart = 'UE'.
Столкнулись со следующими ошибками:—-
Ошибка времени выполнения: DBSQL_SQL_INTERNAL_DB_ERROR
Ошибка SQL «Код SQL: 2048» произошла при доступе к таблице «ACDOCA».
Короткий текст: в классе «CX_SY_OPEN_SQL_DB» произошло исключение
Как мне решить эту проблему? пожалуйста, помогите.
Комментарии:
1. не решение проблемы, но ваше предложение where вызывает большие подозрения из-за «ИЛИ» в ~blart, написанном таким образом. Вы, вероятно, хотите
AND a~blart in ('DR,'ZK','UE')
или… `И (a ~ blart = ‘DR’ ИЛИ a ~ blart = ‘ZK’ ИЛИ a ~ blart = ‘UE’) или ваши другие критерии и будут связаны только с первым a ~ blart, и вы получите обратно все записи ZK и UE a ~ blart.2. @xQbert да, это синтаксис ABAP. Точка используется в ABAP для завершения инструкции.
3. Условие соединения также должно включать belnr: a ~ belnr = b ~ belnr
4. Возможно, вас заинтересует справка SAP: представления CDS , чтобы найти подходящее представление для вашего использования
5. В HANA, не уверен, о какой базе данных вы говорите, код 2048 является общей ошибкой для «ошибки хранилища столбцов». Случай «ошибка выделения памяти» — это всего лишь одна из возможностей. Для получения дополнительной информации см. Примечание 2399990 — Практическое руководство: анализ коротких дампов ABAP в средах SAP HANA
Ответ №1:
Несколько вещей:
- Выбор непосредственно из таблиц базы данных подвержен ошибкам (например, вы забудете ключи при объединении), и вам приходится иметь дело с этими ужасными немецкими сокращениями (например, Belegnummer -> belnr). С некоторых пор сверху есть представления CDS, например,
I_JournalEntryItem
с ассоциациями и правильными английскими именами для этих полей, если вы можете их использовать, я бы это сделал (также они выпущены на C1). - Как уже указывал xQbert, запрос, вероятно, работает не так, как предполагалось, и имеет предопределение над ИЛИ, и поэтому ваш запрос в основном возвращает все из ACDOCA, умноженное на все из BKPF, что, вероятно, приводит к опубликованной вами ошибке базы данных
- С запросами диапазона вы все равно можете получить много результатов (например, миллиарды записей, в зависимости от размера вашей компании), вам следует либо ограничить запрос
UP TO
, реализовать некоторую разбивку на страницы, либоCOUNT(*)
сначала и показать ошибку пользователю, если набор результатов слишком велик.
Я бы написал это так:
TYPES:
BEGIN OF t_filters,
company_codes TYPE RANGE OF bukrs,
customers TYPE RANGE OF kunnr,
document_dates TYPE RANGE OF budat,
accounting_documents TYPE RANGE OF fis_belnr,
ledgers TYPE RANGE OF rldnr,
END OF t_filters.
DATA(filters) = VALUE t_filters(
" filter here
).
SELECT FROM I_JournalEntryItem
FIELDS
CompanyCode,
GLAccount,
DocumentDate,
AccountingDocumentType,
Customer,
AccountingDocument,
DocumentItemText,
_JournalEntry-DocumentReferenceID,
PostingDate,
AmountInCompanyCodeCurrency,
ProfitCenter
WHERE
CompanyCode IN @filters-company_codes AND
Customer IN @filters-customers AND
DocumentDate IN @filters-document_dates AND
AccountingDocument IN @filters-accounting_documents AND
Ledger IN @filters-ledgers AND
AccountingDocumentType IN ( 'DR', 'ZK', 'UE' )
INTO TABLE @DATA(sales_orders)
UP TO 100 ROWS.
(В качестве бонуса вы получите надлежащие проверки авторизации DCL)
Ответ №2:
2048 является / может быть ошибкой выделения памяти: возвращается слишком много данных. Учитывая это, эта строка вызывает большие подозрения
AND a~blart = 'DR' OR a~blart = 'ZK' OR a~blart = 'UE'.
Я бы рассмотрел это вместо этого. В противном случае ВСЕ записи blart ZK и UE возвращаются независимо от клиента, года, компании и т. Д…
SELECT a~rbukrs,
a~racct,
a~bldat,
a~blart,
a~kunnr,
a~belnr,
a~sgtxt,
b~xblnr,
a~budat,
a~hsl,
a~prctr
INTO TABLE @it_final
FROM acdoca AS a
LEFT OUTER JOIN bkpf AS b
ON a~rbukrs = b~bukrs
AND a~gjahr = b~gjahr
WHERE a~rbukrs IN @s_bukrs
AND a~Kunnr IN @s_kunnr
AND a~Budat IN @s_budat
AND a~Belnr IN @s_belnr
AND a~rldnr IN @s_rldnr
AND a~blart IN ('DR','ZK','UE').
Однако, если вы действительно хотели вернуть все записи blart ZK, UE и только те, которые ar DR и в определенных параметрах … вы просто запрашиваете слишком много данных из системы и должны «ОГРАНИЧИТЬ» свой результирующий набор и каким-то образом сообщить пользователю, что возвращается только ограниченный набориз-за объема данных
Я бы также убедился, что вашего соединения с ключами достаточно. Финансовый год и код компании представляют неполный ключ к BKPF. Я не знаю таблицу данных ACDOCA, поэтому я не уверен, что это правильное соединение, которое может привести к полукартовому значению, способствующему раздуванию данных. Я бы подумал, что в многопользовательской БД вам также может потребоваться присоединиться к mandt … возможно, номер документа и некоторые другие значения… опять же, это выглядит как неполное соединение по ключу…. так что, возможно, там тоже нужно больше.
Комментарии:
1. Когда у вас есть случай, когда вам нужно запросить очень большие объемы данных, которые не помещаются в память сразу, тогда оператор OPEN CURSOR может помочь обработать данные по частям.
2. В HANA, не уверен, о какой базе данных говорит OP, код 2048 является общей ошибкой для «ошибки хранилища столбцов». Случай «ошибка выделения памяти» — это всего лишь одна из возможностей. Для получения дополнительной информации см. Примечание 2399990 — Практическое руководство: анализ коротких дампов ABAP в средах SAP HANA
3. @SandraRossi Извините, я вижу это ооооооочень часто, я просто привык ссылаться на 2048 как на ошибку памяти. 99/100 раз, когда я с этим работаю; это так.
4. @SandraRossi OP выбирает из таблицы acdoca, поэтому это должна быть база данных HANA
5.
ACDOCA
Таблица является одной из таблиц, специально разработанных для S / HANA. Эта версия ERP-системы SAP работает исключительно на HANA.