Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вставка записи [D6, Paradox]


Arick ©   (2002-11-30 23:53:00) 

Господа помогите новичку с SQL.
Есть запись , номер которой (поле Number) - N
как вставить запись и занести в Number номер N+1?


Arick   (2002-12-01 17:40:00) [1]

Спасибо, MsGuns, просто я не знал, что autoinc и I совместимы


MsGuns   (2002-12-01 15:45:00) [2]

Твой случай типичный:
Гл.таблица
1. ID - autoinc Primary


Делал
1. ID - I Primary (Связь с Гл)
2. ID2 - autoinc Primary (Собств.UID)


Arick   (2002-12-01 15:05:00) [3]

Автоинкремент не могу использовать т.к. это полем - ключевое,
к нему присоединена вторая таблица в которой тип
не поля соединения не может быть Автоинкремент

Как бы сформировать запрос типа:
SELECT(MAX(Main.Number)+1) as M
FROM Main

INSERT
INTO Main(Number)
VALUES (M)
Но INSERT не работает.


MsGuns   (2002-12-01 14:44:00) [4]

Если это надо для получения уникального указателя записи, то используй Autoinc, если он не удовлетворяет, то надо определять самому. Самое простое:

var
mxnum: integer;
begin
...

Query1.SQL.Clear;
Query1.SQL.Add("SELECT MAX(Id) AS MaxNum From Table");
Query1.Prepare;
Query1.Open;
mxnum := Query1.FieldByName("MaxNum").AsInteger;
Query1.Close;

...

С последующим

Table1.Append
Table1.FieldByName("Id").AsInteger := inc(mxnum);

или

Query1.SQL.Add("INSERT INTO Table1 (Id) values("+IntToStr(inc(mxnum))+")";

Но для сетевого доступа это отстой, т.к. при попытке одновременной вставки двух юзеров для обоих будет получено ОДНО И ТО ЖЕ значение. Для парадокса можно делать добавление (Append) в цикле с защищенным блоком, в котором, если неудачно, увеличивать mxNum на 1 и в начало цикла.

Хотя в общем-то все вышеизложенное есть не что иное как собственное моделирование автоинкремента, что, ИМХО, не есть хорошо.


Arick   (2002-12-01 12:57:00) [5]

А как получить N?


AK-74   (2002-12-01 03:26:00) [6]

Так и пиши:

Query.SQL.Clear;
Query.SQL.Add("insert into TableName (n) values (:n)");
Query.ParamByName("n").AsInteger := n + 1;
Query.ExecSQL;


Значение n из старой записи ты получаешь где-то раньше.

P.S. На всякий случай: SQL не отменяет автоинкрементные поля Paradox.


Наверх

Титульная страница Поиск, карта сайта Написать письмо