Łączyć tabele według dat i dat?

Oct 22 2020

Powinienem pobrać dane z dwóch tabel dziennika ( BALHDRi ZIF_LOG_XML_CONTENT). Mój problem polega na tym, że jedyną wspólną cechą tabel dziennika jest czas utworzenia wpisów. Zapytanie musi działać dla PERIOD, a nie dla PUNKTU CZASOWEGO.

Jednak czas wpisów nie jest przechowywany w tym samym formacie w obu tabelach. W ZIF_LOG_XML_CONTENTnim jest przechowywany w jednej kolumnie TIMESTAMPw drugiej tabeli dziennika, w BALHDRktórym jest przechowywany w dwóch kolumnach, gdzie DATEi TIMEsą przechowywane osobno.

Cały czas próbowałem przekształcić się w STRING, ale nadal nie działałem ...

Co ja robię źle?

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.

Odpowiedzi

1 Suncatcher Oct 22 2020 at 21:57

Łączenie działa, wystarczy, że podasz do swojego SELECT znacznik czasu, a nie łańcuch.

Oto działający uproszczony przykład oparty na standardzie BALHDRi MBEWtabelach:

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 Jagger Oct 22 2020 at 16:52

To nie zadziała, ponieważ TIMESTAMP w SAP jest typem dziesiętnym iw żaden sposób nie jest równoznaczny z konkatenacją daty i godziny.

Powinieneś stworzyć swój znacznik czasu, korzystając z następującego zdania.

CONVERT DATE gs_msgtable-date TIME gs_msgtable-time INTO TIME STAMP DATA(gv_timestamp) TIME ZONE sy-zonlo.

Uważaj także na strefę czasową. Nie wiem, w jakiej strefie czasowej są twoje wpisy w tabeli Z. W tabeli BAL powinny być przechowywane w UTC. Koniecznie sprawdź to wcześniej.

ErzsébetGombkötő Oct 27 2020 at 16:30

PYTANIE

Nie mam jeszcze w pełni działającego minimalnego przykładu, ale mogę podać przykład dla dwóch stołów, które chciałbym połączyć. Trzecia tabela przedstawia oczekiwany wynik. dzięki

-----------------------------------------------------------------------------
                               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

Poniższa tabela przedstawia oczekiwany wynik. Cyfry od 1 do 4 i litery od A do F mają pomóc zrozumieć, w jaki sposób pola będą ze sobą korespondować.

-----------------------------------------------------------------------------
                               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

dzięki