Łączyć tabele według dat i dat?
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
Łą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.
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.
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