Заполнение параметров ХП по MasterSource связи

Обсуждение возникших проблем, предложений и ошибок SDAC компонентов
Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Заполнение параметров ХП по MasterSource связи

Сообщение Zelius » Вт 06 дек 2016 09:42

Добрый день! Использую TMSQuery для вызова ХП с параметрами, для заполнения параметров использую связь MasterSource, по которой берется два параметра, третий устанавливаю вручную перед выполнением процедуры. Так вот этот третий параметр сбрасывается в NULL, так как нет такого поля MasterSource!? Правильно ли я понял ситуацию? Есть ли возможность изменить такое неожиданное поведение? Проект большой, переводился с ADO...
Спасибо

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Zelius » Пн 12 дек 2016 11:12

Подскажите, форум жив?

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Alexp » Вт 13 дек 2016 14:10

Добрый день,

Описанная ситуация не воспроизводиться. Пожалуйста укажите в какой момент вы устанавливаете значение параметра, а также запрос вызова процедуры.

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Zelius » Ср 14 дек 2016 13:48

Здравствуйте!
Я понял, что происходит: мастер датасет - это хранимая процедура, которая собирает поля из нескольких таблиц и переименовывает некоторые из них, например она возвращает ID как ID и поле Name возвращает как Comment. Изменяющая процедура имеет параметры ID и Name, по связи MasterSource параметр ID берется корректно, а параметр Name я присваиваю вручную перед вызовом ExecSQL. Так вот внутри ExecSQL, каким-то макаром, SDAC знает оригинальное имя Name поля Comment, которое он хранит для какие-то своих сдаковских целей, и перезаписывает мое значение! В приложении проект со скриптом для базы. Вопрос, как запретить искать поля по скрытым спискам?
Спасибо
Вложения
SdacTest.7z
(50.68 КБ) 437 скачиваний

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Alexp » Ср 14 дек 2016 15:55

Запретить это поведение нельзя. Вы можете переименовать свой параметр так, что бы его имя не совпадало с реальным именем поля в мастер DataSet, и тогда будет использоваться Ваше значение.

Код: Выделить всё

exec EntityUpd @ID = :ID, @Name = :NewName1

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Zelius » Ср 14 дек 2016 16:12

То есть Вы не считаете это за баг? Вот у Вас в документации написано: 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 распространяет своей продукт с исходниками, дает их менять под себя...

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Alexp » Чт 15 дек 2016 11:26

эта функциональность была сделана по запросам пользователей.

Мы также предоставляем версию с исходным кодом, Вы можете приобрести ее на https://www.devart.com/sdac/ordering.html

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Zelius » Чт 15 дек 2016 11:51

а можно посмотреть на запрос этого функционала, это же через вашу голосовалку было? я смысла не понимаю... еще раз напоминаю, что в документации у вас заявлено другое поведение.
А можно ли приобрести исходники для стандартной редакции? доплачивать 1350 долларов только для того, что вырезать "фичу" для какого-то нерадивого программиста - это моветон.

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Alexp » Ср 21 дек 2016 10:37

Наш продукты работают в соответствии с описанием в справке
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
Detail:

Код: Выделить всё

select * from emp where deptno = :deptno //имя параметра не соответствует имени alias
и такой запрос корректно выполнится.

P.S. Версия с исходными кодами включает в себя полную функциональность продукта - аналог Professional версии. Standard версии с исходными кодами не существует.

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Zelius » Ср 21 дек 2016 13:18

Спасибо за Ваше внимание. Но все же, вы не правы, то что вы сделали приводит к неоднозначностям, что будет если я напишу запрос вида:
master:

Код: Выделить всё

select name as fname, lastname as name from...
detail:

Код: Выделить всё

select * from... where name = :name
В то время как использование только явных имен полей никогда не приведет к такому конфузу при выборе значений....
И вот постоянно так, то значение меняете по своему усмотрению, то тип параметров... Ищите люди баги, покупайте исходники, включайте свои хрустальные шары...

Dimon
Сообщения: 6
Зарегистрирован: Ср 17 дек 2014 08:13

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Dimon » Ср 21 дек 2016 13:28

В приведенном вами примере нет никаких неоднозначностей - значение для параметра name будет взято из поля БД lastname, которое в вашем случае имеет алиас name. Таким образом, никакого конфуза при выборе значений не происходит.
Последний раз редактировалось Dimon Ср 21 дек 2016 14:50, всего редактировалось 1 раз.

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Zelius » Ср 21 дек 2016 13:42

С вашей точки зрения - да, потому что вы это знаете, но программист работает с полями DataSet'а и ожидает, что будет использовано поле Name от DataSet'а, а не нечто, что даже в программе не видно и программисту не доступно. Где в справке написано, что будет взято значение не по имени TField, а по имени реального поля подлежащей таблицы, если только оно есть? Я всегда считал, что все эти уровни абстракции во view для того и существуют, что бы скрыть реализацию.
Представьте, что есть класс TClass1 с методами Proc1 и Proc2, потом создается интерфейс IClass1 с методом Proc1, в реализации интерфейса в классе TClass1 пишется имплементация метода интерфейса IClass1.Proc1 как вызов процедуры Proc2, а потом в момент вызова IClass1.Proc1 внезапно вызывается метод TClass1.Proc1 вместо ожидаемого Proc2!

Dimon
Сообщения: 6
Зарегистрирован: Ср 17 дек 2014 08:13

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Dimon » Ср 21 дек 2016 13:55

К сожалению, я совершенно не понял вашу аналогию. Просто объясню существующую логику DAC компонентов:
Зачастую, для связки master-detail используются поля, которые должны быть недоступны пользователям, и поэтому многие разработчики не создают для них полей. В таком случае, при вашем подходе совершенно невозможно было бы создать связь таблиц. В существующем же подходе связь корректно и однозначно создается, что значительно повышает юзабельность компонентов и упрощает разработку.

Zelius
Сообщения: 26
Зарегистрирован: Вт 24 авг 2010 11:26

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Zelius » Ср 21 дек 2016 14:15

да, совсем не жизненная аналогия. вот попроще: я создаю view:

Код: Выделить всё

create view MyView as select name as FirstName, LastName as Name from MyTable
затем я хочу получить поле Name из этого view

Код: Выделить всё

select Name from MyView
а вы мне возвращаете Name из MyTable, так как вам кажется, что это логично и все пользователи хотят именно этого. представьте мое удивление. и единственный способ - это не пользоваться моим view
А главное, в документации это не описано!

Dimon
Сообщения: 6
Зарегистрирован: Ср 17 дек 2014 08:13

Re: Заполнение параметров ХП по MasterSource связи

Сообщение Dimon » Ср 21 дек 2016 14:53

В вашем примере как раз значение будет браться из поля Name из MyView. Т.е. имено так, как Вы хотите.

Ответить