Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2012, 18:56   #11
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Цитата:
Зачем Delphi делать то, что прекрасно умеет делать любой SQL сервер.
Причем используя различные внутренние механизмы оптимизации данного процесса. К вопросу о нагрузке на сервер. Любой программист знает это и не пытается поручить Delphi (клиентсой программе) задачи предназначенные серверу БД.
Ещё раз - есть блок данных Dataset1, есть блок данных Dataset2, они оба постоянно поступают и обновляются в программе. Из этих данных нужно собрать блок данных Dataset3. Нахрена лишние запросы, лишняя нагрузка на сервер (про распределённые вычисления слышали?), а главное - нахрена те же данные гонять по сети повторно?! В общем понятно - и этого тоже в авто режиме в Delphi нет, явная недоделка.
delphicoding вне форума Ответить с цитированием
Старый 19.03.2012, 19:08   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а главное - нахрена те же данные гонять по сети повторно?!
а почему не составить нормальный запрос и не получить dataset3 сразу?
Цитата:
В общем понятно - и этого тоже в авто режиме в Delphi нет, явная недоделка.
1)программирование баз данных подразумевает умение состовлять хорошие запросы в оные.
2)вас на Делфи никто не держит.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.03.2012, 19:12   #13
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Итак у ваес два наборв, межу ними есть какая-то логическая связь. Эту связь можно реализовать на клиенте и получить два связанных междк собой набора даннх. как это сделать. Но мы же этого правила связи не знаем.(будет правило будет его реализация).
Какую из ваших задач обработки (не показа) нельзя решить двумя отдельными (но взвамозавсимыми) наборами данных. Все данные уже есть, зачем их еще раз копировать, чтобы их обработать.

Delphi это язык программирования, а не язык общения с БД. в котром можно ЗАПРОГРАММИРОВАТЬ любое сколь угодно сложное общение с БД. именно поэтому в нем не готовых рецептов на все случаи жизни. если к вас есть типичный для вас случай, вы один раз пишете новый компонент, и получаете готовое решение на все оставшиеся случаи.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 19.03.2012 в 19:30.
evg_m вне форума Ответить с цитированием
Старый 19.03.2012, 19:20   #14
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Цитата:
а почему не составить нормальный запрос и не получить dataset3 сразу?
Потому что в Dataset1 и Dataset2 много других данных кроме нужных в Dataset3, а также потому что в 1 и 2 данные изменяются независимо и если обновить разом 1,2,3 через 3й - будет фигня полная, похерятся данные юзера.
Остальное пропущу.
Цитата:
какую из ваших задач обработки (не показа) нельзя решить двумя отдельными (но взвамозавсимыми) наборами данных. Все данные уже есть, зачем их еще раз копировать, чтобы их обработать.
Хороший вопрос, по-существу. Задача простейшая - хотел сделать Dataset3 для хранения части данных из Dataset1 и Dataset2 для последующего подключения к нему множества Lookup полей (LookupComboBox,Jv,cxGrid,итд). Если для Lookup использовать оригинальные Dataset1 и Dataset2 - всё работает хорошо, пока юзер не начинает редактировать/update/select в них данные - чтобы инфа была свежая приходиться заново делать Select путём Open-Close и многие Lookup поля дёргаются или просто вызывают ошибки! Для этого хотел выделить отдельный Dataset с минимумом данных для Lookup полей. Обновлять его только перед открытием и в случае закрытия окон использующих его как Lookup. Но, видимо, простыми методами это не сделать...

Последний раз редактировалось delphicoding; 19.03.2012 в 19:22.
delphicoding вне форума Ответить с цитированием
Старый 19.03.2012, 19:26   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

почему то я чую неверную структуру БД...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.03.2012, 19:48   #16
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

