Заполнение параметров ХП по MasterSource связи
Заполнение параметров ХП по MasterSource связи
Добрый день! Использую TMSQuery для вызова ХП с параметрами, для заполнения параметров использую связь MasterSource, по которой берется два параметра, третий устанавливаю вручную перед выполнением процедуры. Так вот этот третий параметр сбрасывается в NULL, так как нет такого поля MasterSource!? Правильно ли я понял ситуацию? Есть ли возможность изменить такое неожиданное поведение? Проект большой, переводился с ADO...
Спасибо
Спасибо
Re: Заполнение параметров ХП по MasterSource связи
Подскажите, форум жив?
Re: Заполнение параметров ХП по MasterSource связи
Добрый день,
Описанная ситуация не воспроизводиться. Пожалуйста укажите в какой момент вы устанавливаете значение параметра, а также запрос вызова процедуры.
Описанная ситуация не воспроизводиться. Пожалуйста укажите в какой момент вы устанавливаете значение параметра, а также запрос вызова процедуры.
Re: Заполнение параметров ХП по MasterSource связи
Здравствуйте!
Я понял, что происходит: мастер датасет - это хранимая процедура, которая собирает поля из нескольких таблиц и переименовывает некоторые из них, например она возвращает ID как ID и поле Name возвращает как Comment. Изменяющая процедура имеет параметры ID и Name, по связи MasterSource параметр ID берется корректно, а параметр Name я присваиваю вручную перед вызовом ExecSQL. Так вот внутри ExecSQL, каким-то макаром, SDAC знает оригинальное имя Name поля Comment, которое он хранит для какие-то своих сдаковских целей, и перезаписывает мое значение! В приложении проект со скриптом для базы. Вопрос, как запретить искать поля по скрытым спискам?
Спасибо
Я понял, что происходит: мастер датасет - это хранимая процедура, которая собирает поля из нескольких таблиц и переименовывает некоторые из них, например она возвращает ID как ID и поле Name возвращает как Comment. Изменяющая процедура имеет параметры ID и Name, по связи MasterSource параметр ID берется корректно, а параметр Name я присваиваю вручную перед вызовом ExecSQL. Так вот внутри ExecSQL, каким-то макаром, SDAC знает оригинальное имя Name поля Comment, которое он хранит для какие-то своих сдаковских целей, и перезаписывает мое значение! В приложении проект со скриптом для базы. Вопрос, как запретить искать поля по скрытым спискам?
Спасибо
- Вложения
-
- SdacTest.7z
- (50.68 КБ) 630 скачиваний
Re: Заполнение параметров ХП по MasterSource связи
Запретить это поведение нельзя. Вы можете переименовать свой параметр так, что бы его имя не совпадало с реальным именем поля в мастер DataSet, и тогда будет использоваться Ваше значение.
Код: Выделить всё
exec EntityUpd @ID = :ID, @Name = :NewName1
Re: Заполнение параметров ХП по MasterSource связи
То есть Вы не считаете это за баг? Вот у Вас в документации написано: When MasterSource is not nil dataset fills parameter values with corresponding field values from the current record of the master dataset. Но у меня нет там такого поля, это сугубо Ваши внутренние списки, на лицо явное противоречие заявленному функционалу. Какой может быть кейс использования данной "фичи"?
Запретить нельзя, но изменить - можно. Подумайте, пожалуйста...
P.S. Ну или прошу дать исходники, что бы не тратить недели на поиски подводных камней нелогичностей.
P.P.S. Вот DevExpress распространяет своей продукт с исходниками, дает их менять под себя...
Запретить нельзя, но изменить - можно. Подумайте, пожалуйста...
P.S. Ну или прошу дать исходники, что бы не тратить недели на поиски подводных камней нелогичностей.
P.P.S. Вот DevExpress распространяет своей продукт с исходниками, дает их менять под себя...
Re: Заполнение параметров ХП по MasterSource связи
эта функциональность была сделана по запросам пользователей.
Мы также предоставляем версию с исходным кодом, Вы можете приобрести ее на https://www.devart.com/sdac/ordering.html
Мы также предоставляем версию с исходным кодом, Вы можете приобрести ее на https://www.devart.com/sdac/ordering.html
Re: Заполнение параметров ХП по MasterSource связи
а можно посмотреть на запрос этого функционала, это же через вашу голосовалку было? я смысла не понимаю... еще раз напоминаю, что в документации у вас заявлено другое поведение.
А можно ли приобрести исходники для стандартной редакции? доплачивать 1350 долларов только для того, что вырезать "фичу" для какого-то нерадивого программиста - это моветон.
А можно ли приобрести исходники для стандартной редакции? доплачивать 1350 долларов только для того, что вырезать "фичу" для какого-то нерадивого программиста - это моветон.
Re: Заполнение параметров ХП по MasterSource связи
Наш продукты работают в соответствии с описанием в справке
When MasterSource is not nil dataset fills parameter values with corresponding field values from the current record of the master dataset.
У вас в запросе присутствует поле Name (даже если оно имеет алиас), и при формировании параметров берется соответствующее значение поля.
Такое поведение удобно в случаях противоположных вашему, когда в Detail запрос необходимо подставить значение по имени параметра который совпадает с именем поля а не алиаса, т.е.
Master:
Detail:
и такой запрос корректно выполнится.
P.S. Версия с исходными кодами включает в себя полную функциональность продукта - аналог Professional версии. Standard версии с исходными кодами не существует.
When MasterSource is not nil dataset fills parameter values with corresponding field values from the current record of the master dataset.
У вас в запросе присутствует поле Name (даже если оно имеет алиас), и при формировании параметров берется соответствующее значение поля.
Такое поведение удобно в случаях противоположных вашему, когда в Detail запрос необходимо подставить значение по имени параметра который совпадает с именем поля а не алиаса, т.е.
Master:
Код: Выделить всё
Select deptno as no, dname as name from dept
Код: Выделить всё
select * from emp where deptno = :deptno //имя параметра не соответствует имени alias
P.S. Версия с исходными кодами включает в себя полную функциональность продукта - аналог Professional версии. Standard версии с исходными кодами не существует.
Re: Заполнение параметров ХП по MasterSource связи
Спасибо за Ваше внимание. Но все же, вы не правы, то что вы сделали приводит к неоднозначностям, что будет если я напишу запрос вида:
master:
detail:
В то время как использование только явных имен полей никогда не приведет к такому конфузу при выборе значений....
И вот постоянно так, то значение меняете по своему усмотрению, то тип параметров... Ищите люди баги, покупайте исходники, включайте свои хрустальные шары...
master:
Код: Выделить всё
select name as fname, lastname as name from...
Код: Выделить всё
select * from... where name = :name
И вот постоянно так, то значение меняете по своему усмотрению, то тип параметров... Ищите люди баги, покупайте исходники, включайте свои хрустальные шары...
Re: Заполнение параметров ХП по MasterSource связи
В приведенном вами примере нет никаких неоднозначностей - значение для параметра name будет взято из поля БД lastname, которое в вашем случае имеет алиас name. Таким образом, никакого конфуза при выборе значений не происходит.
Последний раз редактировалось Dimon Ср 21 дек 2016 14:50, всего редактировалось 1 раз.
Re: Заполнение параметров ХП по MasterSource связи
С вашей точки зрения - да, потому что вы это знаете, но программист работает с полями DataSet'а и ожидает, что будет использовано поле Name от DataSet'а, а не нечто, что даже в программе не видно и программисту не доступно. Где в справке написано, что будет взято значение не по имени TField, а по имени реального поля подлежащей таблицы, если только оно есть? Я всегда считал, что все эти уровни абстракции во view для того и существуют, что бы скрыть реализацию.
Представьте, что есть класс TClass1 с методами Proc1 и Proc2, потом создается интерфейс IClass1 с методом Proc1, в реализации интерфейса в классе TClass1 пишется имплементация метода интерфейса IClass1.Proc1 как вызов процедуры Proc2, а потом в момент вызова IClass1.Proc1 внезапно вызывается метод TClass1.Proc1 вместо ожидаемого Proc2!
Представьте, что есть класс TClass1 с методами Proc1 и Proc2, потом создается интерфейс IClass1 с методом Proc1, в реализации интерфейса в классе TClass1 пишется имплементация метода интерфейса IClass1.Proc1 как вызов процедуры Proc2, а потом в момент вызова IClass1.Proc1 внезапно вызывается метод TClass1.Proc1 вместо ожидаемого Proc2!
Re: Заполнение параметров ХП по MasterSource связи
К сожалению, я совершенно не понял вашу аналогию. Просто объясню существующую логику DAC компонентов:
Зачастую, для связки master-detail используются поля, которые должны быть недоступны пользователям, и поэтому многие разработчики не создают для них полей. В таком случае, при вашем подходе совершенно невозможно было бы создать связь таблиц. В существующем же подходе связь корректно и однозначно создается, что значительно повышает юзабельность компонентов и упрощает разработку.
Зачастую, для связки master-detail используются поля, которые должны быть недоступны пользователям, и поэтому многие разработчики не создают для них полей. В таком случае, при вашем подходе совершенно невозможно было бы создать связь таблиц. В существующем же подходе связь корректно и однозначно создается, что значительно повышает юзабельность компонентов и упрощает разработку.
Re: Заполнение параметров ХП по MasterSource связи
да, совсем не жизненная аналогия. вот попроще: я создаю view:
затем я хочу получить поле Name из этого view
а вы мне возвращаете Name из MyTable, так как вам кажется, что это логично и все пользователи хотят именно этого. представьте мое удивление. и единственный способ - это не пользоваться моим view
А главное, в документации это не описано!
Код: Выделить всё
create view MyView as select name as FirstName, LastName as Name from MyTable
Код: Выделить всё
select Name from MyView
А главное, в документации это не описано!
Re: Заполнение параметров ХП по MasterSource связи
В вашем примере как раз значение будет браться из поля Name из MyView. Т.е. имено так, как Вы хотите.