#abap #opensql
#abap #opensql
Вопрос:
Я должен получить данные из двух таблиц журнала ( BALHDR
и ZIF_LOG_XML_CONTENT
). Моя проблема в том, что единственной общностью между таблицами журналов является время создания записей. Запрос должен работать в течение определенного ПЕРИОДА, а не в течение определенного МОМЕНТА ВРЕМЕНИ.
Однако время для записей не сохраняется в одном формате в двух таблицах. В ZIF_LOG_XML_CONTENT
нем хранится в одном столбце TIMESTAMP
, в другой таблице журнала, в BALHDR
нем хранится в двух столбцах, где DATE
и TIME
хранятся отдельно.
Я пытался преобразовать все времена в STRING
, но все равно не работает…
Что я делаю не так?
DATA: GV_DATEANDTIMETO TYPE STRING,
GV_DATETO TYPE STRING,
GV_TIMETO TYPE STRING,
GV_DATEANDTIMEFROM TYPE STRING,
GV_DATEFROM TYPE STRING,
GV_TIMEFROM TYPE STRING,
GV_DATUM TYPE STRING.
SELECT * FROM BALHDR INTO @GS_MSG_STRUKT WHERE
EXTNUMBER = @P_EXTID AND
OBJECT = @P_OBJ AND
SUBOBJECT = @P_SUBOBJ AND
ALUSER = @P_USER AND
( ALDATE_BALHDR >= @GV_INPUT_DATETO AND ALTIME_BALHDR >= @GV__INPUT_TIMETO ) AND
( ALDATE_BALHDR <= @GV_INPUT_DATEFROM AND ALTIME_BALHDR <= @GV__INPUT_TIMEFROM ) AND
MSG_CNT_E >= 1 OR MSG_CNT_AL IS ZERO.
concatenate GS_MSGTABLE-DATE GS_MSGTABLE-TIME into GV_DATUM.
SELECT RES_CONTENT, REQ_CONTENT
FROM zif_log_content
INTO @GS_MSG_STRUKT
WHERE TIMESTAMP >= @Gv_date AND TIMESTAMP <= @Gv_date.
ENDSELECT.
ENDSELECT.
Комментарии:
1. Это не сработает, поскольку ВРЕМЕННАЯ МЕТКА в SAP имеет десятичный тип и никоим образом не соответствует конкатенации даты и времени.
2. Помимо вашего вопроса, замечание о вашем коде: в том, как вы используете
SELECT
…ENDSELECT
, эта форма устарела, вы должны делать только однуSELECT
с объединением.3. Я sry, но я действительно новичок в мире abap. Я снова пытаюсь объяснить свою проблему. Я должен сравнить balhdr~date и balhdr ~time (это два столбца) с zif_log_content~ timestamp colum для определяемого пользователем интервала. Из balhdr я должен выбрать EXTNUMBER, DATE, TIME OBJECT, ПОДОБЪЕКТ, ALUSER, MSG_COUNT_ALL, MSG_COUNT_ERROR, а из второй таблицы за тот же интервал времени у меня должно быть два столбца: RESPONSE_MSG и REQUEST_MSG. Это то, что должен делать мой выбор. Можете ли вы, пожалуйста, помочь мне определить и написать это?
4. Привет, Сандра, где это помечено как устаревшее? Это идеальный способ сделать an
OPEN CURSOR
без anOPEN CURSOR
.5. Какую версию ABAP и СУБД вы используете? Для версии 7.4 и выше вы можете создать метод AMDP для класса и выполнять здесь все действия SQL без ограничений совместимости (например, сопоставление типов и т. Д.): В SQL вы можете использовать практически все.
Ответ №1:
Конкатенация работает, вам просто нужно передать временную метку в ваш ВЫБОР, а не в строку.
Вот рабочий упрощенный пример, основанный на стандарте BALHDR
и MBEW
таблицах:
TYPES: BEGIN OF struct,
lognumber TYPE balhdr-lognumber,
aldate TYPE balhdr-aldate,
altime TYPE balhdr-altime,
timestamp TYPE mbew-timestamp,
END OF struct.
DATA: gs_msg_strukt TYPE struct.
DATA: gt_msg_strukt TYPE TABLE OF struct.
SELECT *
FROM balhdr
INTO CORRESPONDING FIELDS OF @gs_msg_strukt
WHERE aldate >= @gv_input_dateto AND altime <= @gv_input_timeto.
CONCATENATE gs_msg_strukt-aldate gs_msg_strukt-altime INTO gv_datum.
DATA(gv_date) = CONV timestamp( gv_datum ).
SELECT timestamp
FROM mbew
INTO CORRESPONDING FIELDS OF @gs_msg_strukt
WHERE timestamp >= @gv_date AND timestamp <= @gv_date.
ENDSELECT.
APPEND gs_msg_strukt TO gt_msg_strukt. "<---move APPEND here
ENDSELECT.
Комментарии:
1. Привет, Ловец солнца, спасибо за пример. Это почти идеально, но у меня все еще есть проблема. Даже если в mbew нет записи для выбранной временной метки, я все равно хотел бы перечислить все записи из таблицы balhrd. В вашем примере, если в таблице mbew нет соответствующей записи, я не получил выходных данных ни в одной из таблиц. Не могли бы вы, пожалуйста, помочь мне с этой проблемой? Очень признателен!
2. Просто уберите добавление из ENDSELECT, и вы всегда будете получать выходные данные, если они существуют в BALHDR. Обновлен код
Ответ №2:
Это не сработает, поскольку ВРЕМЕННАЯ МЕТКА в SAP имеет десятичный тип и никоим образом не соответствует конкатенации даты и времени.
Вы должны создать свою временную метку, используя следующее предложение.
CONVERT DATE gs_msgtable-date TIME gs_msgtable-time INTO TIME STAMP DATA(gv_timestamp) TIME ZONE sy-zonlo.
Будьте осторожны также с часовым поясом. Я не знаю, в каком часовом поясе находятся ваши записи в Z-таблице. В таблице BAL они должны храниться в UTC. Обязательно проверьте это раньше.
Комментарии:
1. Я получил синтаксическую ошибку: тип данных компонента DATE из GS_MSGTABLE несовместим с типом данных RES_CONTENT .
2. Трудно сказать, не имея воспроизводимого примера с вашей стороны, но я предполагаю, что с вашей проекцией
RES_CONTENT, REQ_CONTENT
что-то не так, потому что я не используюRS_CONTENT
, не используется в моем преобразовании каким-либо образом.3. кроме того
aldate_balhdr
, вBALHDR
таблице нет поля, вы используете, по-видимому, какое-то нечетное представление. Вот почему всегда полезно воспроизвести вашу проблему в стандартных таблицах, так другие с большей вероятностью помогут вам
Ответ №3:
ВОПРОС
У меня еще нет полностью рабочего минимального примера, но я могу привести вам пример для двух таблиц, которые я хотел бы объединить. В третьей таблице показан желаемый результат. СПАСИБО
-----------------------------------------------------------------------------
BALHDR
----------------------------------------------------------------------------
| EXTNUMBER| DATE | TIME |OBJECT|SUBOBJECT| USER|MSG_ALL |MSG_ERROR
|---------------------------------------------------------------------------
A| 1236 |2000.10.10 |12:33:24 |KAT |LEK |NEK | NULL | NULL
B| 1936 |2010.02.20 |02:33:44 |KAT |MOK |NEK | 3 | 1
C| 1466 |2010.10.10 |11:35:34 |KAT |LEK |NEK | 2 | 0
D| 1156 |2011.08.03 |02:13:14 |KAT |MOK |NEK | 3 | 0
E| 1466 |2014.10.10 |11:35:34 |KAT |LEK |NEK | NULL | NULL
F| 1156 |2019.08.03 |02:13:14 |KAT |MOK |NEK | 1 | 1
----------------------------------------------------------------------------
ZIF_LOG
-----------------------------------------------------------------------------
| TIMESTAMP | REQ | RES
|---------------------------------------------------------------------------
1| 20100220023344 | he |hello
2| 20101010113534 | bla |blala
3| 20110803021314 | to |toto
4| 20190803021314 | macs |ka
В следующей таблице показан желаемый результат. Цифры от 1 до 4 и буквы от A до F помогают понять, как поля будут соответствовать друг другу.
-----------------------------------------------------------------------------
WANTED RESULT TABLE
----------------------------------------------------------------------------
|EXTNUMBER| DATE | TIME |OBJECT|SUBOBJECT | USER| REQ | RES
----------------------------------------------------------------------------
A| 1236 |2000.10.10 |12:33:24 |KAT |LEK |NEK | NULL | NULL
B2| 1936 |2010.02.20 |02:33:44 |KAT |MOK |NEK | he | hello
E | 1466 |2014.10.10 |11:35:34 |KAT |LEK |NEK | NULL | NULL
F6| 1156 |2019.08.03 |02:13:14 |KAT |MOK |NEK | macs | ka
СПАСИБО