Query Builder
TsgcHTMLComponent_QueryBuilder: 비주얼 쿼리 및 필터 빌더입니다. 사용자는 조건(필드, 연산자, 값)을 AND 및 OR 그룹으로 조합하며, 직접 구성하거나 AI 어시스턴트가 답하는 일반 언어 질문으로 만들 수 있습니다. 서버는 그 결과를 매개변수화된 SQL 조건, 행 일치 검사 또는 Grid 필터로 바꿉니다. Delphi, C++ Builder, .NET에서 사용할 수 있습니다.
TsgcHTMLComponent_QueryBuilder: 비주얼 쿼리 및 필터 빌더입니다. 사용자는 조건(필드, 연산자, 값)을 AND 및 OR 그룹으로 조합하며, 직접 구성하거나 AI 어시스턴트가 답하는 일반 언어 질문으로 만들 수 있습니다. 서버는 그 결과를 매개변수화된 SQL 조건, 행 일치 검사 또는 Grid 필터로 바꿉니다. Delphi, C++ Builder, .NET에서 사용할 수 있습니다.
규칙이 지정할 수 있는 필드를 추가하거나 TsgcHTMLComponent_Grid를 연결해 그 열을 사용한 다음 렌더링합니다. 모든 버튼은 서버 이벤트를 전송하고, 컴포넌트는 해당 요청의 트리를 검증하며, OnApply는 데이터를 조회할 수 있도록 그 트리를 전달합니다.
TsgcHTMLComponent_QueryBuilder, 조건 트리를 위한 TsgcHTMLQueryNode 포함
조건과 그룹의 트리를 Bootstrap 5 마크업으로 서버에서 렌더링하며, 스크립트가 필요 없습니다
Delphi, C++ Builder, .NET
Fields는 규칙이 지정할 수 있는 항목을 나열합니다. OnApply는 요청의 검증된 트리를 받고, GetSQLWhere는 이를 이름 있는 매개변수가 포함된 SQL 조건으로 기록하며, ToJSON은 사용자 세션을 위해 이를 보관합니다.
uses
sgcHTML_AI, sgcHTML_Component_QueryBuilder;
// 한 번만 생성: 자신의 서버 이벤트에 응답합니다
oQB := TsgcHTMLComponent_QueryBuilder.Create(Self);
oQB.ElementName := 'orders';
oField := oQB.Fields.Add;
oField.Name := 'customer';
oField.Caption := 'Customer';
oField := oQB.Fields.Add;
oField.Name := 'amount';
oField.Caption := 'Amount';
oField.DataType := aidtInteger;
oField.SQLName := 'o.amount';
oField := oQB.Fields.Add;
oField.Name := 'status';
oField.Caption := 'Status';
oField.Options.Add('open=Open');
oField.Options.Add('paid=Paid');
oQB.HTMXEngine := HTMXEngine1;
oQB.AIAssistant := sgcHTMLAIAssistant1;
oQB.OnApply := QueryBuilderApply;
Result := oQB.HTML;
// aRules는 이 요청의 트리이며, Rules는 건드리지 않습니다
procedure TForm1.QueryBuilderApply(Sender: TObject;
const aRules: TsgcHTMLQueryNode; var aResponse: string);
var
oQB: TsgcHTMLComponent_QueryBuilder;
oParams: TStringList;
vWhere: string;
i: Integer;
begin
oQB := TsgcHTMLComponent_QueryBuilder(Sender);
oParams := TStringList.Create;
try
vWhere := oQB.GetSQLWhere(oParams, aRules);
FDQuery1.Close;
FDQuery1.SQL.Text := 'select * from orders';
if vWhere <> '' then
FDQuery1.SQL.Add('where ' + vWhere);
for i := 0 to oParams.Count - 1 do
FDQuery1.Params.ParamByName(oParams.Names[i]).AsString :=
oParams.ValueFromIndex[i];
FDQuery1.Open;
DoSaveFilter(oQB.ToJSON(aRules)); // 사용자의 세션 저장소
aResponse := DoOrdersHTML(FDQuery1); // hx-swap-oob가 표시된 행
finally
oParams.Free;
end;
end;
// includes: sgcHTML_AI.hpp, sgcHTML_Component_QueryBuilder.hpp
oQB = new TsgcHTMLComponent_QueryBuilder(this);
oQB->ElementName = "orders";
TsgcHTMLQueryField *oField = oQB->Fields->Add();
oField->Name = "customer";
oField->Caption = "Customer";
oField = oQB->Fields->Add();
oField->Name = "amount";
oField->Caption = "Amount";
oField->DataType = aidtInteger;
oField->SQLName = "o.amount";
oQB->HTMXEngine = HTMXEngine1;
oQB->OnApply = QueryBuilderApply;
html = oQB->HTML;
void __fastcall TForm1::QueryBuilderApply(TObject *Sender,
TsgcHTMLQueryNode* const aRules, UnicodeString &aResponse)
{
TsgcHTMLComponent_QueryBuilder *oQB = (TsgcHTMLComponent_QueryBuilder *)Sender;
TStringList *oParams = new TStringList();
try
{
UnicodeString vWhere = oQB->GetSQLWhere(oParams, aRules);
FDQuery1->Close();
FDQuery1->SQL->Text = "select * from orders";
if (vWhere != "")
FDQuery1->SQL->Add("where " + vWhere);
for (int i = 0; i < oParams->Count; i++)
FDQuery1->Params->ParamByName(oParams->Names[i])->AsString =
oParams->ValueFromIndex[i];
FDQuery1->Open();
DoSaveFilter(oQB->ToJSON(aRules));
aResponse = DoOrdersHTML(FDQuery1);
}
__finally
{
delete oParams;
}
}
using esegece.sgcWebSockets;
var qb = new TsgcHTMLComponent_QueryBuilder();
qb.ElementName = "orders";
var field = qb.Fields.Add();
field.Name = "customer";
field.Caption = "Customer";
field = qb.Fields.Add();
field.Name = "amount";
field.Caption = "Amount";
field.DataType = TsgcHTMLAIDataType.aidtInteger;
field.SQLName = "o.amount";
qb.HTMXEngine = htmxEngine;
qb.AIAssistant = aiAssistant;
// aRules는 이 요청의 트리입니다
qb.OnApply += (object sender, TsgcHTMLQueryNode aRules, ref string aResponse) =>
{
var parameters = new List<string>();
string where = qb.GetSQLWhere(parameters, aRules);
using var cmd = connection.CreateCommand();
cmd.CommandText = "select * from orders" + (where != "" ? " where " + where : "");
foreach (var p in parameters)
{
var kv = p.Split(new[] { '=' }, 2);
cmd.Parameters.AddWithValue(":" + kv[0], kv[1]);
}
DoSaveFilter(qb.ToJSON(aRules));
aResponse = DoOrdersHTML(cmd.ExecuteReader());
};
string html = qb.HTML;
SQL을 작성하지 않는 사람을 위한 필터 화면이자, 어떤 데이터베이스에서도 코드가 안전하게 실행할 수 있는 조건입니다.
모든 조건은 필드, 연산자, 값 하나 또는 두 개를 지정하며, 모든 그룹은 하위 항목을 AND 또는 OR로 연결합니다. 그룹은 MaxDepth 단계까지 중첩되고, 트리에는 최대 MaxRules개의 규칙이 들어갑니다. 조건 추가와 그룹 추가는 현재 유효한 첫 번째 필드에서 시작합니다.
필드의 DataType에 따라 사용자가 고를 수 있는 연산자가 정해집니다. 같음, 같지 않음, 포함, 다음으로 시작, 다음으로 끝남, 보다 큼, 보다 작음, 범위, 다음 중 하나, 비어 있음, 비어 있지 않음이 있습니다. 닫힌 값 목록인 Options가 있는 필드는 더 짧은 목록을 허용합니다.
AIAssistant가 있고 AIPrompt가 True이면, 질문 상자가 질문을 현재 유효한 필드에 대한 AND 규칙으로 바꿔 줍니다. 규칙은 빌더에 들어가므로 사용자는 적용하기 전에 여전히 수정할 수 있으며, 답변에 대한 설명은 상자 아래에 표시됩니다.
제공자가 구성되지 않은 어시스턴트는 규칙 기반 파서로 답하므로, 질문 상자는 오프라인에서도 동작합니다. 제공자 호출이 실패하면 UseRuleBasedFallback(기본값 True)이 같은 파서가 답하도록 합니다.
TsgcHTMLComponent_Grid를 연결하면 Fields가 비어 있을 때 빌더가 그리드 열에서 필드를 가져옵니다. ApplyToGrid는 그리드의 RowFilter를 통해 행을 필터링하고, LoadFromGridOps는 그리드 작업 집합의 필터마다 규칙 하나씩 트리를 채웁니다.
모든 컨트롤의 이름은 <ElementName>.<path>.<key> 형식이며, path는 노드의 인덱스 경로이고 key는 결합자, 필드, 연산자 또는 값을 나타냅니다. LoadFromRequest가 이 이름을 다시 읽으므로, 빌더는 htmx 없이 전송하는 일반 폼 안에서도 동작합니다.
가장 자주 사용하는 멤버입니다.
Fields는 규칙이 지정할 수 있는 필드를 보관하며, 각 필드에는 Caption, DataType, SQLName, 선택 사항인 Options(한 줄에 값 하나 또는 value=caption)가 있습니다. 항목이 없으면 Grid의 열이 유효한 필드가 됩니다. FindField, GetFieldCount, IsOperatorAllowed로 이에 대해 조회할 수 있습니다.
OnApply(Sender, aRules, aResponse)는 적용, 지우기, 답변이 완료된 질문 뒤에 발생하며 요청의 검증된 트리를 받습니다. aResponse에 반환한 내용은 답변에 추가되며, 예를 들어 hx-swap-oob가 표시된 행이 있습니다. OnApply가 없으면 ApplyToGrid가 트리를 Rules에 복사하고 연결된 Grid를 필터링합니다.
WHERE 키워드를 뺀 조건을 반환하며, 트리가 비어 있으면 빈 문자열을 반환합니다. 값은 이름 있는 매개변수 :qb1, :qb2 등으로만 기록되고 각각 qb1=<value> 형태로 aParams에 추가되므로, 사용자 텍스트가 문장을 바꿀 수 없습니다. 열은 필드의 SQLName이거나 그 Name입니다.
JSON, AI 답변, 전송된 폼 등 외부에서 트리를 채우는 모든 것은 동일한 검증을 거칩니다. 유효하지 않은 필드에 대한 규칙, 형식이 허용하지 않는 연산자, MaxRules를 넘는 규칙, MaxDepth보다 깊은 그룹은 버려지고, 값은 200자로 잘리며, 비어 있는 하위 그룹은 제거됩니다. SQLName은 그대로 SQL에 들어가므로 코드에서 설정하고 요청에서 가져오지 마십시오.
ToJSON은 그룹을 {"c":"and","r":[...]}로, 규칙을 {"f":"field","o":"operator","v":"value"}로 기록하며, 범위에는 "v2"가 추가됩니다. ParseJSON과 LoadFromJSON은 이를 다시 읽고 검증합니다.
Matches는 Name=Value 쌍으로 주어진 한 행에 대해 트리를 평가하며, 메모리에 있는 행에 사용합니다. 모든 도우미는 선택적으로 트리를 받고 nil은 Rules를 뜻하므로, OnApply 핸들러는 공유 컴포넌트를 건드리지 않고 요청의 트리로 작업합니다.
서버 이벤트는 요청의 트리에서 동작하므로 컴포넌트 하나가 모든 세션을 처리합니다. 여러 사용자가 공유하는 페이지에서는 OnApply를 지정하고, 세션에 ToJSON(aRules)를 보관하며, 사용자별 빌더를 ParseJSON과 GetBuilderHTML로 렌더링하십시오.
모든 버튼과, 값이 바뀔 때의 필드 및 연산자 선택은 서버 이벤트 qb를 HTMX 엔진의 컴포넌트 이벤트 엔드포인트 또는 ActionURL로 전송합니다. 응답은 hx-swap-oob="true"가 표시된 빌더이며, htmx가 그 id로 교체합니다. id는 QueryBuilderID, 또는 qb_에 ElementName을 붙인 값입니다.
Demos\60.HTML\01.RunTime\25.QueryBuilder는 포트 8127에서 동작하는 주문 페이지로, 그리드 위에 빌더가 있고 같은 규칙이 데이터베이스에서 실행할 매개변수화된 WHERE 절을 보여 주는 SQL 카드가 있습니다. AI 어시스턴트에는 API 키가 없으므로 질문 상자는 오프라인으로 답하며, 방문자마다 자신의 규칙을 세션에 보관합니다. 디자인 타임, Lazarus, .NET 버전도 같은 구성입니다.
| 온라인으로 체험eSeGeCe 데모 서버에서 실시간으로 실행되는 쿼리 빌더 데모로 확인해 보세요. | 열기 | |
| 온라인 도움말이 컴포넌트의 전체 API 레퍼런스와 사용 가이드입니다. | 열기 | |
| Grid 컴포넌트빌더가 필터링하고 열을 가져오는 그리드입니다. | 열기 | |
| AI 어시스턴트일반 언어 질문을 질문 상자의 규칙으로 바꿉니다. | 열기 | |
| 모든 sgcHTML 컴포넌트80개 이상 컴포넌트의 전체 기능 매트릭스를 살펴보십시오. | 열기 | |
| 무료 체험판 다운로드30일 체험판에는 60.HTML 데모 프로젝트가 포함되어 있습니다. | 열기 | |
| 가격전체 소스 코드가 포함된 Single, Team 및 Site 라이선스. | 열기 |