Форум: "Базы";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
ВнизСчетчик записей в таблице Найти похожие ветки
← →
Crok (2002-10-30 15:55) [0]Здравстуйте, Мастера, может кто поможет? У меня проблема не знаю как в поле таблицы поставить счетчик
procedure TForm4.btnInsertClick(Sender: TObject);
var s: real;
begin
s:=Table1.FieldByName("KOD").AsFloat;
Table1.Insert;
Table1.FieldByName("KOD").AsFloat:=s+1;
Table1.FieldByName("DATA_O").AsDateTime:=Now;
end;
вроде всё работает, только как только пытаюсь вставить запись в эту же таблицу из другой формы, код повторяется...
ПОМОГИТЕ КТО МОЖЕТ КТО МОЖЕТ ПОМОГИТЕ :)
← →
Darts (2002-10-30 16:23) [1]Попытка создать аналог автоинкремента? Это есть в Парадоксе.
Предлагаемое решение неверно. Лучше создать таблицу, например, Demo, с одним полем и с одной строкой, где хранится счетчик. При вставке новой записи в вашу таблицу обращаетесь в Demo, считываете данные, инкрементируете, заносите в Demo. Потом это же значение загоняете в вашу таблицу. Т.е. это будет выглядеть примерно так:
procedure TForm4.btnInsertClick(Sender: TObject);
var s: Integer;
begin
s: = Table1.FieldByName("KOD").AsInteger;
Demo.Edit;
s := Demo.FieldByName("Count").AsInteger + 1;
Demo.FieldByName("Count").AsInteger := s
Demo.Post;
Table1.Insert;
Table1.FieldByName("KOD").AsInteger := s;
Table1.FieldByName("DATA_O").AsDateTime := Now;
end
Измените тип поля на целочисленный.
Смотрите пример Demos\DB\MastApp. Там такой же подход.
← →
Darts (2002-10-30 16:26) [2]Забыл убрать первую строчку после begin:
s: = Table1.FieldByName("KOD").AsInteger;
А в конце поставить Table1.Post;
В остальном же все верно.
← →
Johnmen (2002-10-30 16:28) [3]Многопользовательское юзанье ?
← →
Darts (2002-10-30 16:33) [4]> Johnmen
Про это не было. Будет вопрос - будет и ответ :)
тут самое главное - алгоритм.
← →
Crok (2002-10-30 16:37) [5]Спасибо! Об этом я не подумал, эту Демо базу можно будет использовать как базу счетчиков для всех таблиц!
> Многопользовательское юзанье ?
Нет база локальная, все равно спасибо!
> Darts (30.10.02 16:23)
ОСТАВАЙТЕСЬ У НАС БУДЕТЕ ГЕНИАЛЬНЫМ МЕХАНИКОМ НАШЕЙ ПЛАНЕТЫ..
← →
Anatoly Podgoretsky (2002-10-30 16:41) [6]Формат DBase VII поддерживает автоинкриментные поля, а ошибка в примере состоит в том, что постоянно берется одна и таже записиь, а надо брать масимальный номер. Перед s:=Table1.FieldByName("KOD").AsFloat; надо сначал спозичионировать по индексу на последнюю записиь или взять с помощью запроса максимальный номер.
Еще один недостатоко при таком методе в многопользовательской среде обеспечены ошибки.
← →
Johnmen (2002-10-30 16:43) [7]>Darts (30.10.02 16:33)
Ничего подобного ! Алгоритм зависит от юзанья !
>Crok (30.10.02 16:37)
Для монопольного юзанья - SELECT MAX(KOL)+1 AS NextKOL FROM <Table>
← →
Darts (2002-10-30 16:43) [8]> Crok
...Спасибо! Об этом я не подумал, эту Демо базу можно будет использовать как базу счетчиков для всех таблиц!
Можно и так. Для каждой таблицы - отдельное поле в Demo. Пример: имеем три таблицы, по которым нужен autoincrement => в Demo должны созданы 3 поля Count1, Count2, Count3.
← →
Darts (2002-10-30 16:49) [9]> Johnmen
Тоже можно. Но производительность будет ниже из-за постоянных выборок. Впрочем, какая разница - лишь бы работало.
← →
Crok (2002-10-30 16:54) [10]
> надо сначал спозичионировать по индексу на последнюю записиь
>
А как это будет выглядеть по коду? Я копался в различных справочниках но нигде не нашел ничего работоспособного
← →
Darts (2002-10-30 16:57) [11]Table1.Last для текущего индекса
← →
Crok (2002-10-30 17:06) [12]Пробовал. Не работает.
← →
Anatoly Podgoretsky (2002-10-30 17:10) [13]Crok (30.10.02 17:06)
Работает у меня в некоторых базах именно так сделано
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c