powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Счетчик
15 сообщений из 15, страница 1 из 1
Счетчик
    #39839227
koo3mee4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста. Есть ХП:
Код: plsql
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.
create or alter procedure CIT_TABLE
(
  DIRID type of column TREATPLACE.DIRID,
  DCODE type of column CLREFERRALS.DCODE,
  TREATCODE type of column CLREFERRALS.TREATCODE
)
returns
(
  SCHID type of column CLREFDET.SCHID,
  SCHEMANAME blob sub_type text,
  SPOSOB type of column TOOTHNAM.TOOTHNAME,
  NOMBERSTEKLO type of column DICINFO.REKVINT3
)
as
begin
if (coalesce(DIRID,0)=0) then
begin
for
select crd.schid schid, w.kodoper||' '||w.schname schemaname, tn.toothname sposob , di.rekvint3 nombersteklo
									from clreferrals cr
									left join clrefdet crd on cr.refid=crd.refid
									join dicinfo di on crd.schid=di.rekvint1 and di.refid=-700 and di.rekvint3<=crd.scount and di.rekvint2=crd.organid
									left join toothnam tn on crd.organid=tn.toothcod
									left join wschema w on w.schid=crd.schid
									where cr.treatcode=:treatcode
						      order by schemaname, sposob, nombersteklo
                  into :SCHID, :SCHEMANAME, :SPOSOB, :NOMBERSTEKLO
do
suspend;
end
end


Возвращает: см.скрин.
Последний столбец - это порядковый номер. Сделано сейчас таблицей отдельной. Как можно реализовать в ХП, на подобии счетчика или еще как?
...
Рейтинг: 0 / 0
Счетчик
    #39839233
koo3mee4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем макс. значение NOMBERSTEKLO должно быть равно crd.scount
...
Рейтинг: 0 / 0
Счетчик
    #39839290
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koo3mee4,

версия ФБ какая? Или смотрите row_number.
...
Рейтинг: 0 / 0
Счетчик
    #39839321
koo3mee4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

3.0
...
Рейтинг: 0 / 0
Счетчик
    #39839351
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koo3mee4,

В 3.0 есть row_number. Или можно попробовать банально. Убрать из запроса и из "into" nombersteklo, а после do типа такого:
Код: sql
1.
2.
3.
do
nombersteklo = nombersteklo + 1;
suspend;


В логику Вашего селекта и ХП особо не вникаю. Правда заинтересовало слово НОМБЕРСТЕКЛО.
...
Рейтинг: 0 / 0
Счетчик
    #39839509
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
от такого порядка джойнов может поплохеть в самый неподходящий момент
from
left join
join
left join
left join
лучше компоновать так
from
join
join
join
left join
left join
left join
...
Рейтинг: 0 / 0
Счетчик
    #39839606
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevskyfrom
left join
join
left join
left join

лучше компоновать так

from
join
join
join
left join
left join
left join

Эти запросы не равнозначны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Счетчик
    #39839704
koo3mee4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

Это не совсем подходит, потому что у меня есть ещё поле crd.scount, которое возвращает просто например значение 3, т.е. 1 строку. А nombersteklo из этого должен сделать 3 строки с порядковыми номерами 1,2 и 3. А join dicinfo вообще убрать надо. Как такое реализовать?
...
Рейтинг: 0 / 0
Счетчик
    #39839773
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koo3mee4KreatorXXI,
Это не совсем подходит, потому что ......... Как такое реализовать?
Другое тоже не совсем подойдет, по какой-то другой причине
И так будет до тех пор, пока внятно не опишешь "проблему" с которой столкнулся
а в этом случае еще и с описанием структур таблиц, связей между ними,
примерами входных данных и желаемого результат
...
Рейтинг: 0 / 0
Счетчик
    #39839775
koo3mee4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

нашел как это реализовать в MS SQL.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE @source_table TABLE (ID INT, ID_product INT, COUNT INT)
 
INSERT INTO @source_table (ID, ID_product, COUNT)
    VALUES (1, 12457, 7),
            (2, 11111, 3),
            (3, 22222, 4),
            (4, 33333, 1)
            
SELECT * FROM @source_table
 
;WITH cteRepeat (ID, ID_product, COUNT, lvl)
AS
(
SELECT ID, ID_product, COUNT, 1 AS lvl FROM @source_table
UNION ALL
SELECT A.ID, A.ID_product, A.count, lvl + 1
FROM @source_table AS A
    INNER JOIN cteRepeat AS B
    ON A.ID = B.ID AND A.count> B.lvl
)
SELECT * FROM cteRepeat ORDER BY ID, lvl


Надо на основе него, в ФБ с моим запросом тоже самое сделать.
В MSSQL запросе делается временная таблица, у меня уже есть код:
Код: plsql
1.
2.
3.
4.
5.
6.
select crd.schid schid, w.kodoper||' '||w.schname schemaname, tn.toothname sposob, crd.scount
from clreferrals cr
left join clrefdet crd on cr.refid=crd.refid
left join toothnam tn on crd.organid=tn.toothcod
left join wschema w on w.schid=crd.schid
where cr.treatcode=:treatcode


Теперь надо как-то это сделать в ХП.
...
Рейтинг: 0 / 0
Счетчик
    #39839779
