Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Автоинкремент при работе с локальными фалами   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.043 c
14-1093395757
SPeller
2004-08-25 05:02
2004.09.12
Опрос для тех, у кого выделенка


3-1092807632
WondeRu
2004-08-18 09:40
2004.09.12
======Распределенные СУБД===========


1-1093690153
Vasya.ru
2004-08-28 14:49
2004.09.12
Это меня глючит, или Дельфю?


4-1091280137
Sulimxar
2004-07-31 17:22
2004.09.12
Приоритеты


1-1093422135
Borion
2004-08-25 12:22
2004.09.12
Программная смена размера бумаги