Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2011, 20:28   #1
Kolya29
Пользователь
 
Регистрация: 21.10.2009
Сообщений: 22
По умолчанию

Есть задание сделать базу в оракле и упралять через програмулину написанную на делфи. Пока получилось только связать связать все и сделать добавление данных. Добавлял данные через Едит-ы и ДБЛукапБокс-ы, данные для которых брал из справочников БД. В базе есть куча связей. После чего написал запрос на вывод только нужных данных ДБГрид, без всяких внешних ключей и ключевых полей.

Получил нужный список, но как его редактировать ни как не могу придумать. Надо чтобы данные выбранные в ДБГрид-е редактировались в так же в Едит-ах и выберались в ДБЛукапБокс-ах, но для этого надо как то получить ID выбранной записи или есть какой то другой способ?

Может кто еще посоветует где есть книга какая-нибудь или информация по программированию Delphi + Oracle?

Или может хоть кто подскажет, что я делаю не правильно. Хочу например удалить строчку, пишу на действие кнопки:
Код:
ADOQuery3.Active:=False;
ADOQuery3.SQL.Clear;
ADOQuery3.SQL.Add('Delete');
ADOQuery3.SQL.Add('From OBORUD');
ADOQuery3.SQL.Add('Where');
ADOQuery3.SQL.Add('KOD_OBORUDOVANIYA = '+Edit3.Text+'');
ADOQuery3.Active:=true;
вылезат ошибка
ORA-00933: SQL command not properly ended

Последний раз редактировалось Stilet; 21.03.2011 в 14:25.
Kolya29 вне форума Ответить с цитированием
Старый 21.03.2011, 14:19   #2
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Здравствуйте
Исходя из этого
Цитата:
Сообщение от Kolya29 Посмотреть сообщение
вылезат ошибка
ORA-00933: SQL command not properly ended
Скорее всего в нижеприведенной строке в конце надо поставить точку с запятой, т.е.
Код:
...
ADOQuery3.SQL.Add('KOD_OBORUDOVANIYA = '+Edit3.Text+';');
...
До свидания
P.S. Это не Oracle это SQL, хотя в Oracle свои особенности и я их не знаю.

Последний раз редактировалось OlegVE; 21.03.2011 в 14:21.
OlegVE вне форума Ответить с цитированием
Старый 21.03.2011, 14:27   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

KOD_OBORUDOVANIYA какого типа? если строкового то пользуйся QuotedStr() для заключения значения Эдита в ковычки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.03.2011, 15:45   #4
Kolya29
Пользователь
 
Регистрация: 21.10.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от OlegVE Посмотреть сообщение
Здравствуйте
Исходя из этого

Скорее всего в нижеприведенной строке в конце надо поставить точку с запятой, т.е.
Код:
...
ADOQuery3.SQL.Add('KOD_OBORUDOVANIYA = '+Edit3.Text+';');
...
До свидания
P.S. Это не Oracle это SQL, хотя в Oracle свои особенности и я их не знаю.
так я тоже пробовал, если ставить точку с запятой, то вылезает ошибка ORA-00911 Invalid character и ни чего не удаляется. Если ее не ставить, то он удаляет но и ошибка вылезает тоже.

Цитата:
Сообщение от Stilet Посмотреть сообщение
KOD_OBORUDOVANIYA какого типа? если строкового то пользуйся QuotedStr() для заключения значения Эдита в ковычки.
у KOD_OBORUDOVANIYA тип number

Последний раз редактировалось Stilet; 23.04.2011 в 15:47.
Kolya29 вне форума Ответить с цитированием
Старый 21.03.2011, 18:18   #5
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Здравствуйте
1. Попробуйте поставить везде пробелы, после:
'Delete '
'From OBORUD '
'Where '
2. Это видимо какая-то особенность Oracle SQL. Попробуйте в коде просто написать:
Код:
...
ADOQuery3.SQL.Add('KOD_OBORUDOVANIYA = СуществующийКодОборудованияЦифрой;');
...
С точкой с запятой и без неё.
3. А здесь
'KOD_OBORUDOVANIYA = '
наоборот, удалите пробелы.
Ваш SQL запрос обрабатывает ни Delphi, ни ADO, а Ваш сервер Oracle.
Не получится - учите Oracle SQL.
До свидания
OlegVE вне форума Ответить с цитированием
Старый 22.04.2011, 20:35   #6
Kolya29
Пользователь
 
Регистрация: 21.10.2009
Сообщений: 22
По умолчанию

OlegVE спасибо за советы, но что видимо я делаю не так, не заработало)) Пошел другим путем, кинул компонент дбНавигатор, скрыл его, а на обычную кнопку повесил чтобы выполнялось нажатие на удаления на навигаторе.

