Программы "Простой софт" www.prostoysoft.ru

ВНИМАНИЕ! РЕКЛАМНЫЕ СООБЩЕНИЯ И ГИПЕРССЫЛКИ В ФОРУМЕ ЗАПРЕЩЕНЫ (посты удаляются автоматически)
Текущее время: 22.11.2024 20:10

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: 16.06.2014 16:51 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
VBScript внутри запроса нельзя. Подзапросы select в скобках можно, как в сам запрос, так и без этого. Их количество ограничено. Если надо неограничено, то создавайте подчиненную таблицу, и это будет правильно.
Можно построить ниспадающий список с множественным выбором и формулой типа:
SELECT Name ... WHERE ID=1 UNION SELECT Name ... WHERE ID=2...
В Галерее см. скриншот №9 "Документы".

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16.06.2014 21:24 
Не в сети

Зарегистрирован: 15.04.2014 10:50
Сообщения: 58
Ivan писал(а):
VBScript внутри запроса нельзя. Подзапросы select в скобках можно, как в сам запрос, так и без этого. Их количество ограничено.

Зачем подзапросы, если условия можно объединять логическим OR?
Ivan писал(а):
Если надо неограничено, то создавайте подчиненную таблицу, и это будет правильно.

Т.е. для каждой записи Альбовом делать две подчиненные таблицы, в одной из которых писать, какие треки он содержит, а в другой - каких артистов? Ну если с первой я могу понять, т.к. там еще и порядок треков содержится, а делать вторую только ради того, чтобы потом запрос из нее "клеить" в строку? Не поняно...
Ivan писал(а):
Можно построить ниспадающий список с множественным выбором и формулой типа:
SELECT Name ... WHERE ID=1 UNION SELECT Name ... WHERE ID=2...
В Галерее см. скриншот №9 "Документы".

А чем это отличается от SELECT Name ... WHERE ID=1 OR ID=2?
Да не в этом суть... Возвращается таблица со строками, а мне нужна ячейчка в таблицу...
В общем, понимаю, что не реально... Видимо, придется делать VBS-триггер, который после изменения наименования исполнителя обновляет один раз всю базу. Но мне это решение крайне не симпатично...

_________________
Все сообщения относятся к программе "Мои диски" версии 2.х, актуальной на момент написания.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16.06.2014 23:26 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
>Т.е. для каждой записи Альбомов делать две подчиненные таблицы
Да, так. Подчиненных таблиц может быть много. Это стандартный подход.

>только ради того, чтобы потом запрос из нее "клеить" в строку?
А зачем надо это склеивание? -Ну, надо - так надо, тогда клейте.
Создайте максимальное количество вычисляемых полей с подзапросами, возвращающими имена по ID-ам. Допустим 5 или 10. Вряд-ли будет больше исполнителей.
А потом одно поле, конкатенирующее их значения через запятую в одном поле.

>А чем это отличается от SELECT Name ... WHERE ID=1 OR ID=2?
Можно написать, например так:
SELECT Name1 FROM qdfTable1 WHERE ID=1 UNION SELECT Name2 FROM qdfTable2 WHERE ID=2...

>после изменения наименования исполнителя
А что это за операция такая? Исполнители (равно как и люди вообще любого типа) крайне редко меняют свои имена.
Поэтому всерьез можно рассматривать только опечатку. А это нестандартная, нештатная операция, и в этом случае вполне допустимо, чтобы пользователь сделал больше телодвижений.
А если же исполнитель все-таки всерьез изменил свое название, то во всей "истории", которая была раньше, как раз должно остаться его прежнее имя. Это будет правильно.
Лично у меня в паспорте написано "место рождения - г. Ленинград".

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16.06.2014 23:36 
Не в сети

Зарегистрирован: 15.04.2014 10:50
Сообщения: 58
Ivan писал(а):
А что это за операция такая? Исполнители (равно как и люди вообще) крайне редко меняют свои имена.

Этот вариант я не рассматривал :lol: Я об этом рассуждал, когда думал, что писать первым: имя или фамилию. Для поиска лучше фамилию, но так звучит непривычно))) Это уже из разряда косметики, но я перфекционист, не знаю, хорошо это или плохо...
Ivan писал(а):
А потом одно поле, конкатенирующее их значения через запятую в одном поле.

Можно подробнее, как это сделать? Разбивать поле по разделителю я уже научился :)

_________________
Все сообщения относятся к программе "Мои диски" версии 2.х, актуальной на момент написания.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17.06.2014 10:42 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
Поподробнее, что такое конкатенация, см. скриншот. А также в поисковике по этому слову.


Вложения:
Pic1.JPG
Pic1.JPG [ 68.33 КБ | Просмотров: 80010 ]

_________________
2B OR NOT 2B = TRUE
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17.06.2014 14:25 
Не в сети

Зарегистрирован: 15.04.2014 10:50
Сообщения: 58
Что это такое, я знаю, спасибо. Примерно понял, как надо действовать.

Вы относительно первого вопроса о подчиненной таблице обращение в ТП получили?

_________________
Все сообщения относятся к программе "Мои диски" версии 2.х, актуальной на момент написания.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22.06.2014 16:42 
Не в сети

