![]() |
|
![]() ![]() ![]() |
|
AnacRon |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
Доброго всем времени суток!
Уже устал бегать по всем закаулкам инета и документации и решил спросить. Сам я не силен в программировании (чайник ), но встала задача, которую необходимо решить. дано: Object pascal (fpc, delphi), mysql (postgresql, sqlite). имеем: несколько таблиц, одна из которых главная и представляет из себя список (журнал событий и т.п.):
и несколько таблиц такого характера (параметры привязанных к списку предыдущей таблицы):
в коде: классы для работы с этими данными. Первая таблица
суть вопроса: Читаю все это по некоторым причинам не через dataset, а на прямую в объект на конкретную запись журнала. Таких объектов может считаться сразу несколько с разных клиентских машин. Данные из таблицы Second хранятся в TFirst.Items;
Затем возможны изменения в этом самом Items (вставка, редактирование, удаление). И ни как не могу придумать чтобы записать эти изменения в таблицу (вставка, редактирование, удаление) т.к. считанные и измененные объекты могут сохраняться в разные периоды и с разных машин. Если вопрос совсем детский то прошу прощения. и пните в нужную сторону! уже несколько вариантов испробовал убил целую неделю но так и не разработал нужный алгоритм. Это сообщение отредактировал(а) AnacRon - 17.2.2011, 09:08 |
||||||||
|
|||||||||
Antimol |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 118 Регистрация: 28.7.2007 Где: Украина, Киев Репутация: 4 Всего: 4 |
Первое что приходи в голову: перебор всех записей и проверка на удаление/редактирование/добавление. Если изменения были - вносим их
--------------------
Лучшее спасибо это "+" к репутации. Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи.... |
|||
|
||||
chip_and_dayl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 603 Регистрация: 22.4.2007 Где: Украина, Киев Репутация: 2 Всего: 9 |
На данный момент у самого такая задача
![]() В любом случае нужно пробежаться по списку и формировать запрос типа для случая а) если mySecond.id=null или ноль, то беж запись была создана пользователем то делаем инсерт записи б) если mySecond.id<>null или нулю то делаем апдейт Тут правда не понятно как отслеживается удаление По поводу апдейта, может выйти, что запись уже удалили, тогда еще перед апдейтом делать проверку, чтобы предупредить пользоватедя В итоге пробежавшись по всем элементам списка должно выйти следующий запрос: insert into Second (p1, p2) Value(1,2) insert into Second (p1, p2) Value(7,5) update Second set p1=1, p2=4 where ID=4 и т.д. -------------------- Фсё будет хорошо!!! |
|||
|
||||
AnacRon |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
Так же проскакивала мысль о генерации запросов по конкретному действию в объекте, но сразу возникает нагрузка на сервер. К примеру если не сильно грамотный пользователь будет по неуверенности жать все подряд то может получиться что-то типа
хотя на деле было всего-то добавлено 2 строки в БД. а что будет если таких действий над Second будет пару десятков, а одновременно работа идет наl с сотнями объектов myFirst. из всех вариантов, что мне приходило и в голову и в то место, через которое вышла эта задача, сам решил удалять по id поля таблицы Second, id придется хранить где-то в объекте программы
и затем выполнять
Если честно, то я надеялся, что может существовать более логичный и красивый способ решения, но пока найти его я не смог Это сообщение отредактировал(а) AnacRon - 15.2.2011, 21:14 |
||||||
|
|||||||
chip_and_dayl |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 603 Регистрация: 22.4.2007 Где: Украина, Киев Репутация: 2 Всего: 9 |
Если пользователь создал запись и удалил, то в списке этого элемента не должно быть. И когда мы будем объект сохранять в базу, то мы будем видеть то что есть. Плюс для объекта нужно свойство УДАЛЕН, если элемент был создан (и сохранен в базе) и пользователь удалил Добавлено через 3 минуты и 22 секунды А ид нужно хранить в любом случае, без него никак, при апдейте и удаление ![]()
Пока еще не придумали ![]() Это сообщение отредактировал(а) chip_and_dayl - 15.2.2011, 22:21 -------------------- Фсё будет хорошо!!! |
||||
|
|||||
Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
А вот интересно, если пользователь, не открыл объект, а создал и должен добавить в БД, другой пользователь может в это время добавить точно такой же объект или нет?
Что-то мне кажется что все значительно проще, или я не понимаю до конца задачу. В объект добавляем поля которые заполняем при открытии объекта и ставим их в ReadOnly. А правим те что есть, то бишь получается дубляж полей ( ну и хрен с ним). Перед сохранением ищем запись с полями из свойств ReadOnly и смотрим есть или нет, если есть значит ее никто не менял и мы смело сохраняем по Update, если нет и свойства не пустые до предупреждаем пользователя что кто-то ее сменил, пока он сидел "ворон считал". Ну и предлагаем посмотреть изменения и оставить те что есть или сохранить свои, опять просто Update. Если свойства объекта со статусом ReadOnly пустые, то значит пользователь создал объект, его надо просто сохранить в БД по Insert. А тут как раз возникает мной заданный вопрос в начале поста. Добавлено через 1 минуту и 43 секунды
ID у них должен быть постоянен и никогда не меняться, иначе получите полную кашу. -------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
AnacRon |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
на деле так и реализовано.
так это и понятно. autoincrement стоит не зря у этого поля
Перед сохранением в БД всегда можно в транзакции опросить максимальный ID и сохранить отличным от него на 1. При условии, что БД поддерживает эти самые транзакции. Или я не прав? |
||||||
|
|||||||
chip_and_dayl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 603 Регистрация: 22.4.2007 Где: Украина, Киев Репутация: 2 Всего: 9 |
А зачем? Если поле ИД инкрементное и мы не передаем. СУБД сама его назначает -------------------- Фсё будет хорошо!!! |
|||
|
||||
Deniz |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Можно озвучить эти причины?
Для похожих действий есть механизм кешированных изменений. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
||||
|
|||||
AnacRon |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
Да именно так, не в dataset! прошу прощения за опечатку. Причина: слабый пропускной канал. постоянно перегруженный сервер. По расчетам нашего админа, разовый запрос мене напрягает сеть и сервер чем работа с dataset`ами. Я начинающий программист, по этому пока верю на слово, не разобравшись пока с этим на практике. если есть вариант более экономичный в ресурсах почему им не воспользоваться? |
|||
|
||||
Vas |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
Дык выбирай в датасет одну строку, и нагрузка будет одинаковая, что в объект потом запихивать, что работать с датасетом. -------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
|||
|
||||
Deniz |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Повторюсь:
можно использовать почти трехзвенку, сервер приложений и клиент в одном флаконе. В двух словах: 1. Клиент через провайдер выбирает в ClientDataSet все необходимые записи и отключается от сервера. 2. Далее проводится необходимая обработка данных. 3. Если связи с сервером нет, можно временно сохранить в локальный файл, и перезагрузить комп. 4. После перезагрузки данные подгрузить в программу из локального файла. 5. После появления соединения (желания пользователя сохранить), дельту изменений можно отправить на сервер. Шаги 3 и 4 можно по желанию пропустить. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |