Aber in Deiner ZCOGIEMAIL ist doch MSGID und MSGNO schon vorne? Mein Gefühl sagt mir, dass Du die Redundanz mit den _KEY-Feldern gar nicht brauchst, aber noch habe ich nicht im Detail verstanden, was Du da machst. Also ZOSC_T_COGI ist demnach definiert als:Bjoern77 hat geschrieben:Die Zcogiemail ist wie folgt aufgebaut
In der ZOSC_T_COGI habe ich mir die MSGID und MSGNO nach vorne an die Tabelle geholt (Deswegen MSGID_KEY und MSGNO_KEY...)Code: Alles auswählen.
MSGID|MSGNO|Email|REC_TYPE
Code: Alles auswählen.
TYPES: BEGIN OF ZOSC_T_COGI,
msg_id_key type AFFW-MSGID,
msg_no_key type AFFW-MSGNO.
INCLUDE STRUCTURE AFFW.
TYPES END OF OF ZOSC_T_COGI.
Das habe ich schon verstanden. Ich kämpfe nur noch mit Deinen Tabellen- bzw. Typdefinitionen, weil Du die halt bisher nicht genau genannt hast.Ich versuche es nochmal zu erklären.
Bei MSGID M7 und MSGNO 090 soll Email a verwendet werden.
Bei MSGID M7 und MSGNO 053 soll Email b verwendet werden.
Das Funktioniert auch.
Aber wenn bei MSGID M7 und MSGID 023 wieder Email a verwendet wird, bekommt dieser Email Empfänger zwei Emails.
Kann man das nicht Sammeln und die beiden Fehler in einer Email an a senden.
Auch das kann nicht angehen, denn dann würde es in der ZOSC_S_COGI keine Felder wie msgv1_key geben und Deine ganzen Zuweisungen innerhalb des LOOPs AT lt_cogi_daten würden auf die Nase fallen.ich habe einen Tabellentyp (interne Tabelle) Namens ZOSC_T_COGI erstellt und eine Struktur ZOSC_S_COGI.
Die Struktur hat MSGID_KEY und MSGNO_KEY an erster stelle und einen INCLUDE TYPE AFFW.
Code: Alles auswählen.
*DATA lt_cogi_mail TYPE TABLE OF zcogiemail.
DATA lt_cogi_mail TYPE HASHED TABLE OF zcogiemail WITH UNIQUE KEY MSGID MSGNO.
*DATA lt_cogi_daten TYPE zosc_t_cogi.
DATA lt_cogi_daten TYPE SORTED TABLE OF zosc_s_cogi WITH NON-UNIQUE KEY MSGID MSGNO.
Code: Alles auswählen.
MSGID type ARBGB
MSGNO type MSGNO
RECEIVER type AD_SMTPADR,
Code: Alles auswählen.
REC_TYPE type SO_ESCAPE
Code: Alles auswählen.
Struktur ZOSC_S_COGI:
MSGID_KEY type MSGID
MSGNO_KEY type MSGNO
MSGTY_KEY type MSGTY
MSGV1_KEY - MSGV4_KEY type MSGV1-MSGV4
Include type AFFW
Code: Alles auswählen.
<lf_cogi_daten>-weblnr_key = <lf_cogi_daten>-weblnr.
Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Report ZTEST6
*&---------------------------------------------------------------------*
REPORT ZTEST6.
TYPES: BEGIN OF ZCOGIEMAIL,
MSGID TYPE ARBGB,
MSGNO TYPE MSGNO,
RECEIVER TYPE AD_SMTPADR,
REC_TYPE TYPE SO_ESCAPE,
FUNCTION TYPE FUNCNAME,
COUNTER TYPE RD_COUNTER,
END OF ZCOGIEMAIL,
BEGIN OF TYPE_EMAILINHALTE,
WEBLNR TYPE AFFW-WEBLNR,
MSGNO TYPE AFFW-MSGNO,
MSGID TYPE AFFW-MSGID,
MSGTY TYPE AFFW-MSGTY,
MSGV1 TYPE AFFW-MSGV1,
MSGV2 TYPE AFFW-MSGV2,
MSGV3 TYPE AFFW-MSGV3,
MSGV4 TYPE AFFW-MSGV4,
END OF TYPE_EMAILINHALTE,
TYPE_TABLE_OF_EMAILINHALTE TYPE STANDARD TABLE OF TYPE_EMAILINHALTE WITH EMPTY KEY,
BEGIN OF TYPE_EMAILTABELLE,
RECEIVER TYPE ZCOGIEMAIL-RECEIVER,
REC_TYPE TYPE ZCOGIEMAIL-REC_TYPE,
INHALTE TYPE TYPE_TABLE_OF_EMAILINHALTE,
END OF TYPE_EMAILTABELLE.
**********************************************************************
* Datendeklaration aus der ZTABELLE ZCOGIEMAIL und AFFW
**********************************************************************
* Data für Email-Versand
DATA GT_DOC_CONTENT TYPE TABLE OF SOLISTI1.
DATA GS_DOC_CONTENT TYPE SOLISTI1.
DATA GT_RECEIVERS TYPE TABLE OF SOMLRECI1.
DATA GS_DOC_DATA TYPE SODOCCHGI1.
DATA GV_ENTRIES TYPE SY-TABIX.
DATA LT_COGI_MAIL TYPE TABLE OF ZCOGIEMAIL.
DATA LT_AFFW TYPE SORTED TABLE OF AFFW WITH NON-UNIQUE KEY MSGNO MSGID. " Der Key ist wichtig, weil er für AT/ENDAT verwendet wird!!!
DATA EMAILTABELLE TYPE HASHED TABLE OF TYPE_EMAILTABELLE WITH UNIQUE KEY RECEIVER REC_TYPE.
DATA LV_MESSAGE TYPE SOLISTI1.
**********************************************************************
* Start of Selection
**********************************************************************
* Select zcogiemal
* bei mir auskommentiert, weil es auf meinem System die Datenbanktabelle ZCOGIEMAIL nicht gibt
* SELECT * FROM zcogiemail
* INTO CORRESPONDING FIELDS OF TABLE lt_cogi_mail.
* Select auf AFFW
SELECT * FROM AFFW INTO TABLE LT_AFFW.
**********************************************************************
* Start Arbeitsbereich Email-verarbeitung
**********************************************************************
* Verarbeitung Receiver von ZCOGIEMAIL
LOOP AT LT_AFFW ASSIGNING FIELD-SYMBOL(<LF_AFFW>).
AT NEW MSGID. " Da der Emailempfänger für ein Tupel MSGNO/MSGID immer gleich ist, müssen wir ihn nur neu lesen, wenn dieses Tupel sich ändert
* Receiver für dieses Paar MSGNO/MSGID in ZCOGIEMAIL suchen
ASSIGN LT_COGI_MAIL[ MSGNO = <LF_AFFW>-MSGNO
MSGID = <LF_AFFW>-MSGID ] TO FIELD-SYMBOL(<LF_COGI_MAIL>).
* Eintrag für diesen Receiver in EMAILTABELLE ermitteln
ASSIGN EMAILTABELLE[ RECEIVER = <LF_COGI_MAIL>-RECEIVER
REC_TYPE = <LF_COGI_MAIL>-REC_TYPE ] TO FIELD-SYMBOL(<EMAILTABELLE>).
IF SY-SUBRC <> 0. " Gibt noch keinen Eintrag für diesen Receiver
INSERT VALUE #( RECEIVER = <LF_COGI_MAIL>-RECEIVER
REC_TYPE = <LF_COGI_MAIL>-REC_TYPE ) INTO TABLE EMAILTABELLE.
ASSIGN EMAILTABELLE[ RECEIVER = <LF_COGI_MAIL>-RECEIVER
REC_TYPE = <LF_COGI_MAIL>-REC_TYPE ] TO <EMAILTABELLE>.
ENDIF.
ENDAT.
APPEND VALUE #( WEBLNR = <LF_AFFW>-WEBLNR
MSGNO = <LF_AFFW>-MSGNO
MSGID = <LF_AFFW>-MSGID
MSGTY = <LF_AFFW>-MSGTY
MSGV1 = <LF_AFFW>-MSGV1
MSGV2 = <LF_AFFW>-MSGV2
MSGV3 = <LF_AFFW>-MSGV3
MSGV4 = <LF_AFFW>-MSGV4 ) TO <EMAILTABELLE>-INHALTE.
ENDLOOP.
* Wenn wir hier ankommen, dann stehen in der internen Tabelle EMAILTABELLE alle Emailempfänger
* drin, und zu jedem Emailempfänger stehen in der Untertabelle EMAILTABELLE-INHALTE alle AFFW-
* Werte drin, zu denen er eine Email bekommen soll. Jetzt können wir die Tabelle durchgehen und
* jedem Empfänger seine Email schicken.
LOOP AT EMAILTABELLE ASSIGNING <EMAILTABELLE>.
GT_RECEIVERS = VALUE #( ( RECEIVER = <EMAILTABELLE>-RECEIVER
REC_TYPE = <EMAILTABELLE>-REC_TYPE ) ).
REFRESH GT_DOC_CONTENT.
**********************************************************************
* Email Body (Ausgabe Inhalt der Meldung in der Email
**********************************************************************
LOOP AT <EMAILTABELLE>-INHALTE ASSIGNING FIELD-SYMBOL(<EMAILINHALT>).
APPEND VALUE #( LINE = `Belegnummer = ` && <EMAILINHALT>-WEBLNR ) TO GT_DOC_CONTENT.
MESSAGE ID <EMAILINHALT>-MSGID TYPE <EMAILINHALT>-MSGTY NUMBER <EMAILINHALT>-MSGNO
WITH <EMAILINHALT>-MSGV1 <EMAILINHALT>-MSGV2 <EMAILINHALT>-MSGV3 <EMAILINHALT>-MSGV4
INTO LV_MESSAGE.
APPEND VALUE #( LINE = ` ` && LV_MESSAGE-LINE ) TO GT_DOC_CONTENT.
ENDLOOP.
**********************************************************************
* Email Header
**********************************************************************
GS_DOC_DATA-OBJ_DESCR = 'Fehler bei der Transaktion COGI'.
GS_DOC_DATA-SENSITIVTY = 'O'.
**********************************************************************
* Email verarbeiten
GV_ENTRIES = LINES( GT_DOC_CONTENT ).
READ TABLE GT_DOC_CONTENT INTO GS_DOC_CONTENT INDEX GV_ENTRIES.
GS_DOC_DATA-DOC_SIZE = ( GV_ENTRIES - 1 ) * 255 + STRLEN( GS_DOC_CONTENT ).
**********************************************************************
* Ende Arbeitsbereich Emailverarbeitung
**********************************************************************
* Funktionsbaustein SO_NEW_DOCUMENT_SEND_API1
**********************************************************************
CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
EXPORTING
DOCUMENT_DATA = GS_DOC_DATA
DOCUMENT_TYPE = 'RAW'
* PUT_IN_OUTBOX = ' '
COMMIT_WORK = 'X'
* IP_ENCRYPT =
* IP_SIGN =
* IMPORTING
* SENT_TO_ALL =
* NEW_OBJECT_ID =
TABLES
* OBJECT_HEADER =
OBJECT_CONTENT = GT_DOC_CONTENT
* CONTENTS_HEX =
* OBJECT_PARA =
* OBJECT_PARB =
RECEIVERS = GT_RECEIVERS
EXCEPTIONS
TOO_MANY_RECEIVERS = 1
DOCUMENT_NOT_SENT = 2
DOCUMENT_TYPE_NOT_EXIST = 3
OPERATION_NO_AUTHORIZATION = 4
PARAMETER_ERROR = 5
X_ERROR = 6
ENQUEUE_ERROR = 7
OTHERS = 8.
* Implement suitable error handling here
IF SY-SUBRC <> 0.
ENDIF.
REFRESH GT_RECEIVERS.
ENDLOOP.