Зарегистрирован: 15.04.2014 10:50
Сообщения: 58
Orion33 писал(а):
Решил проверить, что будет при добавлении из формы "Композиции альбома". Запрос изменил, убрав признак вычисляемого поля:
SELECT c.*, A.ID AS AlbumID, t.CompositionID AS CompID FROM (tblCompositions AS c LEFT JOIN tblTracks AS t ON c.ID = t.CompositionID) LEFT JOIN tblMain AS A ON t.AlbumID = A.ID
По-прежнему выскакивает такая ошибка:
Вложение:
PIC4.png

С этим разобрался. Ошибка была в том, что я формировал запрос из трех таблиц, в одной из которых брал ключевое поле и по нему делал связь "Один ко многим". Естественно, при попытке добавления записи движок программы генерировал строки во всех трех таблицах, что порождало ошибку в основной таблице Альбомы: при добавлении строки в связанной таблице поле, по которому осуществляется связь, заполняется автоматически и для редактирования не доступно. После замены выделенной части запроса на t.AlbumID AS AlbumID все заработало. Фактически аналогия рекурсивного вызова :)

Однако теперь есть еще один нюанс. Для автоматического заполнения поля CompositionID в приджойненной таблице я использую запрос максимального ID в таблице Композиции и добавляю 1. Это хорошо работает до тех пор, пока не происходит отмены ввода. В этом случае счетчик таблицы инкрементируется, но запись не добавляется. Т.о. при следующем добавлении счетчик имеет уже инкремент +2, а в CompositionID вносится значение +1, поскольку я запрашиваю максимальное записанное значение ID.

Вопрос: как узнать актуальное значение счетчика таблицы?

_________________
Все сообщения относятся к программе "Мои диски" версии 2.х, актуальной на момент написания.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.06.2014 10:31 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
>Вопрос: как узнать актуальное значение счетчика таблицы?
SELECT @@IDENTITY в случае Access.
А при MS SQL - SELECT IDENT_CURRENT('имя_таблицы')

Подобные вопросы чисто по СУБД можно также задавать на профильных форумах, например, sql точка ru, в соответствующем разделе.

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.06.2014 11:15 
Не в сети

Зарегистрирован: 15.04.2014 10:50
Сообщения: 58
Цитата:
@@IDENTITY
Contains the last identity value generated in any table in the current session.

Но мне надо сначала узнать счетчик, а потом сформировать запрос. И вообще, судя по описанию, в этой переменной хранится счетчик любой таблицы, к которой было последнее обращение. Как узнать у конкретной?

И еще вопрос: возможно ли запустить триггер при отмене ввода в таблицу? Если записывать данные через подчиненное представление, которое сформировано присоединением таблицы, то отменяется ввод только в главной таблице, а в присоединенной запись появляется.

_________________
Все сообщения относятся к программе "Мои диски" версии 2.х, актуальной на момент написания.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.06.2014 13:00 
Не в сети

Зарегистрирован: 25.04.2012 10:09
Сообщения: 2233
Откуда: Жуковский, Московская область
Orion33 писал(а):
И еще вопрос: возможно ли запустить триггер при отмене ввода в таблицу?
В режиме редактирования в форме -- да.


Вложения:
NewRecordCanceled.jpg
NewRecordCanceled.jpg [ 139.37 КБ | Просмотров: 79948 ]

_________________
90% ответов на ваши вопросы находятся в руководстве, разделах "Вопросы" и "Видео" на нашем сайте.
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.06.2014 13:42 
Не в сети

Зарегистрирован: 15.04.2014 10:50
Сообщения: 58
OMEN писал(а):
В режиме редактирования в форме -- да.

Это относится только к редактированию или добавлению тоже?
Возникает ли это событие после закрытия формы с ДОБАВЛЕНИЕМ записи (т.е. уход со строчки не по ESC, а по стрелке или ENTER)?

Следующий вопрос: почему в таком запросе квадратные и угловые скобки ведут себя одинаково?
Почему при подстановке вставляется текст в кавычках? Из-за этого не работает условие LIKE!


Вложения:
PIC2.png
PIC2.png [ 25.43 КБ | Просмотров: 79947 ]
PIC1.png
PIC1.png [ 59.76 КБ | Просмотров: 79947 ]

_________________
Все сообщения относятся к программе "Мои диски" версии 2.х, актуальной на момент написания.
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.06.2014 14:55 
Не в сети

Зарегистрирован: 15.04.2014 10:50
Сообщения: 58
И можно ли каким-нибудь образом отменить из триггера ввод в таблицу? Т.е. вызвать событие "Закрытие формы"?

_________________
Все сообщения относятся к программе "Мои диски" версии 2.х, актуальной на момент написания.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.06.2014 15:09 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
Внутренняя команда
PressButton "Отмена"
закроет форму для редактирования. Ее можно вызвать из триггера.

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.06.2014 17:29 
Не в сети

Зарегистрирован: 15.04.2014 10:50
Сообщения: 58
Как именно вызвать из триггера, ежели его тип SQL запрос?
А по остальным вопросам как?

_________________
Все сообщения относятся к программе "Мои диски" версии 2.х, актуальной на момент написания.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28.06.2014 10:46 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
>Как именно вызвать из триггера, ежели его тип SQL запрос?
А как бы Вы ответили на вопрос "Почему Володька сбрил усы?" ))
Если вопросы противоречивые, на них нет ответа.

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB