Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2011, 11:21   #1
xabik
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 22
По умолчанию Передача хранимой процедуры в качестве параметра в функцию

Доброго времени суток форумчане. Есть код.

Код:
 function dfg(var nodes_between_nodes:TADOStoredProc;perekr1,perekr2:Largeint):extended;
begin
  nodes_between_nodes.Active:=false;
  nodes_between_nodes.Parameters.ParamByName('1').Value:=perekr1;
  nodes_between_nodes.Parameters.ParamByName('2').Value:=perekr2;
  nodes_between_nodes.Active:=true;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit3.text:=FloatToStr(dfg(ADOStoredProc1,StrToInt64(Edit1.Text),StrToInt64(Edit1.Text)));
end;
Вопрос в следующем.
При передаче хранимой процедуры как параметра функции - результат выборки нулевой. Хотя когда вызываем непосредственно из основного кода результат есть. В чем кроется ошибка?
xabik вне форума Ответить с цитированием
Старый 18.07.2011, 14:12   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
function dfg(var nodes_between_nodes:TADOStoredProc;perekr1,perekr2:Largeint):extended;
ноль получается в Edit3.text ?!
Тогда ткните меня носом, где Вы возвращаете результат функции dfg
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.07.2011, 17:47   #3
xabik
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 22
По умолчанию

К сожалению так и не разобрался с этим вопросом. Обрисую полную картину.

Что имеем:

1. DataModule1 - дата модуль в котором лежат описанные ниже объекты.
2. MathUnit - юнит в котором описана математика работы с объектами.
3. MainUnit - юнит из которого происходит вызов процедур из MathUnit для работы с объектами из DataModule1.

В DataModule1 есть хранимая процедура TADOStoredProc length_nodes которая имеет два параметра типа longint и две таблицы TADOTable Perekrestok1, Perekrestok2

В Mathunit есть процедура,

Код:
procedure LoadLength(var Perekr1, Perekr2:TADOTable;var length_nodes:TADOStoredProc;var ArrLength:TArrLength);
var i,j:integer;
    l,k:LONG64;
begin
  Perekr1.First;
  Perekr2.Last;
  SetLength(ArrLength,Perekr1.RecordCount,Perekr1.RecordCount);
  for i := 0 to Perekr1.RecordCount-2 do begin
    Perekr2.Last;
    for j :=Perekr2.RecordCount downto i+1 do begin
      length_nodes.Active:=false;
      l:=perekr1.FieldByName('id_node_x').AsLargeInt;
      k:=perekr2.FieldByName('id_node_x').AsLargeInt;
      length_nodes.Parameters.ParamByName('1').Value:=l;
      length_nodes.Parameters.ParamByName('2').Value:=k;
      length_nodes.Active:=true;
      length_nodes.First;
      ArrLength[i,j]:=length_nodes.FieldByName('xz').AsFloat;
      Perekr2.Prior;
    end;
    Perekr1.Next;
  end;
  i:=i;
end;
которая вызывается в MainUnit. Последний параметр в процедуре двумерный динамический массив.

Код:
  LoadLength(DataModule1.perekrestok1,DataModule1.perekrestok2,DataModule1.length_nodes,ArrLength);
Так вот при вызове данной процедуры не происходит заполнение массива хотя должно так как когда задаешь параметры явно в хранимую процедуру она возвращает значение поля 'xz'. В чем причина подобного поведения для меня загадка.
xabik вне форума Ответить с цитированием
Старый 31.07.2011, 19:22   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
К сожалению так и не разобрался с этим вопросом
Проследи свое внимание, прыгун:
Цитата:
Тогда ткните меня носом, где Вы возвращаете результат функции dfg
Это означает что в функции должна присутствовать инструкция Result
А у тебя ее нет.
Код:
 function dfg(var nodes_between_nodes:TADOStoredProc;perekr1,perekr2:Largeint):extended;
begin
  nodes_between_nodes.Active:=false;
  nodes_between_nodes.Parameters.ParamByName('1').Value:=perekr1;
  nodes_between_nodes.Parameters.ParamByName('2').Value:=perekr2;
  nodes_between_nodes.Active:=true;
  Result:=Некое вещественное число, однако я не пойму какое именно
end;
Только тогда этот код сможет работать в выражении.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.07.2011, 19:27   #5
xabik
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 22
По умолчанию

не обращайте внимания на первый пост. Это я написал для примера. Во втором обрисовал полностью картину. Считайте что первого не было

... ещё одну тему заметил.

Если задать параметры жестко через Object Inspector то хранимая процедура выдает один и тот же результат. То есть получается что я не могу изменить параметры у хранимой процедуры

Вот ещё нашел...

http://www.programmingforum.ru/delphi/thread724129.html

Последний раз редактировалось Stilet; 01.08.2011 в 08:36.
xabik вне форума Ответить с цитированием
Старый 04.08.2011, 11:08   #6
xabik
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 22
По умолчанию

Всё!!! Тему можно закрывать. Надо было сделать refresh параметров. И пересоздать их
xabik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование имени процедуры в качестве параметра другой процедуры Alexey355 Помощь студентам 1 23.04.2011 13:59
Delphi Fortran DLL передача процедуры в качестве параметра gimlis Помощь студентам 1 23.03.2011 22:52
TextBox в качестве параметра функции/процедуры Голованов Д. Microsoft Office Excel 6 01.12.2009 10:38
Передача поля объекта в процедуру в качестве параметра Голованов Д. Microsoft Office Excel 10 02.11.2009 16:22
Передача метода класса в качестве параметра в другой метод Dmytry87 Общие вопросы C/C++ 0 12.11.2008 15:28