|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Добрый день, коллеги! Возникла небольшая проблемка ... Имеется таблица, у которой в расширенных свойствах полей описаны заголовки столбцов, условия ограничения и т.д. Хочется создать таблицу, в которой каждому полю таблицы соответствовала одна строка. Например, есть столбец1 у которого определено только имя, есть столбец2 у которого определены другие свойства... Поле1 MSCaption Код Поле2 MSCaption Поле2 Поле2 MSDescription Это поле2 Поле2 ValidationRule >1 and < 999 Поле3 ValidationRule >#01.01.2019# AND < #01.01.2020# Поле3 ValidationText "Сеньёр, Вы не правы!" Что хочется? Создать таблицу для передачи по запросу из стороннего приложения в виде: Поле Заголовок Описание Ограничения Сообщение_об_ошибке Поле1 Код Поле2 Поле2 Это поле2 >1 AND < 999 Поле3 >#01.01.2019# AND < #01.01.2020# "Сеньёр, Вы не правы!" Причем, в столбцах, для которых нет введенного ранее значения, выводилась пустая строка "" Т.е. Поле Заголовок Описание Ограничения Текст Поле1 Код "" "" "" Поле2 Поле2 Это поле2 >1 and < 999 "" Поле3 "" "" >#01.01.2019# AND < #01.01.2020# "Сеньёр, Вы не правы!" Причем, если в расширенных свойствах нет описания заголовка (MSCaption), выводилось бы имя столбца из описания таблицы (Field1, Field2 ...) Прошу помощи у уважаемого сообщества в решении моей, наверное не сильно сложной задаче. С благодарностью .... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2020, 12:42 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
edward_sh, чуток не так. Расширенные свойства надо определять у ограничения, а не у таблицы. Если возникает исключение ограничения, то информацию о таблице, столбце и ограничении можно извлечь из сообщения об ошибке. Зная "координаты" можно получить текст расширенного свойства и вернуть его клиенту. Надо иметь в виду, что сообщения могут отличаться для разных языков подключения. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2020, 14:11 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Добрый день Владислав Колосов! Задача стоит несколько иная. Будет приложение на С++, в котором надо отобразить таблицу. Чтобы правильно отобразить столбцы по заголовкам и контролировать правильность ввода на этапе формы, мне и нужно вытянуть расширенные свойства полей из таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2020, 16:13 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
edward_sh, В таком случае, вы разрабатываете приложение с высоким уровнем связности. Например, при каких-то изменениях в базе, например, переименовании или разделении таблицы придется переписывать код приложения. С дрогой стороны, можно перейти на более высокий уровень абстракции, т.е. вместо связи объектов использовать интерфейсы. В качестве интерфейса может выступать хранимая процедура. С помощью процедуры можно запросить описание параметров и передать эти параметры серверу, который сам определяет проверки и способ хранения. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 13:05 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Добрый день, коллеги! Как описывал ранее, потребовалась функция, которая возвращала бы расширенные свойства всех полей заданной таблицы. Делается это для того, чтобы в стороннем приложении (в частности CBuilder): 1) Все столбцы имеют русское название (у кого есть - это проблема приложения) 2) Если зачесалась моя левая пятка и я поменял название столбца с "Код" на "Счетчик", то он изменится у ВСЕХ пользователей и нет необходимости править стороннее приложение. 3) Зачесалась моя правая пятка и я изменил правило на значение, оно изменится у ВСЕХ пользователей без необходимости править стороннее приложение. 4) и т.д. Естественно, все это происходит на этапе формирования формы стороннего приложения... Пока гуру SQL скромно обходят своим вниманием эту тему, пришлось тщательно прошерстить тырнет и скомпилировать примеры в работоспособный пример. SELECT * FROM ( SELECT clmns.name AS ColumnName, p.name AS ExtendedPropertyName, CAST(p.value AS sql_variant) AS ExtendedPropertyValue FROM sys.objects o INNER JOIN sys.all_columns clmns ON clmns.object_id = o.object_id INNER JOIN sys.extended_properties p ON p.major_id = o.object_id AND p.minor_id = clmns.column_id AND p.class = 1 WHERE (o.type IN ('U', 'V')) AND (o.name = 'Имя_таблицы_в_БД') AND (p.name = 'Name' OR p.name = 'OrdinalPosition' OR p.name = 'Type' OR p.name = 'Size' OR p.name = 'MS_Caption' OR p.name = 'MS_Description' OR p.name = 'ValidationRule' OR p.name = 'ValidationText') )PropTable PIVOT (MAX(ExtendedPropertyValue) FOR ExtendedPropertyName IN ([OrdinalPosition], [Type], [Size], [MS_Caption], [MS_Description], [ValidationRule], [ValidationText])) AS pvt ORDER BY CAST(OrdinalPosition AS INT) ASC; Что имели до и после 1) Все параметры расположены в одном столбце (исходно) 2) Развернули строки по полям (выход) Осталось найти, где хранятся соответствие кодов типов данных и их описанием (например, 8 = datetime), а также как заменить в выходном наборе данных заменить числовой код словесным описанием. [img=] [img=] ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 17:21 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Не смог сразу вставить вторую картинку Вариант после разворачивания таблицы по столбцам ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 17:35 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
хранить заголовки библиотеки в вертикальном виде - это какой то антиsql хранить в ненормальной форме для того, что бы потом конвертировать в нормальную Примените пожалуйста Правило №1: если у вас что то не получается даже после гугления и подглядывания за аналогами - значит вы что то делаете совсем не так (ну или у вас супер уникальная задача, которую до вас никто не решал) edward_sh Если зачесалась моя левая пятка и я поменял название столбца с "Код" на "Счетчик", то он изменится у ВСЕХ пользователей и нет необходимости править стороннее приложение. Это называется "я пилю свой велосипед фреймворк". Если вы хотите абстрагироваться и хранить структуры в БД, то смотрите как устроены фреймворки на вашем языке. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 18:07 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Извините, но это не я храню так, а MS SQL сервер :) Я только пытаюсь представить их в удобоваримом виде. Закомментируйте секцию PIVOT и убедитесь в этом... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 18:18 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
edward_sh, так в общем-то, не делают. Если хотите создать корпоративное клиент-серверное приложение, то должны отвязать модель отображения от модели хранения. Это выполняется при помощи хранимых процедур и функций. Воле-неволей Вам потребуется найти SQL разработчика или закатать рукава самому. Если прямо аж горит как напрямую обращаться к модели данных, то Ваше решение приемлемо. Однако если есть хоть малейшее подозрение на его масштабирование рано или поздно всё зайдёт в тупик из-за нелинейного объема изменений, который придется выполнить. Например, Вы начинаете понимать, что приложение работает медленно. Копаете, пока не обнаруживаете, что модель хранения данных, к примеру, денормализованная "простыня", требует нормализации ввиду постоянно возникающих ожиданий доступа. И вы должны пилить как клиента, так и модель данных потому, что клиент напрямую обращается к таблицам. Через некоторое время внедрение нового функционала начнет занимать полгода, затем год, затем Вы банкрот. Всё это не новости, это практика. Поищите книги о рефакторинге, в том числе о рефакторинге баз данных, там это всё отлично описано. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 18:28 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Владислав Колосов, поэтому я "закатал рукава" и оформил этот скрипт как хранимую процедуру. Бизнес-логика должна хранится на сервере данных - она и храниться. Клиентское приложение получает данные по запросу. Управляется централизованно... Что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 18:39 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
edward_sh Осталось найти, где хранятся соответствие кодов типов данных и их описанием (например, 8 = datetime), а также как заменить в выходном наборе данных заменить числовой код словесным описанием. ... только в ней datetime не равно 8, а =61 ... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 10:54 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
edward_sh, как-то так: Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 11:40 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
edward_sh Владислав Колосов, Бизнес-логика должна хранится на сервере данных - она и храниться. ... Что не так? она (у вас) хранится НЕПРАВИЛЬНО :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 12:21 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
StarikNavy она (у вас) хранится НЕПРАВИЛЬНО :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 12:24 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Спасибо, court! Обязательно посмотрю там, возможно и оттуда возможно будет вытащить данные. Таблица была импортирована из Access, тогда возможно, тип datatime 8 - это access кодировка типов данных. Действительно в MS SQL datetime имеет код 61. Буду думать... Интересно, есть ли описание "стандартных" расширенных свойств полей? Наверняка же параметр MS_Caption не от фонаря назначается. То Владислав Колосов - я пробовал эту функцию. Мне не удалось завернуть ее в PIVOT. Сервер отчаянно ругался, не помню уж об чем. Поэтому и пришлось искать пути через чтение таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 16:56 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
edward_sh Наверняка же параметр MS_Caption не от фонаря назначается. Если создавать обычным create table ... - никаких расширенных свойств не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 17:15 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
edward_sh, зачем поворот, не пойму? Результат точно такой же,как у Вас на картинках, по строке на колонку. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 17:18 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Кажется, понял - надо развернуть несколько расширенных свойств в колонки... Ну это как-то не очень, получите резалтсет с неопределенным количеством столбцов. Чтобы такое запрограммировать на SQL надо использовать динамический запрос или переписывать его по мере изменения таблицы. На клиенте реализовать поворот проще, по-моему. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 17:32 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Уважаемый StarikNavy, просвятите, если не трудно, как по-фэншую должна храниться бизнес-логика? То Владислав Колосов - доберусь до сервера - проверю Ваше предложение. Структура запроса может меняться редко и слегка подправить приложение - не проблема, динамический запрос - тема другого разговора, если в нем возникнет необходимость. Клиент должен съесть только то, что ему отдали. Проблемы приложения, как оно его разгребет... То buser - простите мою некомпетентность, что есть EAV? Уважаемые джентельмены, а есть ли утилитка, которая преобразует базу access в таблицу MS SQL? Штатными средствами и access и MS SQL сервера таблицы переносятся, но все ограничения игнорируются. Имеется проект-прикидка для миграции на SQL сервер, не хочется все свойства полей переписывать руками. А таблиц более 40 ... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 18:19 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
edward_sh Бизнес-логика должна хранится на сервере данных - она и храниться. Что не так? Бизнес логика должна храниться в приложении (на бекенде), а данные - в базе данных. Вы пытаетесь засунуть правила И логику в базу. Конечно же с благой целью flexibility, которая (цель) как обычно вымащивает дорогу известно куда. Для больших и сложных приложений это может быть оправдано (и то, конфигурационные файлы чаще тупо удобнее), но у вас то я не уверен, что приложение на продажу и соответствующего масштаба. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 07:32 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
PizzaPizza, не совсем понятное утверждение. Логика обработки данных - это тоже часть бизнес логики. И её удобно держать на сервере в виду хранимых процедур, отделяя обработку данных от интерфейса. Паттерн модель - представление - контроллер. Представление реализует клиентское приложение, контроллер реализует база данных (процедуры, триггеры и так далее) или совместно с сервером приложений. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 12:46 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Основная проблема, которую я хочу решить таким образом - это "автоматическое" изменение отображения данных на форме приложения (не важно на чем оно написано). Также, если я допустил где-то ляп в наложении ограничений на поля и исправил это, необходимо перекомпилировать приложения и заменить их у пользователей. Также, если ужесточились ограничения, например вместо диапазона дат 2017 - 2050 я решил ввести 2020-2050. Скомпилированное приложение, при скомпилированном коде с встроенными ограничениями честно пропустит старый диапазон дат и получит отлуп от сервера, поскольку там уже другие ограничения. Задуманное мною не ново - приложение запрашивает сервер о полях таблицы через вьюшку или процедуру. Получает в ответ как называются поля по-русски и список ограничений на поля. Прикладная программа на этапе построения формы рассовывает эти ограничения по полям. Таким образом получается "автоматическая" синхронизация правил сервер-приложение. Согласитесь, что отлавливать ошибки на уровне ввода в форму гораздо лучше, чем отправив запрос на сервер, ожидая получить ответ от него, получаешь сообщение об ошибке. Вторая причина не менее банальна. Я не считаю себя гуру программирования и эстетом в конструировании форм. Возможно, найдется умелец, который захочет написать свой интерфейс к БД на другом языке. И тогда мне придется каждому объяснять что как называется, чем ограничивается. А здесь все проще - запросил - получи. И делай с этим все что хочешь... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2020, 04:19 |
|
Нужна помощь по формированию таблицы
|
|||
---|---|---|---|
#18+
Владислав Колосов PizzaPizza, Логика обработки данных - это тоже часть бизнес логики. И её удобно держать на сервере в виду хранимых процедур, отделяя обработку данных от интерфейса. когда логика сложная, то может быть удобнее бекенд держать не в ХП, а как приложение с апи (да, на сервере). Тем более, если хочется гибкости, то ХП это будет многовато кода. У edward_sh желание хранить в базе всю логику и структуру, что, имхо, излишне при ему требуемом уровне абстракции - судя по всему это вполне конкретное приложение с конкретным функционалом, а не фреймворк. Просто надо писать документацию, и не будет проблем с изменением структуры и правил. edward_sh приложение запрашивает сервер о полях таблицы через вьюшку или процедуру. Получает в ответ как называются поля по-русски и список ограничений на поля. Прикладная программа на этапе построения формы рассовывает эти ограничения по полям. Ну так плоская таблица с ограничениями и админка для менеджмента этой таблицы будет более чем достаточно. Зачем поворачивать тут что то. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2020, 18:10 |
|
|
start [/forum/topic.php?fid=46&msg=39918667&tid=1686571]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 348ms |
total: | 465ms |
0 / 0 |