Но до сих пор не могу придумать как редактирование данных организовать.
Кто что подскажет?
Как сделать чтобы данные выделенной строки попадали в Эдиты, а потом после редактирования изменения вносились в базу?
Kolya29 вне форума Ответить с цитированием
Старый 22.04.2011, 20:46   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
ADOQuery3.Active:=False;
ADOQuery3.SQL.Clear;
ADOQuery3.SQL.Add('Delete');
ADOQuery3.SQL.Add('From OBORUD');
ADOQuery3.SQL.Add('Where');
ADOQuery3.SQL.Add('KOD_OBORUDOVANIYA = '+Edit3.Text+'');
ADOQuery3.Active:=true;
ошибка "классическая"! Через .Active:=true (оно же .Open; )
можно открывать ТОЛЬКО запросы с выборкой данных -
т.е. ТОЛЬКО где данные выбираются через SELECT ..

для манипуляций данными (INSERT ... / UPDATE ... / DELETE ..) нужно использовать метод ExecSQL;
Код:
ADOQuery3.ExecSQL;

ну и насчёт кавычек для текстовой константы, если поле текстовое, это абсолютно в точку!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.04.2011, 22:02   #8
Kolya29
Пользователь
 
Регистрация: 21.10.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ошибка "классическая"! Через .Active:=true (оно же .Open; )
можно открывать ТОЛЬКО запросы с выборкой данных -
т.е. ТОЛЬКО где данные выбираются через SELECT ..

для манипуляций данными (INSERT ... / UPDATE ... / DELETE ..) нужно использовать метод ExecSQL;
Код:
ADOQuery3.ExecSQL;

ну и насчёт кавычек для текстовой константы, если поле текстовое, это абсолютно в точку!
Отлично! Заработало удаление Спасибо

Теперь надо что то с редактированием придумать

Что я делаю не так? Пытаюсь изменить название оборудования, ID которого 52

Код:
ADOQuery3.SQL.Clear;
ADOQuery3.SQL.Add('UPDATE');
ADOQuery3.SQL.Add('OBORUD);
ADOQuery3.SQL.Add('SET');
ADOQuery3.SQL.Add('NAIM = Пресс');
ADOQuery3.SQL.Add('WHERE');
ADOQuery3.SQL.Add('OBORUD_ID = 52'); {ID редактируемого оборудования}
ADOQuery3.ExecSQL;
После этого вылезает ошибка ORA-00904: "Пресс" Invalid Identifier

Если Слово процесс меняю на число, то все работает без ошибок

тип столбца NAIM - VARCHAR2

причем если выполняешь запрос не через делфи, то все отлично проходит и ошибок не вылезает. Вот такой запросик выполняется
Код:
UPDATE OBORUD
SET NAIM='Пресс'
WHERE OBORUD_ID='52';

Последний раз редактировалось Stilet; 23.04.2011 в 15:49.
Kolya29 вне форума Ответить с цитированием
Старый 23.04.2011, 08:15   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы шутите? Или издеваетесь?
Цитата:
Код:
ADOQuery3.SQL.Add('NAIM = Пресс');
Цитата:
Код:
SET NAIM='Пресс'
никакой разницы не видите?!!


Подсказываю - текстовые константы должны быть заключены в одинарные кавычки!
И об этом в этой теме Вам уже НЕОДНОКРАТНО писали!

надо или так:
Код:
ADOQuery3.SQL.Add('NAIM = ''Пресс'' ');
или так:
Код:
ADOQuery3.SQL.Add('NAIM = '+QuotedStr('Пресс'));
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.04.2011, 11:48   #10
Kolya29
Пользователь
 
Регистрация: 21.10.2009
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вы шутите? Или издеваетесь?

никакой разницы не видите?!!


Подсказываю - текстовые константы должны быть заключены в одинарные кавычки!
И об этом в этой теме Вам уже НЕОДНОКРАТНО писали!

надо или так:
Код:
ADOQuery3.SQL.Add('NAIM = ''Пресс'' ');
или так:
Код:
ADOQuery3.SQL.Add('NAIM = '+QuotedStr('Пресс'));
Отлично! Оба способа показанные Вами работают На счет двойных кавычек читал несколько раз и пробовал всегда почему то ставить такие( " ) вместо ( ' ' )

Теперь еще проблема появилась, не могу поменять ширину столбца в DBGrid, чтобы скрыть ID. В StringGrid все просто делалось
Код:
StringGrid1.ColWidths[0]:=-1;
а тут ни как не могу найти параметр отвечающий за ширину.

Или можно как то по другому получить ID выделенной строки при нажатии на нее? если перед этим запросом выводятся только нужные поля.

Либо как вообще лучше организовать, чтобы редактирование данных осуществлялось через поля Edit?

Последний раз редактировалось Stilet; 23.04.2011 в 15:52.
Kolya29 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с установкой Oracle 11g Database Altera Софт 5 08.02.2011 09:10
Delphi+Oracle habias2006 БД в Delphi 3 09.08.2010 17:47
Delphi и Oracle Ensoph БД в Delphi 2 29.06.2009 14:41
Решаю любые проблемы. В плане программирования. Vedrus Фриланс 1 31.05.2008 04:57
delphi + oracle Toxa Общие вопросы Delphi 3 18.12.2006 14:52