Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.039 c
1-1092582610
Nikk
2004-08-15 19:10
2004.09.12
Delphi 8 - как скрыть форму?


1-1093892635
Ragazor
2004-08-30 23:03
2004.09.12
Есть PopupMenu, как на все его MenuItem..


14-1093155078
asdqwer
2004-08-22 10:11
2004.09.12
Пауза между появлением гудка в линии и набором номера


1-1093518207
D3viL
2004-08-26 15:03
2004.09.12
Спасите Памагити!!!


3-1092632990
Mamed
2004-08-16 09:09
2004.09.12
Bag v AdODB i WebBrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский