2013-08-17 4 views
0

DataTable 열에서 조건부 SUM을 수행하려고합니다. 아래의 코드는 나에게 적절한 결과를주지 못합니다.DataTable 잘못된 결과를주는 계산 및 선택 방법

var d = Convert.ToDouble(myDataTable.Compute("SUM(qty_o)", "itemmaster1_id=4636 AND batch=15789")) // returns 0 

myDataTable.Select("itemmaster1_id=4636 AND batch=15789") // return 0 rows 

'는 myDataTable'= 4636 itemmaster1_id AND 배치 = 15,789 '난 DataTable의 시각화에 디버그 상태를 볼 수있는 필터 조건을 만족하는 레코드를 가지고있다.

DataTable은 데이터 항목으로 사용되는 DataViewGrid에 바인딩됩니다.

도움이 필요합니다.

[편집] 나는 이것을 디버깅하고 연구를 좀 더했다. 세부 사항 공유. DataTable에 3 개의 행이 있습니다. myDataTable.Select()를 실행하면 3 행을 얻습니다. 필터 표현식없이 열 값을 합산하기 위해 .Compute를 호출하면 적절한 결과를 얻을 수 있습니다. 그러나 제 3 행을 필터링 (. 선택)하려고하면 0 행이 생깁니다. 처음 2 행을 필터링하려고하면 완벽하게 작동합니다. 덧붙여서 DataGridView에 세 번째 행이 입력됩니다. 따라서 문제의 데이터 로우 (3 행)가 커밋되지 않았거나 뭔가있을 수 있습니다. 그러나 데이터를 데이터 소스/데이터 테이블에 유지/커밋하는 데 필요한 모든 작업을 수행하고 있으며 올바른 결과를 반환하는 .Select() 호출 및 .Compute ("SUM (qty_o)", null) 호출로 증명됩니다. 나는 혼란 스럽다.

나는 또한 열린 버그 - http://connect.microsoft.com/VisualStudio/feedback/details/477331/filter-expression-in-datatable-compute-datatable-select-failed과이 - http://support.microsoft.com/kb/891742/en-us을 보았습니다. 이 문제는 .NET 4.0에서는 문제가되지 않기를 바라고 있습니다.

[편집 날짜 : 2013 년 8 월 22 일] 여전히 적절한 해결 방법을 얻는 데 어려움을 겪고 있습니다. 도와주세요.

[EDIT 16/July 2014]이 문제가 다시 발생했습니다. 아래 Datatable Compute 메서드는 나를 잘못 대답합니다. LINQ 쿼리 아래 완벽하게 정답을주는 작품을하는 동안

double d = Convert.ToDouble(this.DataSourceAsDataTable.Compute("SUM(amount)", "jobtype=1")); 

.

double n = this.DataSourceAsDataTable 
       .AsEnumerable() 
       .Where(r => ((r["jobtype"] != DBNull.Value) ? Convert.ToInt32(r["jobtype"]) : 0) == 1) 
       .Sum(r => (r["amount"] != DBNull.Value) ? Convert.ToDouble(r["amount"]) : 0); 
+0

[이 솔루션?]과 같은 쿼리 형식 지정은 어떻게됩니까? (http://stackoverflow.com/questions/16767010/c-sharp-datatable-select-how-do-i-format-the-filter-criteria-to -include-null) – Jonesopolis

+0

id 및 batch 열은 숫자 또는 문자열입니까? –

+0

'Compute (문자열 식, 문자열 필터)'에 대해서만 알고 있습니다. 샘플이 전혀 컴파일되지 않습니까? 정확하게 어떤 방법입니까? –

답변

0

.Compute 바로 아래에 다음 코드 줄을 추가하면 문제가 해결되었습니다.

(this.DataSource as BindingSource).EndEdit(); 

표 셀의 데이터 (여기서는 jobtype 열)가 기본 데이터 소스에 커밋되지 않은 것 같습니다. EndEdit가 트릭을했습니다.