Unire le tabelle per timestamp e colonne di data?
Dovrei recuperare i dati da due tabelle di registro ( BALHDRe ZIF_LOG_XML_CONTENT). Il mio problema è che l'unica cosa in comune tra le tabelle di registro è l'ora in cui sono state create le voci. La query deve funzionare per un PERIODO e non per un PUNTO DI TEMPO.
Tuttavia, l'ora per le voci non viene memorizzata nello stesso formato nelle due tabelle. In ZIF_LOG_XML_CONTENTesso è memorizzato in una colonna TIMESTAMPnell'altra tabella di registro nel BALHDRè memorizzato in due colonne, dove DATEe TIMEsono memorizzati separatamente.
Ho provato a trasformarmi tutte le volte in STRING, ma ancora non funziona ...
Che cosa sto facendo di sbagliato?
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.
Risposte
La concatenazione funziona, devi solo passare il timestamp nel tuo SELECT, non la stringa.
Ecco un esempio semplificato funzionante basato su standard BALHDRe MBEWtabelle:
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.
Questo non funzionerà poiché TIMESTAMP in SAP è un tipo decimale e non equivale in alcun modo a una concatenazione di data e ora.
È necessario creare il timestamp utilizzando la seguente frase.
CONVERT DATE gs_msgtable-date TIME gs_msgtable-time INTO TIME STAMP DATA(gv_timestamp) TIME ZONE sy-zonlo.
Attenzione anche al fuso orario. Non so in quale fuso orario si trovano le tue voci nella tabella Z. Nella tabella BAL devono essere memorizzati in UTC. Assicurati di controllarlo prima.
DOMANDA
Non ho ancora un esempio minimale completamente funzionante, ma posso darti un esempio per i due tavoli, che vorrei unire. La terza tabella mostra il risultato desiderato. grazie
-----------------------------------------------------------------------------
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
La tabella seguente mostra il risultato desiderato. I numeri da 1 a 4 e le lettere da A a F servono a capire come i campi corrisponderebbero tra loro.
-----------------------------------------------------------------------------
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
grazie