IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Процедура, возвращающая набор значений, C++ Builder
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


В базе (на IBExpert) есть хранимая процедура:
Код

ALTER PROCEDURE MED_ACT_AND_SPEC (
    code_act integer)
returns (
    code_spec integer)
as
begin
for
    select "MED_ACT_and_SPEC".code_spec
    from "MED_ACT_and_SPEC"
    where "MED_ACT_and_SPEC".code_act=:code_act
    into :code_spec
do
  suspend;
end

которая возвращает набор из числовых значений..
В Builder по нажатию кнопки вот такой обработчик:

IBStPrMedActSp->ParamByName("CODE_ACT")->AsInteger=codeact;
IBStPrMedActSp->ExecProc();
int i=IBStPrMedActSp->ParamByName("CODE_SPEC")->AsInteger; //здесь хочу добраться до выходных //параметров функции...но так, как есть - я получаю только первое значение...
//а как получить всё, что возвращает процедура, объясните пожалуйста...!


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Обычно (по крайней мере при использовании TADOStoredProc это работает), если хранимая процедура возвращает не одно значение, а набор данных, то для получения всего набора можно вместо ExecProc() сделать:

	sp->Open();
for(sp->First(); !sp->Eof ; sp->Next()) {
int i = sp->Parameters->ParamByName("CODE_SPEC")->Value;
}

 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 21.12.2008 22:52) *

Обычно (по крайней мере при использовании TADOStoredProc это работает), если хранимая процедура возвращает не одно значение, а набор данных, то для получения всего набора можно вместо ExecProc() сделать:

	sp->Open();
for(sp->First(); !sp->Eof ; sp->Next()) {
int i = sp->Parameters->ParamByName("CODE_SPEC")->Value;
}



у меня IBStoredProc..
и программа требует "use ExecProc for Procedure"...
однако если добавить ExecProc, то ситуация не меняется...

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Вызов ExecProc предназначен для хранимых процедур, которые не возвращают набор данных. Для процедур, возвращающих набор данных используется метод Open, либо Active:=true.

Итого, что имеем: у тебя есть хранимая процедура, тебе надо из нее вернуть таблицу (ну, не вожно, несколько данных), так? Значит, делаешь следующее: На форму добавляешь TIBQuery, в ней - вызываешь хранимую процедуру, запустить Query можно так, как я показал, через Open, и прочитать результаты через First/Next... (это все чисто теоретически, у меня нет установленного IBase, поэтому проверить не могу).

В IBQuery.SQL - что-то типа
SQL
SELECT * FROM MED_ACT_AND_SPEC(:CODE_ACT)
, опиши параметр CODE_ACT у IBQuery, и присвой ему значение аналогично тому, как ты делала это для IBStoredProc ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Пусть свой набор значений я получила...Записала его в массив..
И хочу из этого набора выбрать число, и выбор этот должен осуществляться случайным образом (но из имеющегося набора!)..Скажите пожалуйста, можно такое осуществить?

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Лучше записывать результаты в vector, тогда твоя задача сведется к тому, чтобы сгенерировать случайное число в интервале от 0 до количества элементов в векторе:

	std::srand(std::time(0));
std::vector<int> myVector;

// ... Заполнение вектора данными ...

int value = myVector[ rand() % myVector.size() ];

 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата(volvo @ 25.12.2008 9:52) *

Лучше записывать результаты в vector, тогда твоя задача сведется к тому, чтобы сгенерировать случайное число в интервале от 0 до количества элементов в векторе:

	std::srand(std::time(0));
std::vector<int> myVector;

// ... Заполнение вектора данными ...

int value = myVector[ rand() % myVector.size() ];



а если результаты, которые нужно будет записывать в vector, не являются непрерывным набором...
т.е например, такой набор - 1,3,18,19...ноль вообще никогда не появится в моём наборе...
Тогда использование vector мне поможет?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(Гость @ 25.12.2008 17:07) *

а если результаты, которые нужно будет записывать в vector, не являются непрерывным набором...
т.е например, такой набор - 1,3,18,19...ноль вообще никогда не появится в моём наборе...
Тогда использование vector мне поможет?

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






А какая разница, что у тебя хранится в векторе, непрерывны ли данные или нет? Ты записала допустимые значения в вектор? Записала. Любое значение из записанных в векторе может быть выбрано? Вот и выбираешь: получаешь случайный индекс элемента, хранящего информацию...

Цитата
ноль вообще никогда не появится в моём наборе
Зато вектор всегда начинается с нулевого элемента smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 25.12.2008 9:52) *

Лучше записывать результаты в vector, тогда твоя задача сведется к тому, чтобы сгенерировать случайное число в интервале от 0 до количества элементов в векторе:

	std::srand(std::time(0));
std::vector<int> myVector;

// ... Заполнение вектора данными ...



Не поняла, как этот вектор заполнять...
Вот массив y будет содержать те значения, которые мне нужны для последующего выбора..

IBQuery2->Open();
int y[100];
int j=0;
for(IBQuery2->First(); !IBQuery2->Eof ; IBQuery2->Next()) {
y[j] = IBQuery2->Fields->FieldByName("CODE_SPEC")->AsInteger;
j++;
}


Объясните пожалуйста, КАК именно в этот вектор записать?
И ещё, Builder ругается на строки

std::srand(std::time(0));
std::vector<int> myVector;



Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
Builder ругается на строки

#include <vector> 

присутствует? (это по поводу второй строки, насчет первой - вообще непонятно, srand описан в stdlib.h, он подключается в любом случае к проекту. Попробуй убрать std:smile.gif

Цитата
Не поняла, как этот вектор заполнять...
Еще проще, чем массив:
IBQuery2->Open();
for(IBQuery2->First(); !IBQuery2->Eof ; IBQuery2->Next()) {
myVector.push_back(IBQuery2->Fields->FieldByName("CODE_SPEC")->AsInteger);
}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


А нужно ли очищать этот вектор, а то у меня в нём всё время остаётся одни и тот же набор...а так быть не должно..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата
А нужно ли очищать этот вектор
Если тебе больше не нужны значения, хранящиеся в векторе - вызывай
myVector.clear(); // это удалит из вектора все элементы, и сделает его длину = 0

, потом можешь начинать заполнять заново...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 5.05.2024 16:02
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name