본문 바로가기
ERP-SAP/SAMRTFORMS

<ABAP> Smartforms 여러건의 문서에 여러 아이템들 인쇄하기 (다수 페이지)

by 행복한워니의 기록 2011. 6. 29.
728x90
반응형


<1페이지>


<1페이지 - 2번째>





<2페이지>

보다시피 이런식의 컨트롤이다. 아이템은 여러건이 될 수 있어서 뒷페이지까지 인쇄되고 다시 다른 자재가 첫페이지로 나오는 것인데..
그냥 생각하면 쉬운 컨트롤 같으나.. 해보면 어렵다... -_-


그럼 어떻게 할지 우선 선언부부터 공개..
테이블로 둘다 선언한 이유는 여러건의 자재가 들어오니 header도 여러건 item도 여러건이다.


물론 코딩상에서 1번째 자재에 맞는 그 아랫단 Bom 아이템들은 필드를 하나 줘서 매칭시켜놨다.
가령 1번 자재1 - 1번 bom1 1번 bom2 1번 bom3
       2번 자재2 - 2번 bom1 2번 bom2 2번 bom3 2번 bom4 이런식으로... 그러기에 여기서만 잘 컨트롤 해주면 된다.. ㅎㅎ

다음은 정의부.


 드럽게 많이 정의해줬다... G_FOBCIF는 사실 다른쪽때문에 선언한거다. 페이지 컨트롤에는 관련 없다.
HEAER_PAGE 는 우선 1페이지부터라 1로 선언했다.


 HEADER가 몇개인지 계산해주면 몇개의 자재가 있는지 알수 있다. (물론 그에 따라서 달린 BOM들 때문에 전체 페이지는 매우 많이 나올 것이다..)
G_TOTAL_PAGE 는 총 5라인이었다...(예를 들자면 그랬다..)

우선 MATPAGE 가 G_HEADER_PAGE일때 시작하니까.. G_HEADER_PAGE 는 전역정의에서 1로 선언했다. 1페이지부터 출력이다.

아래는 아이템라인 컨트롤 시작.


입력 매개변수 IT_ITEM                          출력 매개변수  IT_ITEM
                   G_HEADER_PAGE                                  G_ITEM_COUNT
                   G_ITEM_COUNT                                    G_GO_NEXTPAGE
                   G_GO_NEXTPAGE                                 G_HEADER_PAGE

소스코드
DATA:
  l_tabix TYPE sy-tabix,
  l_lines TYPE i,
  ls_item LIKE LINE OF it_item.
                                                                                                                                                                                                                                                              
CONSTANTS:
  c_item_max_lines TYPE sy-tabix VALUE 4.
                                                                                                                                                                                                                                                              
CLEAR:
  g_go_nextpage,
  g_item_count.
                                                                                                                                                                                                                                                              
LOOP AT it_item WHERE matpage = g_header_page.
  g_item_count = g_item_count + 1.
  l_tabix      = sy-tabix.
ENDLOOP.
                                                                                                                                                                                                                                                              
CHECK sy-subrc = 0.
                                                                                                                                                                                                                                                              
IF g_item_count < c_item_max_lines.         <-이 부분은 아이템라인이 총 4라인이 아닌 3라인이 들어왔을때
  l_lines = c_item_max_lines - g_item_count. <- 빈 아이템라인을 출력하는 곳이다.
                                                                                                                                                                                                                                                               
  DO l_lines TIMES.                                  <- 맨 위에 폼양식을 보면 가운데가 4칸인데 3칸만 인쇄될 것을 우려해서 넣은부분
    g_item_count    = g_item_count + 1.
    l_tabix         = l_tabix + 1.
    ls_item-matpage = g_header_page.        <-빈칸도 MATPAGE 를 입력해줘야 되니까 넣었다.
    INSERT ls_item INTO it_item INDEX l_tabix.  <- 빈칸 넣는거다.
  ENDDO.
ENDIF.

아이템 인쇄부의 명령어인데...

그 아랫부분이 포인트다. HEADER LINE CONTROL 부분!!


입력 매개변수 G_ITEM_INDEX                     출력 매개변수  G_ITEM_INDEX
                    G_ITEM_COUNT                                        G_ITEM_COUNT
                    G_HEADER_PAGE                                     G_GO_NEXTPAGE
                    G_GO_NEXTPAGE                                    G_HEADER_PAGE

코딩부
g_item_index = g_item_index + 1.
                                                                                                                                                                                                                                                              
IF g_item_index = g_item_count.     <- 만약 아이템 인덱스를 쭉 돌아서 g_item_index 가 총 아이템 카운트랑 같아지면(위쪽에서 세놨음)
  CLEAR:
    g_item_index,                           <-클리어해
    g_item_count.    
                                                                                                                                                                                                                                                           
  g_header_page = g_header_page + 1.   <- 다음페이지로 가.
  g_go_nextpage = 'X'.                          <- 넥스트 페이지에 체크해놔
ENDIF.


아래는 마지막 부분..

G_GO_NEXT_PAGE 가 체크 되어 있고, G_TOTAL_PAGE 가 G_HEADER_PAGE 보다 크거나 같을 때,
넘어가라. 라는건데... 크거나 같은 조건을 넣은 이유는 맨 마지막에 5페이지면 그 전 명령어 때문에
6페이지까지 +1이 되고 멈춰서 빈 페이지가 출력되는 것이다.
그렇기 때문에 마지막 커맨드에 저렇게 넣어주면 빈 페이지 출력이 안된다.

이정도면 끝!!!

728x90
반응형