powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Связывание таблицы и хранимки
17 сообщений из 17, страница 1 из 1
Связывание таблицы и хранимки
    #32507941
vovan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли связать таблицу и хранимку?

я пробую сделать вот так:

select cd.Id,d.Discount
from Cards cd, GETCLIENTDISCOUNT(cd.Id,'01.05.03',0,0) d

план строит нормально а при выполнении пишет:
The cursor identified in the update or delete statement is not positioned on . no current record for fetch operation.
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32507945
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где связь между ХП и таблицей ?

select cd.Id,d.Discount
from Cards cd, GETCLIENTDISCOUNT(cd.Id,'01.05.03',0,0) d ON (...)

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32507949
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И Вообще так не делают, надо так:

Код: plaintext
1.
2.
SELECT cd.Id,d.Discount
FROM Cards cd
JOIN GETCLIENTDISCOUNT('01.05.03', 0 , 0 ) d ON (cd.Id = d.Id)

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32507951
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще надо скорее всего текст ХП смотреть... чуствую там все не так ...

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32507957
vovan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА где связь между ХП и таблицей ?
В процедуру передается параметр cd.Id который и является связкой

авторSELECT cd.Id,d.Discount
FROM Cards cd
JOIN GETCLIENTDISCOUNT('01.05.03',0,0) d ON (cd.Id = d.Id)


Все равно таже ошибка
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32507959
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текст ХП нарисуй, сейчас разберемся ...

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32507966
vovan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE PROCEDURE GETCLIENTDISCOUNT(
CARDID VARCHAR(16),
DATEONLY DATE,
TOTAL DOUBLE PRECISION,
OPERID INTEGER)
RETURNS (
DISCOUNT DOUBLE PRECISION,
MAXSUM DOUBLE PRECISION,
CURRENTSUM DOUBLE PRECISION,
RET_CARDID VARCHAR(16))
AS
declare variable StartDate1 DATE;
declare variable StartDate2 DATE;
declare variable EndDate1 DATE;
declare variable EndDate2 DATE;
declare variable DateTemp DATE;

declare variable Sum1 DOUBLE PRECISION;
declare variable Sum2 DOUBLE PRECISION;
declare variable Sum1_S DOUBLE PRECISION;
declare variable Sum2_S DOUBLE PRECISION;
declare variable Sum1_R DOUBLE PRECISION;
declare variable Sum2_R DOUBLE PRECISION;
begin
/*---------------------------------------------------------*/
/*Сначала устанавливаем текущую дату*/
DateTemp = DateOnly;
StartDate1 = FirstDayMonth(DateTemp);
EndDate1 = LastDayMonth(DateTemp);

/*Отнимаем один месяц*/
DateTemp = IncDate(StartDate1,0,-1,0);
StartDate2 = FirstDayMonth(DateTemp);
EndDate2 = LastDayMonth(DateTemp);

/*--Выбираем из 2-х месяцев максимальную сумму----*/
SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <> 1)
AND (DateOnly BETWEEN :StartDate1 AND :EndDate1)
AND (Id <> :OperId)
AND (ActionId <> 'R')
INTO :Sum1_S;
if (Sum1_S IS NULL) then Sum1_S = 0;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <> 1)
AND (DateOnly BETWEEN :StartDate1 AND :EndDate1)
AND (Id <> :OperId)
AND (ActionId = 'R')
INTO :Sum1_R;
if (Sum1_R IS NULL) then Sum1_R = 0;

Sum1 = Sum1_S - Sum1_R;

CURRENTSUM = Sum1;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <> 1)
AND (DateOnly BETWEEN :StartDate2 AND :EndDate2)
AND (Id <> :OperId)
AND (ActionId <> 'R')
INTO :Sum2_S;
if (Sum2_S IS NULL) then Sum2_S = 0;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <> 1)
AND (DateOnly BETWEEN :StartDate2 AND :EndDate2)
AND (Id <> :OperId)
AND (ActionId = 'R')
INTO :Sum2_R;
if (Sum2_R IS NULL) then Sum2_R = 0;

Sum2 = Sum2_S - Sum2_R;
/*-------------------------------------------------*/

if (Sum1 > Sum2) then MaxSum = Sum1; else MaxSum = Sum2;
/*MaxSum = MaxSum + Total;*/

/*-----------Выбираем соответствующую скидку-------*/
SELECT MAX(Discount)
FROM DiscBarriers
WHERE (Barrier < :MaxSum)
INTO :Discount;

if (Discount IS NULL) then
/*Сумма ниже всех барьеров, делаем скидку минимальной*/
begin
SELECT MIN(Discount)
FROM DiscBarriers
INTO :Discount;
end
Ret_CardId = CardId;
suspend;
end


Когда вызываю просто
select * from GetClientDiscount('11111111','01.05.03',0,0)
то все нормально
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32507978
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все понятно. Попробуй так:

Код: plaintext
1.
2.
SELECT cd.Id,d.Discount
FROM Cards cd
JOIN GETCLIENTDISCOUNT(cd.Id, '01.05.03',  0 ,  0 ) d ON (cd.Id = d.Ret_CardId)

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32507981
vovan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уже давно так пробовал ошибка одна и та же

кстати FB1.5+IBExpert
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32508016
vovan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT cd.Id,(select Discount from GETCLIENTDISCOUNT(cd.Id,'01.05.03',0,0))
FROM Cards cd

вот так вот вроде заработало
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32508021
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нельзя передовать cd.Id в качестве параметра ХП.

