Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Parameter does not exists  [new]
LMag
Member

Откуда:
Сообщений: 61
Добрый вечер

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

Ругается на то что нет параметра в sql запросе, хотя он там присутствует

Ошибка приведена на изображении.

Кусок кода

Работа идет с компонентом FibDataSet

      dm_create.ds_covid_sem.Close;
       // dm_create.ds_covid_sem.SQLs.SelectSQL.Clear;
        if LookupForActForm.MCODLookupCombobox.Value<>null then begin

              dm_create.ds_covid_sem.SQLs.SelectSQL.Text:='select distinct u.id_sluch, p.mse, p.inv, u.podr, so.iotd,u.ds_onk,t.data_l,t.npr_mo, t.npr_date, u.p_per,t.nhistory, u.npolis, u.profil_k, p.w, '+
                                                      't.usl_ok, usl.umpname, t.for_pom, t.ishod, t.rslt, u.profil, sp.t_type, '+
                                                      't.date_1, t.date_2, u.ed_col as KD, u.koefk, t.ds0, t.ds1, t.ds2, t.ds3, t.c_zab, '+
                                                      'u.dn, t.c_zab, n.napr_v, t.disp,  u.npolis,  u.lpu, u.lpu_1, sl.m_namef, '+
                                                      't.det, p.fam, p.im, p.ot, p.dr, extract(year from t.date_1)-extract(year from p.dr) as VOZRAST, u.date_in, u.date_out, u.ds, m.name, t.iddokt, '+
                                                      'd.fio, d.spec, u.code_usl, sp.name_issl, t.prvs_s, u.zak, '+
                                                      'iif(u.sumv_usl=0,u.tarif*u.kol_usl,u.sumv_usl) as sumv_usl, '+
                                                      'IIF(sn.id_povod='',''Проверен'', sn.id_povod) as id_povod, '+
                                                      'sn.comment, sn.summa_v, sn.tip_exp, sn.data_exp,sk.sumoms_sht as mek '+
                                                      'from ut05s50'+LookupForActForm.cData+' u '+
                                                      'left join tt05s50'+LookupForActForm.cData+' t on u.id_sluch=t.id_sluch_tt '+
                                                      'left join pt05s50'+LookupForActForm.cData+' p on substring(p.id_sch from 9 for 6)=u.lpu and p.polis=t.id_pac and t.novor=p.novor and p.id_pac_new=t.id_pac_new '+
                                                      'left join sp_tarif sp on sp.ksg=u.code_usl '+
                                                      'left join uslmp usl on usl.idump=t.usl_ok '+
                                                      'left join s_lpu s on s.mcod=u.lpu_1 '+
                                                      'left join mkb m on m.lcod=t.ds1 '+
                                                      'left join stacotd so on so.kotd=u.podr and so.mcod=u.lpu_1 '+
                                                      'left join ( '+
                                                      '    select s.id, s.id_sluch, s.id_exp, s.id_povod, s.comment, s.summa_v, s.summa_m, s.data_exp, s.tip_exp from snk'+LookupForActForm.cData+' s '+
                                                      '     union all '+
                                                      '    select s.id, s.id_sluch, s.id_exp, s.id_povod, s.comment, s.summa_v, s.summa_m, s.data_exp, s.tip_exp from snk_stac'+LookupForActForm.cData+' s '+
                                                      ') sn on sn.id_sluch=u.id_sluch '+
                                                      'left join sankc sk on sk.id_sluch=u.id_sluch and sk."year"='+QuotedStr(LookupForActForm.cbyear.Text)+' and sk.mont='+QuotedStr(LookupForActForm.cbMonth.Text)+' ' +
                                                      'where u.lpu_1=:mcod and t.usl_ok<3 and extract(year from t.date_1)-extract(year from p.dr)>=70 and ((t.ds1 in (''U07.1'',''U07.2'')) or (t.ds2 in (''U07.1'',''U07.2'')) or (t.ds3 in (''U07.1'',''U07.2''))) ';
              Showmessage(IntToStr(dm_create.ds_covid_sem.ParamCount));
             [b] dm_create.ds_covid_sem.ParamByName('mcod').AsString:=dm.ds_slpuMCOD.AsString;[/b]
              dm_create.ds_covid_sem.Open;
          end 


К сообщению приложен файл. Размер - 136Kb
25 окт 21, 23:27    [22388092]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
Softologic
Member

Откуда: Питер
Сообщений: 393
LMag, "Модную" болезнь кодите, однако...

По существу: а есть уверенность, что при дебаге "LookupForActForm.MCODLookupCombobox.Value<>null" ? Может там null и, возможно, срабатывает уже SelectSQL.Text, который задан непосредственно в дизайн-тайме. В котором искомого параметра нет (запрос может там хранится устаревший...). Я на что то подобное с фибами нарывался. Проверьте в дизайн-тайме, что у датасета прописано внутри.

Сообщение было отредактировано: 25 окт 21, 23:37
25 окт 21, 23:36    [22388094]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30245
LMag,

1. вместо '+LookupForActForm.cData+' используйте параметры. Оно надежнее, особенно если у юзера другой формат даты, чем вы предполагали

2. картинки тут с сообщениями не приведствуются, в редких и исключительных случаях. Как правило на почти любом сообщении об ошибке можно нажать Ctrl-C, и ТЕКСТОВОЕ сообщение скопируется. Тем более, что вы даже умудрились окно ошибки скопировать на фоне текста запроса. Это зачем?

3. вместо текста запроса из дельфей надо приводить голый текст запроса, без дельфевого кода. Как и куда вы его там вставляете - мало кому интересно.

