Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/28: Рейтинг темы: голосов - 28, средняя оценка - 4.79
7 / 7 / 0
Регистрация: 13.09.2009
Сообщений: 263
1

Запрос в Delphi, параметрический запрос, обновление строки

07.08.2011, 21:59. Показов 5774. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Продолжение темы Запрос на обновление строки в таблице
Вот запрос на добавление записи из одной таблицы в другую.
2 таблицы tovar и prihod. Поля: [Наименование], [Цена], [Количество].
Данные добавляются из prihod в tovar.
Если добавляем запись из prihod, где поля [Наименование] и [Цена] уже есть в tovar, значит меняется только [Количество], т.е. плюсуется.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE @Col INT,
        @Cena money,
        @Naim nvarchar(50)
        
SET @Col=:koli  -- с этими строками проблема
SET @Cena=:cena -- с этими строками проблема
SET @Naim=:naim -- с этими строками проблема
 
INSERT INTO prihod ([Наименование],[Цена],[Количество]) VALUES (@Naim,@Cena,@Col)
IF EXISTS(SELECT * FROM tovar WHERE [Наименование]=@Naim AND [Цена]=@Cena)
  UPDATE tovar SET [Количество]=[Количество]+@Col WHERE [Наименование]=@Naim AND [Цена]=@Cena
ELSE
  INSERT INTO tovar ([Наименование],[Цена],[Количество]) VALUES (@Naim,@Cena,@Col)
Проблема вот в чём:
Мне нужно этот запрос написать в Delphi, чтобы он срабатывал при нажатии кнопки.
Таблицы заполняются в интерфейсе на Form в DBGrid, т.е.
данные сразу забиваются в таблицу.
И нужно как-то сделать параметрический запрос,
эти строки вот:
SQL
1
2
3
SET @Col=:koli
SET @Cena=:cena
SET @Naim=:naim
Не знаю как правильно записать. Данные, которые будут записываться в таблицу, могут быть какими угодно и надо, чтобы в запросе это было записано в виде параметров, которые будут подставляться из таблицы.

Надеюсь, понятно объяснила, а то всё слишком запутанно...))))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.08.2011, 21:59
Ответы с готовыми решениями:

Не работает параметрический запрос(SQL)(Delphi)
Здравствуй, у меня возникла проблема. Пытаюсь сделать параметрический запрос но ни чего не выходит....

Как сделать параметрический запрос в Delphi
Вот у меня есть параметрический запрос, но нужно сделать диалоговое окно для ввода значения, по...

Параметрический запрос Delphi & Access
Вообщем есть запрос SELECT Фамилия, Имя, Отчество, Дата_рождения, Адрес_проживания,...

Параметрический запрос
вот такое мне надо тапи ввожу первую буквы и нижимаю искать и тут оппа нашол по первой бекве Я...

10
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
07.08.2011, 23:21 2
AC13, ну так либо пишите запрос прямо в обработчике клика кнопки, еще как вариант можно повесить на событие источника данных, просто главное подобрать нужное... а еще лучше повесить на триггер таблицы - после обновления к примеру, если субд такие сущности поддерживает... в общем вариантов решений - море, а что у вас конкретно не выходит?
1
7 / 7 / 0
Регистрация: 13.09.2009
Сообщений: 263
08.08.2011, 00:25  [ТС] 3
Lord_Voodoo, не получается с параметрами.
Вот строки, в которых задаются параметры, их же можно запиать, как значение, которые хотим вставить, например:
SQL
1
2
3
SET @Col=5
SET @Cena=200
SET @Naim='Название'
Но в данном случае это пишется в тексте запроса и запись будет добавляться только с этими значениями.
А у меня эти данные забиваются в программе в таблицу.
т.е. выглядит это так:
Запрос в Delphi, параметрический запрос, обновление строки

И надо как-то сделать в запросе, чтоб значения считывались из полей таблицы и подставлялись в параметры запроса.
И вот как правильно сделать параметрический запрос не знаю ((
0
714 / 402 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
08.08.2011, 00:54 4
Параметры для выборки задаются так:
SQL
1
2
3
4
SELECT Base.ID, Base.Datа......
FROM [WORK] INNER JOIN (TypeWork INNER JOIN.....
WHERE (((YEAR([Base]![DATA]))=:god))
ORDER BY Base.Data,.....
WHERE (((Year([Base]![Data]))=:god))
в запрос введен параметр god

В программе вы пишите:
Delphi
1
2
3
4
dm1.ADOSetka.Active:=false;    {деактивируем таблицу}
dm1.ADOSetka.Prepared:=true;  {хз что это, но надо именно так писать}
dm1.ADOSetka.Parameters.ParamByName('god').Value:=item.Caption; {присваем параметру значение (хоть откудова)}
dm1.ADOSetka.Active:=true;   {активируем таблицу}
Добавлено через 2 минуты
В АДО (Аксцессовая база) нельзя включить вложенные запросы.
Разбейте их на несколько и обрабатывайте последовательно...
Мелкософтовский SQL - потомственный кастрат...
1
7 / 7 / 0
Регистрация: 13.09.2009
Сообщений: 263
08.08.2011, 01:25  [ТС] 5
Спасибо большое )) Но как всё это будет выглядеть в тексте программы вместе с запросом, т.е. как это правильно оформить?
Вот мой бредовый вариант и я знаю, что так не верно:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Procedure TForm2.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
begin
ADOQuery1.Active:=false;    
ADOQuery1.Prepared:=true;
ADOQuery1.Parameters.ParamByName('god').Value:=item.Caption; 
ADOQuery1.Active:=true;
 
begin
with TADOCommand.Create(nil) do
  try
 
Connection:=Form1.ADOConnection1; 
  
CommandText:=
'DECLARE @Col int,
             @Cena money,
             @Naim nvarchar(50)
INSERT INTO prihod ([Наименование],[Цена],[Количество]) VALUES (@Naim,@Cena,@Col)
IF EXISTS(SELECT * FROM tovar WHERE [Наименование]=@Naim AND [Цена]=@Cena)
UPDATE tovar SET [Количество]=[Количество]+@Col WHERE [Наименование]=@Naim AND [Цена]=@Cena
ELSE
INSERT INTO tovar ([Наименование],[Цена],[Количество]) VALUES (@Naim,@Cena,@Col)';
 
   try
     execute;
   except
   end;
  finally
   Free;
end;
Что куда здесь надо записать?
0
19 / 19 / 0
Регистрация: 22.07.2011
Сообщений: 68
08.08.2011, 09:35 6
Хм, мне помогла замечательная функция делфи format, например:
Delphi
1
QueryText := format('SELECT MyFunc("%s","%s",%u)',[par1,par2,par3]);
Смысл: загоняем каркасс текста запроса с "заготовленными" для переменных местами, после чего в эти "заготовленные" места запихиваем соответствующие параметры. В данном примере par1,par2 - строки, а par3 - целое беззнаковое.
1
Супер-модератор
8783 / 2536 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
08.08.2011, 09:52 7
AC13, set указывается один раз, а потом указываются поле = новое значение через запятую...
а параметры в параметризированном запросе указываются не с собакой, а с двоеточием...
1
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
08.08.2011, 15:10 8
Delphi
1
В АДО (Аксцессовая база) нельзя включить вложенные запросы.
Ну да ? Вот такой запрос

Delphi
1
2
3
4
Select C.* from
(Select B.* from
(Select A.* from
(SELECT *  FROM izd_ztr) A) B) C
"прошуршал" как песня

Delphi
1
Мелкософтовский SQL - потомственный кастрат...
С этого места поподробнее. Начиная с того что такое "мелкософтовский" и заканчивая "кастратом"

Добавлено через 4 минуты
Еще вот этот перл:
Delphi
1
dm1.ADOSetka.Prepared:=true;  {хз что это, но надо именно так писать}
Прежде чем писать, узнали бы у того самого "х". И вовсе не надо, а лишь в некоторых случаях рекомендуется. В справке конечно все подробно написано, но "х", ясен пень, лучше знает
1
7 / 7 / 0
Регистрация: 13.09.2009
Сообщений: 263
08.08.2011, 19:13  [ТС] 9
Всем спасибо, но скажите пожалуйста, куда писать этот текст:
SQL
1
2
3
4
dm1.ADOSetka.Active:=FALSE;  
dm1.ADOSetka.Prepared:=TRUE;  
dm1.ADOSetka.Parameters.ParamByName('god').Value:=item.Caption;
dm1.ADOSetka.Active:=TRUE;
И куда этот текст запроса:
SQL
1
2
3
4
5
6
7
8
DECLARE @Col INT,
             @Cena money,
             @Naim nvarchar(50)
INSERT INTO prihod ([Наименование],[Цена],[Количество]) VALUES (@Naim,@Cena,@Col)
IF EXISTS(SELECT * FROM tovar WHERE [Наименование]=@Naim AND [Цена]=@Cena)
UPDATE tovar SET [Количество]=[Количество]+@Col WHERE [Наименование]=@Naim AND [Цена]=@Cena
ELSE
INSERT INTO tovar ([Наименование],[Цена],[Количество]) VALUES (@Naim,@Cena,@Col)
Не совсем понимаю, как записать запрос подобным образом:
SQL
1
QueryText := format('SELECT MyFunc("%s","%s",%u)',[par1,par2,par3]);
0
19 / 19 / 0
Регистрация: 22.07.2011
Сообщений: 68
08.08.2011, 20:07 10
Цитата Сообщение от AC13 Посмотреть сообщение
Не совсем понимаю, как записать запрос подобным образом
Вот смотри: тебе надо засунуть значения из переменных делфи koli,cena,naim в переменные базы @col,@cena,@naim. Пишем:
Delphi
1
строка := format('SET @col=%u, @cena=%m, @naim="%s"',[koli,cena,naim]);
Например, если твои переменные koli=5, cena = 6.70 и naim='Название', функция format вернет:
'SET @col=5, @cena=6.70, @naim="название"', т.е. именно тот кусок запроса, с которым у тебя проблемы. Вставляем этот кусок в нужное место в комманд тексте и радуемся.
1
7 / 7 / 0
Регистрация: 13.09.2009
Сообщений: 263
08.08.2011, 21:31  [ТС] 11
OK, спасибо большое! ))) Буду разбираться.
0
08.08.2011, 21:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2011, 21:31
Помогаю со студенческими работами здесь

Параметрический запрос
Уважаемые знатоки, подскажите пожалуйста, мне нужно ввести год из даты, как это сделать?

Параметрический запрос!!!!!!
Подскаите плиз!!!!!!!! Имеется форма 'зарплата' с полями: №,Дата,Период,Кому,Сумма. В период...

Параметрический запрос
Не понимаю, как сделать запрос. Вот простой пример. Есть наименование товара, есть его количество....

Параметрический запрос
В общем так Скл запрос: SELECT B.* FROM Benzin B WHERE B.Mark= :B.Mark На кнопке весит вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru