![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Автоинкремент при работе с локальными фалами [D7, MSSQL]
Sir John © (2004-08-16 14:57:00)Здравствуйте, уважаемые мастера!
В процессе разработки ПО столкнулся вот с чем. Всем известно, что TClientDataSet может работать в двух режимах - подключенным к БД и в режиме BriefCase, т. е. с локальными файлами, отключенным от БД.
Вопрос собственно говоря касается полей, поддерживающий свойство autoincrement. При коннекте с БД проблем нет и все работает нормально. Но при сохранении данных в локальных файлах и при добавлении новой записи в поле с autoincrement ничего не заносится! Соответсвенно, сортировка данных нарушается, также нарушается и нумерация. Как побороть?
Заранее благодарю за ответ.
----------------------------------
С уважением
Sir John
Ega23 (2004-08-16 16:19:00) [1]Всего-то написать утилитку для перекачки данных на сервер...
Sir John (2004-08-16 16:05:00) [2]Anatoly Podgoretsky © (16.08.04 16:03) [25]
Какой? Не совсем понимаю. Обясните.
если у меня опрерации идут под номерами 1, 2, 3, 4, 5, 6,....nn какой тут ключ должен быть?
Anatoly Podgoretsky (2004-08-16 16:03:00) [3]Sir John © (16.08.04 16:00) [24]
Опять же, не нужен тебе счетчик, у тебя есть естественный ключ
Sir John (2004-08-16 16:00:00) [4]Мастер © (16.08.04 15:58) [22]
Anatoly Podgoretsky © (16.08.04 15:58) [23]
Чувствую, что придется свой счетчик писать [:-\
Anatoly Podgoretsky (2004-08-16 15:58:00) [5]Sir John © (16.08.04 15:53) [21]
Вот это и должно использоваться в качестве ИД и никаких автоинкриментов, тем более в режиме BriefCase
Мастер (2004-08-16 15:58:00) [6]>Sir John © (16.08.04 15:53) [21]
У тебя, как минимум, есть один простой и надежный выход.
1. Уникальные номера формируются только в пределах сессии при работе в Offline.
2. Для загрузки данных на сервер используй свой метод загрузки, где формируй номера стандартным образом.
Sir John (2004-08-16 15:53:00) [7]Anatoly Podgoretsky © (16.08.04 15:49) [20]
00-00-00 - на самом деле это только шаблон, ибо данные могут иметь запись 1-145-6456 или вот могут быть представлены вот так: 4-1341-2
причем данные каждого разряда берерутся из разных справочников
Anatoly Podgoretsky (2004-08-16 15:49:00) [8]Sir John © (16.08.04 15:30) [16]
покажите мне GUID в формате описанном в [12] :)
GUID означает только одно, уникальный глобальный ID, а не GUID из система, вот ты его и формируй на клиенте, по указаному формату, только что то у тебя он очень коротки, сможешь сделать только 100 операций по одному цеху и категории.
Sir John (2004-08-16 15:35:00) [9]аи - автоинкремент :)
Sir John (2004-08-16 15:34:00) [10]Ega23 © (16.08.04 15:29) [15]
Да, блин, пойми, то, что ты написал - это клево относительно сервера. Но при коннекте с сервером у меня и с ai все работает без проблем. у меня человек, который будет формировать маршрутки сидит удаленно. Он к серверу имеет доступ всего раз в неделю. На протяжении остальных 5-ти рабочих дней он сидит дома и работает в офф-лайн. При занесении данных аи попросту не работает!
Ega23 (2004-08-16 15:30:00) [11]Елси описывать задачу более полно, то при внесении данных в справочник новой операции должен присваиваться следующий за текущим номер, на единицу больше. Данные должны быть записаны в формате 00-11-22, где
00 - номер цеха
11 - номер категории операций
22 - номер самой операции
Ну и в чём проблема?????
Print 'S_SupSetProc- процедура для работы со справочниками системы `Сопровождение`'
go
if exists (select * from sysobjects where id = object_id(N'[S_SupSetProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [S_SupSetProc]
GO
CREATE PROCEDURE S_SupSetProc
@actnam varchar(32)='NONE',
--'WARETYPGROUPS.ADD' - Добавить группы комплектующих [....]
--'WARETYPGROUPS.SEL' - прочитать группы комплектующих ()
--'WARETYPGROUPS.FILL' - Заполнить группы комплектующих ()
-- Группы типов комплектующих
@WarTypGrCod int=0,
@WarTypGrNam varchar(64)='',
@WarTypGrLab varchar(64)='',
@WarTypGrOrd int=0,
@WarTypGrNot varchar(255)='',
@WarTypGrMsk bit=0,
As
declare @result int,
@x int,
@opercod int,
@operOrd int,
@operfl int,
@opernam varchar(64),
@InfNamSpaces int
set nocount on
set @result=-1
set @ActNam=upper(ltrim(rtrim(@ActNam)))
set @TableNam=upper(ltrim(rtrim(@TableNam)))
IF @ActNam='WARETYPGROUPS.UPD'
begin
if not exists (select 1 from wareTypgroups where WarTypGrCod=@WarTypGrCod)
begin
Select @WarTypGrCod=Max(WarTypGrCod)+1 from WareTypGroups
insert WareTypGroups (WarTypGrCod,WarTypGrNam,WarTypGrLab,WarTypGrOrd,WarTypGrNot,WarTypGrMsk)
values (@WarTypGrCod,@WarTypGrNam,@WarTypGrLab,@WarTypGrOrd,@WarTypGrNot,@WarTypGrMsk )
end
else update WareTypGroups set WarTypGrNam=@WarTypGrNam,WarTypGrLAb=@WarTypGrLab,WarTypGrOrd=@WarTypGrOrd,WarTypGrNot=@WarTypGrNot,WarTypGrMsk=@WarTypG rMsk
where @WarTypGrCod=WarTypGrCod
goto fin
end
Sir John (2004-08-16 15:30:00) [12]Anatoly Podgoretsky © (16.08.04 15:26) [13]
покажите мне GUID в формате описанном в [12] :)
Девченки в цеху по номеру операции должны эту операци выполнить и получить за это денежку.
Если мы будем использовать GUID, то минимум
a) не читаемо
б) незапоминаемо
Мои девченки-швеи помнят все многи операции наизусть :)
GUID не подходит
Ega23 (2004-08-16 15:29:00) [13]Елси описывать задачу более полно, то при внесении данных в справочник новой операции должен присваиваться следующий за текущим номер, на единицу больше. Данные должны быть записаны в формате 00-11-22, где
00 - номер цеха
11 - номер категории операций
22 - номер самой операции
Ну и в чём проблема?????
Print 'S_SupSetProc- процедура для работы со справочниками системы `Сопровождение`'
go
if exists (select * from sysobjects where id = object_id(N'[S_SupSetProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [S_SupSetProc]
GO
CREATE PROCEDURE S_SupSetProc
@actnam varchar(32)='NONE',
--'WARETYPGROUPS.ADD' - Добавить группы комплектующих [....]
--'WARETYPGROUPS.SEL' - прочитать группы комплектующих ()
--'WARETYPGROUPS.FILL' - Заполнить группы комплектующих ()
-- Группы типов комплектующих
@WarTypGrCod int=0,
@WarTypGrNam varchar(64)='',
@WarTypGrLab varchar(64)='',
@WarTypGrOrd int=0,
@WarTypGrNot varchar(255)='',
@WarTypGrMsk bit=0,
As
declare @result int,
@x int,
@opercod int,
@operOrd int,
@operfl int,
@opernam varchar(64),
@InfNamSpaces int
set nocount on
set @result=-1
set @ActNam=upper(ltrim(rtrim(@ActNam)))
set @TableNam=upper(ltrim(rtrim(@TableNam)))
IF @ActNam='WARETYPGROUPS.UPD'
begin
if not exists (select 1 from wareTypgroups where WarTypGrCod=@WarTypGrCod)
begin
Select @WarTypGrCod=Max(WarTypGrCod)+1 from WareTypGroups
insert WareTypGroups (WarTypGrCod,WarTypGrNam,WarTypGrLab,WarTypGrOrd,WarTypGrNot,WarTypGrMsk)
values (@WarTypGrCod,@WarTypGrNam,@WarTypGrLab,@WarTypGrOrd,@WarTypGrNot,@WarTypGrMsk )
end
else update WareTypGroups set WarTypGrNam=@WarTypGrNam,WarTypGrLAb=@WarTypGrLab,WarTypGrOrd=@WarTypGrOrd,WarTypGrNot=@WarTypGrNot,WarTypGrMsk=@WarTypG rMsk
where @WarTypGrCod=WarTypGrCod
goto fin
end
Sir John (2004-08-16 15:27:00) [14]Ega23 © (16.08.04 15:22) [11]
Идея хорошая, но не подходит по формату. Однозначно! :)
Anatoly Podgoretsky (2004-08-16 15:26:00) [15]То что ты описываешь в [9] это не автоинкриментрый номер, а уникальный номер ID, ты просто выбрал не ту реализацию, за что сейчас и расплачиваешься, тебе нужен был GUID
Sir John (2004-08-16 15:23:00) [16]к вышесказанному.
Елси описывать задачу более полно, то при внесении данных в справочник новой операции должен присваиваться следующий за текущим номер, на единицу больше. Данные должны быть записаны в формате 00-11-22, где
00 - номер цеха
11 - номер категории операций
22 - номер самой операции
на мой взгляд при использовании аи все будет проще
Ega23 (2004-08-16 15:22:00) [17]Отключи IDENTITY. Генери GUIN :о)
Ega23 (2004-08-16 15:20:00) [18]Ну, в принципе, автоинкримент ВРЕМЕННО! можно отключить, делается это с помощью директивы IDENTITY_INSERT, но, ИМХО, это порочный путь.
Sir John (2004-08-16 15:18:00) [19]KSergey © (16.08.04 15:10) [5]
Объясняю ситуацию. Номера мне нужны не для сортировки. У меня швейное предприятие. Программа расчитана на учет и создание мраш. листов. Так вот, данные в маршрутные листы заносятся из так называемых справочников. Данные - это операции над изделиями. Каждой операции присваивается уникальный номер. Если из БД удаляются данные, то номр вторично использоваться не должен. Исходя из условия описанной мной задачи поле с autoincrement - самое простое и надежное решение
Ega23 (2004-08-16 15:17:00) [20]Лично я почти в каждой таблице добавляю поле SortOrd int. Order By провожу по нему, дальше - в алфавитном порядке.
Преимущества: пользователь сам может настраивать порядок показа справочных таблиц, наиболее часто встречаемые записи ставить вверх выборки.
Недостатки: лишний TEdit на форме редактирования таблицы и лишний параметр в ХП. :о)