Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Getting started ... Alles für einen gelungenen Start.
25 Beiträge • Vorherige Seite 2 von 2 (current)
25 Beiträge Vorherige Seite 2 von 2 (current)

Re: Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Beitrag von DeathAndPain (Top Expert / 1941 / 257 / 412 ) »
Bjoern77 hat geschrieben:Die Zcogiemail ist wie folgt aufgebaut

Code: Alles auswählen.

MSGID|MSGNO|Email|REC_TYPE
In der ZOSC_T_COGI habe ich mir die MSGID und MSGNO nach vorne an die Tabelle geholt (Deswegen MSGID_KEY und MSGNO_KEY...)
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:

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.
Ist das so richtig?
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.
Das habe ich schon verstanden. Ich kämpfe nur noch mit Deinen Tabellen- bzw. Typdefinitionen, weil Du die halt bisher nicht genau genannt hast.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Beitrag von Bjoern77 (ForumUser / 17 / 0 / 0 ) »
Hallo Deathandpain,

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.

In der ZCOGIMAIL habe ich an erster Stelle MSGID und MSGNO.

Ich hoffe es ist klarer.

Re: Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Beitrag von DeathAndPain (Top Expert / 1941 / 257 / 412 ) »
Du machst einen MOVE-CORRESPONDING ls_cogi_mail TO gs_receivers. Wenn die ZCOGIMAIL aus den Feldern MSGID|MSGNO|Email|REC_TYPE besteht, so wie Du es geschrieben hast, dann frage ich mich, was Du mit diesem Befehl bewegst, denn die gs_receivers ist vom Typ somlreci1, und in diesem gibt es davon nur das Feld REC_TYPE. Das reicht aber nicht, um einen Emailempfänger zu identifizieren. Nach meinem Dafürhalten muss zumindest das Feld, dass Du als "Email" angegeben hast, in Wahrheit "receiver" heißen, sonst wird das nichts.

Du merkst: Wie immer beim Programmieren musst Du bis ins kleinste Detail akkurat sein, sonst kann ich nicht interpretieren, was Dein Programm macht.
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.
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.

Ganz ehrlich: Wir kommen nicht voran, weil Du mir keine präzise korrekten Informationen lieferst. Ohne die geht es in der Programmierung nun mal nicht.

Ich würde in Deinem Programm die Definitionen der internen Tabellen zunächst mal wie folgt ändern:

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.
Damit hat der Befehl SORT lt_cogi_daten sich dann auch schon mal erledigt. Den Sinn der namensgleichen _KEY-Felder verstehe ich nicht. Wozu brauchst Du die? Es stehen da doch genau die gleichen Daten drin. Warum arbeitest Du nicht einfach mit den normalen Feldern (ohne _KEY), die Du aus der AFFW bekommst?

Die Struktur Deines Programms, soweit ich sie bis hierher verstanden habe, ist so, dass die zu versendenden Emails in der AFFW stehen. Aus der zcogiemail beziehst Du nur die Emailadresse des zu der jeweiligen MSGID/MSGNO gehörenden Empfängers. Soweit korrekt?

Dann ist der richtige Weg der, dass Du Dir eine dritte, interne, sortierte Tabelle lt_emails definierst. Primärschlüssel dieser Tabelle ist der RECEIVER. Als weitere Felder kannst Du entweder die fertigen Emailzeilen nehmen. Dann brauchst Du nur eine zweite Spalte von Typ SRM_T_SOLISTI1 (läuft dann also auf eine geschachtelte Untertabelle hinaus). Oder Du legst hier erst mal die Rohdaten ab. Dann müssten die ganzen Felder mit rein, die Du zum Aufbau der Email-Zeilen brauchst, also msgty, msgno, msgv1, ...

Dann kannst Du einen LOOP auf Deine lt_cogi_daten machen, bei dem Du zu jeder Zeile den Emailempfänger aus der lt_cogi_mail liest und das Ergebnis dann der lt_emails hinzufügst. Hinterher machst Du einen LOOP über die lt_emails und erzeugst pro Emailempfänger eine Ergebnismail mit allen Zeilen.

Ich hätte Dir schon längst einen lauffähigen Code geboten, aber Du rückst ja die richtigen Typdefinitionen nicht raus. Ich muss gestehen, dass das für mich zunehmend frustrierend ist.

Re: Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Beitrag von Bjoern77 (ForumUser / 17 / 0 / 0 ) »
Hallo Deathandpain,

das ist mit Sicherheit keine Absicht. Ich habe grade meine Schulung hinter mir, nur theoretisch gearbeitet. Und seit September 2018 garnicht mehr.
Ich dachte eigentlich ich hätte alle Typendefinitionen angegeben.
Die AFFW ist die Tabelle in der die Fehlerhaften Warenebewegungen aus Rückmeldungen, da stehen keine Receiver, da bekomme ich die relevanten MSGID und MSGNO her die ich benötige um eine Fehlermeldung eindeuting zu identifizieren um diese dann einem Bestimmten Email Empfänger meiner ZCOGIMAIL zu senden.
Es tut mir leid das ich mich Falsch ausdrücke.

Ich habe eine Datenbanktabelle (ZCOGIEMAIL)
Felder als KEY gesetzt:

Code: Alles auswählen.

MSGID type ARBGB
MSGNO type MSGNO
RECEIVER type AD_SMTPADR,
kein KEY:

Code: Alles auswählen.

REC_TYPE type SO_ESCAPE
Tabellentypen als Interne Tabelle (ZOSC_T_COGI)

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 
Den Code hatte ich bereits mit allen definionen gepostet.

Bitte nicht Böse sein, ich gebe mir mühe mich besser auszudrücken.

Re: Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Beitrag von DeathAndPain (Top Expert / 1941 / 257 / 412 ) »
Haut immer noch nicht hin, denn dann würde Deine Zeile

Code: Alles auswählen.

  <lf_cogi_daten>-weblnr_key     = <lf_cogi_daten>-weblnr.
auf die Nase fallen, da die ZOSC_T_COGI kein Feld weblnr_key enthält.

Warum machst Du nicht einfach mal in der SE11 Screenshots (von der Tabelle ZCOGIEMAIL und dem DDIC-Datentyp zosc_s_cogi), lädst diese nach https://de.imgbb.com/ hoch und fügst dann hier die Links ein? Dann sehen wir im Original, wie das definiert ist, statt immer nur irgendwelche unvollständigen Beschreibungen davon zu bekommen.

Re: Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Beitrag von Bjoern77 (ForumUser / 17 / 0 / 0 ) »
Da hätte ich gleich drauf kommen können. ;)

Zcogiemail

Bild

Zosc_s_cogi

Bild

Re: Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Beitrag von DeathAndPain (Top Expert / 1941 / 257 / 412 ) »
Sehr schön.

Ich habe Dir mal einen Codevorschlag geschrieben. Leider kann ich ihn mangels Daten (und mangels Datenbanktabelle ZCOGIEMAIL) nicht testen, aber ich bin doch recht zuversichtlich. War eine sehr ansprechende Programmieraufgabe. Ich habe auch hinsichtlich 7.40-Syntax aus dem Vollen geschöpft und die eine oder andere Konstruktion von Dir entsprechend umgebaut. Insbesondere die meisten Workareas (GS_ und LS_) brauchst Du nicht mehr, und der CONCATENATE ist auch entbehrlich. Da ich normalerweise nicht mit ungarischer Notation arbeite, habe ich dies auch hier nicht durchgehend gemacht. Möglicherweise willst Du daher die eine oder andere Variable mal umbenennen (oder alternativ Ralfs Signatur lesen).

Hier ist der Code in ruinifizierter Forenform:

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.
Und hier ist der Code zum Runterladen in nicht vom code-Tag zerstörter Form:

Datei von filehorst.de laden

Diese Version zum Herunterladen enthält auch nicht die Anpassungen, die ich gemacht habe, damit ich den Kram auf meinem System trotz fehlender Tabelle ZCOGIEMAIL kompilieren kann.

Wie ich schon dachte, bringt das Umkopieren mit _KEY nichts. Das kannste weglassen. Mein Beispielcode baut sich eine Ergebnistabelle auf, die in jeder Zeile einen Emailempfänger und dazu eine Untertabelle mit den an diesen Emailempfänger auszugebenden Emails enthält. Danach muss man diese Tabelle nur durchloopen und die Emails rausschicken. Ich denke, wenn Du meinen Code liest, dann wirst Du merken, dass es so nicht nur kürzer, sondern auch bedeutend verständlicher ist.

Was ich nicht gemacht habe, was Du aber noch ändern solltest, auch wenn es etwas Fleißarbeit ist, ist ordentliche Datenobjekte mit den tatsächlich benötigten Datenbankfeldern zu definieren und die SELECT * rauszuschmeißen. SELECT * überträgt immer die gesamte Tabellenzeile aus der Datenbank, obgleich Du nur einen Bruchteil der Daten tatsächlich brauchst, und ist daher eine Performancesünde. Es macht auch den Quellcode schlechter verständlich, da man sich erst tief reinarbeiten muss, um zu verstehen, welche Felder Du denn wirklich lesen möchtest. Und schließlich hat SELECT * keine Zukunft in HANA. Also lass den weg, wenn Du nicht wirklich (nahezu) alle Daten der Tabellenzeile brauchst.

Der Code ist so kompilierbar. Wenn er doch irgendwelche Bugs enthalten sollte, die Du alleine nicht gelöst bekommst, dann berichte bitte.

Re: Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Beitrag von Bjoern77 (ForumUser / 17 / 0 / 0 ) »
Hallo DeathandPain,

ich danke dir das du soviel Geduld mit mir hast.
Ich habe noch viel zu lernen. Und denke mal als du meinen Code gesehen hast du deine Hände über den Kopf zusammengeschlagen hast.
Ich werde das nun Anpassen und testen und dir dann natürlich berichten.

Re: Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Beitrag von Bjoern77 (ForumUser / 17 / 0 / 0 ) »
Erledigt, vielen dank an alle besonders an DeathandPain.

Re: Inhalte Gruppiert TCODE COGI nach Nachrichtennummern...

Beitrag von DeathAndPain (Top Expert / 1941 / 257 / 412 ) »
Wer außer mir hat denn in diesem Thread was geboten? :D

Vergleichbare Themen

2
Antw.
5075
Views
Query: Umsätze gruppiert nach Anlagedatum
von obreuer » 02.04.2007 16:57 • Verfasst in Sonstige Module
4
Antw.
3398
Views
COGI - Konsi-Buchungen
von ubrinkmann » 08.05.2014 13:35 • Verfasst in Material Management & Produktionsplanung
0
Antw.
1836
Views
Auswirkungen Nichtabarbeiten COGI Liste
von Abraxas1 » 01.02.2008 16:42 • Verfasst in Financials
2
Antw.
7438
Views
0
Antw.
2320
Views
BAPI_PRODORDCONF_CREATE_TT Kein Labedruck & COGI statt CO11n
von Mole1986m » 16.01.2017 09:38 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 2 Tagen von Bright4.5 1 / 738
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2364
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8948