Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Про InterBase  (Прочитано 14909 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dima (KDV_83)
Участник

kz
Offline Offline

« : 16-11-2005 05:26 » 

Столкнулся вот с такой проблемой:
Есть бд на InterBase(основная) она не сетевая, ввод данных производился всегда только в нее, потом я брал эту базу
устанавливал пользователям (разграничал права доступа, показывал только те данные которые надо и т д) это было так раньше,
Теперь сделали все наоборот: сами пользователи вводят свои данные и после их ввода я должен собрать все в основную бд
Вот....
Вроде ничего трудного, сделал выборку копирую Appendom, записи добавляются, все хорошо с одного пользователя забрал, стал забирать с второго , но ни тут то было. Поле Id (при вставке записи вызыват генератор Gen_Id(IdStud,1)), и так вот у каждого пользователя  этот Id  повызывался и теперь у них у всех одинаковый он идет. вызвать appendom при копировании этот генератор не получается
Как быть


P/S как трудно описать свои мысли, так что если кто понял меня, помогите please.....   
Записан
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #1 : 16-11-2005 07:34 » 

Дима, а что за процедура Gen_Id(IdStud,1))? Насколько я понял, пользователи генерят айдишники сами себе... И, кстати, на основе чего они генерят себе ID? Наверняка из базы берут, подлецы Ага
Записан
Dima (KDV_83)
Участник

kz
Offline Offline

« Ответ #2 : 16-11-2005 09:17 » 

Gen_Id(IdStud,1) это генератор вызываю, чтобы поле idstud на +1 увеличить, поле это имеет primary key
Генерируют его сами пользователи при добавлении новой записи
Записан
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #3 : 16-11-2005 10:19 » 

Вот это как раз не совсем верно, формированием идентификаторов пользователи заниматься не должны. Я бы организовал табличку с пользователями, в которой были бы данные вроде имени, фамилии и т.д., плюс при добавлении нового пользователя генерился бы уникальный номер. Клиент получает этот номер и указывает его каждый раз, когда хочет сохранить данные в базе. Как получать номер, это тоже вопрос. Поскольку считать комбинацию Ф+И+О уникальной нельзя, то я ввести для каждого пользователя что-то вроде пароля, тогда комбинацию ФИО+Пароль можно использовать для получения из таблички пользователя его идентификатора. Ясное дело, что люди с одинаковыми ФИО одинаковые пароли иметь не должны, но эта задача возлагается на модуль добавления новых пользователей

Слушай, а получается так, что тебе по сути нужен в качестве ID просто номер, на 1 больше последнего существующего в базе? Тогда для этого надо использовать автоинкрементные поля, в SQL Server они определяются как IDENTITY. Такие поля при вставке строки сами увеличивают себя на 1 относительно последнего значения
Записан
Dima (KDV_83)
Участник

kz
Offline Offline

« Ответ #4 : 16-11-2005 10:37 » 

Правильно мне нужно чтобы этот ID был на +1 больше преидущего

Просто сейчас видишь как получилось: была одна база общая в ней например Id остановился на 14555, и теперь пользователи (7 человек) начали вводить данные каждый на своем компе т е 1 пользователь ввел 100 записей и сейчас у него Id будет 14655. Вот у первого я базу только и смог забрать,
теперь второй пользователь ввел тоже 100 записей например и у него Id теперь будет 14655, т е видишь Id повторятся начали
и я не могу скинуть остальных 6 человек в свою общую базу
Мне теперь у себя надо как-то сделать чтобы при копировании записей их Id менялся
вот это не получается у меня 
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 16-11-2005 11:12 » 

Делайте вставку SQL-командой "Insert", значение для поля ID не указывайте. И еще, почитайте что нибудь о репликации данных, например это:
http://www.osp.ru/os/2001/12/045.htm
http://replication.chat.ru/
http://ibase.ru/d_repl.htm
Записан

С уважением, Oldy.
Dima (KDV_83)
Участник

kz
Offline Offline

« Ответ #6 : 16-11-2005 11:20 » 

Oldy. я именно с insertom делал сначала, при вставке новой записи вызывал генератор чтобы Id увеличивался, только там при вставке сообщение выходит что то типа "Не могу литеры поменять..."
а appendom делаешь проглатывает, данные записываются

За ссылки спасибо сейчас почитаю
Записан
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #7 : 16-11-2005 12:22 » 

Dima, при вставке данных в таблицу с автоинкрементным полем в операторе INSERT просто не нужно указывать значение для этого поля. Например, если у нас есть таблица People(ID, Name, Phone), в которой поле ID определено как IDENTITY, то оператор INSERT будет выглядеть следующим образом: INSERT INTO People VALUES ("Вася Пупкин", "123-45-67"). Как видишь, поле ID никак не фигурирует в INSERT, и тем не менее при вставке поле ID будет установлено корректно. Никаких дополнительных процедур для этого писать не надо.
Записан
Dima (KDV_83)
Участник

kz
Offline Offline

« Ответ #8 : 17-11-2005 10:04 » 

У меня ведь бд InterBase в нем нет автоинкрементных полей
Специально генератор вызываю при вставке
Записан
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #9 : 17-11-2005 10:58 » 

Прочитал подробнее, въехал, и вправду нет такой возможности... Я вот только не понимаю, на каком этапе у тебя генериться ID? Должно быть так, чтобы вставка данных производилась хранимой процедурой, которая 1) блокирует таблицу на чтение для остальных порльзователей, 2) читает последний ID и генерит на его основе новый, 3) вставляет данные, 4) снимает блокировку.
Что блокировок нет, это я уже знаю Улыбаюсь Нашел тут ресурсик, авось пригодится http://www.ibase.ru/devinfo/pslock.htm
А если без блокировок, то можно попробовать ту же последовательность, только без пунктов 1) и 4)
Записан
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 17-11-2005 16:31 » 

Mouse, в Интербейзе это (автоинкрементация) делается при помощи генератора вызываемого из триггера Before Insert, а так как  каждый из пользователей имеет свою собственную копию базы,то каждый генерит ключи в том-же самом диапазоне возможных значений. А поскольку в "центре" нужно иметь общую базу, образованную путем слияния клиентских баз, желательно применять методы используемые для репликации. Одним из возможных способов может быть генерация ключей (ID) в различных диапазонах. То есть ключи от ID=0 до ID=999 999 - может генерировать пользователь №1, от 1 000 000 до 1 999 999 - пользователь №2 и т.д.
« Последнее редактирование: 17-11-2005 16:36 от Oldy » Записан

С уважением, Oldy.
Mouse
Молодой специалист

ru
Offline Offline

« Ответ #11 : 17-11-2005 18:09 » 

Oldy, спасибо что пояснил. Я ж с Интербейзом не работаю... Улыбаюсь
Записан
Dima (KDV_83)
Участник

kz
Offline Offline

« Ответ #12 : 18-11-2005 04:25 » 

Oldy, я об этом тоже подумал был (каждому пользователю свой диапозон ID выделять), но теперь поздно уже.
Данные они уже по вводили, и заново они уже вводить не будутjavascript:void(0);
Мне теперь остается только самому при копировании в общую базу этот id менять
Записан
Dima (KDV_83)
Участник

kz
Offline Offline

« Ответ #13 : 18-11-2005 06:56 » 

Всеjavascript:void(0);
Всем спасибо
Сделал
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines