Я пытаюсь написать фрагмент кода, который будет принимать пользовательский ввод, если значения по умолчанию изменились, и помещать его в оператор SQL.
procedure TfrmHotels.btnFilterClick(Sender: TObject);
var
iTest, iErrorCode, iMinStars, iMaxStars, iMinCost, iMaxCost: Integer;
begin
//This is the first thing the SQL does, by filtering the entire database to show all the hotels in the area the user has selected
with dmCoAdventure do
begin
qryCoAdventure.SQL.Clear;
qryCoAdventure.SQL.Add('SELECT * FROM Hotels WHERE TownName = ' + QuotedStr(frmTowns.sTown));
qryCoAdventure.Open;
end;
//If the value changes
if (spnMinStars.Value <> 0) OR (spnMaxStars.Value <> 0) then
begin
if spnMinStars.Value > spnMaxStars.Value then
begin
ShowMessage('Min Stars can''t be higher the Max Stars.');
Exit;
end
else
begin
iMinStars:= spnMinStars.Value;
iMaxStars:= spnMaxStars.Value;
with dmCoAdventure do
begin
//Adds the filter
qryCoAdventure.SQL.Add('AND Stars BETWEEN ' + IntToStr(iMinStars) + ' AND ' + IntToStr(iMaxStars));
//ShowMessage('AND Stars BETWEEN ' + IntToStr(iMinStars) + ' AND ' + IntToStr(iMaxStars));
end;
end;
end;
//If the value changes
if (edtMinCost.Text <> '') AND (edtMaxCost.Text <> '') then
begin
//Test that the min value is less than the max value
if edtMinCost.Text > edtMaxCost.Text then
begin
ShowMessage('Min Cost can''t be more then Max Cost.');
Exit;
end
else
begin
//Validate that it can change to an integer
Val(edtMinCost.Text,iTest,iErrorCode);
if iErrorCode = 0 then
begin
Val(edtMaxCost.Text,iTest,iErrorCode);
if iErrorCode = 0 then
begin
iMinCost:= StrToInt(edtMinCost.Text);
iMaxCost:= StrToInt(edtMaxCost.Text);
with dmCoAdventure do
begin
//Adds the filter
qryCoAdventure.SQL.Add('AND CostPNight BETWEEN ' + IntToStr(iMinCost) + ' AND ' + IntToStr(iMaxCost));
end;
end
else
begin
ShowMessage('Min and Max values should both be numbers.');
end;
end
else
begin
ShowMessage('Min and Max values should both be numbers.');
end;
end;
end;
end;
В тот момент, когда я добавляю фильтр минимальных и максимальных звезд или даже фильтр стоимости, сетка становится пустой и не отображает никаких данных. Я попытался изменить «между» только для операторов «‹» или «>», и я все еще получаю тот же эффект. Я думал, что это может быть как-то связано с тем, как настроен SQL, но я недостаточно осведомлен, чтобы понять, где я ошибся.
S1 = S2
и посмотрите, возвращает ли он истину или ложь (он вернет ложь), и выгрузите содержимое двух переменных в визуальный контейнер, такой как TMemo, чтобы вы могли сравнить их на экране. - person MartynA   schedule 01.04.2020IntToStr
иQuotedStr
дает ошибочное значение для одного из параметров, которые вы передаете запросу, и, следовательно, он не создает строк и вызывает пустой DBGrid. Код не включает в себя то, что вы открываете запрос, но если вы не хотите переписывать процедуру, по крайней мере, добавьте вызов... - person Ken White   schedule 03.04.2020ShowMessage(qryCoAdventure.SQL.Text);
непосредственно перед тем, как сделать это, и внимательно проверьте построенный вами SQL. - person Ken White   schedule 03.04.2020ShowMessage(qryCoAdventure.SQL.Text);
я не вижу ничего плохого в этом, он выглядит так же, как тот, который жестко запрограммирован. - person Jandrie Visagie   schedule 03.04.2020ShowMessage
, либо вы пропустили что-то, что отличает их, либо (опять же) вы не смотрите на одни и те же данные. Вы не говорите, какую СУБД вы используете, но если вы действительно настаиваете на том, что одни и те же идентичные операторы SQL и одни и те же точные данные производят разные выходные данные, вам следует связаться с люди, которые пишут эту СУБД и подают отчет об ошибке, потому что это было бы достаточно серьезно, чтобы сделать их продукт непригодным для использования. - person Ken White   schedule 03.04.2020