‎2007 Oct 03 11:33 AM
i have created a FM which is going to run in the background by doing the folloing process ...upon rejection of successive three lots for the same material 2same vendor pop up of quality info record change(t code qi02) should come so that user decide upon the vendor block .it has to repeated when we again used the same material, vendor and FM sholud run in the background and t code-qi02 has to run by rejection of that lot . (if accepeted we will save ) . iam looking for the solution on this . thanks.
‎2007 Oct 03 6:04 PM
If you run a program in the background (I'm not sure how exactly are you planning to run just an FM) there cannot be any pop-ups or user dialog.
You might want to review the requirements and explore other options, such as sending some other notification from the program (SAP Inbox, email, workflow, create a BDC session, etc.).
‎2007 Oct 04 6:00 AM
actually iam running a transaction qa32 .in that by selecting inspection no , iam rejecting a vendor , then this FM will run in the back ground at that instnant we are going to call the tc code qi02.
‎2007 Oct 04 6:22 AM
this is the FM coding ,for the requirement what i have mentiond in the first reply .if any changes make it and revert back to me as early as possible. thanks
FUNCTION ZQM_USAGE_DECISION.
*"----
-
""Local Interface:
*" IMPORTING
*" VALUE(I_QALS) LIKE QALS STRUCTURE QALS
*" VALUE(I_QAVE) LIKE QAVE STRUCTURE QAVE
*" EXPORTING
*" VALUE(E_SUBRC) LIKE SY-SUBRC
*" TABLES
*" E_PROTOCOL STRUCTURE RQEVP
*"----
-
*******start****mail 5**************************
*
*IF I_QAVE-VCODE = 'REJ'.
*
*
*
*
*
*endif."IF I_QAVE-VCODE = 'REJ'.
*
*
*******end******mail 5**************************
******start****mail 4**************************
TABLES: QINF.
data : begin of it_qals occurs 0,
matnr like qals-matnr,
lifnr like qals-lifnr,
werk like QALS-WERK,
PRUEFLOS like qals-PRUEFLOS,
end of it_qals.
*DATA : BEGIN OF IT_QAVE OCCURS 0,
PRUEFLOS LIKE QAVE-PRUEFLOS,
VCODE LIKE QAVE-PRUEFLOS,
END OF IT_QAVE.
DATA : IT_QAVE LIKE QAVE OCCURS 0 WITH HEADER LINE.
Data: Matnr like qals-matnr,
Lifnr like qals-lifnr,
Ctr(1) type c.
IF I_QAVE-VCODE = 'REJ'.
select lifnr matnr werk PRUEFLOS
from qals
into corresponding fields of it_qals
up to 2 rows
where werk = i_qals-werk and
matnr = i_qals-matnr and
lifnr = i_qals-lifnr
order by PRUEFLOS descending.
append it_qals.
endselect.
select PRUEFLOS vcode
INTO CORRESPONDING FIELDS OF TABLE IT_QAVE
FROM QAVE
FOR ALL ENTRIES IN IT_QALS
WHERE PRUEFLOS = IT_QALS-PRUEFLOS AND
VWERKS = IT_QALS-WERK.
*DATA : VCODE LIKE QAVE-VCODE.
*Sort it_qave by PRUEFLOS VCODE .
LOOP AT IT_QAVE.
IF SY-TABIX = 1.
if it_qave-vcode <> 'REJ'.
EXIT.
ENDIF.
ELSE.
IF IT_QAVE-VCODE = 'REJ'.
SELECT SINGLE MATNR
FROM QINF
INTO QINF-MATNR
WHERE MATNR = I_qals-MATNR AND
WERK = I_qals-WERK AND
LIEFERANT = I_qals-lifnr.
SET PARAMETER ID 'MAT' FIELD I_qals-MATNR.
SET PARAMETER ID 'LIF' FIELD I_qals-lifnr.
MATNR = i_QALS-MATNR.
LIFNR = i_QALS-LIFNR.
SET PARAMETER ID 'WRK' FIELD I_qals-WERK.
IF SY-SUBRC <> 0.
CALL TRANSACTION 'QI01' AND SKIP FIRST SCREEN.
ELSEIF I_QALS-MATNR = MATNR AND I_QALS-LIFNR = LIFNR.
CTR = CTR + 1.
IF CTR >= 3.
CALL TRANSACTION 'QI02' AND SKIP FIRST SCREEN.
ENDIF.
ENDIF.
ENDIF.
endif.
ENDIF.
ENDLOOP.
ENDIF. " IF I_QAVE-VCODE = 'REJ'.
******end*****mail 4**************************
*
Satzbetten :
ID der Mappe
DATA: BEGIN OF L_FOLDER_ID.
INCLUDE STRUCTURE SOODK.
DATA: END OF L_FOLDER_ID.
Falls das zu verschickende Obj. bereits exist., seine ID; sonst space
DATA: BEGIN OF L_OBJECT_ID.
INCLUDE STRUCTURE SOODK.
DATA: END OF L_OBJECT_ID.
SOUD-USRNAM für FORWARDER
DATA: BEGIN OF L_SOUD.
INCLUDE STRUCTURE SOUD.
DATA: END OF L_SOUD.
Neues Obj. wird abgelegt -> Info's zum Ablageort. Ausgang -> initial
DATA: BEGIN OF L_OBJECT_FL_CHANGE.
INCLUDE STRUCTURE SOFM1.
DATA: END OF L_OBJECT_FL_CHANGE.
Neues Obj. einfügen: Allgemeine Kopfdaten. Kein neues Ob. -> initial
DATA: BEGIN OF L_OBJECT_HD_CHANGE.
INCLUDE STRUCTURE SOOD1.
DATA: END OF L_OBJECT_HD_CHANGE.
OUTBOX-FLAG, SORE-FLAG, SENT_TO_ALL
DATA: BEGIN OF L_SONV.
INCLUDE STRUCTURE SONV.
DATA: END OF L_SONV.
OUTBOX-FLAG, SORE-FLAG, SENT_TO_ALL
DATA: BEGIN OF L_SOOD.
INCLUDE STRUCTURE SOOD.
DATA: END OF L_SOOD.
Wenn ein Obj. beim Senden neu angelegt wurde --> Export SAP-office ID
DATA: BEGIN OF L_OBJECT_ID_NEW.
INCLUDE STRUCTURE SOODK.
DATA: END OF L_OBJECT_ID_NEW.
*
**----
-
**
INTERNE TABELLEN :
Objekt existiert noch nicht, neu !
DATA: BEGIN OF L_OBJCONT OCCURS 9.
INCLUDE STRUCTURE SOLI.
DATA: END OF L_OBJCONT.
Objekt soll in AP-Office angelegt werden
DATA: BEGIN OF L_OBJHEAD OCCURS 0.
INCLUDE STRUCTURE SOLI.
DATA: END OF L_OBJHEAD.
Bei neuem Objekt SET/GET Parameter ablegen (Name und Wert)
DATA: BEGIN OF L_OBJPARA OCCURS 0.
INCLUDE STRUCTURE SELC.
DATA: END OF L_OBJPARA.
In der ersten Zeile muß die Memory-ID stehen
DATA: BEGIN OF L_OBJPARB OCCURS 0.
INCLUDE STRUCTURE SOOP1.
DATA: END OF L_OBJPARB.
Empfänger und Sendeattribute
DATA: BEGIN OF L_RECEIVERS OCCURS 0.
INCLUDE STRUCTURE SOOS1.
DATA: END OF L_RECEIVERS.
*
**Poovannan Date 08/05/2005. Internal table for Userid
data : begin of it_userid occurs 0,
RECNAM like ZQM_MAIL_ID-RECNAM,
SNDEX like ZQM_MAIL_ID-SNDEX.
data : end of it_userid.
*
DATA:
C_SAP_EDITOR_TEXT LIKE SOOD-OBJTP VALUE 'RAW',
C_KREUZ LIKE SONV-FLAG VALUE 'X',
C_FORWARDER LIKE SOUD-USRNAM.
*
Initialisieren
CLEAR: L_OBJECT_ID,
L_OBJECT_ID_NEW,
L_FOLDER_ID,
L_OBJECT_FL_CHANGE,
L_OBJECT_HD_CHANGE,
L_SOUD,
G_OBJCONT,
L_OBJHEAD,
L_OBJPARA,
L_OBJPARB,
L_RECEIVERS.
REFRESH: G_OBJCONT, L_OBJPARA, L_RECEIVERS, L_OBJHEAD, L_OBJPARB.
*
Objekt - Typ definieren
MOVE 'RAW' TO L_SOOD-OBJTP.
*
Headers füllen
MOVE: SY-LANGU TO L_OBJECT_HD_CHANGE-OBJLA,
TEXT-020 TO L_OBJECT_HD_CHANGE-OBJNAM,
TEXT-021 TO L_OBJECT_HD_CHANGE-OBJDES,
*
I_QALS-PRUEFLOS TO L_OBJECT_HD_CHANGE-OBJDES+20(12),
'F' TO L_OBJECT_HD_CHANGE-OBJSNS.
*
**----
-
**
TEXT füllen
**----
-
**
*
. Zeile
CLEAR G_OBJCONT.
MOVE TEXT-022 TO G_OBJCONT.
APPEND G_OBJCONT.
. Zeile <<Leerzeile>>
CLEAR G_OBJCONT.
APPEND G_OBJCONT.
Erzeugender Materialbeleg
IF NOT I_QALS-MBLNR IS INITIAL.
CLEAR G_OBJCONT.
MOVE: TEXT-023 TO G_OBJCONT,
I_QALS-MBLNR TO G_OBJCONT+16,
TEXT-024 TO G_OBJCONT+28,
I_QALS-ZEILE TO G_OBJCONT+38,
TEXT-025 TO G_OBJCONT+50,
I_QALS-MJAHR TO G_OBJCONT+56.
APPEND G_OBJCONT.
ENDIF.
. Zeile <<Leerzeile>>
CLEAR G_OBJCONT.
APPEND G_OBJCONT.
Zeile
MOVE: TEXT-040 TO G_OBJCONT,
I_QALS-MATNR TO G_OBJCONT+16,
TEXT-026 TO G_OBJCONT+38,
I_QALS-CHARG TO G_OBJCONT+46.
APPEND G_OBJCONT.
Zeile
MOVE: TEXT-027 TO G_OBJCONT.
WRITE I_QALS-LOSMENGE UNIT I_QALS-MENGENEINH TO G_OBJCONT+16(14).
MOVE I_QALS-MENGENEINH TO G_OBJCONT+30.
APPEND G_OBJCONT.
Zeile
MOVE TEXT-028 TO G_OBJCONT.
WRITE I_QALS-GESSTICHPR UNIT I_QALS-EINHPROBE TO G_OBJCONT+16(14).
MOVE I_QALS-EINHPROBE TO G_OBJCONT+30.
APPEND G_OBJCONT.
. Zeile <<Leerzeile>>
CLEAR G_OBJCONT.
APPEND G_OBJCONT.
*
Block mit Bestandsbuchungen sofern bestandsrelevant !
CALL FUNCTION 'QAST_STATUS_CHECK'
EXPORTING
I_OBJNR = I_QALS-OBJNR
I_STATUS = 'I0203'
EXCEPTIONS
STATUS_NOT_ACTIV = 1.
IF SY-SUBRC NE 1.
MOVE: TEXT-029 TO G_OBJCONT.
APPEND G_OBJCONT.
Zeile
IF NOT I_QALS-LMENGE01 IS INITIAL.
MOVE: TEXT-030 TO G_OBJCONT.
WRITE I_QALS-LMENGE01 UNIT I_QALS-MENGENEINH TO G_OBJCONT+30(14).
APPEND G_OBJCONT.
ENDIF.
Zeile
IF NOT I_QALS-LMENGE02 IS INITIAL.
MOVE: TEXT-031 TO G_OBJCONT.
WRITE I_QALS-LMENGE02 UNIT I_QALS-MENGENEINH TO G_OBJCONT+30(14).
APPEND G_OBJCONT.
ENDIF.
Zeile
IF NOT I_QALS-LMENGE03 IS INITIAL.
MOVE: TEXT-032 TO G_OBJCONT.
WRITE I_QALS-LMENGE03 UNIT I_QALS-MENGENEINH TO G_OBJCONT+30(14).
APPEND G_OBJCONT.
ENDIF.
Zeile
IF NOT I_QALS-LMENGE04 IS INITIAL.
MOVE: TEXT-033 TO G_OBJCONT.
WRITE I_QALS-LMENGE04 UNIT I_QALS-MENGENEINH TO G_OBJCONT+30(14)
*.
APPEND G_OBJCONT.
ENDIF.
Zeile
IF NOT I_QALS-LMENGE05 IS INITIAL.
MOVE: TEXT-034 TO G_OBJCONT.
WRITE I_QALS-LMENGE05 UNIT I_QALS-MENGENEINH TO G_OBJCONT+30(14)
*.
APPEND G_OBJCONT.
ENDIF.
Zeile
IF NOT I_QALS-LMENGE06 IS INITIAL.
MOVE: TEXT-035 TO G_OBJCONT.
WRITE I_QALS-LMENGE06 UNIT I_QALS-MENGENEINH TO G_OBJCONT+30(14)
*.
MOVE I_QALS-MATNRNEU TO G_OBJCONT+45(18)
*.
MOVE I_QALS-CHARGNEU TO G_OBJCONT+64.
APPEND G_OBJCONT.
ENDIF.
Zeile
IF NOT I_QALS-LMENGE07 IS INITIAL.
MOVE: TEXT-042 TO G_OBJCONT.
WRITE I_QALS-LMENGE07 UNIT I_QALS-MENGENEINH TO G_OBJCONT+30(14)
*.
APPEND G_OBJCONT.
ENDIF.
ENDIF.
8. Zeile <<Leerzeile>>
CLEAR G_OBJCONT.
APPEND G_OBJCONT.
Zeile
MOVE: TEXT-036 TO G_OBJCONT,
I_QAVE-VCODE TO G_OBJCONT+27,
TEXT-041 TO G_OBJCONT+32,
I_QAVE-VBEWERTUNG TO G_OBJCONT+47.
APPEND G_OBJCONT.
Zeile
MOVE: TEXT-037 TO G_OBJCONT.
WRITE I_QAVE-QKENNZAHL TO G_OBJCONT+22(3).
APPEND G_OBJCONT.
8. Zeile <<Leerzeile>>
CLEAR G_OBJCONT.
APPEND G_OBJCONT.
**
MOVE TEXT-038 TO G_OBJCONT.
MOVE I_QAVE-VAENAME TO G_OBJCONT+22.
APPEND G_OBJCONT.
Zeile
MOVE '_______________________________________' TO G_OBJCONT.
APPEND G_OBJCONT.
CLEAR G_OBJCONT.
Langtext ausgeben, sofern vorhanden
IF I_QAVE-LTEXTKZ EQ C_KREUZ.
MOVE TEXT-039 TO G_OBJCONT.
APPEND G_OBJCONT.
CLEAR G_OBJCONT.
MOVE '---> ' TO G_OBJCONT.
APPEND G_OBJCONT.
CLEAR G_OBJCONT.
APPEND G_OBJCONT.
CLEAR G_OBJCONT.
Langtext des Verwendungsentscheids holen und anhängen !
PERFORM LANGTEXT_VE_HOLEN USING I_QAVE-LTEXTKZ
I_QALS-PRUEFLOS
I_QAVE-KZART
I_QAVE-ZAEHLER
I_QALS-SPRACHE.
ELSE.
MOVE TEXT-043 TO G_OBJCONT.
APPEND G_OBJCONT.
CLEAR G_OBJCONT.
ENDIF.
Empfänger definieren
MOVE I_QAVE-VAENAME TO L_RECEIVERS-RECNAM.
MOVE SPACE TO L_RECEIVERS-RECESC.
MOVE SPACE TO L_RECEIVERS-ACONE.
MOVE 'X' TO L_RECEIVERS-SNDEX.
APPEND L_RECEIVERS.
*
select RECNAM SNDEX into corresponding fields of table it_userid
from ZQM_MAIL_ID.
*
loop at it_userid.
if I_QAVE-VAENAME <> it_userid-RECNAM.
MOVE it_userid-RECNAM TO L_RECEIVERS-RECNAM.
MOVE SPACE TO L_RECEIVERS-RECESC.
MOVE SPACE TO L_RECEIVERS-ACONE.
MOVE it_userid-SNDEX TO L_RECEIVERS-SNDEX.
APPEND L_RECEIVERS.
endif.
endloop.
*
In welche Ausgangsmappe stellen ?
MOVE SY-UNAME TO L_SOUD-USRNAM.
CLEAR C_FORWARDER.
*
Aufruf des Sendebausteins
CALL FUNCTION 'SO_OBJECT_SEND'
EXPORTING
FOLDER_ID = L_FOLDER_ID
FORWARDER = C_FORWARDER
OBJECT_FL_CHANGE = L_OBJECT_FL_CHANGE
OBJECT_HD_CHANGE = L_OBJECT_HD_CHANGE
OBJECT_ID = L_OBJECT_ID
OBJECT_TYPE = L_SOOD-OBJTP
OUTBOX_FLAG = C_KREUZ
OWNER = L_SOUD-USRNAM
STORE_FLAG = L_SONV-FLAG
IMPORTING
OBJECT_ID_NEW = L_OBJECT_ID
SENT_TO_ALL = L_SONV-FLAG
TABLES
OBJCONT = G_OBJCONT
OBJHEAD = L_OBJHEAD
OBJPARA = L_OBJPARA
OBJPARB = L_OBJPARB
RECEIVERS = L_RECEIVERS
EXCEPTIONS
ACTIVE_USER_NOT_EXIST = 01
COMPONENT_NOT_AVAILABLE = 02
FOLDER_NOT_EXIST = 03
FOLDER_NO_AUTHORIZATION = 04
FORWARDER_NOT_EXIST = 05
NOTE_NOT_EXIST = 06
OBJECT_NOT_EXIST = 07
OBJECT_NOT_SENT = 08
OBJECT_NO_AUTHORIZATION = 09
OBJECT_TYPE_NOT_EXIST = 10
OPERATION_NO_AUTHORIZATION = 11
OWNER_NOT_EXIST = 12
PARAMETER_ERROR = 13
SUBSTITUTE_NOT_ACTIVE = 14
SUBSTITUTE_NOT_DEFINED = 15
USER_NOT_EXIST = 16
X_ERROR = 17.
*
CASE SY-SUBRC.
WHEN 01.
active_user_not_exist
MESSAGE I021 WITH SY-SUBRC L_SOUD-USRNAM.
WHEN 02.
COMPONENT_NOT_AVAILABLE
MESSAGE I021 WITH SY-SUBRC SPACE.
WHEN 03.
FOLDER_NOT_EXIST
MESSAGE I021 WITH SY-SUBRC L_FOLDER_ID.
WHEN 04.
FOLDER_NO_AUTHORIZATION
MESSAGE I021 WITH SY-SUBRC L_FOLDER_ID.
WHEN 05.
FORWARDER_NOT_EXIST
MESSAGE I021 WITH SY-SUBRC C_FORWARDER.
WHEN 06.
NOTE_NOT_EXIST
MESSAGE I021 WITH SY-SUBRC SPACE.
WHEN 07.
OBJECT_NOT_EXIST
MESSAGE I021 WITH SY-SUBRC L_OBJECT_ID.
WHEN 08.
OBJECT_NOT_SENT
MESSAGE I021 WITH SY-SUBRC SPACE.
WHEN 09.
OBJECT_NO_AUTHORIZATION
MESSAGE I021 WITH SY-SUBRC L_OBJECT_ID.
WHEN 10.
OBJECT_TYPE_NOT_EXIST
MESSAGE I021 WITH SY-SUBRC L_SOOD-OBJTP.
WHEN 11.
OPERATION_NO_AUTHORIZATION
MESSAGE I021 WITH SY-SUBRC SPACE.
WHEN 12.
OWNER_NOT_EXIST
MESSAGE I021 WITH SY-SUBRC L_SOUD-USRNAM.
WHEN 13.
PARAMETER_ERROR
MESSAGE I021 WITH SY-SUBRC L_OBJPARA-NAME.
WHEN 14.
SUBSTITUTE_NOT_ACTIVE
MESSAGE I021 WITH SY-SUBRC SPACE.
WHEN 15.
SUBSTITUTE_NOT_DEFINED
MESSAGE I021 WITH SY-SUBRC SPACE.
WHEN 16.
USER_NOT_EXIST
MESSAGE I021 WITH SY-SUBRC L_RECEIVERS-RECNAM.
WHEN 17.
X_ERROR
MESSAGE I021 WITH SY-SUBRC SPACE.
Returncode <&> ist aufgetreten
ENDCASE.
*
ENDFUNCTION.
*
**&----
-
**
**& Form LANGTEXT_VE_HOLEN
**&----
-
**
text
**
**----
-
**
**FORM LANGTEXT_VE_HOLEN USING I_QAVE-LTEXTKZ
I_QALS-PRUEFLOS
I_QAVE-KZART
I_QAVE-ZAEHLER
I_QALS-SPRACHE.
DATA: L_TEXTID_VE LIKE TTXID-TDID VALUE 'QAVE',
L_LTEXTSCHLUESSEL LIKE THEAD-TDNAME,
L_TEXTOBJECT LIKE THEAD-TDOBJECT VALUE 'QPRUEFLOS ',
***
BEGIN OF SCHLUESSEL_VE,
MANDANT LIKE QAVE-MANDANT,
PRUEFLOS LIKE QAVE-PRUEFLOS,
KZART LIKE QAVE-KZART,
ZAEHLER LIKE QAVE-ZAEHLER,
END OF SCHLUESSEL_VE.
**
Tabelle fuer VE-Langtext
DATA: BEGIN OF L_TAB_LANGTEXT OCCURS 9.
INCLUDE STRUCTURE TLINE.
DATA: END OF L_TAB_LANGTEXT.
**
CHECK I_QAVE-LTEXTKZ NE SPACE.
Langtextschluessel fuellen
MOVE SY-MANDT TO SCHLUESSEL_VE-MANDANT.
MOVE I_QALS-PRUEFLOS TO SCHLUESSEL_VE-PRUEFLOS.
MOVE I_QAVE-KZART TO SCHLUESSEL_VE-KZART.
MOVE I_QAVE-ZAEHLER TO SCHLUESSEL_VE-ZAEHLER.
MOVE SCHLUESSEL_VE TO L_LTEXTSCHLUESSEL.
**
CALL FUNCTION 'READ_TEXT'
EXPORTING
CLIENT = SY-MANDT
ID = L_TEXTID_VE
LANGUAGE = I_QALS-SPRACHE
NAME = L_LTEXTSCHLUESSEL
OBJECT = L_TEXTOBJECT
TABLES
LINES = L_TAB_LANGTEXT
EXCEPTIONS
ID = 01
LANGUAGE = 02
NAME = 03
NOT_FOUND = 04
OBJECT = 05
REFERENCE_CHECK = 06
WRONG_ACCESS_TO_ARCHIVE = 07.
**
CHECK SY-SUBRC EQ C_RC00.
**
Langtext mit aufnehmen
LOOP AT L_TAB_LANGTEXT.
IF L_TAB_LANGTEXT-TDFORMAT EQ '>1'."Formatkz. n. ausgeben !
MOVE L_TAB_LANGTEXT-TDLINE+2 TO G_OBJCONT.
ELSE.
MOVE L_TAB_LANGTEXT-TDLINE TO G_OBJCONT.
ENDIF.
APPEND G_OBJCONT.
ENDLOOP.
**
*ENDFORM. " LANGTEXT_VE_HOLEN