Форум: "Базы";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизАвтоинкремент при работе с локальными фалами Найти похожие ветки
← →
Sir John © (2004-08-16 14:57) [0]Здравствуйте, уважаемые мастера!
В процессе разработки ПО столкнулся вот с чем. Всем известно, что TClientDataSet может работать в двух режимах - подключенным к БД и в режиме BriefCase, т. е. с локальными файлами, отключенным от БД.
Вопрос собственно говоря касается полей, поддерживающий свойство autoincrement. При коннекте с БД проблем нет и все работает нормально. Но при сохранении данных в локальных файлах и при добавлении новой записи в поле с autoincrement ничего не заносится! Соответсвенно, сортировка данных нарушается, также нарушается и нумерация. Как побороть?
Заранее благодарю за ответ.
----------------------------------
С уважением
Sir John
← →
Ega23 © (2004-08-16 15:03) [1]А при чём тут MS SQL????
← →
Anatoly Podgoretsky © (2004-08-16 15:06) [2]Номер заносится сервером
← →
Sir John © (2004-08-16 15:06) [3]при том, что я с ним работаю. Но думаю, это не имеет большого значения к затронутой теме :)
← →
Sir John © (2004-08-16 15:08) [4]Anatoly Podgoretsky © (16.08.04 15:06) [2]
Так я и спрашиваю, есть ли альтернативы. Мне автоинкрементные номера очень важны, ибо по ним формируются данные. Все бы нормально, только проблема в том, что клиент работает удаленно и набивает данные в локальном режиме.
← →
KSergey © (2004-08-16 15:10) [5]Ну сортировать по id - не есть хорошо. Это однозначно. Надо найти другой подходящий к случаю атрибут.
А в каком смысле это можно побороть - мне не совсем понятно.. Ну прописывать туда любые значения, от фонаря, но они ведь не будут отражать истины после переноса на сервер, верно?
← →
KSergey © (2004-08-16 15:11) [6]> [4] Sir John © (16.08.04 15:08)
> Мне автоинкрементные
> номера очень важны, ибо по ним формируются данные.
Какие данные?
А вообще это не верно как-то
В общем случае они могут быть абсолютно любыми
Единственное что можно гарантировать - что они увеличиваются относительно последнего значения, но как именно - никто не знает.
← →
Anatoly Podgoretsky © (2004-08-16 15:16) [7]Sir John © (16.08.04 15:08) [4]
Автоинкримент он нато и Автоинкримент, что авто и всегда только в сторону увеличения. Ты не должен с этим работать в режиме BriefCase
← →
Ega23 © (2004-08-16 15:17) [8]Лично я почти в каждой таблице добавляю поле SortOrd int. Order By провожу по нему, дальше - в алфавитном порядке.
Преимущества: пользователь сам может настраивать порядок показа справочных таблиц, наиболее часто встречаемые записи ставить вверх выборки.
Недостатки: лишний TEdit на форме редактирования таблицы и лишний параметр в ХП. :о)
← →
Sir John © (2004-08-16 15:18) [9]KSergey © (16.08.04 15:10) [5]
Объясняю ситуацию. Номера мне нужны не для сортировки. У меня швейное предприятие. Программа расчитана на учет и создание мраш. листов. Так вот, данные в маршрутные листы заносятся из так называемых справочников. Данные - это операции над изделиями. Каждой операции присваивается уникальный номер. Если из БД удаляются данные, то номр вторично использоваться не должен. Исходя из условия описанной мной задачи поле с autoincrement - самое простое и надежное решение
← →
Ega23 © (2004-08-16 15:20) [10]Ну, в принципе, автоинкримент ВРЕМЕННО! можно отключить, делается это с помощью директивы IDENTITY_INSERT, но, ИМХО, это порочный путь.
← →
Ega23 © (2004-08-16 15:22) [11]Отключи IDENTITY. Генери GUIN :о)
← →
Sir John © (2004-08-16 15:23) [12]к вышесказанному.
Елси описывать задачу более полно, то при внесении данных в справочник новой операции должен присваиваться следующий за текущим номер, на единицу больше. Данные должны быть записаны в формате 00-11-22, где
00 - номер цеха
11 - номер категории операций
22 - номер самой операции
на мой взгляд при использовании аи все будет проще
← →
Anatoly Podgoretsky © (2004-08-16 15:26) [13]То что ты описываешь в [9] это не автоинкриментрый номер, а уникальный номер ID, ты просто выбрал не ту реализацию, за что сейчас и расплачиваешься, тебе нужен был GUID
← →
Sir John © (2004-08-16 15:27) [14]Ega23 © (16.08.04 15:22) [11]
Идея хорошая, но не подходит по формату. Однозначно! :)
← →
Ega23 © (2004-08-16 15:29) [15]Елси описывать задачу более полно, то при внесении данных в справочник новой операции должен присваиваться следующий за текущим номер, на единицу больше. Данные должны быть записаны в формате 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) [16]Anatoly Podgoretsky © (16.08.04 15:26) [13]
покажите мне GUID в формате описанном в [12] :)
Девченки в цеху по номеру операции должны эту операци выполнить и получить за это денежку.
Если мы будем использовать GUID, то минимум
a) не читаемо
б) незапоминаемо
Мои девченки-швеи помнят все многи операции наизусть :)
GUID не подходит
← →
Ega23 © (2004-08-16 15:30) [17]Елси описывать задачу более полно, то при внесении данных в справочник новой операции должен присваиваться следующий за текущим номер, на единицу больше. Данные должны быть записаны в формате 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:34) [18]Ega23 © (16.08.04 15:29) [15]
Да, блин, пойми, то, что ты написал - это клево относительно сервера. Но при коннекте с сервером у меня и с ai все работает без проблем. у меня человек, который будет формировать маршрутки сидит удаленно. Он к серверу имеет доступ всего раз в неделю. На протяжении остальных 5-ти рабочих дней он сидит дома и работает в офф-лайн. При занесении данных аи попросту не работает!
← →
Sir John © (2004-08-16 15:35) [19]аи - автоинкремент :)
← →
Anatoly Podgoretsky © (2004-08-16 15:49) [20]Sir John © (16.08.04 15:30) [16]
покажите мне GUID в формате описанном в [12] :)
GUID означает только одно, уникальный глобальный ID, а не GUID из система, вот ты его и формируй на клиенте, по указаному формату, только что то у тебя он очень коротки, сможешь сделать только 100 операций по одному цеху и категории.
← →
Sir John © (2004-08-16 15:53) [21]Anatoly Podgoretsky © (16.08.04 15:49) [20]
00-00-00 - на самом деле это только шаблон, ибо данные могут иметь запись 1-145-6456 или вот могут быть представлены вот так: 4-1341-2
причем данные каждого разряда берерутся из разных справочников
← →
Мастер © (2004-08-16 15:58) [22]>Sir John © (16.08.04 15:53) [21]
У тебя, как минимум, есть один простой и надежный выход.
1. Уникальные номера формируются только в пределах сессии при работе в Offline.
2. Для загрузки данных на сервер используй свой метод загрузки, где формируй номера стандартным образом.
← →
Anatoly Podgoretsky © (2004-08-16 15:58) [23]Sir John © (16.08.04 15:53) [21]
Вот это и должно использоваться в качестве ИД и никаких автоинкриментов, тем более в режиме BriefCase
← →
Sir John © (2004-08-16 16:00) [24]Мастер © (16.08.04 15:58) [22]
Anatoly Podgoretsky © (16.08.04 15:58) [23]
Чувствую, что придется свой счетчик писать [:-\
← →
Anatoly Podgoretsky © (2004-08-16 16:03) [25]Sir John © (16.08.04 16:00) [24]
Опять же, не нужен тебе счетчик, у тебя есть естественный ключ
← →
Sir John © (2004-08-16 16:05) [26]Anatoly Podgoretsky © (16.08.04 16:03) [25]
Какой? Не совсем понимаю. Обясните.
если у меня опрерации идут под номерами 1, 2, 3, 4, 5, 6,....nn какой тут ключ должен быть?
← →
Ega23 © (2004-08-16 16:19) [27]Всего-то написать утилитку для перекачки данных на сервер...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.035 c