Добрый день, есть CRM v 3.30.49 sql версия.
При переходе в закладке Контрагенты со Все контрагенты на Мои Контрагенты выдает ошибка открытия источника данных ds_Account, Вложенный запрос вернул больше одного значения и т.д.
Ошибка только у этого пользователя у других не проявилась
Нравится
Забыл упомянуть есть фильтр ОбщиеОтветственный текущий контакт
Добрый вечер.
В Вашем случае нужно отладиться и определить, в какой момент возникает ошибка.
Для этого запустите отладчик под пользователем, у которого возникают проблемы, параллельно с этим запустите sql-профайлер (также под этим пользователем) и посмотрите, какие запросы идут в базу.
Это поможет Вам определить причину ошибки и устранить её.
Вот что получилось, пользователь был привязан ответственным к контрагентам, удалил привязку у всех контрагентов кроме одного, при попытке его выбрать быстрым фильтром по наименованию ОШИБКА ОТКРЫТИЯ ИСТОЧНИКА ДАННЫХ DS_ACCOUNT. Что это может быть? дубль? и как его теперь удалить?
Олег, эта ошибка означает, что у Вас в sq_Account есть колонка или фильтр подзапроса, в котором по смыслу должна быть одно значение результата, а реально подзапрос выдаёт несколько.
Вроде:
select * from tbl_A where A = (select A from tbl_B where B = 1)
Тут, если в tbl_B одна запись с B = 1, то хорошо, а если две и более, то будет такая же ошибка. Для предотвращения можно в подзапросе дописывать top 1.
Нужно в профайлере (можно встроенном) отловить этот запрос, после которого выдаёт ошибку, а затем запускать его в СУБД, выясняя, где именно и почему в нём неправильный результат подзапроса.
т.е. дубль ? я правильно понял? запись в sq_Account правильная, она может выбирать например ответственного а там дважды привязали например сотрудника и возникает эта ошибка? не совсем понял где найти запрос sq_Account. я просматриваю таблицы напрямую через SQL Server Management Studio, SQL Query. как там увидеть этот запрос?
Увидеть все идущие от программы в базу запросы можно в SQL Server Profiler.
Запрос я тоже увидел, я имел ввиду где и как его отредактировать?
В TSAdmin исправить sq_Account, если ошибка в нём. Прежде чем что-то изменять, точно выясните, в чём причина выборки нескольких строк в подзапросе.
Oleg Fchuk,
Сами изменения лучше сначала внести на тестовой копии рабочей версии, если все будет в порядке, тогда уже перенести на рабочую версию.
Тут, если в tbl_B одна запись с B = 1, то хорошо, а если две и более, то будет такая же ошибка. Для предотвращения можно в подзапросе дописывать top 1. такой вариант не подходит он выбирает первого попавшегося ответственного, это не точно нужно... В TSAdmin исправить sq_Account там все в виде конструктора, мне нужен код в виде текста он где-то в базе храниться? На сколько я понимаю Вложенный запрос вернул больше одного значения это ограничение SQL. Получается что база спроектирована не правильно не проверяет на уникальность записи (например ключом или тригером ) которые потом выбираются вложенным запросом. Пользователи бездумно лепят записи и возникают ошибки. Нет защиты от дурака. Хорошо с этим понятно, как теперь это исправить? у меня есть запись в tbl_Account которую я могу увидеть только через SQL Query, через оболочку выдает ошибку, что с этим делать?
Oleg Fchuk пишет:
В TSAdmin исправить sq_Account там все в виде конструктора, мне нужен код в виде текста он где-то в базе храниться?
Нигде, на ходу генерируется.
Oleg Fchuk пишет:
На сколько я понимаю Вложенный запрос вернул больше одного значения это ограничение SQL. Получается что база спроектирована не правильно не проверяет на уникальность записи (например ключом или тригером ) которые потом выбираются вложенным запросом.
Где надо, там как раз проверяется.
Oleg Fchuk пишет:
Хорошо с этим понятно, как теперь это исправить? у меня есть запись в tbl_Account которую я могу увидеть только через SQL Query, через оболочку выдает ошибку, что с этим делать?
Дело не в записи, а в условии выборки подзапроса. Для начала, нужно понять, какой. Попробуйте отловить профайлером и потом запускать проблемный запрос прямо в базе и выяснить, в какой его части ошибка возникает.
выяснил следующее подзапрос к таблице tbl_MountedStaff там есть две записи сделанные одним пользователем недавно 05,06,2020 по времени полностью идентичные до секунды 2020-06-05 10:04:17.647 2020-06-05 10:04:17.647. Пользователя вычислил... Вопрос первый не совсем понял что это за таблица и за что она отвечает? Если средствами SQL удалить запись какие будут послествия? Еще в догонку значение поля IsPrimary в таблице tbl_MountedStaff может быть 1 у двух и более записей?
Вероятно, проектная доработка. Сложно сказать, не зная, что за продукт у Вас. Посмотреть заголовок таблицы можно, найдя её в дереве справа в TSAdmin.
Вопрос закрыт сделал апдейт поля IsPrimary одной строки в которой было значение 1 (поменял на 0) в таблице tbl_MountedStaff . Человек говорит что у него при записи зависла программа... Полагаю была не завершена транзакция SQL и получилось две записи с одинаковым значением.
Но ID у них точно должен быть разным, во всех таблицах есть ограничение на уровне базы. Достаточно ли IsPrimary = 0 и можно ли удалять запись, зависит от логики на уровне Вашей системы. Если на обе записи из других таблиц есть ссылки, может потребоваться их скорректировать на оставшуюся или удалить тоже.