4. вот это что - t.ds1 in (''U07.1''. По-моему оно так в дельфях не работает. разве не три одинарных кавычки там должно быть?

5. ни одного двоеточия (сиречь параметра sql) я в вашем тексте поиском не нахожу.
25 окт 21, 23:44    [22388096]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
Softologic
Member

Откуда: Питер
Сообщений: 393
kdv


5. ни одного двоеточия (сиречь параметра sql) я в вашем тексте поиском не нахожу.

Вот, в последней строке этот параметр mcod у него :
where u.lpu_1=:mcod and t.usl_ok<3 and extract(year from t.date_1)-extract(year from p.dr)>=70 and ((t.ds1 in (''U07.1'',''U07.2'')) or (t.ds2 in (''U07.1'',''U07.2'')) or (t.ds3 in (''U07.1'',''U07.2''))) 


Сообщение было отредактировано: 25 окт 21, 23:48
25 окт 21, 23:47    [22388098]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30245
LMag,

параметров в запросе нет, при этом написано
dm_create.ds_covid_sem.ParamByName('mcod').AsString:=dm.ds_slpuMCOD.AsString;
зачем эта шлабуда? Вы сами не могли это найти?
В отладке же у вас именно на этой строке идет exception. Или F8 не работает?
25 окт 21, 23:47    [22388099]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2653
kdv,

where u.lpu_1=:mcod
25 окт 21, 23:48    [22388100]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30245
Softologic,

и правда, ок, был невнимателен. Ну хорошо. В отладке у вас же есть проперть
dm_create.ds_covid_sem.SQLs.SelectSQL.Text
и вы можете ее посмотреть в отладчике ПЕРЕД строкой присвоения значения параметру, и убедиться, что текст SQL верный.
В конце-концов, взять этот текст, и попробовать выполнить в IBExpert. Он же вас попросит ввести значение параметра, если таковой обнаружит в тексте запроса.
Вдруг у вас в конкатенации еще где есть :, и текст запроса корёжится напрочь?
25 окт 21, 23:50    [22388101]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
hvlad
Member

Откуда:
Сообщений: 11551
Для начала стоит посмотреть на dm_create.ds_covid_sem.SQLs.SelectSQL.Text
25 окт 21, 23:54    [22388107]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
Softologic
Member

Откуда: Питер
Сообщений: 393
hvlad
Для начала стоит посмотреть на dm_create.ds_covid_sem.SQLs.SelectSQL.Text

+1, ну да, я вот про то же. Скорее всего там параметра и нет как раз.
25 окт 21, 23:58    [22388109]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
Polesov
Member

Откуда:
Сообщений: 835
LMag
Добрый вечер

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

  'IIF(sn.id_povod='',''Проверен'', sn.id_povod) as id_povod, '+


Привет.

Мне кажется, пустая строка в сравнении должна быть представлена 4-мя одинарными кавычками:
  'IIF(sn.id_povod='''',''Проверен'', sn.id_povod) as id_povod, '+


Сообщение было отредактировано: 26 окт 21, 00:03
26 окт 21, 00:02    [22388110]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30245
Polesov,

лично меня это всегда бесило. то-ли три кавычки, то-ли четыре...
26 окт 21, 00:04    [22388111]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
Polesov
Member

Откуда:
Сообщений: 835
kdv, акамущаслихко? )
26 окт 21, 00:05    [22388112]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
LMag
Member

Откуда:
Сообщений: 61
Данный sql запрос , выполнял через ibexpert и он отлично выполняется, предлагает ввести значение параметра
26 окт 21, 00:22    [22388115]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
LMag
Member

Откуда:
Сообщений: 61
Softologic
LMag, "Модную" болезнь кодите, однако...

По существу: а есть уверенность, что при дебаге "LookupForActForm.MCODLookupCombobox.Value<>null" ? Может там null и, возможно, срабатывает уже SelectSQL.Text, который задан непосредственно в дизайн-тайме. В котором искомого параметра нет (запрос может там хранится устаревший...). Я на что то подобное с фибами нарывался. Проверьте в дизайн-тайме, что у датасета прописано внутри.


LookupForActForm.MCODLookupCombobox.Value равно определенному значению и он не равен null
26 окт 21, 00:23    [22388116]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
LMag
Member

Откуда:
Сообщений: 61
kdv
LMag,

1. вместо '+LookupForActForm.cData+' используйте параметры. Оно надежнее, особенно если у юзера другой формат даты, чем вы предполагали

2. картинки тут с сообщениями не приведствуются, в редких и исключительных случаях. Как правило на почти любом сообщении об ошибке можно нажать Ctrl-C, и ТЕКСТОВОЕ сообщение скопируется. Тем более, что вы даже умудрились окно ошибки скопировать на фоне текста запроса. Это зачем?

3. вместо текста запроса из дельфей надо приводить голый текст запроса, без дельфевого кода. Как и куда вы его там вставляете - мало кому интересно.

4. вот это что - t.ds1 in (''U07.1''. По-моему оно так в дельфях не работает. разве не три одинарных кавычки там должно быть?

5. ни одного двоеточия (сиречь параметра sql) я в вашем тексте поиском не нахожу.


Вот sql запрос

select distinct u.id_sluch, p.mse, p.inv, u.podr, so.iotd,u.ds_onk,t.data_l,t.npr_mo, t.npr_date, u.p_per,t.nhistory, u.npolis, u.profil_k, p.w,
    t.usl_ok, usl.umpname, t.for_pom, t.ishod, t.rslt, u.profil, sp.t_type,
    t.date_1, t.date_2, u.ed_col as KD, u.koefk, t.ds0, t.ds1, t.ds2, t.ds3, t.c_zab,
    u.dn, t.c_zab, n.napr_v, t.disp,  u.npolis,  u.lpu, u.lpu_1, sl.m_namef,
    t.det, p.fam, p.im, p.ot, p.dr, extract(year from t.date_1)-extract(year from p.dr) as VOZRAST, u.date_in, u.date_out, u.ds, m.name, t.iddokt,
    d.fio, d.spec, u.code_usl, sp.name_issl, t.prvs_s, u.zak,
    iif(u.sumv_usl=0,u.tarif*u.kol_usl,u.sumv_usl) as sumv_usl,
    IIF(sn.id_povod='','Проверен', sn.id_povod) as id_povod,
    sn.comment,
    sn.summa_v, sn.tip_exp, sn.data_exp,sk.sumoms_sht as mek
from ut05s50202108 u
left join tt05s50202108 t on u.id_sluch=t.id_sluch_tt
left join pt05s50202108 p on substring(p.id_sch from 9 for 6)=u.lpu and p.polis=t.id_pac and t.novor=p.novor and p.id_pac_new=t.id_pac_new
left join NPR05s50202108 n on n.idserv=u.idserv
left join dt05s50202108 d on d.kod=t.iddokt and d.mcod=u.lpu_1
left join sp_tarif sp on sp.ksg=u.code_usl
left join uslmp usl on usl.idump=t.usl_ok
left join s_lpu sl on sl.mcod=u.lpu_1
left join mkb m on m.lcod=t.ds1
left join stacotd so on so.kotd=u.podr and so.mcod=u.lpu_1
left join (
    select s.id, s.id_sluch, s.id_exp, s.id_povod, s.comment, s.summa_v, s.summa_m, s.data_exp, s.tip_exp from snk202108 s
    union all
    select s.id, s.id_sluch, s.id_exp, s.id_povod, s.comment, s.summa_v, s.summa_m, s.data_exp, s.tip_exp from snk_stac202108 s
) sn on sn.id_sluch=u.id_sluch
left join sankc sk on sk.id_sluch=u.id_sluch and sk."year"='2021' and sk.mont='07'
where u.lpu_1=:glpu and t.usl_ok<3 and extract(year from t.date_1)-extract(year from p.dr)>=70 and ((t.ds1 in ('U07.1','U07.2')) or (t.ds2 in ('U07.1','U07.2')) or (t.ds3 in ('U07.1','U07.2')))
26 окт 21, 00:25    [22388117]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54772

LMag
Данный sql запрос

В приведённом тексте нет SQL запроса. Только совершенно безумный код его
генерации. Так что не надо ля-ля про "данный запрос".

Posted via ActualForum NNTP Server 1.5

26 окт 21, 00:25    [22388118]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
LMag
Member

Откуда:
Сообщений: 61
Вы думаете , это все из за ковычек
26 окт 21, 00:26    [22388119]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54772

LMag
Вот sql запрос

А теперь сравниваем по буквам "glpu" и "mcod". Видишь между ними что-то общее?..

Posted via ActualForum NNTP Server 1.5

26 окт 21, 00:27    [22388120]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
LMag
Member

Откуда:
Сообщений: 61
Спасибо Всем, разобрался в запросе
26 окт 21, 00:42    [22388121]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
LMag
Member

Откуда:
Сообщений: 61
Можно закрыть
26 окт 21, 00:43    [22388122]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
Softologic
Member

Откуда: Питер
Сообщений: 393
LMag,
кусок из запроса в первом посте:
where u.lpu_1=:mcod and t.usl_ok<3 and extract(year from t.date_1)-extract(year from p.dr)>=70 and ((t.ds1 in (''U07.1'',''U07.2'')) or (t.ds2 in (''U07.1'',''U07.2'')) or (t.ds3 in (''U07.1'',''U07.2'')))

кусок из запроса из недавнего:
where u.lpu_1=:glpu and t.usl_ok<3 and extract(year from t.date_1)-extract(year from p.dr)>=70 and ((t.ds1 in ('U07.1','U07.2')) or (t.ds2 in ('U07.1','U07.2')) or (t.ds3 in ('U07.1','U07.2')))


Упс, уже все закончилось благополучно :)

Сообщение было отредактировано: 26 окт 21, 00:46
26 окт 21, 00:45    [22388123]     Ответить | Цитировать Сообщить модератору
 Re: Parameter does not exists  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30245
Softologic,
меня браузер ФФ подвел. по поиску : почему-то не дал ничего в первый раз.
26 окт 21, 01:17    [22388126]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить