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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2011, 17:23   #1
crossmark
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 27
По умолчанию Delphi, Firebrird, Процедуры

Привет!
Столкнулся с такой проблемой... как только не пробовал... только не так как надо.
не могу получить выходные параметры из хранимой процедуры бд на Firebird/
сама процедура в IBExpert работает: вот код
Код:
Код:
create or alter procedure PR_READ_DATA_PERS (
TAB_PERS integer)
returns (
R_TAB_PERS integer,
R_FAM_PERS varchar(30),
R_NAME_PERS varchar(30),
R_LAST_NAME_PERS varchar(30),
R_TOWN_PERS varchar(30),
R_STREET_PERS varchar(30),
R_HOUSE_PERS varchar(10),
R_KVART_PERS varchar(10),
R_BIRTH_PERS date,
R_KOLONA_PERS smallint,
R_POST_PERS integer,
R_MOTION_PERS integer,
R_KLASS_PERS smallint,
R_TRACT_PERS integer,
R_DATE_PERS date)
as
begin
select PERSONAL.p_tab, PERSONAL.P_FAMILY, PERSONAL.P_NAME, PERSONAL.P_LASTNAME,
PERSONAL_DATA.PD_TOWN, PERSONAL_DATA.PD_STREET, PERSONAL_DATA.PD_HOUSE,personal_data.pd_kvart,
PERSONAL_DATA.P_BIRTH, PERSONAL_DATA2.PD_KOLONA, personal_data2.pd_post,
personal_data2.pd_motion, PERSONAL_DATA2.PD_KLASS, personal_data2.pd_traction, PERSONAL_DATA2.PD_DATE
from personal,personal_data,personal_data2
where (personal.p_tab=:Tab_pers) and (personal_data.pd_tab=:tab_pers) and (personal_data2.pd_tab=:tab_pers)
into :R_TAB_PERS, :R_FAM_PERS,:R_NAME_PERS,:R_LAST_NAME_PERS,:R_TOWN _PERS,:R_STREET_PERS,:R_HOUSE_PERS,:R_KVART_PERS,: R_BIRTH_PERS,:r_kolona_pers,:R_POST_PERS,:r_motion _pers,:r_klass_pers,:R_TRACT_PERS,:r_date_pers;
end
Тут, занчаит один входящий парметр и ряд выходящик параметров.

на делфи пробую вызов так:
Код:
Код:
StoredProcReadPersProc.Active;
StoredProcReadPersProc.StoredProcName:='PR_READ_DA TA_PERS';
StoredProcReadPersProc.Params.Add;
StoredProcReadPersProc.Params.Items[0].Name:= 'TAB_PERS';
//StoredProcReadPersProc.Params[0].AsInteger:=QueryViewPers.FieldByName('P_TAB').AsI nteger;
StoredProcReadPersProc.Params.ParamValues['TAB_PERS']:= QueryViewPers.FieldByName('P_TAB').AsInteger;
StoredProcReadPersProc.Params.Add;
StoredProcReadPersProc.Params.Items[1].Name:='R_FAM_PERS';
showmessage(StoredProcReadPersProc.ParamByName('TA B_PERS').AsString);
StoredProcReadPersProc.Prepare;
StoredProcReadPersProc.ExecProc;

//StoredProcReadPersProc.Params.AddParam(
s:=StoredProcReadPersProc.ParamByName('R_FAM_PERS' ).Value;
showmessage(s);
как получить все эти выходные параметры...?


спасибо!
crossmark вне форума Ответить с цитированием
Старый 29.12.2011, 17:33   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
ADOQuery.SQL.Text:='EXECUTE PROCEDURE PR_READ_DATA_PERS ('+IntToStr(QueryViewPers.FieldByName('P_TAB').AsInteger)+')';
ADOQuery.Open;
И работать как с таблицей. Уточните как в Firebrird вызывается хранимая процедура. Если не так, то подправьте
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.12.2011, 17:48   #3
crossmark
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 27
По умолчанию

