Объединение таблиц по столбцам с метками времени и датой?

#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 без an OPEN 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
  

СПАСИБО