2013-06-06 3 views
2

1 개의 DataWindow에서 데이터를 가져 오는 2 개의 DataStore, lds_header 및 lds_detail을 조합했습니다. 난 헤더의 열을 기반으로 DataWindow의 열을 설정했습니다.PowerBuilder의 데이터 윈도우에서 여분의 열을 삭제하는 방법

lds_header has 10 columns to export for header segment - holds in first row only 
lds_detail has 5 columns to export for detail segment - holds in second row and so on. 
DataWindow has 10 columns. 

.TXT (탭 구분) 파일이 생성 된 경우. 세부 세그먼트는 다른 5 개의 열을 넘깁니다. 이제 내 질문은, 어떻게 데이터 영역을 저장 AS 메서드를 사용하여 세부 세그먼트에 대한 불필요한 열을 제거하는 것입니다?

사실, FileOpen 메서드를 사용하여 예상 된 결과를 제공 할 수 있었지만 문자열 연결을 사용했지만 FileOpen 메서드는 문자열 값을 보유하는 데 한계가 있으므로 데이터 저장 SaveAs 메서드에서 내보내기를 수행하려고합니다.

+1

FileOpen 및 FileWrite를 가리키고 있다고 가정하면 FileWrite가 문자열을 취하는 제약 조건은 제약 조건이 아니어야합니다. 모든 열의 값, 심지어 문자열 데이터 형식 열을 String()으로 지정할 수 있기 때문입니다. – Terry

답변

2

나는 위의 질문을하는 방법을 알아 내려고하고있다. 이 스크립트 행 dw_Outbound.Modify("DESTROY i")은 잘못된 구문을 반환합니다. 어떻게 데이터를 삭제하지 않고 열을 삭제하려면?

FOR ll_outbound = 2 TO dw_Outbound.RowCount() 
      IF dw_Outbound.Object.A[ll_outbound] = 'D' THEN 
       ls_column = dw_Outbound.Object.DataWindow.Column.Count 
       FOR li_column = 9 TO Integer(ls_Column) 
        dw_Outbound.Modify("DESTROY i")     
        dw_Outbound.Modify("DESTROY j") 
        dw_Outbound.Modify("DESTROY k") 
        dw_Outbound.Modify("DESTROY l") 
        dw_Outbound.Modify("DESTROY m") 
        dw_Outbound.Modify("DESTROY n") 
        dw_Outbound.Modify("DESTROY o") 
        dw_Outbound.Modify("DESTROY p") 
        dw_Outbound.Modify("DESTROY q") 
        dw_Outbound.Modify("DESTROY r") 
        dw_Outbound.Modify("DESTROY s") 
        dw_Outbound.Modify("DESTROY t") 
       NEXT 
      END IF 
     NEXT 
+1

구문은'destroy column # n' (날카로운 기호로) 또는'destroy column_name'입니다. – Seki

+1

@Seki, destroy column_name 구문을 사용하고 있습니다. column_name은 i이지만 작동하지 않습니다. DataWindow.Modify ("destroy i"), 정확합니까? – Alex

+1

나는 당신이 행에있는 루프 안의 컬럼을'파괴 '한다는 사실을 놓쳤다 ... 모든 열에 대해 존재하는 열은 첫 번째 행에서 그것을 파괴하고, 두 번째 행에서 같은 열의'destroy' 행이 이미 사라 졌기 때문에 행이 실패합니다.이것이 잘못된 구문의 출처 : 존재하지 않는 컬럼 삭제 (더 이상) – Seki

0

SaveAs 메서드를 사용하면 모든 열이 내보내지기보다는 선택 목록에 있다고 생각합니다. 아무리 그럴지라도 가시적인지 아닌지. destroy와 create를 사용하면 선택 목록의 열에 대한 컨트롤 만 생성합니다. 여러 열을 내보내고 싶지 않거나 열의 "레이블"이름을 바꾸려면 내보낼 열이있는 별도의 데이터 창이 필요하며 원본 데이터 창에서 내보낼 데이터를 복사해야합니다 "데이터 윈도우. 이게 당신 문제였습니까?

br. 가버

2

데이터 윈도우에서 일부 컬럼 만 내보내는 가장 쉬운 방법은 원하는 컬럼이 처음 N 컬럼이되도록 데이터 소스를 설정하는 것입니다. 모든 열 dw_all을 가진 DataWindow를 호출 할 것입니다. 그런 다음 dw_all을 dw_some으로 저장 한 다음 데이터 소스에서 N 다음에있는 열을 삭제합니다. 그런 다음, dw_all을 가정 할 ds_all에 있고 데이터를 가지고 있으며, dw_some는에 ds_some 빈 : ds_all 중간에서 열 블록을 복사하는 당신은 시작과 끝 열을 변경할 수 있습니다

ll_rows = ds_all.rowcount() 
ds_some.object.data[1, 1,ll_rows,N] = ds_all.object.data[1,1,ll_rows,N] 

, 또는 마지막 N 개의 열이 있지만 dw_some을 만들 때 열의 유형과 크기에주의해야합니다. 반면에 N으로 저장하고 삭제하는 것은 거의 완벽합니다.

마지막으로 한 번에 열과 열의 블록을 일치시키고 복사하지 않는 데이터 윈도우를 사용할 수 있습니다. 아래의 예가 내가 권장하는 방식으로 데이터 윈도우를 만드는 것이 더 나은 이유를 보여주기 바랍니다. 이 맞다면 당신이 말할 수있는 유일한 방법은 신중하게 모두에서 DataWindow의 데이터 소스를 확인하는 것입니다 :

dw_excel.Object.Data[1,1,il_rows,1]  = dw_report.Object.Data[1,1,il_rows,1] 
dw_excel.Object.Data[1,2,il_rows,3]  = dw_report.Object.Data[1,3,il_rows,4] 
dw_excel.Object.Data[1,4,il_rows,12] = dw_report.Object.Data[1,5,il_rows,13] 
dw_excel.Object.Data[1,13,il_rows,13] = dw_report.Object.Data[1,15,il_rows,15] 
dw_excel.Object.Data[1,14,il_rows,14] = dw_report.Object.Data[1,25,il_rows,25] 
dw_excel.Object.Data[1,15,il_rows,20] = dw_report.Object.Data[1,17,il_rows,22] 

참고 : 반드시 행 개수는 이와 같은 데이터의 표현을 사용하기 전에> 0인지 확인하십시오.

관련 문제