ну должен же быть вариант чтобы считать в переменные и не использовать таблицу
crossmark вне форума Ответить с цитированием
Старый 29.12.2011, 19:01   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Попробуйте для каждого параметра в таком духе
Код:
if StoredProcReadPersProc.Params.FindParam('R_TAB_PERS') <> nil
  then xR_TAB_PERS := StoredProcReadPersProc.Params.ParamByName('R_TAB_PERS').AsInteger;
Сделать результат процедуры как набор данных удобнее в данном случае. ИМХО
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.12.2011, 19:24   #5
crossmark
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Попробуйте для каждого параметра в таком духе
Код:
if StoredProcReadPersProc.Params.FindParam('R_TAB_PERS') <> nil
  then xR_TAB_PERS := StoredProcReadPersProc.Params.ParamByName('R_TAB_PERS').AsInteger;
Сделать результат процедуры как набор данных удобнее в данном случае. ИМХО
получается как TIBStoredProc не получает и не видит эти параметры,
если параметр добавить через ADD, то он пустой.
Код:
 StoredProcReadPersProc.Params.Add;
 StoredProcReadPersProc.Params.Items[0].Name:= 'TAB_PERS'; 
 StoredProcReadPersProc.Params.ParamValues['TAB_PERS']:= QueryViewPers.FieldByName('P_TAB').AsInteger;
А если
Код:
 s:=StoredProcReadPersProc.ParamByName('R_FAM_PERS').AsString
то сообщает что такой параметр не найден
crossmark вне форума Ответить с цитированием
Старый 29.12.2011, 19:35   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

C TIBStoredProc не знаком. Возможно там другое свойство для возвращаемых параметров? Эквивалент в ADO позволяет так делать.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.12.2011, 20:02   #7
crossmark
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 27
По умолчанию

если делать так
Код:
StoredProcReadPersProc.Active;
 StoredProcReadPersProc.StoredProcName:='PR_READ_DATA_PERS';
 
 StoredProcReadPersProc.Params.ParamValues['TAB_PERS']:= QueryViewPers.FieldByName('P_TAB').AsInteger;
 StoredProcReadPersProc.Prepare;
 StoredProcReadPersProc.ExecProc;
выдает ошибку StoredProcReadPersProc: Parameter 'TAB_PERS' not found
crossmark вне форума Ответить с цитированием
Старый 29.12.2011, 21:33   #8
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Если StoredProcReadPersProc - это TIBStoredProc, то
Код:
StoredProcReadPersProc.ParamByName('TAB_PERS').Value := <значение>
Прик вне форума Ответить с цитированием
Старый 29.12.2011, 21:48   #9
crossmark
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Если StoredProcReadPersProc - это TIBStoredProc, то
Код:
StoredProcReadPersProc.ParamByName('TAB_PERS').Value := <значение>
капец, два дня копаться и искать решение... а решение в две строчки

[code]StoredProcl.ParamByName('TAB_PERS') .Value:=2;
StoredProcl.Prepare;
StoredProcl.ExecProc;
s:=StoredProcl.ParamByName('R_FAM_P ERS').AsString ;
showmessage(s);./code]

Спасибо!
crossmark вне форума Ответить с цитированием
Старый 29.12.2011, 21:49   #10
crossmark
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 27
По умолчанию

Прик тебе огромное спасибо!!!!!!!!!!!!!!!!!!
crossmark вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
процедуры в delphi. Борис Владимирович Помощь студентам 4 02.12.2011 02:11
Процедуры(Delphi) CAMOBAP Помощь студентам 3 14.03.2011 13:28
Процедуры и функции в Delphi alexchromets Помощь студентам 0 23.12.2010 22:33
Хранимые процедуры в Delphi 5 lexaltd БД в Delphi 2 15.02.2010 13:24
объединить процедуры (Delphi) Joy Помощь студентам 4 28.05.2009 17:23