![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 18.02.2008
Сообщений: 198
|
![]()
Здрасте всем.
Решил вспомнить программирование и понял что забыл совсем все! Ситуация: Есть файл 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 как заставить таблицу правильно работать? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]()
в вашем коде было изменение запроса в IBQuery по этому DBGrid очищается
варианты исправления: 1) использовать 2 Query 2) восстановить после insert-а первоначальный select
программа — запись алгоритма на языке понятном транслятору
|
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 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; РАБОТАЕТ!!! Может можно проще??? и как сделать так чтоб курсор перемещался на последнюю запись?? |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 29.06.2008
Сообщений: 603
|
![]() |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 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 уникальным? Т.е реализовать проверку на совпадения (на уровне раблицы) ??? |
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]()
либо использовать primary key либо unique
Единственное, что ограничивает полет мысли программиста-компилятор
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 18.02.2008
Сообщений: 198
|
![]()
КАК ??? Primary key уже есть - это ID!
A вот unique что-то не пойму! В IBConsole на таблице TEST выбираю ALTER А дальше??? Как поле TEST сделать unique ??? Когда клацаю на вкладке unique -> ADD там AVALEBLE только ID (который у меня primary). |
![]() |
![]() |
![]() |
#8 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]() Код:
Единственное, что ограничивает полет мысли программиста-компилятор
|
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 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 чтоб записи добавлялись по порядку??? |
![]() |
![]() |
![]() |
#10 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
![]()
ну дак не используйте, а вот эта ваша проверка будет тормозить особенно когда записей много. А насчет второго вопроса записи физически всегда добавляются в конец!!!!! То что вы видете в гриде это последствия выборки с сортировкой, и если вы пишите order by? данные сортируются по возрастанию в зависимости от значений полей
Единственное, что ограничивает полет мысли программиста-компилятор
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
таблица на записи.. | 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 |