Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странности ExecWP и FibQuery 
:(
    Опции темы
Cinemaizer[Олег]
Дата 2.10.2010, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

Репутация: нет
Всего: 0



Суть задачи в следующем: Получение флага NULL_FLAG для заданных таблицы и поля. Использую Delphi 7 + FIB 6.99 + Firebird 2.21.
Что такое NULL_FLAG для тех кто не знает - "определяет, может ли поле содержать NULL значение. 1 - не может" (речь о метаданных)

В общем, если рассмотреть такой код:
Код

procedure Tfrm1.btnOKClick(Sender: TObject);
var
  nflag: integer;
  tname, fname: String;

begin
  tname:='''NOMENKLATURA''';
  fname:='''ID''';
  nflag:=GetNullFlag(tname, fname);
  frm1.Close;
end;

function Tfrm1.GetNullFlag(TableName, FieldName: String): Integer;
begin
  with MainForm.pFIBQuery1 do begin
    Close;
    SQL.Clear;
    SQL.Text:='SELECT rdb$null_flag from rdb$relation_fields WHERE @@firstcond% 1=1@ AND @@secondcond% 1=1@';
    ExecWP(['rdb$relation_name = '+TableName,'rdb$field_name = '+FieldName]);
    if Fields[0].AsString='' then
    Result:=0
    else
    Result:=1;
    Close;
  end;
end;
 получаю ошибку с недостатком актуальных параметров - "not enough actual parameters".

Если введу в функцию дополнительно пару переменных, то будет все замечательно работать:
Код

procedure Tfrm1.btnOKClick(Sender: TObject);
var
  nflag: integer;
  tname, fname: String;

begin
  tname:='''NOMENKLATURA''';
  fname:='''ID''';
  nflag:=GetNullFlag(tname, fname);
  frm1.Close;
end;

function Tfrm1.GetNullFlag(TableName, FieldName: String): Integer;
var
  tname, fname: string;
  tmp: string;

begin
  tname:=TableName;
  fname:=FieldName;

  with MainForm.pFIBQuery1 do begin
    Close;
    SQL.Clear;
    SQL.Text:='SELECT rdb$null_flag from rdb$relation_fields WHERE @@firstcond% 1=1@ AND @@secondcond% 1=1@';
    ExecWP(['rdb$relation_name = '+tname,'rdb$field_name = '+fname]);
    if Fields[0].AsString='' then
    Result:=0
    else
    Result:=1;
    Close;
  end;
end;


Если же не заморачиваться с запросом вообще, а  просто проверить корректность передачи параметров в функцию и написать так:
Код

procedure Tfrm1.btnOKClick(Sender: TObject);
var
  nflag: integer;
  tname, fname: String;

begin
  tname:='''NOMENKLATURA''';
  fname:='''ID''';
  nflag:=GetNullFlag(tname, fname);
  frm1.Close;
end;

function Tfrm1.GetNullFlag(TableName, FieldName: String): Integer;
begin
  showmessage(TableName + FieldName);
  Result:=1;
end;


то все отлично. Кто подскажет почему имеет место быть ошибка "not enough actual parameters" ? Заранее спасибо!

Это сообщение отредактировал(а) Cinemaizer[Олег] - 2.10.2010, 17:59
PM MAIL WWW   Вверх
Akella
Дата 4.10.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



а ты уверен, что используешь макросы правильно?
PM MAIL   Вверх
Cinemaizer[Олег]
Дата 5.10.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

Репутация: нет
Всего: 0



посмотрел хелп к фибу еще раз. да вроде правильно все, ну и пример №2 с доп. переменными по идее показывает, что я не ошибся. В принципе, проблему то уже решил другим способом, но причину ошибки все таки хотелось бы узнать...
PM MAIL WWW   Вверх
Frees
Дата 5.10.2010, 14:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



все просто, в всем виноват with MainForm.pFIBQuery1 и FieldName - это метод у pFIBQuery1 и имя переменной, компилятор просто запутался.

решение изменить именование параметров функции на кашерное   AFieldName


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Cinemaizer[Олег]
Дата 5.10.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.4.2008
Где: Москва

Репутация: нет
Всего: 0



точно! Спасибо! smile
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1121 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.