빌더(TWx) 님이 쓰신 글 :
: 뽀뽀중 님이 쓰신 글 :
: : FireDAC를 이용해서 DB 프로그램을 작성 하고 있습니다.
: :
: : 1. 테이블에 입력된 자료를 DBGrid에 표시 합니다.
: : 2. 검색결과만 동일한 DBGrid에 표시하려 하는데, 이부분을 어떻게 해야 하는지 모르겠습니다.
: : (검색되지 않은 데이터를 삭제 하는 것이 아닌, DBGrid 에서만 보이게 하고 싶습니다.)
: :
: : 제가 작성한 코드는 아래와 같습니다.
: :
: : FDTableRegDoc->Active = false;
: : FDTableRegDoc->TableName = "MasterReg";
: : FDTableRegDoc->Connection = FormMain->FDConnection1;
: : FDTableRegDoc->Active = true;
: : FDTableRegDoc->Open();
: :
: : FDTableRegDoc->Edit();
: :
: : FormMain->FDCommand1->CommandText->Clear();
: :
: : // 검색어 조건에 따라 SQL 문장을 변경 한다.
: : if (AsGum == "전체" && AsMyun == "전체" && AsRi == "전체" && AsFacType == "전체" && AsBunGi == "") {
: : AsSQLString = "SELECT * FROM MasterReg";
: : }
: :
: : else {
: : AsSQLString = "SELECT * FROM MasterReg WHERE " AddressSi='양평군' and AddressMyun = '강상면';
: : }
: :
: : FormMain->FDCommand1->CommandText->Add(AsSQLString);
: : FormMain->FDCommand1->Active = true;
: :
: : FDTableRegDoc->Post();
: : FDTableRegDoc->Close();
: : DBgrdRegDoc->Refresh();
: : FormMain->FDCommand1->Active = false;
: :
: : 검색한 결과 만 자동으로 DBgrdRegDoc에 표시(입력)되는 것으로 생각하고 있었는데,....
: : 안되네요..
: :
:
:
:
:
: 답변:
:
:
:
: TFDCommand는 TDataSet으로 부터 상속되어 구현된 클래스가 아니라서
: data set 의 쿼리 조건 요구에 따라서 데이타 베이스로 부터 rercord set을 리턴 받는 경우엔 사용될 수 없습니다.
:
: TFDCommand는 메모리 테이블과 테이블 아답타와 연계해서 인터페이스를 취할 때나 의미가 있는 거고
: 각기 클래스들의 컴포지션 관계를 숙지하고 있어야 합니다.
:
:
: 그런데...
:
: VCL Document Help 는 안봐요?
:
:
: TFDCommand 에 대해서...
:
: "The class does not provide TDataSet-aware access to returned result sets."
:
: 라고 친절하게 설명해 놓고 있는데...
:
:
: 다음과 같은 식으로 TFDQuery 로 시퀄(SQL) 조건을 설정해서 사용하세요.
:
: FDTableRegDoc->SQL->Text = "select * from MasterReg where AddressSi = :AddressSi";
: FDTableRegDoc->ParamByName("AddressSi")->AsString = "시이름";
:
: ':AddressSi' 에서 앞 부분의 ':' 는 파라미터임을 나타내는 Token 역할을 합니다.
:
:
먼저 답변 감사 드립니다.
알려 주신 방법으로 시도를 해 보았는데, 제가 실력(지식)이 부족하여 만족할만한 결과를 얻지 못했습니다.
답변 계시전에 다른 방법인 filter 사용하는 방법으로 하니, 검색은 원하는 결과를 얻었으나
DBGrid 에 검색결과를 업데이트 가 안되고 있습니다.
BBGrid 에 보이는 레코드를 클릭하면, 해당 자료를 읽게 하였으며,
검색어에 포함되지 않은 레코드는 클릭을 하여도, 해당 자료를 읽을수는 없습니다.
close(), open(), refrash() 등등 시도를 해 보았는데, 안되네요...
수정된 코드는 아래와 같습니다.
FDTableRegDoc->Active = false;
FDTableRegDoc->TableName = "MasterReg";
FDTableRegDoc->Connection = FormMain->FDConnection1;
FDTableRegDoc->Active = true;
FDTableRegDoc->Open();
// 검색어 조건에 따라 SQL 문장을 변경 한다.
if (AsGum == "전체" && AsMyun == "전체" && AsRi == "전체" && AsFacType == "전체" && AsBunGi == "") {
AsSQLString = "I_MasterID <> 0";
FDTableRegDoc->Filter = AsSQLString;
}
else {
AsSQLString = AsSQLGum + AsSQLMyun + AsSQLRi + AsSQLBunGi;
FDTableRegDoc->Filter = AsSQLString;
// select * from MasterReg where AddressSi='무명군' and AddressMyun = '무명면';
}
FDTableRegDoc->Filtered = true;
FDTableRegDoc->FilterChanges;
FDTableRegDoc->First();
FDTableRegDoc->Refresh();
////**** 테이블과 DBGrid 연결이 안된듯 함
FDTableRegDoc->EnableControls();
ShowMessage(FDTableRegDoc->RecordCount);
DBgrdRegDoc->Refresh();
FDTableRegDoc->Close();
===> 검색에 성공(?) 하였습니다.
아래 코드와 같이 수정 하면 됩니다.
우선 테이블이 아닌 쿼리 로 해야 하는 것이 었습니다.
FDQueryRegDoc->Filtered = false;
// 검색어 조건에 따라 SQL 문장을 변경 한다.
if (AsGum == "전체" && AsMyun == "전체" && AsRi == "전체" && AsFacType == "전체" && AsBunGi == "") {
AsSQLString = "I_MasterID <> 0";
}
else {
AsSQLString = AsSQLGum + AsSQLMyun + AsSQLRi + AsSQLBunGi;
// select * from MasterReg where AddressSi='양평군' and AddressMyun = '강상면';
}
FDQueryRegDoc->Filter = AsSQLString;
FDQueryRegDoc->Filtered = true;
|