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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2010, 12:11   #1
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию Таблица INTERBASE и добавление записи

Здрасте всем.
Решил вспомнить программирование и понял что забыл совсем все!
Ситуация:
Есть файл test.gdb с таблицей TEST полем TEST (int, not Null)

ВОПРОС 1

на форме IBDatabase, IBQuery, IBTransaction, Datasource, DBGrid

IBDatabase
user_name=SYSDBA
PASSWORD=masterkey
loginPromt:=false;
connected:=true;

IBQuery
Database=IBDatabase
transaction=Ibtransaction
SQL= 'SELECT * FROM TEST'

IBTransaction
Defaultdatabase=IBDatabase

Datasource
Dataset=IBQuery

DBGrid
datasource=datasource


Вопрос - Правильные ли у меня алиасы???


Далее по кнопке

procedure TForm1.B1Click(Sender: TObject);
begin
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('insert into TEST values (1)');
IBQuery1.ExecSQL;
IBQuery1.Transaction.Commit;
end;

в DBGrid все пропадает, но при следующем запуске приложения я вижу новую запись.

ВОПРОС 2
как заставить таблицу правильно работать?
Yuran вне форума Ответить с цитированием
Старый 28.08.2010, 13:02   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

в вашем коде было изменение запроса в IBQuery по этому DBGrid очищается

варианты исправления:
1) использовать 2 Query
2) восстановить после insert-а первоначальный select
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 28.08.2010, 13:33   #3
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Спасибо!
Я к этому тоже пришел!
теперь у меня так:

dm.IBQuery1.SQL.Clear;
dm.IBQuery1.SQL.Add('insert into TEST values (:Q)');
dm.IBQuery1.Params.ParseSQL(dm.IBQu ery1.sql.Text,true);
dm.IBQuery1.ParamByName('Q').Value: ='10';
dm.IBQuery1.ExecSQL;
dm.IBTransaction1.Commit;
dm.IBQuery1.Close;
dm.IBQuery1.SQL.Clear;
dm.IBQuery1.SQL.Add('select * from TEST');
dm.IBQuery1.open;

РАБОТАЕТ!!!
Может можно проще???
и как сделать так чтоб курсор перемещался на последнюю запись??
Yuran вне форума Ответить с цитированием
Старый 28.08.2010, 13:36   #4
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Цитата:
Сообщение от Yuran Посмотреть сообщение
и как сделать так чтоб курсор перемещался на последнюю запись??[/B]
IBQuery1.Last;
_Engine_ вне форума Ответить с цитированием
Старый 28.08.2010, 14:39   #5
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Отлично! Спасибо _Engine_

Идем дальше!
Добавил в таблицу поле ID (int, not null)
Создал генератор GEN_TEST
IBQuery.generatorField='GEN_TEST -> ID by 1' (on new record)
В таблице создал триггер TRG_TEST
( as
begin
new."ID"=GEN_ID (GEN_TEST,1);
end )
теперь у меня 2 поля INT gde pole ID должно инкрементироваться автоматически
Таблиуц очистил (записей нет)
запрос такой
'insert into TEST (TEST) values(:Q)'
ParamByName('Q').Value: =10;
Все работает.

как сделать поле TEST уникальным? Т.е реализовать проверку на совпадения (на уровне раблицы) ???
Yuran вне форума Ответить с цитированием
Старый 28.08.2010, 15:18   #6
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

либо использовать primary key либо unique
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 28.08.2010, 15:51   #7
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Цитата:
Сообщение от Sparky Посмотреть сообщение
либо использовать primary key либо unique
КАК ??? Primary key уже есть - это ID!
A вот unique что-то не пойму! В IBConsole на таблице TEST выбираю ALTER А дальше??? Как поле TEST сделать unique ??? Когда клацаю на вкладке unique -> ADD там AVALEBLE только ID (который у меня primary).
Yuran вне форума Ответить с цитированием
Старый 28.08.2010, 16:25   #8
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

Код:
alter table t_table add constraint un_name unique (name_field)
вроде так
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 29.08.2010, 01:14   #9
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Может и так, но честно говоря пока ждал ответа нашел рекомендации разработчиков INTERBASE что использование двух УНИКАЛЬНЫХ полей (только если они не составные) может привести к нежелательным результатам при Backup/restore базы!

Проверку на совпадение записей сделал таким образом:


dm.IBQuery1.Close;
dm.IBQuery1.SQL.Clear;
dm.IBQuery1.SQL.Add('select * from TEST where TEST='+edit1.Text);
dm.IBQuery1.open;
if not dm.IBQuery1.IsEmpty then
begin
ShowMessage('Повтор!');
exit;
end;

потом
select * from TEST
IBQuery1.last;

дальше код с добавлением записи в таблицу.

Только беда в том что запись добавляется не в конец таблицы а в середину! Можно конечно отсортировать IBQuery, но почему так происходит????? и можно ли составить запрос или команды IBQuery1 чтоб записи добавлялись по порядку???
Yuran вне форума Ответить с цитированием
Старый 29.08.2010, 10:18   #10
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

ну дак не используйте, а вот эта ваша проверка будет тормозить особенно когда записей много. А насчет второго вопроса записи физически всегда добавляются в конец!!!!! То что вы видете в гриде это последствия выборки с сортировкой, и если вы пишите order by? данные сортируются по возрастанию в зависимости от значений полей
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
таблица на записи.. darika Паскаль, Turbo Pascal, PascalABC.NET 0 17.04.2010 13:59
Добавление записи rn6hac БД в Delphi 3 02.06.2009 10:26
Добавление данных в таблицы Interbase hijke БД в Delphi 18 22.10.2008 20:52
Interbase, добавление записи Алёна БД в Delphi 9 25.03.2008 11:54
не создается таблица в Interbase, вот кодинг... Алёна БД в Delphi 3 19.02.2008 18:21