|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog, ты его не слушай. Он тебе сейчас такого насоветует, что работать ещё хуже будет. dgdog Хммм... но запилить все проверки в хранимых процедурах Да, но только вместо DROP/CREATE TABLE использовать GLOBAL TEMPORARY TABLE ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 09:35 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Di_LIneЛадно, поделюсь мега_хакингом. :-) Есть в одной Табле почти 600 полей. В Дельфе сваял глобальную переменную, типа Full_Colum_Names:='Colim_1,Colim_2,... Colim_J '; И потом курю бамбук: form1.pfibquery4.SQL.Text:='select '+Full_Colum_Names+' from FULLTABLE where '. Так как в процессе жизни Табли кол-во и наименование полей менялось не однократно. И править их приходилось только в одном месте, а не елозить по всему коду. Ну и меньше кнобкотыкать приходится с меньшим числом очепяток. :-) Минус №1. Надо менять константу при появлении новых полей Минус №2. Такая портянка дольше передается по сети Минус №3. Такая портянка дольше препарится сервером А в чем плюсы данного решения? ТС, ты главное не вздумай сделать что-то вроде Query.ParamByName('SomeDate').AsString := DateToStr(aDate). Ставлю на то, что это и есть причина твоих тормозов. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 09:59 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Го-стхи ТС, ты главное не вздумай сделать что-то вроде Query.ParamByName('SomeDate').AsString := DateToStr(aDate). Ставлю на то, что это и есть причина твоих тормозов. Ээээ... а ты нормально на стуле сидишь? Ну тогда вооот: Код: pascal 1.
Было. Дату видишь)))) Правда, вчера местные товарищи с шутками прибаутками меня побили (даже ногами) и я ночью перебил: стало Код: pascal 1. 2. 3. 4. 5.
Ну и большинство Query в этом духе оформил, но еще не все, но самые частые. Да. Чуть, чуть процессор разгрузил. Но очень чуть, чуть))) Транзакции надо разбирать... но это атомный пи*ц. Пью кофе, курю и думаю переписывать модуль заново. И распаралелить всё сразу ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 10:13 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogа на FieldByName в цикле Arioch ругается как компилятор при делении на ноль на ParamByName тоже так что поправим и еще нa ошибку внутри цикла заложимся - добавим закрытие запроса даже в случае exception Любезный Лови простой пример. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 10:46 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogigs123Ну и External Table есть такое в Firebird http://www.ibase.ru/impexp/ Башка не варит, но если я правильно понял то это самый удобный вариант перекинуть данные. Это сырые бинарные данные. С одной стороны, если ты микроконтроллеры программировал, то разобраться сможешь. С другой - зачем делать сложно, если можно просто :-) Чуть что напутаешь - отлаживать и искать ошибку тольк осложнее будет В общем, лично я бы не советовал тебе завязываться на сырые неоформленные данные, сиречь External Tables Хотя смотри сам, конечно ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 10:52 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog Запускается десять разных клиентов которые тащат конкретные данные из конкретных источников. Но мне каждую строчку надо сверить с моей базой. Они наваливаются разом ... и привет ЦП. А зачем все разом? По одному нельзя? Ну или по три максимум :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 10:59 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
.. и потом, если все это делается автоматически (оператор не учавствует в разборе данных), и днем начинаются проблемы с реально работающей бухгалтерией, почему бы не запускать все это ночью? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:03 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogИ это по большому счету всех устраивает, "только скорость импорта нннадА". Так пусть выбирают, им надо "скорость импорта" или чтобы "ничего не менять". Только пусть они официально сами сделают выбор, а ты просто исполнишь. PS. Кстати, "нажимать на клиентах кнопку" может быть и не надо. Сделай службу (WinNT Service) котрая всегда у них работает и "ждёт сигнала" - чтобы твой сервер импорта сам её на клиентах запускал когда надо. Зря и не дальновидно прогнулся под самостоятельный импорт в "одно рыло". (не ожидал такого объема) Теперь переломить ситуацию сложно. И никто не ожидал. Теперь либо вертать объёмы обратно - либо приспосабливаться. Говорят, что у китайцев слово "кризис" сопадает со словом "возможности" :-) Сейчас твоя прога - "дитя природы, хошь дурное - но дитя", все её терпят, но всем она чужая. Админ оперативку на сервере зарезал, бухи хотят чтобы их не трогали но все само работало и т.д. На самом деле ТОЛЬКО сейчас ситуацию можно переломить. Только когда программа начинает захлёбываться и встаёт работа всей конторы - можно поднять статус этой приблуды до законной дочери, до важной части необходимой инфраструктуры. До того, в чем заитероесована и за что отвечает ВСЯ фирма. А вот пока "котлеты не подгорали" так и повода небыло ситуацию пересмотреть. И когда исправишь - снова повода не будет. Только когда всем жмёт, всем стало тесно - только в такой момент и осознается "шкурой" нужность программы и только в такой момент ситуацию можно пытаться менять. Перевесить импорт на бухов "а зачем, работает же... ну медленно, но работает" Вот и пуст ьони под этим подпишутся. Если колом программка встанет "Кто виноват?" хммм... Бухи - они категорически потребовали ничего не менять, несмотря на нарастающие тормоза и мои предупреждения. ...конечно если тебе удастся подписать их на какой-то конкретный и зафиксированный ответ, см. выше. ...а это тебе не удастся, если ты не "переломишь ситуацию" и не эмансипируешь программу до официального статуса обще-фирменно-важной. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:07 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Di_LIneЕсть в одной Табле почти 600 полей. В Дельфе сваял глобальную переменную, типа Full_Colum_Names:='Colim_1,Colim_2,... Colim_J '; И потом курю бамбук: form1.pfibquery4.SQL.Text:='select '+Full_Colum_Names+' from FULLTABLE where ' DRY principle, это архитектурно Но... 1) почему переменную, а не константу ? ненадёжно... 2) почему только поля вынес в константу? если такая пьянка, то уж выносить начиная с select'a и заканчивая 'from FULLTABLE' - уж эти волшебные слова ещё реже меняются, чем столбцы :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:12 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogа вот базу же можно тупо как файл скопировать в резерв (при выключенном сервере)? Понятно с мусором будет и т.п. Но как самый быстрый вариант прокатит? Можно. Но я выше тебе уже говорил про nbackup - таки покури его. Получишь почти такую же скорость копирования - но при работающем сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:15 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
ЛюбезныйТеперь вкратце - пример с параметрами для Insert. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
ну про ParamByName я уже на ноль поделил, теперь буду про транзакции и ошибки. не надо вот так делать! во время работы программы могут быть оишбки, в том числе и на подтверждении транзакции. Так что схема выглядит слегка по другому, в самом простом варианте так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9.
[/quot] 2. Компоненту транзакции на чтение хорошо бы присвоить классические параметры читающей транзакции: read read committed rec_version nowait Этак ты его и на схему с двумя соединениями подпишешь DD В общем совет правильный, но мне кажется пока не актуальный. Достаточно будет просто явно сделать разумное ручное управление вокруг логических блоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:22 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
S.G... и потом, если все это делается автоматически (оператор не учавствует в разборе данных), и днем начинаются проблемы с реально работающей бухгалтерией, почему бы не запускать все это ночью? Долго объяснять. И запарился объяснять на каждой странице, если честно. Загрузка идет 3-5-8 раз в день. Данные нужны СРОЧНО!СЕГОДНЯ! СЕЙЧАС! По три базы разом отрабатывает в легкую. Но это порядка 2-3 часов. Сам понимаешь, 3 раза импорт по 3 часа... бухам работать вообще некогда. Время же уходит еще и на подключение к б.д. (отбой, ошибка, занят, нет инета, связь порвалась). А так по 10 штук хоть разом конектятся, уже плюс (верней, минус минуты).30 - 40 минут против 2х-3х часов. Пошел к задаче с другой стороны (за подсказки по Дельфи, Жарптице спасибо). Но решил разрулить сначала вообще общий принцип работы. Жду 1Сника может даст выгрузку в файл автоматом. (тогда будет проще. Утилита видит файл появился. Хватает его в фоновом режиме и разбирает) Таким макаром обойду загрузку не изменившихся баз и херову тучу не нужных проверок уже имеющихся платежек. Опять же надо выяснить есть ли в 1С датавремя последних изменений проводки?! В мыслях хранить дату последнего импорта по базе и хватать только измененные проводки... Ну короче, начал работу по импорту заново. ПС Вот так вот. Подхалтурил в свое время, "срубил пару штук по легкому". Атомный звиздец)))) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:22 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Любезный Это позволит стартовать ее всего один раз сразу после коннекта к базе данных и больше не трогать. казалось бы... на самом деле в некоторых условиях такая транзакция тоже течет ресурсами - например БЛОБами так что хотя бы пару раз в час надо "предёргивать" и "вечную" транзакцию :-) и даже если сейчас программы автора может быть по любому дольше и не работают всё равно, но на будущее ему лучше опасные советы давать с примечаниями :-) он ведь сейчас мотает это на ус как универсальный и всегда правильный рецепт на будущее ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:25 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog думаю переписывать модуль заново. И распаралелить всё сразу а вот это правильно безумству храбрых.... если ты себя ещё голову не расколошматил об стену дам тебе всеьма рискованный совет - попробуй найти и прочитать хорошую статью про Map-Reduce. Ну просто чтобы голову себе засрать распахнуть двери восприятия посмотреть на свои задачи под другим углом, научиться планировать программу по другому, как поток данных, а не поток действий. На функциональное программирование не обращай внимание - оно тебе тут не нужно и не осилишь. Обращай внимание на саму логику обработки потока данных, когда вместо типового процедурного "взять элемент данных, провести его через 10 операций, положить результат в копилку, взять второй элемент данных..." выстраивается конвейер "взять первое действие, провести через него все элементы данных; взять второе действие и провести через него все результаты первого действия; взять третье действие". И на то, что "неестественное" для процедурников и очень неэкономная по памяти организация программы в некотрх условиях оказывается и гораздо проще-понятнее и гораздо быстрее, чем "нормальная" оргaнизация. Ну а если oт MapReduce вернуться на землю, то напоминаю про 19450595 Чисто совет как в несколько раз уменьшить количество запросов и транзакций - в своих клиентах сразу группируй данные по разным PP. Или через интерфейс источника данных, если можно и достаточно быстро, или (например при вычитке текстовых файлов) - через временные файлы/таблицы. При этом для каждого отдельного PP выясняешь или запоминаешь минимумы и максимумы Даты и Расхода (или любых других столбцов по которым ты запросы делаешь) и вчитываешь с основного сервера не одну единственную запись, а сразу целую срезку, табличку под этот PP. 19450595 В результате у тебя количество запросов (и автоматических транзакций) будет количество разных PP, а не как сейчас - перемножение количеств PP и Расходов и Дат. В несколько раз меньше, если не порядков. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:44 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog Подхалтурил в свое время, "срубил пару штук по легкому". Атомный звиздец)))) Какая же это халтура, если ты там корни пустил ? Халтура - это "сунул, вынул и пошёл" ( этические вопросы обсуждать не будем ). А ты не пошёл. А ты там поселился. В своей же халтуре. И при этом фактически приняв, что у тебя с этой программой теперь уже серьёзные отношения, не стал о ней по настоящему заботиться. "Вот это мы с Вованом тормознули" (с) КВН ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:49 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
ЛюбезныйЧто тут важно: Ни то ни другое для пакетной обработки не важно. Это советы исключительно для интерактивных приложений. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:50 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdogНу и большинство Query в этом духе оформил, но еще не все, но самые частые. Да. Чуть, чуть процессор разгрузил. Но очень чуть, чуть))) Транзакции надо разбирать... но это атомный пи*ц. Надо смотреть, сколько за весь цикл выполняется запросов и каких. Если, к примеру, для каждой локальной базы крутится цикл по 100000 записей, для каждой из которых в рамках своей персональной транзакции выполняется запрос на выборку - тут параметры особо не помогут, конечно всё будет тормозить. Возможно, стоит рассмотреть вариант сделать предвыборку из главной базы, на основе нее предварительно отсеять некоторую часть данных из локальной базы, а потом оставшиеся уже проверять конкретно. Что же касается таблицы в памяти, с которого начался топик, то запрос, связанный с read read_committed транзакцией и которому сделали FetchAll, вполне сойдет за требуемый объект. Только вот если данные из таблицы должны будут меняться для каждой записи локальной базы, то смысла в этой "таблице в памяти" особо не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:57 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Ariochdgdog думаю переписывать модуль заново. И распаралелить всё сразу ..."взять первое действие, провести через него все элементы данных; взять второе действие и провести через него все результаты первого действия; взять третье действие". ... Вот не поверишь. Пока жду административных решений и товарища ОдынЭсника. План переписи модуля как раз сложился к тому: А какого х*ра я каждую проводку фигачу?! Сводим весь импорт в 1 файл или таблицу... не суть. Но все в единый формат. 1. Сначала выкидываем все, что выкидывается впринципе. Тупо сравнением таблицы - дубли. Это вообще ОДИН запрос. 2. Потом проверяем из оставшегося чего нет в справочнике банков и других справочниках. Суем все партией. коммитим. 3.Тут немного логики... проверки, но они плевые для клиента-сервака. 4. Суем все оставшиеся проводки в базу. Пачкой. Коммит т.е. я так понял, ты как раз о таком разбиении... и какого х*ра я огород городил? (хотя оправдание есть, я не знал о существовании других источников импорта. И допиливал под сиюминутные требования. Теперь задача раскрыта полностью НАДЕЮСЬ ) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 11:58 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog, ну дык я тебя примерно к такой методе и подталкивал с самого начала, разбить на несвязанные куски обменивающиеся пакетами данных на каждом источнике данных запускается полу-импорт и создает стандартный пакет для отправки на центральный сервер, который уже окончательно импортирует все такие одинакового типажа пакеты. вопрос только в балансе, сколько процентов проверок делать на клиентах локально (а для этого потребуется заранее на сервере формировать подробные "требования по импорту", зато потом при новых рабочих местах все параллелится автоматически), а сколько таки на сервере. Грубо отшелушивать лучше всё же удалённо, на процессорах с источниками данных, а окончательную тонкую шлифовку уже можно на сервере. с буферами сервера та же фигня, сделаешь слишком много - в итоге только хуже получится, опять баланс ищи :-) с транзакциями то ж: и миллион транзакций по одной записи плохо и одна на миллион записей не лучше, а лучше тысяча по тысяче и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 12:08 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Го-стхизапрос, связанный с read read_committed транзакцией и которому сделали FetchAll, вполне сойдет за требуемый объек Только вот он подымет сложность алгоритма до O(N^2)... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 12:08 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Ariochdgdog Подхалтурил в свое время, "срубил пару штук по легкому". Атомный звиздец)))) Какая же это халтура, если ты там корни пустил ? Халтура - это "сунул, вынул и пошёл" ( этические вопросы обсуждать не будем ). Не совсем так)) в 2013-2014 я и думать не мог, что я тут поселюсь))) А пришел я совсем по другому профилю. Правда направление с полгода как свернули и я остался не у дел. Ну не об этом сейчас ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 12:49 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
Го-стхиМинус №1. Надо менять константу при появлении новых полей - Ну и чё ставо? (запихивая горсть попкорнв в клюф) У тебя чё, состав полей в табле меняется, как настрояниее у бушек, по 5 раз на дню? Го-стхиМинус №2. Такая портянка дольше передается по сети - Чё-чё? Как порнуху гонять по сети, так ничо не тормозит. А от разовых 6 килобайт - так пипец, как вся сеть ляжет. Го-стхиМинус №3. Такая портянка дольше препарится сервером - А ты и не дергай каждый раз. :-) Справочник он и в африке справочник. В данном случае для проверки дельт. - А есле полей нуна не под 600, а 500? Тогда чё? Бушь в каждой итерации тягать излишки на клиента, напрягая сеть и сервер. Ну не верится мну, что апдейтяться "все-все-все" поля. И тырканье "селект * фром Табля" больше грит о лености прогера и его не желания думать головом ДО. То есть не прогер, а кодер. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 13:10 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
AriochDRY principle, это архитектурно - Ни фига! DIY principle со всеми втекающими... - Ы? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 13:19 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
И тырканье "селект * фром Табля" больше грит о лености прогера и его не желания думать головом ДО. То есть не прогер, а кодер. :-)[/quot] А вот сейчас обидно было. Ага. Сорри, за офтоп от полного профана: но тогда уж замути массив переменных, где будут перебраны все варианты полей.)) и потом эти переменные пихай в selectы. Вдруг в DBgrideh вывести придется, она очень любит чтоб последовательность полей совпадала с последовательностью в запросе. Нет ребят без обид, сколько прогеров, столько решений))) Тебе удобно? Ну и зашибись. Работает? Ну и не лезь.))) ПС на вооружение метод принял. Ничего сложного вроде, но вовремя сообразить не всегда же получается. При большом количестве полей попробую... но вот есть ли преимущество перед звездочкой? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 13:27 |
|
Delphi, FireBird создать таблицу в памяти клиента
|
|||
---|---|---|---|
#18+
dgdog... но вот есть ли преимущество перед звездочкой? Так ни кто, кроме тебя не знает ВСЕЙ твоей задачи. А по сему - Каждый сверчок свистит как ему видится со своей колокольни. :-) Значит... ~70% свиста букв равны зеленым свисткам в воздух. :-) По этому и дают не точные рецепты и инструкции к действу, кроме тынцов в бумашки, а так-сзать направление для мыслей в правильную сторону, как и бумашках. PS 1: Если чё, я - не кладовщик. :-) PS 2: dgdog...но тогда уж замути массив переменных, где будут перебраны все варианты полей.)) - Ну и как ты, ваш-бродь, всю эту жуйню бушь лопатить под WEB, когда время на сформированный ответ не более 200 мсек? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 14:00 |
|
|
start [/forum/topic.php?fid=40&msg=39280199&tid=1561790]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
88ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
others: | 265ms |
total: | 468ms |
0 / 0 |