Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Процедура не выводит результат / 16 сообщений из 16, страница 1 из 1
05.07.2019, 12:40
    #39834318
koo3mee4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
Подскажите пожалуйста что не так? Процедура с селектом не выводит результат. Но если отдельно выполнить запрос, то работает.
Код: sql
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.
create or alter procedure RES_CITOLOG
(
  PROTOCOLID type of column TREATPLACE.PROTOCOLID,
  CODEPARAMS type of column PARAMSINFO.CODEPARAMS,
  ORGANID type of column PARAMSINFO.ORGANID,
  TREATCODE type of column TREAT.TREATCODE
)
returns
(
  SPOSOB type of column PARAMSINFO.VALUETEXT
)
as
begin
for
	select
 IIF(coalesce(tp.dirid,0)>0, (select distinct
										IIF(p.organid=14874,
										(select v1.valuetext
										from treat t
										left join clrefdet crd on t.treatcode=crd.rtreatcode and crd.schid=502001397 and crd.organid=14874
										left join clreferrals cr on crd.refid=cr.refid
										left join stat_direction sd on cr.dirid=sd.sdid
										left join treatplace tp1 on sd.sdid=tp1.dirid and tp1.placeid=502000472 and cr.dcode=tp1.dcode
										left join (select valuetext, protocolid from paramsinfo where codeparams=502038627 and ver_no=0) v1 on tp1.protocolid=v1.protocolid
										where t.treatcode=:treatcode),
										IIF(p.organid=14876,
										(select v1.valuetext
										from treat t
										left join clrefdet crd on t.treatcode=crd.rtreatcode and crd.schid=502001397 and crd.organid=14876
										left join clreferrals cr on crd.refid=cr.refid
										left join stat_direction sd on cr.dirid=sd.sdid
										left join treatplace tp1 on sd.sdid=tp1.dirid and tp1.placeid=502000472 and cr.dcode=tp1.dcode
										left join (select valuetext, protocolid from paramsinfo where codeparams=502038650 and ver_no=0) v1 on tp1.protocolid=v1.protocolid
										where t.treatcode=:treatcode),''))
										from paramsinfo p
										where p.codeparams=:codeparams and p.organid=:organid and p.protocolid=:protocolid),
	(select distinct
										IIF(p.organid=14874,
										(select v1.valuetext
										from treat t
										left join clrefdet crd on t.treatcode=crd.rtreatcode and crd.schid=502001397 and crd.organid=14874
										left join treat t1 on crd.treatcode=t1.treatcode
										left join treatplace tp1 on t1.treatcode=tp1.treatcode and tp1.placeid=502000472
										left join (select valuetext, protocolid from paramsinfo where codeparams=502038627 and ver_no=0) v1 on tp1.protocolid=v1.protocolid
										where t.treatcode=:treatcode),
										IIF(p.organid=14876,
										(select v1.valuetext
										from treat t
										left join clrefdet crd on t.treatcode=crd.rtreatcode and crd.schid=502001397 and crd.organid=14876
										left join treat t1 on crd.treatcode=t1.treatcode
										left join treatplace tp1 on t1.treatcode=tp1.treatcode and tp1.placeid=502000472
										left join (select valuetext, protocolid from paramsinfo where codeparams=502038650 and ver_no=0) v1 on tp1.protocolid=v1.protocolid
										where t.treatcode=:treatcode),''))
										from paramsinfo p
										where p.codeparams=:codeparams and p.organid=:organid and p.protocolid=:protocolid))


	from treatplace tp
	where tp.protocolid=:protocolid
	into :SPOSOB
  do
  suspend;
end


Модератор: Пользуйся тегом SRC.
И форматируй правильно, тогда и помочь захотят.
...
Рейтинг: 0 / 0
05.07.2019, 12:46
    #39834325
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
koo3mee4,

в таком виде даже смотреть не хочется. Надо было текст скрипта оформить в тег [src]
...
Рейтинг: 0 / 0
05.07.2019, 13:00
    #39834333
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
koo3mee4Процедура с селектом не выводит результат. Но если отдельно выполнить запрос, то работает.

Вероятнее всего отдельно выполняется несколько другой запрос.
И вовсе незачем в процедуре громоздить такой же ужас, как в "отдельном запросе": там есть
все возможности сделать то же самое в гораздо более читабельном виде.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.07.2019, 13:04
    #39834336
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
Dimitry Sibiryakov,

да я думаю и сам запрос можно было бы написать гораздо короче. Этот читать не возможно
...
Рейтинг: 0 / 0
05.07.2019, 13:09
    #39834341
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
для начала неплохо бы заменить свои цепочки IIF на CASE
...
Рейтинг: 0 / 0
05.07.2019, 13:10
    #39834343
koo3mee4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
Симонов Денис,

Менял не помогло
...
Рейтинг: 0 / 0
05.07.2019, 13:14
    #39834346
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
05.07.2019 13:10, koo3mee4 пишет:
> Менял не помогло

имхо, тут программист нужен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.07.2019, 13:15
    #39834348
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
koo3mee4,

оно и не должно было помочь. Просто сделает эту фигню в 2 экрана более читаемой.

Какая версия Firebird?
...
Рейтинг: 0 / 0
05.07.2019, 13:16
    #39834349
koo3mee4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
Симонов Денис,

3,0
...
Рейтинг: 0 / 0
05.07.2019, 13:22
    #39834356
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
koo3mee4,

это уже хорошо. Значит мутные подзапросы вроде
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
(select v1.valuetext
from treat t
left join clrefdet crd on t.treatcode=crd.rtreatcode and crd.schid=502001397 and crd.organid=14874
left join clreferrals cr on crd.refid=cr.refid
left join stat_direction sd on cr.dirid=sd.sdid
left join treatplace tp1 on sd.sdid=tp1.dirid and tp1.placeid=502000472 and cr.dcode=tp1.dcode
left join (select valuetext, protocolid from paramsinfo where codeparams=502038627 and ver_no=0) v1 on tp1.protocolid=v1.protocolid
where t.treatcode=:treatcode),


можно выделить в PSQL подфункции
...
Рейтинг: 0 / 0
05.07.2019, 15:16
    #39834392
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
Dimitry SibiryakovВероятнее всего отдельно выполняется несколько другой запрос.
а я ставлю на "не те" параметры (которые передаются в процедуру, и которые передаются в вырезанный из нее запрос).
Симонов Денисможно выделить в PSQL подфункции
это да. но мне вот тут вдруг подумалось, что процедурное мышление в SQL иногда вредит. К примеру, обычный Дельфи, С++ и т.д. программист привык повторяющийся код оформлять в процедуры и функции.
Далее, он пишет запросы. И в разных запросах есть обращение к одной таблице. И он думает - запросы разные, а обращение одно, дай я оформлю обращение в процедуру. И потом использует эту процедуру в тех запросах. И вдруг наступают тормоза...
...
Рейтинг: 0 / 0
05.07.2019, 16:14
    #39834430
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
kdvпроцедурное мышление в SQL иногда вредит.

Это не "процедурное мышление", это "отсутствие мышления".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.07.2019, 22:31
    #39834505
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
Когда я вижу что все до единого соединения в многоэтажной этажерке left, я дальше не вникаю. Просто потому, что по жизни такой запрос нужен один на 1000. А в остальных 999 случаях это говорит о необходимости археологических раскопок в консерватории. Что мне уже скучно.
...
Рейтинг: 0 / 0
05.07.2019, 23:44
    #39834513
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
Старый плюшевый мишка,

я тебе скажу чуть иначе. многоэтажки left join у меня вызывают сомнения, что человеку нужен именно left join. И запрос скорее построен автоматическим построителем, чем вручную.
И когда задаешь вопрос типа, а что, и правда в treat есть записи, которым нет соответствия в clrefdet, в ответ либо молчание, либо мычание.

В этом случае надо дать по башке книгой Дейта, конкретно главой 19 "Отсутствующая информация"
...
Рейтинг: 0 / 0
06.07.2019, 07:55
    #39834545
koo3mee4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
kdvСтарый плюшевый мишка,

И запрос скорее построен автоматическим построителем, чем вручную.
И когда задаешь вопрос типа, а что, и правда в treat есть записи, которым нет соответствия в clrefdet, в ответ либо молчание, либо мычание.



Запрос построен вручную.
Да в treat есть записи, которым нет соответствия в clrefdet.
Просто чтобы понять логику:
Treat - таблица приемов врачей.
Clreferrals - таблица направлений (в каком приеме какое направление)
Clrefdet - детальная таблица направлений, на какие именно анализы (услуги)
Отсюда, не на всех приемах врач делает направление на анализы, соответственно не всегда будет treatcode в таблицах clreferrals и clrefdet. Если есть направление в приеме, то заполняется treatcode в обоих таблицах направлений.
Если приём стационарный то заполняется поле dirid в таблице treat и clreferrals. Treatcode заполняется только в таблице clreferrals, в clrefdet нет. А связка между clreferrals и clrefdet происходит по полю refid.
...
Рейтинг: 0 / 0
06.07.2019, 08:07
    #39834546
koo3mee4
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура не выводит результат
koo3mee4Если приём стационарный то заполняется поле dirid в таблице treat и clreferrals. Treatcode заполняется только в таблице clreferrals, в clrefdet нет. А связка между clreferrals и clrefdet происходит по полю refid.
Описался. Treatcode вообще не записывается ни в clreferrals ни в clrefdet. Связь между treat и clreferrals производится по полю dirid. А между clreferrals и clrefdet по полю refid
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Процедура не выводит результат / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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