Текущий архив: 2003.07.17;
Скачать: CL | DM;
ВнизВвод функции Найти похожие ветки
← →
Status_I (2003-06-22 19:47) [0]Господа помогите новичку в SQL!
Требуется задать функцию, в теле которой в виде параметра SQL-запрос с COUNT.Т.е. требуется подсчет записей по разным полям(Paradox).То что сочинил выдаёт непонятный результат.Помогите, если не сложно.
Interface
………….
Type
………….
…………
function Numbercount(Query1:TQuery;AText1:String):Integer;
implementation
uses UDataM;
{$R *.dfm}
function TMainForm.Numbercount(Query1:TQuery;AText1:String):Integer;
begin
with DataM.Query1 do
begin
if Active then Close;
SQL.Clear;
SQL.Add(AText1);
Open;
end;
end;
procedure TMainForm.LMDShapeButtonConnectClick(Sender: TObject);
var
AText1:String;
Query1:TQuery;
Begin
AText1:="";
AText1:="SELECT COUNT(Number) FROM Control.DB";
StatusBar1.Panels[0].Text:=IntToStr(Numbercount(Query1,AText1));
End;
End;
Сообщения компилятора:
Return value of function:"TMainForm.Numbercount" might be undefind;
Variable "Query1" might not have been initialiized
← →
sniknik (2003-06-22 21:56) [1]> Return value of function:"TMainForm.Numbercount" might be undefind;
возврашаемое значение функции неопределено. напиши в теле функции
Numbercount:= 5; //значение
или
Result:= 17; //другое значение //но вобще поставь нужное
Variable "Query1" might not have been initialiized
передаваемое в функцию Query1 возможно не инициализирована. убери вообще, у тебя используется из модуля DataM.Query1.
← →
Status_I (2003-06-22 22:58) [2]Вставил в тело Result:=0, дак и в StatusBar теперь 0. И от куда убрать Query1? Извините за непонятливость.
← →
sniknik (2003-06-23 01:37) [3]function TMainForm.Numbercount(AText1:String):Integer; <- в заголовке не нужно
begin
Result:=0
with DataM.Query1 do begin <- пользуешся из модуля DataM
if Active then Close;
SQL.Clear;
SQL.Add(AText1);
Open;
Result:= Fields[0].AsInteger; <- нужное значение
end;
end;
примерный запрос
StatusBar1.Panels[0].Text:= IntToStr(Numbercount("SELECT COUNT(*) FROM Control.DB"));
да и то, нафига весь запрос передавать? уж если для многих таблиц выводится передавай в функцию только имя таблици, и составляй его внутри.
а вот эта кверя
procedure TMainForm.LMDShapeButtonConnectClick(Sender: TObject);
var
AText1:String;
Query1:TQuery;
Begin
...
первое не нужна, второе неинициализирована (компилятор пропустит, с предупреждением, а на этапе выполнения при обращении ошибка вывалится)
← →
Status_I (2003-06-23 10:45) [4]Большое спасибо все получилось!Вот только если есть время,нельзя ли пояснить оператор,Result:= Fields[0].AsInteger; что здесь происходит?И почему Fields[0]?
Еще раз большое спасибо за помощь!
← →
sniknik (2003-06-23 11:44) [5]полное представление
Result:= DataM.Query1.Fields[0].AsInteger
происходит выборка значения из результатов запроса, из первого поля, в возвращаемую функцией переменную (вернее в этом случае регистр, но это неважно). почему ноль? до потому что возвращается единственное поле а смещение идет с нуля.
если бы запрос был с именем "SELECT COUNT(*)AS CountNum FROM Control.DB" то можно былобы попонятнее DataM.Query1.FieldByName("CountNum").AsInteger, но так как имя поля неизвестно (подставится чтонибудь вроде Expr1000) то берем по смещению (с нуля, и кстати быстрее немного на больших таблиицах/циклах заметно).
← →
Status_I (2003-06-23 16:57) [6]Огромное спасибо!Кажется всё понял.
Страницы: 1 вся ветка
Текущий архив: 2003.07.17;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.009 c