Пора тебе постить объявление "определяю структуру БД по нюху". :D
delphicoding вне форума Ответить с цитированием
Старый 20.03.2012, 09:29   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Для этого хотел выделить отдельный Dataset с минимумом данных для Lookup полей. Обновлять его только перед открытием и в случае закрытия окон использующих его как Lookup. Но, видимо, простыми методами это не сделать...
Ну так и получи его от сервера честно ОДИН раз (а лучше несколько для разных LookUp) а не путем каких-либо ухищрений и потом так же честно обновляй при нужде. При обновлении DisableControls.
Цитата:
пока юзер не начинает редактировать/update/select в них данные - чтобы инфа была свежая приходиться заново делать Select путём Open-Close и многие Lookup поля дёргаются или просто вызывают ошибки!
Нагрузка на сервер минимальна не так часто это будет случаться. Не может пользователь вводить данные быстрее чем работает компьютер. Обработать 100 знаков в минуту (больше человек физически не способен ввести) сможет любой сервер. Не вижу необходимости в слиянии DataSet jd. И LookUP это показ а не обработка. Если это чаще то
Цитата:
почему то я чую неверную структуру БД...
.

Цитата:
Нахрена лишние запросы, лишняя нагрузка на сервер (про распределённые вычисления слышали?),
Распределенные вычисления подразумевают два достаточно продолжительных (по сравнению с выполнением отдельного запроса к БД) действия
1. подготовка данных человеком. результат подготовки есть запрос к БД на ввод данных.
1 мин работы человека и 1 мс работы сервера. (нагрузки на сервер нет).
2. вычисление (обработка) порции . время может быть в принципе любым. Но если время обработки сравнимо со временем запроса то зачем гонять данные туда-сюда. лишняя нагрузка на сеть (при необходимости их легко восстановить) . А если так то опять нет нагрузки на сервер.
запрос данных - обработка - запрос на ввод результатов.
1 мин обработки - 2 мс сервера БД.
Нагрузка появляется при увеличении обрабатывающих центров.
500 центров *1 мин - 500 *2 мс =1000 мс сервера (1 сек).

или же у вас все наоборот. много-много человек "распределенно" работают с одним сервером вычислений.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.03.2012 в 09:50.
evg_m вне форума Ответить с цитированием
Старый 20.03.2012, 23:42   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я тебе намекну - а зачем вообще проц на клиентской машине работы с клиент-серверной БД?
А с чего ты взял что у клиента будет машинка, способная быстро обработать обьем нагруженных на нее данных?
У нас на предприятии к примеру стоят машины, которых "мудрые" Киевские программистеры считают мегакомпьютерами, и поэтому всю (шоп их) обработки данных вынесли на клиента. В результате - Сервер выдает в сеть всю (шоп их еще раз) базу (а она порядком до 500М разрастается иногда) - это засирает сеть. А сами клиенты... настолько слабенькие что простой запрос Select * from таблица просто минут 10 обрабатывают, при условии что в таблице порядка 10000 записей, хотя после этого запроса программа на клиенте еще раз проходит по полученному набору и возвращает около 5-10 записей (запросы такие у операторов, им то много не надо по роду работы).
А теперь вопрос: Может ну его, сервер то за 30 штук баков? А зачем, если есть клиенты, которые могут потерпеть скажем минут 10-20, чтоб получить простенький отчет в Report?
Цитата:
а главное - нахрена те же данные гонять по сети повторно?
Опаньки. А теперь вопрос: А что это за данные? Справочного характера, которые оч. редко изменяются, или оперативные данные, изменение которых должно затронуть множество пользователей?
I'm learning to live...

Последний раз редактировалось Stilet; 20.03.2012 в 23:45.
Stilet вне форума Ответить с цитированием
Старый 21.03.2012, 13:02   #19
delphicoding
Заблокирован
 
Регистрация: 04.07.2011
Сообщений: 261
По умолчанию

evg_m
Цитата:
Ну так и получи его от сервера честно ОДИН раз (а лучше несколько для разных LookUp) а не путем каких-либо ухищрений и потом так же честно обновляй при нужде. При обновлении DisableControls.
Это очевидно, просто нафига гонять повторно данные которые уже есть в программе в двух разных Dataset'ах. DisableControls спасает от передвижения курсора (который и так в случае Lookup не двигается ), но если связанный в Lookup Dataset делает Close - некоторые типы Lookup компонент делают "опля".
Цитата:
Нагрузка на сервер минимальна не так часто это будет случаться.
Вопрос не только в ЛИШНЕЙ нагрузке на серв (сколько бы не было доп нагрузки - много, мало, всё равно это ЛИШНЕЕ), но ещё и в медленных подключениях типа 14кбит/с - не охота гонять лишний раз лишние данные (данные, которые уже есть в программе).
Цитата:
или же у вас все наоборот. много-много человек "распределенно" работают с одним сервером вычислений.
Всё довольно просто - зачем 100 пользователям посылать 100*кол-во Lookup запросов на сервер, если у них уже есть все эти данные?!

Stilet
Цитата:
А с чего ты взял что у клиента будет машинка, способная быстро обработать объём нагруженных на нее данных?
С того, что любого проца даже Pentium133 хватит для копирования пары колонок данных внутри программы за 1секунду.
Цитата:
В результате - Сервер выдает в сеть всю (шоп их еще раз) базу (а она порядком до 500М разрастается иногда) - это засирает сеть.
Согласен, идиоты бывают разные. Одни идиоты любят свои сервера, но перегружают сеть. Другие любят клиентские машины, но перегружают сервер. Мне бы хотелось обойтись без этих заскоков.
Цитата:
Опаньки. А теперь вопрос: А что это за данные? Справочного характера, которые оч. редко изменяются, или оперативные данные, изменение которых должно затронуть множество пользователей?
Ещё раз - Dataset1 и Dataset2 это редактируемые справочники, редакция которых затрагивает ВСЕХ пользователей. Но реально эти справочники редактируются редко - 1-10 раз в день. Вот юзер врубил своего клиента, получил данные этих справочников и интерфейс юзает их в Lookup полях. Эти Dataset1,2 периодически обновляются по нужным событиям. Но если у юзера открыто окно использующее Lookup поле и юзер открывает для правки справочник связанный с Dataset1,2 - то датасеты нужно Open-Close и Lookup поле глючит! Но поскольку Dataset1,2 уже с данными есть в программе - я вот подумал нафиг делать новые запросы и гонять заново те же данные, лучше из Dataset1,2 собрать нужную инфу в "DatasetLookup3". Но, такого автоматизированного механизма видимо нет.

Последний раз редактировалось delphicoding; 21.03.2012 в 13:05.
delphicoding вне форума Ответить с цитированием
Старый 21.03.2012, 14:41   #20
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Но если у юзера открыто окно использующее Lookup поле и юзер открывает для правки справочник связанный с Dataset1,2 - то датасеты нужно Open-Close и Lookup поле глючит!
1. Отключить визуализацию рабочего набора (disableControls) чтоб не дергался.
Отключить связь Lookup в рабочем наборе (пользователю она сейчас не нужна). или проблема в том что вам неизвестна эта связь.
Дать пользователю выполнить редакцию с независимым набором данных.
Восстановить связь и прочее при необходимости используя дополнительно сохраненные данные.

2. сделать копию НД для редакции (копию одного а не из двух сделать один основной камень преткновения). TdataSet.clone

никогда такого делать не приходилось (но и lookup не пользуюсь).
после редакции удалить. И придумать как отправлять итоги редакции.

или две копии для двух наборов данных. (если вдруг мы должны редактировать сразу два, а не по очереди).
или пересмотреть алгоритм и вместо двух исходных справочников иметь один (сразу получать объединение справочников).
или ... это все пытаюсь догадаться зачем м.б.придумать два НД в один


3. обойтись для редакции без Dataset зависимых компонент. ( зависит от задач редакции кои нам неизвестны). Утопично понимаю.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.03.2012 в 15:02.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в Dataset создать дубликат колонки? delphicoding Общие вопросы Delphi 11 19.03.2012 19:11
Расчет данных одного диапазона по двум критериям двух других alexsampler Microsoft Office Excel 4 29.07.2011 18:08
Выбор значения относительно двух других oleg_sh Microsoft Office Excel 8 05.12.2010 19:52
Можно ли в DataSet установить relationship междщу таблицами? GenniY БД в Delphi 3 25.06.2010 12:23
Как сделать БД на основе двух других PARTOS Microsoft Office Excel 8 11.12.2009 07:54