help!!!! помогите с lazarus!!! срочно!!!

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
ancia
незнакомец
Сообщения: 3
Зарегистрирован: 18.01.2010 01:09:25

help!!!! помогите с lazarus!!! срочно!!!

Сообщение ancia »

здравствуйте=)
помогите пожалуйста!!!
база написана на firebird. для связи с lazarus использую IBConnection, SQLQuery1, SQLTransaction1, Datasource1. и dbgrid.
как сделать: 1) чтобы поле id заполнялось автоматически, и уникально.
2) чтобы поле можно было для заполнения cделать для заполнения выпадающим списком из другой таблицы. например, название предметов можно было выбрать из выпадающего списка (список уже существует в другой таблице).
3) чтобы таблицу можно было сохранить в excel.
базу писала с помощью ibexpert. там все всязи и автозаполнение работает, а в lazarus не перенеслось к сожалению...(((( надо бы сделать все, как в ibexpert чтобы работало...
заранее благодарю
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

ancia
Поле id у Вас какого типа? Создали ли Вы генератор? Создали ли триггер для этой таблицы, который работает перед вставкой записи и вызывает генератор?
ancia
незнакомец
Сообщения: 3
Зарегистрирован: 18.01.2010 01:09:25

Сообщение ancia »

поле id типа integer. в автоинкрименте создан и генератор и триггер. в idexpert автозаполнение работает замечательно, а в lazarus, если оставить его пустым, то вылезает ошибка "project project1.exe raised exception class EDataBaseError with message: SQLQuery1: Field ID is required, but not supplied"
ancia
незнакомец
Сообщения: 3
Зарегистрирован: 18.01.2010 01:09:25

Сообщение ancia »

неужели никто не может помочь :(
alexmai
постоялец
Сообщения: 106
Зарегистрирован: 02.02.2009 13:58:42

Сообщение alexmai »

ancia писал(а):поле id типа integer. в автоинкрименте создан и генератор и триггер. в idexpert автозаполнение работает замечательно, а в lazarus, если оставить его пустым, то вылезает ошибка "project project1.exe raised exception class EDataBaseError with message: SQLQuery1: Field ID is required, but not supplied"

Тест запроса на вставку в студию !
запрос должен быть без указания поля ID
типа
insert into table1 (field1,field2) values ('1','2')
и значение поля id заполниться после commit
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

ancia
Внутри компонента SQLQuery случайно поля не определены принудительно? Если да, то смотрите там поле ID, в котором стоит галка "Required". Галку уберите и будет Вам щастье...
Аватара пользователя
Astralis
новенький
Сообщения: 45
Зарегистрирован: 06.06.2007 20:33:05
Откуда: Tvercity-Annet
Контактная информация:

Сообщение Astralis »

если вы используете Firebird версии 2.0 и выше, то используйте новый синтаксис команды insert

Код: Выделить всё

INSERT INTO TableName
(field1,field2...)
VALUES
(:val1,:val2...)
RETURNING :Id

далее по правилам делаете рефреш новой строки строки запросом

Код: Выделить всё

SELECT field1,field2...
FROM TableName
WHERE Id=:Id

и собственно данный результат вставляете в локальный набор данных
все это здорово вешается на event BeforePost
ruslba
незнакомец
Сообщения: 3
Зарегистрирован: 18.03.2017 11:46:31

Сообщение ruslba »

Ну и объясняют!
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Можно не указывать в Insert автоинкременентное поле, допустим 'id':
как пример: само TableName (id,field1,field2...)..
Вставка
INSERT INTO TableName (field1,field2...) VALUES (:val1,:val2...) или явно указать null
INSERT INTO TableName (id,field1,field2...) VALUES (null,:val1,:val2...)
тогда можно создать триггер на вставку TableName:

Код: Выделить всё

CREATE TRIGGER trgTTEST_BI_V2 for TTEST
active before insert position 0
as
begin
  if (new.id is null) then
  begin
    new.id = gen_id( 'GenID', 1 );
  end
end

https://firebirdsql.org/manual/generato ... owids.html
- что он делает: перед вставкой проверяется поле new.id на NULL, если так - то генерим новое значение от генератора и заносим в поле..

Добавлено спустя 4 минуты 58 секунд:
если вдруг нужно узнать новое значение и потом вписать в id
то нужно получить от генератора это значение..

Код: Выделить всё

SELECT GEN_ID( <GeneratorName>, 1 ) FROM RDB$DATABASE;

и потом просто вписать в INSERT

Код: Выделить всё

INSERT INTO TableName (id,field1,field2...) VALUES (:id,:val1,:val2...)
Аватара пользователя
DYUMON
постоялец
Сообщения: 234
Зарегистрирован: 11.03.2009 12:32:54
Контактная информация:

Сообщение DYUMON »

Весна . активизировались студенты. мне уже пару раз предлагали купить код программу базы данных, тока код давно канул в лету. А новый писать лень.
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

ancia писал(а):2) чтобы поле можно было для заполнения cделать для заполнения выпадающим списком из другой таблицы. например, название предметов можно было выбрать из выпадающего списка (список уже существует в другой таблице).

Изначально никак (или писать все руками). Но в компонентах RX есть rxdbgrid, которая это умеет вроде как.
ancia писал(а):3) чтобы таблицу можно было сохранить в excel.

Изначально никак)) в любом случае вывод идет не через компоненты отображения данных (dbgrid), а доступа к данным, я не пользовался компонентами IB, в компонентах ZeosDB есть наметки, также как в LazReport. НУ или как всегда вручную.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

2. Это даже штатный грид умеет - надо просто правильно настроить
3. RxDBGrid выгружает данные в электронные таблицы - даже с формулами умеет (итоги). LazReport умеет выгружать. Но там есть 2 принципиальных недостатка:
1. Все числа выгружаются как текст - это пока не победимо.
2. Отчёт надо предварительно подготовить - чтобы поменьше было пересечений ячеек.
slyubez
постоялец
Сообщения: 185
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

Ну и тему нашли... Автор, видимо, уже давно в армии :)
Ответить