Unire le tabelle per timestamp e colonne di data?

Oct 22 2020

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

1 Suncatcher Oct 22 2020 at 21:57

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

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.

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

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