koo3mee4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

сделал так:

Код: plsql
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.
create or alter procedure TEST2
(
TREATCODE type of column CLREFERRALS.TREATCODE
)
returns(
SCHID type of column CLREFDET.SCHID,
SCHEMANAME blob sub_type text,
SPOSOB type of column TOOTHNAM.TOOTHNAME,
SCOUNT type of column CLREFDET.SCOUNT,
LVL INTEGER
)
as
begin
for
WITH recursive Repeat(SCHID, SCHEMANAME, SPOSOB, SCOUNT, LVL)
AS
(
select crd.schid schid, w.kodoper||' '||w.schname schemaname, tn.toothname sposob, crd.scount, 1 as lvl
from clreferrals cr
left join clrefdet crd on cr.refid=crd.refid
left join toothnam tn on crd.organid=tn.toothcod
left join wschema w on w.schid=crd.schid
where cr.treatcode=:treatcode
UNION all
select crd1.schid schid, w1.kodoper||' '||w1.schname schemaname, tn1.toothname sposob, crd1.scount, lvl+1
from clreferrals cr1
left join clrefdet crd1 on cr1.refid=crd1.refid
left join toothnam tn1 on crd1.organid=tn1.toothcod
left join wschema w1 on w1.schid=crd1.schid
JOIN Repeat AS CRT on crd1.schid=crt.schid and crd1.scount>crt.lvl
where cr1.treatcode=:treatcode
)
select SCHID, SCHEMANAME, SPOSOB, SCOUNT, LVL from Repeat
into SCHID, SCHEMANAME, SPOSOB, SCOUNT, LVL
do
suspend;
end


но зачем-то повторяет ЛД.14.1 Соскоб 2 2, хотя должен был один раз вывести это.
...
Рейтинг: 0 / 0
Счетчик
    #39839783
koo3mee4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koo3mee4,

Всё сделал
Код: plsql
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.
create or alter procedure TEST2
(
TREATCODE type of column CLREFERRALS.TREATCODE
)
returns(
SCHID type of column CLREFDET.SCHID,
SCHEMANAME blob sub_type text,
SPOSOB type of column TOOTHNAM.TOOTHNAME,
SCOUNT type of column CLREFDET.SCOUNT,
LVL INTEGER
)
as
begin
for
WITH recursive Repeat(SCHID, SCHEMANAME, SPOSOB, SCOUNT, LVL)
AS
(
select crd.schid schid, w.kodoper||' '||w.schname schemaname, tn.toothname sposob, crd.scount, 1 as lvl
from clreferrals cr
left join clrefdet crd on cr.refid=crd.refid
left join toothnam tn on crd.organid=tn.toothcod
left join wschema w on w.schid=crd.schid
where cr.treatcode=:treatcode
UNION all
select crd1.schid schid, w1.kodoper||' '||w1.schname schemaname, tn1.toothname sposob, crd1.scount, lvl+1
from clreferrals cr1
left join clrefdet crd1 on cr1.refid=crd1.refid
left join toothnam tn1 on crd1.organid=tn1.toothcod
left join wschema w1 on w1.schid=crd1.schid
JOIN Repeat AS RPT on crd1.schid=rpt.schid and crd1.scount>rpt.lvl and tn1.toothname=rpt.sposob
where cr1.treatcode=:treatcode
)
select SCHID, SCHEMANAME, SPOSOB, SCOUNT, LVL from Repeat
into SCHID, SCHEMANAME, SPOSOB, SCOUNT, LVL
do
suspend;
end
...
Рейтинг: 0 / 0
Счетчик
    #39839785
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koo3mee4,

Здесь есть знающие MS SQL может они и переведут


koo3mee4Теперь надо как-то это сделать в ХП.
ну прям не знаю как еще подсказать, вопрос надо задать так чтобы была ясна проблема
без разбирательств в портянках кода, без задания уточняющих вопросов автору
и без использования хрустальных шаров и магии

А вот теперь как я понял в чем у тебя заключается вопрос
Есть запрос
Код: sql
1.
2.
3.
4.
5.
6.
select ..........., crd.scount
from clreferrals cr
left join clrefdet crd on cr.refid=crd.refid
left join toothnam tn on crd.organid=tn.toothcod
left join wschema w on w.schid=crd.schid
where cr.treatcode=:treatcode



в поле scount сидит некое число (в диапазоне >=1) и надо каждую запись
результата выполнения запроса "размножить" в соответствии с значением в scount
И в твоем случае желательно это сделать в XP

Я правильно понял или нет?
...
Рейтинг: 0 / 0
Счетчик
    #39839786
koo3mee4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

Всё верно. Решение сделал и расписал выше.
...
Рейтинг: 0 / 0
Счетчик
    #39839790
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koo3mee4m7m,
Всё верно.
Ну вот если бы сразу так расписал свой вопрос то давно бы получил ответ

Ну а поскольку тебе желательно в XP и я не очень люблю WITH recursive
то от меня был-бы вот такой ответ

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Lvl=0;
for select ..........., crd.scount
from ......
where ......
into ...., scount
do begin
  while (lvl <= scount)
do begin
  Lvl=lvl+1;
  suspend;
end
  lvl=0;
end


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


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