2013-07-06 2 views
0

여기에 파일 분할을위한 스크립트가 있습니다. 예를 들어 총 lds_trandetail.rowcount()는 56이고, 나는 최대 20 개의 행을 가진 3 개의 파일에서 56을 다듬어야하고 마지막 파일은 16 인 나머지 행을 처리 할 것이다. 20 개의 첫 번째 파일을 생성 할 수 있었다. 좋은 행. 하지만 나머지 행을 얻는 방법에 대해서는 알 수 없습니다. 제발 도움을 누구 ...PowerBuilder에서 파일을 분할하는 방법

The expected output should be: 
20 Full Rows in a File = Header as First Row(1) + Detail(18) + Footer as Last Row(1) 

1st File : 18 rows (lds_trandetail rows from 1 to 18) 
2nd File : 18 rows (lds_trandetail rows from 19 to 36) 
3rd File : 18 rows (lds_trandetail rows from 37 to 54) 
4th File : 2 (lds_trandetail rows from 55 to 56) 


//Variable Desclarations Here..... 
IF NOT ISVALID (lds_TranHeader) THEN 
    lds_TranHeader = CREATE DataStore 
    lds_TranHeader.DataObject = 'd_export_inventoryheader' 
    lds_TranHeader.SetTransObject(SQLCA) 
END IF 

IF NOT ISVALID (lds_TranDetail) THEN 
    lds_TranDetail = CREATE DataStore 
    lds_TranDetail.DataObject = 'd_export_inventorydetail' 
    lds_TranDetail.SetTransObject(SQLCA) 
END IF 


lds_TranHeader.Retrieve() 
lds_TranDetail.Retrieve() 
ll_detailrow = lds_TranDetail.RowCount() 

IF lds_TranDetail.RowCount() > 0 THEN 
    //Initialize the total rowcount of inventory. 
    li_fileint = (ll_detailrow/18) 
    ldec_filecount = Dec(ll_detailrow/18) 
    ls_remainder = String(ldec_filecount,'####.000') 
    li_pos = POS(ls_remainder,'.') 
    ls_remainder = Mid(ls_remainder, li_pos) 
    ldec_remainder = Dec(ls_remainder) 
    IF ldec_remainder > 0 THEN 
     li_fileint = li_fileint + 1 
    ELSEIF ldec_remainder < 0 THEN 
     li_fileint = (ll_detailrow/18) 
    END IF 

    ls_seqnum = gf_control_num('EDI_HW4C1FOOTER',10) 

    //Perform Iteration to the inventory rowcount. 
    FOR ll_detail = 1 TO lds_TranDetail.RowCount() 
     IF lds_TranHeader.RowCount() = 1 THEN 
      ls_recordidh = lds_TranHeader.getItemString(1,'RECORDIDH') 
      ls_schcontactname = lds_TranHeader.getItemString(1,'SCHCONTACTNAME') 
      ls_schcontactemail = lds_TranHeader.getItemString(1,'schcontactemail') 
      ls_schcontactphone = lds_TranHeader.getItemString(1,'schcontactphone') 
      ls_schdunsnum = lds_TranHeader.getItemString(1,'schdunsnum') 
      ldt_createddt = lds_TranHeader.getItemDateTime(1,'createddt') 
      ls_hwdnunsnum = lds_TranHeader.getItemString(1,'hwdunsnum') 
      ls_createddt = String(ldt_createddt,'YYYYMMDDHHMMSS')  
      ls_header = ls_recordidh + '~t' 
      ls_header += ls_schcontactname + '~t' 
      ls_header += ls_schcontactemail + '~t' 
      ls_header += ls_schcontactphone + '~t' 
      ls_header += ls_schdunsnum + '~t' 
      ls_header += ls_createddt + '~t' 
      ls_header += ls_hwdnunsnum + '~t' + '~t' + '~t' + '~t'  
     END IF 

     ls_recordidd = lds_TranDetail.getItemString(ll_detail,'recordidd') 
     ls_clnum = lds_TranDetail.getItemString(ll_detail,'clnum') 
     ls_schdunsnum = lds_TranDetail.getItemString(ll_detail,'schdunsnum') 
     ls_schlsname = lds_TranDetail.getItemString(ll_detail,'schlsname') 
     ls_company = lds_TranDetail.getItemString(ll_detail,'company') 
     ls_hwwhsecode = lds_TranDetail.getItemString(ll_detail,'hwwhsecode') 
     ls_hwdunsnum = lds_TranDetail.getItemString(ll_detail,'hwdunsnum') 
     ls_hwsubcompany = lds_TranDetail.getItemString(ll_detail,'hwsubcompany') 
     ls_boxname = lds_TranDetail.getItemString(ll_detail,'boxname') 
     ls_boxnumb = lds_TranDetail.getItemString(ll_detail,'boxnumb') 
     ls_contractnum = lds_TranDetail.getItemString(ll_detail,'contractnum') 
     //ldec_ItemQty = Dec(lds_TranDetail.getItemNumber(ll_detail,'itemqty')) 
     ls_itemqty = String(lds_TranDetail.getItemNumber(ll_detail,'itemqty')) 
     ls_itemcode = lds_TranDetail.getItemString(ll_detail,'itemcode') 
     ls_boxstatus = lds_TranDetail.getItemString(ll_detail,'boxstatus') 

     ls_detail += ls_recordidd + '~t' 
     ls_detail += ls_clnum + '~t' 
     ls_detail += ls_schdunsnum + '~t' 
     ls_detail += ls_schlsname + '~t' 
     ls_detail += ls_company + '~t' 
     ls_detail += ls_hwwhsecode + '~t' 
     ls_detail += ls_hwdunsnum + '~t' 
     ls_detail += ls_hwsubcompany + '~t' 
     ls_detail += Trim(ls_boxname) + '~t' 
     ls_detail += ls_boxnumb + '~t' 
     ls_detail += ls_contractnum + '~t' 
     ls_detail += ls_itemqty + '~t' 
     ls_detail += Trim(ls_itemcode) + '~t' 
     ls_detail += ls_boxstatus + '~t' + '~t' + '~t' + '~t' + '~r~n'  

     Long ll_insert 
     Long ll_getrow, ll_counter, ll_totalrow, ll_loop = 0 
     String ls_trandate, ls_generateddt 

     IF ll_detail = 18 AND (li_fileint <> li_filecount) THEN     
      ldt_trandate = gnv_app.of_getServerDate() 
      ls_trandate = String(ldt_TranDate,'YYYYMMDDHHMMSS') 

      li_pagefile++ //Increment       
      ls_Footer = 'F' + '~t' + String(li_pagefile) + '~t' + '.' + '~t' 
      ls_Footer += ls_seqnum + '~t' + '/' + '~t' + 'E' + '~t' + '~t' + '~t' + '~t' 

      ls_Message = ls_Header + '~r~n' + ls_Detail + ls_Footer + '~r~n'    
      FilePath = String(dw_path.Object.outboundfilepath[1]) 
      FileName = ls_FilePrefix + '_' +String(li_pagefile)+'_'+String(ldt_TranDate,'YYYYMMDDHHMMSS') + '.txt' 
      FileDir = FilePath + '/' + FileName 
      li_FileNum = FileOpen(FileDir, TextMode!, Write!, LockWrite!, Append!) 

      ll_status = FileWriteEx(li_FileNum, ls_Message) 
      IF ll_Status >= 1 THEN 
       FileClose(li_FileNum) 
      END IF 
      IF Trim(ls_Message) <> "" OR Len(Trim(ls_Message)) > 0 THEN ls_Message = "" 
      IF Trim(ls_Header) <> "" OR Len(Trim(ls_Header)) > 0 THEN ls_Header = "" 
      IF Trim(ls_Detail) <> "" OR Len(Trim(ls_Detail)) > 0 THEN ls_Detail = "" 
      ll_getrow = lds_trandetail.RowCount() 
      li_filecount = li_filecount + 1 
      ll_loop = ll_detail + 18 
      ll_totalrow = ll_detailrow - ll_detail 
      ll_detail = 18 * li_filecount 
     END IF 

    NEXT 


END IF 

RETURN ib_RETURN = TRUE 

답변

0

당신은 파일 당 약 20 행을 이야기하지만, 내가 볼로도 헤더 행과 각 파일에 18 ~ 19 개 행을 넣어. 나는 당신의 코드를 완전히 이해하지 못한다. 그러나 for 루프를 작성하고 만약 카운터가 20으로 나눌 수 있다면 나는 실제 파일을 닫고 새로운 파일을 열 것이다.

ADDED :

IF ll_detail = 18 AND (li_fileint <> li_filecount) THEN  

만에 처음으로 단 18 개 행을 확인하기 때문 거짓 당신이 하나 개의 파일 만받을 이유, 그건 :

나는 문제가이 상태로 생각 .

이이 비슷한을 변경해야합니다 :

IF (Mod(ll_detail, 18) = 0 or ll_detail = lds_TranDetail.RowCount()) AND (li_fileint <> li_filecount) THEN     

Mod(ll_detail, 18) = 0 상태를 확인 당신이 모든 행의 마지막에있는 ll_detail = lds_TranDetail.RowCount() 또 다른 18 행의 끝입니다 여부를!

나는 이것이 작동 할 수 있다고 생각합니다.

br. 가보

+0

확인할 수 있으면 예상 출력을 편집했습니다. – Alex

+0

도움을 주시면 감사하겠습니다. 결과가 만족 스럽습니다. 고맙습니다. – Alex

+0

당신은 환영합니다 :) 좋은 주말 보내십시오! – DARKinVADER