cancel
Showing results for 
Search instead for 
Did you mean: 

How to build a Report from workflow information

Former Member
0 Kudos

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.

Accepted Solutions (0)

Answers (3)

Answers (3)

Former Member
0 Kudos

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

Former Member
0 Kudos

Steve,

If you search just a little bit you'll find [this thread|; explains exactly how you can develop a workflow report and why you shouldn't select directly in workflow tables (such as SWWIHEAD).

Cheers,

Patrick

Former Member
0 Kudos

There is no standard Wflow report. You have to create a custom report using table SWWWIHEAD.

Thanks

Arghadip