Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ввод функции [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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо