SAP Jobsuche bei DV-Treff
Nautilus
  • Nautilus
  • SAP Forum - Neuling Thema Starter
vor 19 Jahre
Hallo, ich bin es mal wieder und suche hier bei Euch Hilfe.

Ich habe ein Programm geschrieben, welches mir zu einer vorgegebenen Kompontete die Materialien anzeigt, in denen es benötigt

wird. Bei dem ganzen bediene ich mich dem Funktionsbaustein "CS_WHERE_USED_MAT". In der Grundfunktion funktioniert es analog

zu der Transaktion CS15.
Ich muss anschliessend aber noch einige Daten herausselektieren und von daher habe  ich mich entschlossen, das Programm so zu

schreiben.

Das Programm wurde soweit erstellt und dem anfordernden Mitarbeiter zur Verfügung gestellt.
Leider rief dieser sehr schnell an bemerkte, dass er auch öfters mit Dummy-Materialien arbeitet.
Aus diesem Grund muss die Mehrstufigkeit (wie man sie in den Transaktionen CS15 und CS11 auswählen kann) ermöglicht werden.
Falls Ihr Euch nicht darunter vorstellen könnt:
Unter diese Kategorie fallen Materialien, welche wieder Komponenten für andere Materialien darstellen. Hierzu zählen

allerdings keine Rohstoffe und Hilfsstoffe.

Hört sich jetzt etwas verwirrend an.

Nun kommen wir zu meinem eigentlichen Problem.
Ich habe mir überlegt, das ganze durch einen rekursiven Funktionsaufruf zu realisieren.
Sprich, ich gehe mit der vorgebenen Komponente in den Funktionsbaustein "CS_WHERE_USED_MAT". Danach schreibe gehe ich mit dem

gefundenen Material noch mal in die Funktion und überprüfe, ob es auch irgendwo als Komponente verwendet wird. Diese wird so

lange gemacht, bis der Rückgabewert (SY-SUBRC) ungleich (<>) 0 ist.

Allerdings habe ich in ABAP so etwas noch nie gemacht und habe mich dann mit meinen Erfahrungen aus anderen

Programmiersprachen da mal rangemacht und eine rekursive Funktion zusammen gebaut.

Leider funktioniert diese (noch) nicht korrekt. Ich habe mir den ganzen Tag schon damit um die Ohren geschlagen und kann

absolut nicht mehr klar denken.

Morgen sollte das Programm stehen und ich weiss nicht weiter.

Vielleicht hat einer von Euch eine Idee und kann mir weiterhelfen?!
Vier Augen sehen ja mehr? Also, wo habe ih Fehler gemacht?

Ich danke Euch schon mal im Voraus.

Mfg

Christian
Nautilus
  • Nautilus
  • SAP Forum - Neuling Thema Starter
vor 19 Jahre
Codeausschnitt:

<br>REPORT ZPTARBPLDAT004<br><br>TABLES: PLMZ,<br> &nbsp; &nbsp; &nbsp; &nbsp;PLPO,<br> &nbsp; &nbsp; &nbsp; &nbsp;PLKO,<br> &nbsp; &nbsp; &nbsp; &nbsp;CRHD,<br> &nbsp; &nbsp; &nbsp; &nbsp;MAKT,<br> &nbsp; &nbsp; &nbsp; &nbsp;STKO.<br><br>* Deklaration der internen Tabelle für die Daten.<br>TYPES: BEGIN OF TYP_DATEN,<br> &nbsp; &nbsp; MATNR LIKE MAKT-MATNR, &nbsp; &nbsp; &nbsp; &nbsp; &quot;Materialnummer<br> &nbsp; &nbsp; MAKTX LIKE MAKT-MAKTX, &nbsp; &nbsp; &nbsp; &nbsp; &quot;Materialkurztext<br>END &nbsp; OF TYP_DATEN.<br><br><br>DATA: INT_DATEN TYPE TYP_DATEN OCCURS 100 WITH HEADER LINE,<br> &nbsp; &nbsp; &nbsp;INT_STPOV TYPE STPOV &nbsp;OCCURS 10 WITH HEADER LINE,<br> &nbsp; &nbsp; &nbsp;TMP_INT_STPOV TYPE STPOV &nbsp;OCCURS 10 WITH HEADER LINE,<br>*Folgende interne Tabelle werden nur aus Kompatiblität zu dem<br>*Funktionsbaustein CS_WHERE_USED_MAT deklariert.<br>*Sie werden nicht benötigt und können völlig ausser Acht gelassen werden<br> &nbsp; &nbsp; &nbsp;INT_CSCEQUI TYPE CSCEQUI &nbsp;OCCURS 10 WITH HEADER LINE,<br> &nbsp; &nbsp; &nbsp;INT_CSCKND TYPE CSCKND &nbsp;OCCURS 10 WITH HEADER LINE,<br> &nbsp; &nbsp; &nbsp;INT_CSCMAT TYPE CSCMAT &nbsp;OCCURS 10 WITH HEADER LINE,<br> &nbsp; &nbsp; &nbsp;INT_CSCSTD TYPE CSCSTD &nbsp;OCCURS 10 WITH HEADER LINE,<br> &nbsp; &nbsp; &nbsp;INT_CSCTP TYPE CSCTPL &nbsp;OCCURS 10 WITH HEADER LINE,<br>*Ende der belanglosen internen Tabellen &nbsp;:-) <br> &nbsp; &nbsp; &nbsp;ARBPL_ID LIKE CRHD-OBJID,<br> &nbsp; &nbsp; &nbsp;ANZ_INT_DATEN TYPE I,<br> &nbsp; &nbsp; &nbsp;ANZ_STRING TYPE C.<br><br><br>* Hilfvariablen<br>DATA: TMP_MATNR LIKE MAKT-MATNR,<br> &nbsp; &nbsp; &nbsp;TMP_MAKTX LIKE MAKT-MAKTX,<br> &nbsp; &nbsp; &nbsp;TMP_PLNNR LIKE PLKO-PLNNR,<br> &nbsp; &nbsp; &nbsp;TMP_START TYPE C VALUE 'X',<br> &nbsp; &nbsp; &nbsp;TMP_SUBRC LIKE SY-SUBRC,<br> &nbsp; &nbsp; &nbsp;TMP_TABIX LIKE SY-TABIX.<br><br><br>SELECTION-SCREEN BEGIN OF BLOCK DATEN WITH FRAME TITLE TEXT-001.<br> &nbsp;PARAMETERS: ARBEITPL LIKE CRHD-ARBPL .<br> &nbsp;PARAMETERS: PLSTATUS LIKE PLKO-STATU DEFAULT 'K' .<br> &nbsp;PARAMETER KOMPON LIKE MAKT-MATNR DEFAULT '10601'.<br> &nbsp;PARAMETERS: STSTATUS LIKE STKO-STLST .<br>SELECTION-SCREEN END OF BLOCK DATEN.<br><br>START-OF-SELECTION.<br><br><br>* Mit der angegebenen Komponentennummer(als Parameter in der Selektion angegeben) Wird in<br>* die rekursive Funktion gegangen.<br>TMP_MATNR = KOMPON.<br>PERFORM MEHRSTUFIG.<br><br><br>* Testweises ausgeben aller gefundenen Daten:<br>LOOP AT INT_STPOV.<br> &nbsp; &nbsp;WRITE / INT_STPOV-MATNR.<br>ENDLOOP.<br><br><br><br>**********************************************************************<br>******************Mehrstufigkeit bei Stücklisten**********************<br>**********************************************************************<br>** &nbsp;Realisierung über Rekursion.<br>** D.h. die Funktion muss solange aufgerufen werden, bis keine<br>** Materialien mehr gefunden werden.<br><br>FORM MEHRSTUFIG.<br><br> &nbsp; &nbsp; CALL FUNCTION 'CS_WHERE_USED_MAT'<br> &nbsp; &nbsp; &nbsp;EXPORTING<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DATUB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= '99991231'<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DATUV &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= SY-DATUM<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MATNR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= TMP_MATNR<br>* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;POSTP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= ' '<br>* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;RETCODE_ONLY &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = ' '<br>* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;STLAN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= ' '<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WERKS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= '0001'<br>* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MCLMT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= ' '<br>* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MNSTL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= ' '<br>* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MXSTL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= ' '<br>* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;STLTP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= ' '<br>* &nbsp; &nbsp; IMPORTING<br>* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TOPMAT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =<br> &nbsp; &nbsp; &nbsp;TABLES<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WULTB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= TMP_INT_STPOV<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; EQUICAT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= INT_CSCEQUI<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; KNDCAT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = INT_CSCKND<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MATCAT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = INT_CSCMAT<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STDCAT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = INT_CSCSTD<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TPLCAT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = INT_CSCTP<br>* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PRJCAT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =<br> &nbsp; &nbsp; EXCEPTIONS<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CALL_INVALID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = 1<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MATERIAL_NOT_FOUND &nbsp; &nbsp; &nbsp; &nbsp; = 2<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NO_WHERE_USED_REC_FOUND &nbsp; &nbsp;= 3<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NO_WHERE_USED_REC_SELECTED = 4<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NO_WHERE_USED_REC_VALID &nbsp; &nbsp;= 5<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;OTHERS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = 6.<br><br> &nbsp; &nbsp;TMP_SUBRC = SY-SUBRC.<br><br> &nbsp; &nbsp;IF TMP_SUBRC EQ '0'.<br> &nbsp; &nbsp; &nbsp; &nbsp;LOOP AT TMP_INT_STPOV.<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; READ TABLE INT_STPOV WITH KEY MATNR =<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TMP_INT_STPOV-MATNR.<br><br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IF SY-SUBRC NE '0'.<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; APPEND TMP_INT_STPOV TO INT_STPOV.<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ENDIF.<br> &nbsp; &nbsp; &nbsp; &nbsp;ENDLOOP.<br> &nbsp; &nbsp;ENDIF.<br><br>*Prüfen, ob ein DS gefunden wurde.<br> &nbsp; &nbsp; WHILE TMP_SUBRC EQ '0'.<br> &nbsp; &nbsp; &nbsp; &nbsp; TMP_TABIX = TMP_TABIX + 1.<br><br><br> &nbsp; &nbsp; &nbsp; LOOP AT INT_STPOV FROM TMP_TABIX.<br> &nbsp; &nbsp; &nbsp; &nbsp; IF TMP_MATNR NE INT_STPOV-MATNR.<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TMP_MATNR = INT_STPOV-MATNR.<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TMP_TABIX = SY-TABIX.<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PERFORM MEHRSTUFIG.<br> &nbsp; &nbsp; &nbsp; &nbsp; ENDIF.<br> &nbsp; &nbsp; &nbsp; ENDLOOP.<br> &nbsp; &nbsp; ENDWHILE.<br><br><br>ENDFORM.<br><br>