on 08-22-2008 12:04 PM
Hi Friends,
I want to create a sales order approval and rejection steps using workflow. For this I have created User Decision Step where I have included approval and rejection decisions. And it is working fine. But the thing is that user wants a report for later analyis by giving sales order info. in selection and in output he need SO number,creation date, approver name, how many times he rejected, rejection date, approval date etc. How to achieve this? Is there any standard report programs available to get this type of info? kindly assist me.
Rewarded...
Thanks in advanace,
Steve.
Hi Stephen!
Take a look this example I've developed a report like this.
REPORT ZSICREP001 .
INCLUDE ZSICREP001I.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS: S_UNAME LIKE USR02-BNAME OBLIGATORY.
SELECTION-SCREEN: END OF BLOCK B1.
INITIALIZATION.
PERFORM zf_init_alv USING p_var.
START-OF-SELECTION.
PERFORM busca_nome USING S_UNAME CHANGING LC_NAME.
CONCATENATE 'Tarefas de:' LC_NAME INTO TITULO SEPARATED BY SPACE.
PERFORM: busca_dados,
prepara_dados,
zf_monta_tabela_alv,
zf_monta_layout,
ZF_SORT_SUBTOTAL,
zf_executa_funcao_alv TABLES t_alv USING ' '.
END-OF-SELECTION.
************************************************************************
Executa a busca dos dados no BD.
************************************************************************
Form Busca_Dados.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 15
text = 'Buscando dados ...'.
Busca o histório das tarefas executadas pelo usuário informado.
Select WI_ID
METHOD
METH_EDATE
METH_ETIME
FROM SWWLOGHIST
INTO TABLE T_SWWLOGHIST
WHERE METHOD EQ 'SWW_WI_STATUS_TO_COMPLETED' AND
METH_USER EQ S_UNAME.
IF SY-SUBRC EQ 0.
BUSCA O LOG DE CRIAÇÃO DA TAREFA
Select WI_ID
METHOD
METH_EDATE
METH_ETIME
FROM SWWLOGHIST
INTO TABLE T_SWWLOGHIST_CRIA
FOR ALL ENTRIES IN T_SWWLOGHIST
WHERE WI_ID EQ T_SWWLOGHIST-WI_ID AND
METHOD EQ 'SWW_WW_CREATE' AND
METH_USER EQ 'WF-BATCH'.
ENDIF.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 35
text = 'Buscando dados ...'.
Busca as tarefas aguardando execução do usuário.
CONCATENATE 'US' S_UNAME INTO S_ORG_OBJ.
Select WI_ID
FROM SWWORGTASK
INTO TABLE T_SWWORGTASK
WHERE ORG_OBJ EQ S_ORG_OBJ.
Para cada tarefa aguardando execução, busca o evento de criação da
tarefa e appenda na tabela de histórico
IF SY-SUBRC EQ 0.
SORT T_SWWORGTASK BY WI_ID.
Select WI_ID
METHOD
METH_EDATE
METH_ETIME
FROM SWWLOGHIST
APPENDING TABLE T_SWWLOGHIST_CRIA
FOR ALL ENTRIES IN T_SWWORGTASK
WHERE WI_ID EQ T_SWWORGTASK-WI_ID AND
METHOD EQ 'SWW_WW_CREATE' AND
METH_USER EQ 'WF-BATCH'. .
ENDIF.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 45
text = 'Buscando dados ...'.
Endform.
*********************************************************************
PREPARA OS DADOS
*********************************************************************
FORM prepara_dados.
DATA: lc_hoje like SWWLOGHIST-METH_EDATE,
lc_index type i.
LC_HOJE = SY-DATUM.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 50
text = 'Preparando dados ...'.
SORT T_SWWLOGHIST BY WI_ID METH_EDATE METH_ETIME.
SORT T_SWWLOGHIST_CRIA BY WI_ID.
LOOP AT T_SWWLOGHIST_CRIA.
PERFORM BUSCA_REQUISICAO USING T_SWWLOGHIST_CRIA-WI_ID
CHANGING l_NUM_REQ l_WIPAI.
Se o número da req. vier em branco é porque o workitem nao é do SIC.
IF NOT l_NUM_REQ IS INITIAL.
BUSCA O EVENTO DE EXECUCAO DA TAREFA
READ TABLE T_SWWLOGHIST WITH KEY WI_ID = T_SWWLOGHIST_CRIA-WI_ID
BINARY SEARCH.
IF SY-SUBRC EQ 0.
l_DTEXECTASK = T_SWWLOGHIST-METH_EDATE.
l_HREXECTASK = T_SWWLOGHIST-METH_ETIME.
ELSE.
l_DTEXECTASK = ''.
l_HREXECTASK = ''.
ENDIF.
T_ALV-WORK_ITEM = T_SWWLOGHIST_CRIA-WI_ID.
T_ALV-EXEC_TAREFA = l_DTEXECTASK.
T_ALV-HORA_EXEC_TAREFA = l_HREXECTASK.
T_ALV-CRIA_TAREFA = T_SWWLOGHIST_CRIA-METH_EDATE.
T_ALV-HORA_CRIA_TAREFA = T_SWWLOGHIST_CRIA-METH_ETIME.
T_ALV-REQUISICAO = l_NUM_REQ.
T_ALV-WIPAI = l_WIPAI.
BUSCA O TIPO DO FLUXO
SELECT SINGLE FLUXO
FROM ZSICREQUISICAO
INTO T_ALV-FLUXO
WHERE BANFN EQ T_ALV-REQUISICAO.
APPEND T_ALV.
ENDIF.
ENDLOOP.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 75
text = 'Preparando dados ...'.
SORT T_ALV BY REQUISICAO.
LOOP AT T_ALV.
AT NEW REQUISICAO.
BUSCA O TIPO DO FLUXO
SELECT SINGLE FLUXO
FROM ZSICREQUISICAO
INTO T_ALV-FLUXO
WHERE BANFN EQ T_ALV-REQUISICAO.
PERFORM BUSCA_LOG USING T_ALV-REQUISICAO
T_ALV-FLUXO
CHANGING T_LOG.
ENDAT.
CLEAR: T_ALV-ICONE.
BUSCA O LOG DE CRIACAO DO WORKITEM
READ TABLE T_LOG WITH KEY WORKITEM = T_ALV-WORK_ITEM.
IF SY-SUBRC EQ 0.
T_ALV-TEXTO_LOG_CRIA = T_LOG-TEXTO_LOG.
ELSE.
T_ALV-TEXTO_LOG_CRIA = ''.
ENDIF.
BUSCA O LOG DE EXECUÇÃO DO WORKITEM
IF SY-SUBRC EQ 0.
lc_index = SY-TABIX.
lc_index = lc_index + 1.
READ TABLE T_LOG INDEX lc_index.
IF SY-SUBRC EQ 0.
T_ALV-TEXTO_LOG_EXEC = T_LOG-TEXTO_LOG.
ELSE.
T_ALV-TEXTO_LOG_EXEC = ''.
ENDIF.
ENDIF.
Calcula o tempo que a tarefa ficou parada
IF NOT T_ALV-EXEC_TAREFA = ''.
T_ALV-DIAS = T_ALV-EXEC_TAREFA - T_ALV-CRIA_TAREFA.
ELSE.
T_ALV-DIAS = LC_HOJE - T_ALV-CRIA_TAREFA.
WRITE icon_red_light AS ICON TO t_alv-icone.
ENDIF.
MODIFY T_ALV.
ENDLOOP.
ENDFORM.
*********************************************************************
BUSCA A REQUISIÇÀO ATRAVES DO WORKITEM.
*********************************************************************
FORM BUSCA_REQUISICAO USING l_WI CHANGING NUMREC WI_PAI.
DATA: LC_NUMREC LIKE SWW_CONTOB-OBJKEY.
CLEAR: l_SWR_WIHDR.
BUSCA O WORKITEM PAI.
CALL FUNCTION 'SAP_WAPI_GET_HEADER'
EXPORTING
workitem_id = l_WI
IMPORTING
WORKITEM_ATTRIBUTES = l_SWR_WIHDR.
BUSCA O NUMERO DA REQUISICAO.
SELECT SINGLE OBJKEY
FROM SWW_CONTOB
INTO LC_NUMREC
WHERE WI_ID EQ l_SWR_WIHDR-WI_CHCKWI AND
ELEMENT EQ 'REQUISITIONHEADER' AND
OBJTYPE EQ 'BUS2105'.
IF SY-SUBRC EQ 0.
NUMREC = LC_NUMREC.
WI_PAI = l_SWR_WIHDR-WI_CHCKWI.
ELSE.
NUMREC = ''.
WI_PAI = ''.
ENDIF.
ENDFORM.
************************************************************
Monta a estrutura do relatório
************************************************************
FORM ZF_MONTA_TABELA_ALV.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 80
text = 'Montando a estrutura do relatório...'.
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'ICONE'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'Status'.
t_fieldcat-inttype = 'C'.
t_fieldcat-no_out = 'X'.
APPEND t_fieldcat.
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'REQUISICAO'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'Requisição'.
t_fieldcat-inttype = 'C'.
APPEND t_fieldcat.
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'CRIA_TAREFA'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'Dt.Rec.Tarefa'.
t_fieldcat-inttype = 'D'.
APPEND t_fieldcat.
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'HORA_CRIA_TAREFA'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'Hr.Rec.Tarefa'.
t_fieldcat-inttype = 'C'.
APPEND t_fieldcat.
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'TEXTO_LOG_CRIA'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'Log do recebimento da tarefa'.
t_fieldcat-inttype = 'C'.
APPEND t_fieldcat.
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'EXEC_TAREFA'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'Dt.Exec.Tarefa'.
t_fieldcat-inttype = 'D'.
APPEND t_fieldcat.
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'HORA_EXEC_TAREFA'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'Hr.Exec.Tarefa'.
t_fieldcat-inttype = 'C'.
APPEND t_fieldcat.
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'TEXTO_LOG_EXEC'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'Log da execução da tarefa'.
t_fieldcat-inttype = 'C'.
APPEND t_fieldcat.
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'DIAS'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'Dias'.
t_fieldcat-inttype = 'I'.
t_fieldcat-do_sum = 'X'.
APPEND t_fieldcat.
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'WORK_ITEM'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'Work Item'.
t_fieldcat-inttype = 'C'.
t_fieldcat-no_out = 'X'.
APPEND t_fieldcat.
*
CLEAR t_fieldcat.
t_fieldcat-fieldname = 'WIPAI'.
t_fieldcat-tabname = 'T_ALV'.
t_fieldcat-reptext_ddic = 'WI Pai.'.
t_fieldcat-inttype = 'C'.
t_fieldcat-no_out = 'X'.
APPEND t_fieldcat.
ENDFORM.
*----
-
Form zf_sort_subtotal
*----
-
Classificação e item de subtotalização
*----
-
FORM ZF_SORT_SUBTOTAL.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 90
text = 'Montando a estrutura do relatório...'.
CLEAR t_sort.
t_sort-spos = 1.
t_sort-fieldname = 'REQUISICAO'.
t_sort-tabname = 'T_ALV'.
t_sort-up = 'X'.
t_sort-subtot = 'X'.
append t_sort.
CLEAR t_sort.
t_sort-spos = 2.
t_sort-fieldname = 'CRIA_TAREFA'.
t_sort-tabname = 'T_ALV'.
t_sort-up = 'X'.
append t_sort.
ENDFORM.
*----
-
BUSCA A LINHA DO LOG REFERENTE AO WORKITEM
*----
-
FORM BUSCA_LOG USING NUM_REQ TIPO_WFLOW CHANGING LOG STRUCTURE T_LOG.
DATA: lh_wis like SWWWIHEAD occurs 0 with header line,
lc_wiatual type TP_DADOSWI,
lc_noant like ZSICDESETAPA-NODE_ID,
lc_chckwi like swwwihead-wi_chckwi,
lh_itemlist like SWWWIHEAD occurs 0 with header line,
lc_wid like swwwihead-wi_id,
lc_objkey like SWW_CONTOB-OBJKEY.
BUSCA TODAS AS INSTANCIAS DO FLUXO
lc_objkey = NUM_REQ.
call function 'SWI_WORKITEMS_OF_OBJECT_GET'
exporting
objtype = 'BUS2105'
objkey = lc_objkey
tables
itemlist = lh_itemlist.
Elimina os Workitens que não sao de diálogo e não são de criação do
*fluxo.
delete lh_itemlist where not wi_chckwi is initial or wi_type <> 'F'.
loop at lh_itemlist.
Refresh: lh_wis.
CLEAR: lc_noant.
lc_wid = lh_itemlist-wi_id.
busca todos os workitems dependentes do WI pai
call function 'SWI_GET_DEPENDENT_WORKITEMS'
exporting
wi_id = lc_wid
tables
dependent_wis = lh_wis.
elimina WI que não são de diálogo
delete lh_wis where wi_type <> 'W'.
Verifica se existe alguma tarefa para o usuário informado se não
existir, né há necessidade de entrar no loop.
READ TABLE lh_wis WITH KEY WI_AAGENT = S_UNAME.
CHECK SY-SUBRC EQ 0.
Loop at lh_wis.
busca nó
search lh_wis-wi_creator for lh_wis-WI_CHCKWI.
lc_wiatual-node_id = lh_wis-wi_creator+sy-fdpos(22).
busca o SUBWORKFLOW que a tarefa pertence.
select single wi_rh_task
into lc_wiatual-task
from swwwihead
where wi_id = lh_wis-WI_CHCKWI.
Monta o log
IF S_UNAME EQ lc_wiatual-agent.
LOG-WORKITEM = lh_wis-WI_ID.
PERFORM MONTA_LOG USING TIPO_WFLOW
lc_wiatual-task
lc_wiatual-node_id
lc_noant
lc_wiatual-agent
lh_wis-WI_AAGENT
CHANGING LOG-TEXTO_LOG.
APPEND LOG TO T_LOG.
Busca o Agente
lc_wiatual-agent = lh_wis-WI_AAGENT.
lc_noant = lc_wiatual-node_id.
endloop.
Endloop.
ENDFORM.
MONTA O TEXTO DO LOG.
FORM MONTA_LOG USING TIPO_WF TAREFA NODE NODE_ANT AGENT AGENT_DEST
CHANGING TEXTO_LOG.
Data: lc_DESETAPA LIKE ZSICDESETAPA,
lc_LEN TYPE I.
BUSCA O TEXTO DO LOG.
SELECT * UP TO 1 ROWS
FROM ZSICDESETAPA
INTO lc_DESETAPA
WHERE TASK EQ TAREFA AND
NODE_ID EQ NODE AND
FLUXO EQ TIPO_WF.
ENDSELECT.
SE FOR ETAPA RECURSIVA
IF lc_DESETAPA-RECURSIVA = 'X'.
SELECT SINGLE LOG
INTO TEXTO_LOG
FROM ZSICETAPA_RECUR
WHERE TASK = TAREFA AND
NODE_ID = NODE AND
FLUXO = TIPO_WF AND
NODE_IDPAI = NODE_ANT.
ELSE.
TEXTO_LOG = lc_DESETAPA-LOG.
ENDIF.
IF NOT TEXTO_LOG IS INITIAL.
Formata Mensagem DO USUARIO ORIGEM
PERFORM busca_nome USING AGENT CHANGING LC_NAME.
lc_LEN = STRLEN( lc_NAME ).
IF NOT lc_LEN IS INITIAL.
REPLACE 'V1' LENGTH lc_LEN with lc_name(lc_LEN)
INTO TEXTO_LOG.
ELSE.
REPLACE 'V1' LENGTH 2 WITH SPACE INTO TEXTO_LOG.
ENDIF.
Formata Mensagem DO USUARIO DESTINO
PERFORM busca_nome USING AGENT_DEST CHANGING LC_NAME.
lc_LEN = STRLEN( lc_NAME ).
IF NOT lc_LEN IS INITIAL.
REPLACE 'V2' LENGTH lc_LEN with lc_name(lc_LEN)
INTO TEXTO_LOG.
ELSE.
REPLACE 'V2' LENGTH 2 WITH SPACE INTO TEXTO_LOG.
ENDIF.
ELSE.
TEXTO_LOG = ''.
ENDIF.
ENDFORM.
*********************************************************
BUSCA O NOME DO USUÁRIO
*********************************************************
form busca_nome using p_usrid CHANGING p_name.
data ln_pernr like pa0105-pernr.
check not p_usrid is initial.
Busca o no.pessoal do usuário
select pernr into ln_pernr up to 1 rows
from pa0105
where usrty eq '0001'
and usrid eq p_usrid.
endselect.
if sy-subrc = 0.
Busca o nome completo do usuário
select ename into p_name up to 1 rows
from pa0001
where pernr eq ln_pernr.
endselect.
translate p_name to upper case.
endif.
endform.
*&----
*
*& Form zf_monta_layout
*&----
*
text
*----
*
--> p1 text
<-- p2 text
*----
*
form zf_monta_layout.
Preenchendo algumas opções de impressão (Não é obrigatório)
v_layout-expand_all = 'X'. "Abrir subitens
v_layout-colwidth_optimize = 'X'. "Largura melhor possível da coluna
v_layout-edit = 'X'. "Permitir a edição
v_layout-zebra = 'X'. "Zebrar o relatório
v_layout-info_fieldname = 'COLOR'. "Cor da linha
v_layout-no_totalline = 'X'. "Não imprime a linha de Total.
v_layout-totals_before_items = 'X'. "Imprime o total antes do item
endform. " zf_monta_layout
Best Regards
Luciano Barreto
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
There is no standard Wflow report. You have to create a custom report using table SWWWIHEAD.
Thanks
Arghadip
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
95 | |
11 | |
10 | |
9 | |
9 | |
7 | |
6 | |
5 | |
5 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.