Надо сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
CREATE PROCEDURE GETCLIENTDISCOUNT(
DATEONLY DATE,
TOTAL DOUBLE PRECISION,
OPERID INTEGER)
RETURNS (
DISCOUNT DOUBLE PRECISION,
MAXSUM DOUBLE PRECISION,
CURRENTSUM DOUBLE PRECISION)
AS
declare variable StartDate1 DATE;
declare variable StartDate2 DATE;
declare variable EndDate1 DATE;
declare variable EndDate2 DATE;
declare variable DateTemp DATE;
declare variable CARDID VARCHAR( 16 );

declare variable Sum1 DOUBLE PRECISION;
declare variable Sum2 DOUBLE PRECISION;
declare variable Sum1_S DOUBLE PRECISION;
declare variable Sum2_S DOUBLE PRECISION;
declare variable Sum1_R DOUBLE PRECISION;
declare variable Sum2_R DOUBLE PRECISION;
begin

---------------------------------------------------------------------------
-- Цикл по Cards
FOR SELECT ID FROM Cards INTO :CardId DO BEGIN
-------------------------------------------------------------------------

 /*---------------------------------------------------------*/ 
 /*Сначала устанавливаем текущую дату*/ 
DateTemp = DateOnly;
StartDate1 = FirstDayMonth(DateTemp);
EndDate1 = LastDayMonth(DateTemp);

 /*Отнимаем один месяц*/ 
DateTemp = IncDate(StartDate1, 0 ,- 1 , 0 );
StartDate2 = FirstDayMonth(DateTemp);
EndDate2 = LastDayMonth(DateTemp);

 /*--Выбираем из 2-х месяцев максимальную сумму----*/ 
SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <>  1 )
AND (DateOnly BETWEEN :StartDate1 AND :EndDate1)
AND (Id <> :OperId)
AND (ActionId <> 'R')
INTO :Sum1_S;
if (Sum1_S IS NULL) then Sum1_S =  0 ;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <>  1 )
AND (DateOnly BETWEEN :StartDate1 AND :EndDate1)
AND (Id <> :OperId)
AND (ActionId = 'R')
INTO :Sum1_R;
if (Sum1_R IS NULL) then Sum1_R =  0 ;

Sum1 = Sum1_S - Sum1_R;

CURRENTSUM = Sum1;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <>  1 )
AND (DateOnly BETWEEN :StartDate2 AND :EndDate2)
AND (Id <> :OperId)
AND (ActionId <> 'R')
INTO :Sum2_S;
if (Sum2_S IS NULL) then Sum2_S =  0 ;

SELECT SUM(Actual)
FROM Opers
WHERE (CardId = :CardId)
AND (RDB$Modified <>  1 )
AND (DateOnly BETWEEN :StartDate2 AND :EndDate2)
AND (Id <> :OperId)
AND (ActionId = 'R')
INTO :Sum2_R;
if (Sum2_R IS NULL) then Sum2_R =  0 ;

Sum2 = Sum2_S - Sum2_R;
 /*-------------------------------------------------*/ 

if (Sum1 > Sum2) then MaxSum = Sum1; else MaxSum = Sum2;
 /*MaxSum = MaxSum + Total;*/ 

 /*-----------Выбираем соответствующую скидку-------*/ 
SELECT MAX(Discount)
FROM DiscBarriers
WHERE (Barrier < :MaxSum)
INTO :Discount;

if (Discount IS NULL) then
 /*Сумма ниже всех барьеров, делаем скидку минимальной*/ 
begin
SELECT MIN(Discount)
FROM DiscBarriers
INTO :Discount;
end
suspend;
-------------------------------------------------------------------------
-- Конец цикла по Cards
-------------------------------------------------------------------------
END

end

И тогда :

Код: plaintext
1.
2.
SELECT cd.Id,d.Discount
FROM Cards cd
JOIN GETCLIENTDISCOUNT('01.05.03', 0 , 0 ) d ON (cd.Id = d.CardId)


Best regards,
Dnico.
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32508023
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vovan1
Так конечно должно работать, но вложенные запросы думаю очень медленно будут работать.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32508066
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При связывании ХП и таблицы нужно использовать LEFT JOIN .
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32508078
Фотография Dnico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
Согласен, но не всегда.

Best regards,
Dnico.
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32508085
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если видишь " no current record for fetch operation ", то ОБЯЗАТЕЛЬНО .
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32508382
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МимопроходящийПри связывании ХП и таблицы нужно использовать LEFT JOIN. Это обязательно если соединение с ХП идет через параметр.
Запрос вида:
Код: plaintext
1.
select cd.Id,d.Discount
from Cards cd, GETCLIENTDISCOUNT(cd.Id,'01.05.03', 0 , 0 ) d
Нужно переделать так:
Код: plaintext
1.
2.
select cd.Id,d.Discount
from Cards cd LEFT JOIN GETCLIENTDISCOUNT(cd.Id,'01.05.03', 0 , 0 ) d
ON ( 1 = 1 )
...
Рейтинг: 0 / 0
Связывание таблицы и хранимки
    #32509262
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
"Ещё одна особенность, точнее на этот раз пожалуй даже глупость, которую периодически пытаются сделать новички. Ну например так:

select * from sp1(t.id) sp, test2 t

То есть в качестве параметра процедуры идёт одно из полей другого соединяемого отношения. Никогда не пройдёт. По той простой причине, что при любой технологии сначала выполняется соединение, а уже потом появляются поля."
...

Подробности - http://www.krista.ru/ib/proc-join.html

...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Связывание таблицы и хранимки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]