Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
FOGOT-BAstA Member Откуда: Сообщений: 197 |
Добрый день! Может кто-нибудь подскажет где кроется решение проблемы! В БД 2 таблицы - мастер - Remont и детейл - Dannie_Komissia_Remont (список комиссии ФИО и должность), в делфи (Сиэтл) использую компоненты ADO, соединены по первичному ключу ID_Remont основной таблицы. В Делфи хочу, чтобы в детейл добавлялись поля из не связанной таблицы Sotrydnik (список персонала ФИО и должность). Вешаю на нажатие кнопки такой код: if(ADOQuery19.Active) then ADOQuery19.Close; ADOQuery19.SQL.Add('INSERT INTO Dannie_Komissia_Remont (ID_Remont, FIO, Dolznost) SELECT ID_Remont='''+ADODataSet1.FieldByName('ID_Remont').AsString+''', FIO, PDKK FROM Sotrydnik WHERE PDKK IN (''Заместитель председателя комиссии'',''Член комиссии'') ORDER BY PDKK,FIO DESC'); ADOQuery19.ExecSQL; ADOTable1.Close; ADOTable1.Open; Работает не корректно - в первый раз когда создаешь новую запись всё нормально, в связанную таблицу заносятся записи (4шт.) с нужным ID и потом на форме всё отображается. Когда во вторую новую запись вставляю комиссию - в БД уже заносятся записи с текущим и предыдущим ID (8шт.) и так далее, все предыдущие записи обрабатываются, что ,естественно, не правильно - должны записываться только с текущим ID, на котором стоит курсор! Уже дня три понять не могу в чём проблема. Есть какие идеи в чем кроется проблема? В настройках компонент ADO или в базе что-то надо подкрутить? А может я опять всё не правильно сделал? Заранее спасибо сочуствующим )) |
7 дек 18, 12:56 [21756930] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8320 |
FOGOT-BAstA, какие еще ID? Вы выбираете все строки по условию ''Заместитель председателя комиссии'',''Член комиссии''. Добавьте в выражение фильтра WHERE and not exists (select ...), если не хотите выбирать существующие. |
7 дек 18, 13:11 [21756957] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2396 |
так вы скажите об этом серверу базы данных. с помощью волшебного слова WHERE |
||
7 дек 18, 13:19 [21756970] Ответить | Цитировать Сообщить модератору |
iiyama Member Откуда: Сообщений: 642 |
FOGOT-BAstA, Немного офф, для передачи значений в запрос используйте параметры. Собирать так запрос-дурной тон. |
7 дек 18, 14:19 [21757071] Ответить | Цитировать Сообщить модератору |
FOGOT-BAstA Member Откуда: Сообщений: 197 |
Спасибо за ответы! В менеджере SQL запрос выполняется правильно, в таблицу при указании конкретного ID_Remont в Dannie_Komissia_Remont добавляется необходимые 4 записи.
StarikNavy, ID_Remont='''+ADODataSet1.FieldByName('ID_Remont').AsString+''' Вот тут я ведь указываю конкретный текущий ID из Датасета, который надо внести в те 4 строки, которые выбираются из Sotrydnik. Как-то по другому сделать можно средствами SQL? Странно, что при внесении записей из Delphi добавляет вновь созданные в сессии ID_Remont в выборку iiyama, С параметрами постоянный гемор, надо их определять правильно...дольше возиться, уж привык напрямую писать |
||
10 дек 18, 08:10 [21758770] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
Really? А потом кто-нибудь из вредности заведет тебе в поле ID_remont значение
', '', ''; DROP TABLE Dennie_Komissia_Remont; SELECT 1'
и будешь ты по-старинке на форуме вопрошать "доколе?!" |
||
10 дек 18, 11:14 [21758881] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8320 |
FOGOT-BAstA, выбирайте по cdjtve фильтру, но исключите те ID которые уже перенесены, я об этом писал. Исключить можно использую not exists(). |
10 дек 18, 12:41 [21759002] Ответить | Цитировать Сообщить модератору |
FOGOT-BAstA Member Откуда: Сообщений: 197 |
Руслан Дамирович, Успокойтесь, таких вопросов от меня пока не было и не будет. Тем более ID напрямую беру из DataSet'а, параметр тоже его брать будет оттуда же, так какая разница? Поле инкрементное, ключевое, числовое, пользователь его не видит и оно защищено от редактирования. Свои теоретические домыслы оставьте при себе. А если пользователь сможет в приложении каким-то образом написать SQL код с такими записями, то это уже не вопрос передачи параметров... Владислав Колосов, Спасибо, теперь вроде стало более понятно, что Вы имели ввиду. Но в таком случае думаю надо дописывать большой алгоритм считывания всех предыдущих ID, которые были введены в сессии. Я всё-таки грешил на компонент ADOQuery, в обработчике кнопки написал вот так if(ADOQuery19.Active) then ADOQuery19.Close; ADOQuery19.SQL.Add('INSERT INTO Dannie_Komissia_Remont (ID_Remont, FIO, Dolznost) SELECT ID_Remont='''+ADODataSet1.FieldByName('ID_Remont').AsString+''', FIO, PDKK FROM Sotrydnik WHERE PDKK IN (''Заместитель председателя комиссии'',''Член комиссии'') ORDER BY PDKK,FIO DESC'); ADOQuery19.ExecSQL; ADOQuery19.SQL.Clear; ADOQuery19.Close; ADOTable1.Close; ADOTable1.Open; и всё стало вводиться корректно... |
13 дек 18, 09:44 [21762452] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |