Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с запросом Insert 
:(
    Опции темы
Jonnik
Дата 1.3.2011, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



Подскажите насчет запроса.
База находится в Access соедина с делфи через ADO.
Выдает ошибку, что пропущен оператор. Не могу понять какой оператор.
Все поля в таблице текстовые
Сам запрос:

Код

INSERT INTO Oper( N, Val, Date_O )
VALUES ( "'+s+'","SELECT Operator.N FROM Operator WHERE (Operator.ID="'+s2+'")","'+s3+'" ) ;


Это сообщение отредактировал(а) Jonnik - 1.3.2011, 00:45
PM MAIL   Вверх
Данкинг
Дата 1.3.2011, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



А с чего ты взял, что подобная конструкция сработает на Access? Вот я попробовал:
Код

insert into cdrom (info) values (select info from cdrom where q=26)

И Access выдал "ошибка синтаксиса". В то время как простой запрос работает:
Код

insert into cdrom select *  from cdrom where q=26



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Antimol
Дата 1.3.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 28.7.2007
Где: Украина, Киев

Репутация: 4
Всего: 4



К тому же эта конструкция если бы работала то только в том случае когда выражение:
Цитата

Код

SELECT Operator.N FROM Operator WHERE (Operator.ID="'+s2+'")


возвратит только одно значение.

Инструкция гласит что синтаксис таков:
Код

INSERT INTO конечный_объект [(поле1[, поле2[, ...]])] VALUES (значение1[, значение2[, ...])

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

Это сообщение отредактировал(а) Antimol - 1.3.2011, 11:50
--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
Jonnik
Дата 1.3.2011, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



Спасибо за объяснения, но у меня всеравно не получается.

В общем необходимо из таблицы Operator перенести три поля в таблицу Otob_Oper.
Первое и третье поле тупо переносятся, а для второго поля надо сначало узнать по ID его значение в таблице Val. Я эту проблему решил, но она решается тремя запросами, а это много писанины. Вопрос как сделать эту операцию одним запросом к базе?
Вот пример кода:
Код

Form1.ADOQuery2.Close;
  Form1.ADOQuery2.SQL.Clear;
  Form1.ADOQuery2.SQL.Add('SELECT Operator.*');
  Form1.ADOQuery2.SQL.Add('FROM Operator ;');
  Form1.ADOQuery2.Open;
  while not Form1.ADOQuery2.Eof do
      begin
        s:=Form1.ADOQuery2.Fields.Fields[1].AsString;
        s1:=Form1.ADOQuery2.Fields.Fields[2].AsString;
        s2:=Form1.ADOQuery2.Fields.Fields[3].AsString;
        Form1.ADOQuery4.Close;
        Form1.ADOQuery4.SQL.Clear;
        Form1.ADOQuery4.SQL.Add('SELECT Val.N_Val');
        Form1.ADOQuery4.SQL.Add('FROM Val WHERE (Val.ID_Val='+s1+') ;');
        Form1.ADOQuery4.Open;
        while not Form1.ADOQuery4.Eof do
          begin
            s1:=Form1.ADOQuery4.Fields.Fields[0].AsString;
            Form1.ADOQuery5.Close;
            Form1.ADOQuery5.SQL.Clear;
            Form1.ADOQuery5.SQL.Add('INSERT INTO Otob_Oper( N_O, Val, Date_O ) ');
            Form1.ADOQuery5.SQL.Add('VALUES ( "'+s+'","'+s1+'","'+s2+'" ) ;');
            if(Form1.ADOQuery5.ExecSQL=1)then qw:=1;
            Form1.ADOQuery4.Next;
          end;
        Form1.ADOQuery2.Next;
      end;

PM MAIL   Вверх
Antimol
Дата 2.3.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 28.7.2007
Где: Украина, Киев

Репутация: 4
Всего: 4



Ну что ж, немного разобравшись с вышеприведенным кодом, создал БД. Думаю она будет похожа на оригинал:
Вы писали что:
Цитата

Все поля в таблице текстовые

Это очень интересно, но все же, создал текстовые поля.
Operator 
N_O
ID_VAL
Date_O
Otob_Oper
N_O
Val
Date_O
Val
ID_VAL
N_VAL

Теперь приступим к кодированию. Тестируем запрос в Аксес.

Код

INSERT INTO Otob_Oper(N_O, VAL, Date_O) SELECT Operator.N_O, Val.N_VAL AS VAL, Operator.Date_O FROM Operator,VAL WHERE VAL.ID_VAL = OPERATOR.ID_VAL


О чудо оно работает, а про это еще писал Данкинг 
Цитата

Код

insert into cdrom select *  from cdrom where q=26 



Ладно, теперь переходим к кодированию на делфи. Размещаем на форме ADOConnection1 - настраиваем подключение к БД. размещаем там же ADOQuery1 - настраиваем. Размещаем кнопку, по нажатию на которою будет выполняться запрос. На событие кнопки onClick пишим код:

Код

  try
    with ADOQuery1 do
    begin
      sql.text:='INSERT INTO Otob_Oper(N_O, VAL, Date_O) SELECT Operator.N_O, Val.N_VAL AS VAL, Operator.Date_O FROM Operator,VAL WHERE VAL.ID_VAL = OPERATOR.ID_VAL';
      ExecSQL;
      ShowMessage('Операция удачно завершена');
    end;
  except
    on E:Exception do ShowMessage('Ошибка:'+E.Message);
  end;

Момент истины пришел. Запускаем, нажимаем и видим что? правильно "Операция удачно завершена". Так смотрим программа правильно работает или нет. Открываем Аксес и что видим - все ОК.

Ну это так у меня, у вас может не получиться, но ничего не расстраиваемся, пробуем снова и снова, пока не получиться. 

Кстати можно писать просто
Код

 with ADOQuery1 do
    begin
      sql.text:='INSERT INTO Otob_Oper(N_O, VAL, Date_O) SELECT Operator.N_O, Val.N_VAL AS VAL, Operator.Date_O FROM Operator,VAL WHERE VAL.ID_VAL = OPERATOR.ID_VAL';
      ExecSQL;
      ShowMessage('Операция удачно завершена');
    end;

--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
Jonnik
Дата 2.3.2011, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



Спасибо. Все верно.
Но есть маленькая проблема в этом месте: VAL.ID_VAL = OPERATOR.ID_VAL

VAL.ID_VAL это цифровой параметр, а OPERATOR.ID_VAL текстовый поэтому  происходит сравнение числа и строки. Как в этом случае быть?

Это сообщение отредактировал(а) Jonnik - 2.3.2011, 21:43
PM MAIL   Вверх
Antimol
Дата 3.3.2011, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 28.7.2007
Где: Украина, Киев

Репутация: 4
Всего: 4



Цитата(Jonnik @ 2.3.2011,  19:32)
Спасибо. Все верно.

Пожалуйста.
Цитата(Jonnik @ 2.3.2011,  19:32)

Но есть маленькая проблема в этом месте: VAL.ID_VAL = OPERATOR.ID_VAL    
VAL.ID_VAL это цифровой параметр, а OPERATOR.ID_VAL текстовый поэтому  происходит сравнение числа и строки. Как в этом случае быть?

План действий:
1. (Изменяем таблицу VAL.ID_VAL - цифровое поле, OPERATOR.ID_VAL - текстовое ). Тестируем запрос в Access:

Код

INSERT INTO Otob_Oper(N_O, VAL, Date_O) SELECT Operator.N_O, Val.N_VAL AS VAL, Operator.Date_O FROM Operator,VAL WHERE VAL.ID_VAL = OPERATOR.ID_VAL

Результат: Говорит что типы у нас разные

2. Задаем вопрос: Что нужно сделать???? Ответ: Преобразовать тип, к примеру с текста в число
3. Ищем как преобразовать параметр. Ответ: находим функцию CInt
4. Тестируем снова, но уже с функией CInt

Код

INSERT INTO Otob_Oper ( N_O, VAL, Date_O )
SELECT Operator.N_O, Val.N_VAL AS VAL, Operator.Date_O
FROM Operator, VAL
WHERE VAL.ID_VAL = CInt(OPERATOR.ID_VAL);

Результат: работает. 
--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
Jonnik
Дата 5.3.2011, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



Спасибо за консультацию


Это сообщение отредактировал(а) Jonnik - 5.3.2011, 12:45
PM MAIL   Вверх
Jonnik
Дата 5.3.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 9.2.2006

Репутация: нет
Всего: нет



Я кончно извеняюсь, но что то я никак не могу сделать эти два запроса в один.
Я не могу понять как вставить первый запрос вместо переменно s8?

Код

                                    with Form1.ADOQuery2 do
                                      begin
                                        Close;
                                        sql.text:='SELECT G.ID FROM G WHERE (G.GA="")';
                                        Open;
                                        while not Eof do
                                          begin
                                            s8:=Fields.Fields[0].AsString;     /
                                            Next;
                                          end;
                                      end;
                                     with Form1.ADOQuery2 do
                                      begin
                                        Close;
                                        sql.text:='INSERT INTO S(Kod,ID_Gor) VALUES ("'+kod+'",'+s8+')';
                                        ExecSQL;
                                      end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.