![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ввод функции [D6, Paradox]
Status_I © (2003-06-22 19:47:00)Господа помогите новичку в 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
Status_I (2003-06-23 16:57:00) [1]Огромное спасибо!Кажется всё понял.
sniknik (2003-06-23 11:44:00) [2]полное представление
Result:= DataM.Query1.Fields[0].AsInteger
происходит выборка значения из результатов запроса, из первого поля, в возвращаемую функцией переменную (вернее в этом случае регистр, но это неважно). почему ноль? до потому что возвращается единственное поле а смещение идет с нуля.
если бы запрос был с именем "SELECT COUNT(*)AS CountNumFROM Control.DB" то можно былобы попонятнее DataM.Query1.FieldByName("CountNum").AsInteger, но так как имя поля неизвестно (подставится чтонибудь вроде Expr1000) то берем по смещению (с нуля, и кстати быстрее немного на больших таблиицах/циклах заметно).
Status_I (2003-06-23 10:45:00) [3]Большое спасибо все получилось!Вот только если есть время,нельзя ли пояснить оператор,Result:= Fields[0].AsInteger; что здесь происходит?И почему Fields[0]?
Еще раз большое спасибо за помощь!
sniknik (2003-06-23 01:37:00) [4]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-22 22:58:00) [5]Вставил в тело Result:=0, дак и в StatusBar теперь 0. И от куда убрать Query1? Извините за непонятливость.
sniknik (2003-06-22 21:56:00) [6]> Return value of function:"TMainForm.Numbercount" might be undefind;
возврашаемое значение функции неопределено. напиши в теле функции
Numbercount:= 5; //значение
или
Result:= 17; //другое значение //но вобще поставь нужное
Variable "Query1" might not have been initialiized
передаваемое в функцию Query1 возможно не инициализирована. убери вообще, у тебя используется из модуля DataM.Query1.