2016-06-16 9 views
0

고객에게 '메모'가 포함 된 sqlite 데이터베이스가 있습니다. 데이터베이스 디자인은 매우 간단하며 메모, 고객 테이블과 고객 테이블, 고객 테이블을 연결하는 "링크"테이블을 포함합니다. notes 테이블에는 id 필드가 있으며 customer_note에는 customer_id와 note_id (1 대 다수)가 있고 customers 테이블에는 id도 있습니다.데이터 인식 구성 요소의 TSQLQuery 및 업데이트

선택한 고객에 대한 메모를 얻기 위해 쿼리는 다음과 같습니다

SELECT * FROM note n 
INNER JOIN customer_note cn 
ON (cn.note_id = n.id) 
WHERE customer_id = :customerID 
ORDER BY created_on ASC 

쿼리는 고객의 클라이언트 데이터 셋이 스크롤되는 이벤트에서 실행되는, 즉

customersCDSAfterScroll() 
{ 
int cID = customerCDS->FieldByName("id")->AsInteger; 
customerNotesQ->Params->ParamByName("customerID")->AsInteger = bID; 
customerNotesQ->Open(); 

//Get notes 
string note = stdstr(customerNotesQ->FieldByName("note")->AsString); 
Log(lInfo) << "Note is: "<<note; 
customerNotesQ->Close(); 

}

쿼리는 DataSetProvider, ClientDataSet 및 DataSource 구성 요소에 의해 참조됩니다. UI에서 TDBLookupListbox가 데이터를 받고 있습니다.

문제는 TDBLookpListbox가 모든 고객에 대해 모든 메모를 표시한다는 것입니다. 로그 메시지에서 위의 코드에서 쿼리가 올바르게 수행 된 것처럼 보일 수 있습니다.

무엇이 잘못 될지 알고 싶습니다.

답변

0

쿼리의 결과에는 param에 의해 올바르게 필터링 된 노트 만 포함되므로이 쿼리는 목록 상자에 데이터를 제공하는 쿼리 일 수 없습니다.

따라서 대답은 DBLookupListBox를 잘못 구성하여 노트를 필터링하지 않는 쿼리를 가리키는 다른 데이터 소스를 할당 한 것일 수 있습니다.

또한 param 값을 할당하고 쿼리를 열 때 customerNotesQ이 실제로 닫혀 있는지 확인할 수 없습니다. 그러나 그렇지 않다면 param은 아무런 효과가 없습니다.