Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» InterBase и FireBird: вопросы по работе и их решение

Автор: ant0ni02004
Дата сообщения: 28.11.2014 18:40
russko
вряд ли дело в вычисляемых полях (если мы об одном и том же говорим)
скорее дело в большом кол-ве подзапросов из второго запроса, типа вот таких (я уже не говорю о простых типа SUM())

,(select RESULT_SUMMA from NPC_SCHETA_OPL_NEOPL(NSz.ID,1,2,null,NSz.summa_v_valute_sch)) OPLACHENO_PROCENTOV

,(select min(Data_Opl) from NPC_Scheta_Oplata nso where nso.Schet_ID=nspz.Schet_ID ) DATA_OPL_FIRST

,(select case when max(Data_Opl)<>min(Data_Opl) then max(Data_Opl) end from NPC_Scheta_Oplata nso where nso.schet_ID=nspz.Schet_ID ) DATA_OPL_LAST

попробуйте их по одному "выключать" (напр. ,0.000 OPLACHENO_PROCENTOV ) и увидите, что же реально тормозит. а потом будет видно как ускорить - или индекс добавить, или получать в цикле, или даже хранить результаты в таблице

Автор: xpin2013
Дата сообщения: 29.11.2014 14:07
miwa

Цитата:
Спасибо. Если что, я знаю и ваш предыдущий ник и помню вас на скуле. Поэтому пользуясь случаем хочу сказать, что на вас иногда находит довольно серьезное косноязычие и понять написанное решительно невозможно. Не знаю, могло ли это быть причиной бана, но это точно было причиной одного обмена публичными сообщениями "на грани фола" между нами здесь, на руборде.

Скорее всего Вы не правы. На sql.ru кто-то начал светить мои личные данные и тролить по этому поводу. Я был выпивший и не зная что так принято высказался грубо. К личным данным я отношусь следующим образом. В 1993 году я решил что я больше не хаккер. В 1994 написал свой архиватор. После этого я взломал всего 2 программы. Одна из них моя собственная, я потерял исходники, а они были зашифрованы в этой программе. На ru-board отказались её ломать - объяснили "грязные технологии". Все формы программы были зашифрованы. Но в моей программе был JCL дебаг для лога экзепшена. Я написал программу которая вытаскивает этот лог и нашёл функцию IsFebruary4. Тут то я её и хакнул, но защита действительно сложная. Я не хаккер. Личные данные я уважаю. И я считаю что айтишник который взламывает программы, пишет собственные архиваторы, пишет собственные TDataset (на что Вы и обиделись), такой человек не является нубом. И никакой завсегдатай sql.ru не выше его. Напишите в ветку Ассемблер, что Вы все нубы и не знаете sql. Полагаю их ответы смогут Вас просветить, кто действительно нуб в просторах интернета. Не обижайтесь, я Вас действительно уважаю - иногда Вы можете чудом натолкнуть на идею.

chAlx
Предлагаю прикрыть про sql.ru, они не стоят.

Добавлено:
miwa
Да кстати новости, хотел поделиться. Я Вам предложил соавторство, так как Вы натолкнули на идею, но помнится Вы отказались. Так вот, в моём датасете теперь есть ForeigKeys. Но пока я не решил - индексы отдельно. ForeignField должна иметь уникальный иднекс, а FieldName тоже должна иметь индекс, на случай CASCADE или SET NULL. Ключи пока создаются только в оболочке DElphi, но vdbXplor их подхватывает. Плюс и я смог перейти на EhLib XE6. Так что мой простенький клиентдатасет всё ещё поживает. Всегда велком.
Автор: noisy
Дата сообщения: 01.12.2014 18:36
форумчане, вышла бета версия Firebird 3.

багрепорты приветствуються. просьба прогнать на своих проектах.

Добавлено:
не забываем что FB3 не допускает смешивать явный и неявный джоин
т.е. запрос:
Select * from table1, table2 inner join table3 on (table2.id = table3.id)

не сработает на FB3

Автор: xpin2013
Дата сообщения: 03.12.2014 18:38
noisy
Я почитал, что там наворочено. Этого за 10 лет не выучить - вот уж постарались. Особенно мне понравился update returning old.value new.value.

Про триггер выяснилось случайно недавно, что у моего коллеги хранимая процедура когда ей дают в параметре null, она шарашит всю таблицу. Old.id в insert триггере null. Так что это не FireBird такой, это как обычно мы чуток кривоватые. Простите.
Автор: noisy
Дата сообщения: 10.12.2014 13:40
Вышло обновление Firebird версии 2.1 и 2.5.
Автор: xpin2013
Дата сообщения: 26.12.2014 22:02
noisy
- Ты сегодня разговаривал с Гуглом?
- Ну да.
- И что он тебе рассказал?
- Да как всегда, "Страница не найдена".

Я думаю это дети. Это они странички выдирают.
Автор: SuPriTo
Дата сообщения: 12.01.2015 14:25
Подскажите компонент Delphi для работы с Firebird embedded, который можно использовать в windows service? Без всяких оконных компанент.
Автор: Chukotka
Дата сообщения: 12.01.2015 16:26

Цитата:
Подскажите компонент Delphi для работы с Firebird embedded
Работа с embedded ничем не отличается от desktop - так что хоть стандартные IBX, хоть FIbPlus или IbDac какой-нить
Автор: SuPriTo
Дата сообщения: 12.01.2015 16:31
Chukotka

Цитата:
Работа с embedded ничем не отличается от desktop - так что хоть стандартные IBX, хоть FIbPlus или IbDac какой-нить

Я знаю, что работа с embedded ничем не отличается. Можно эти компаненты использовать в службах windows или есть ограничения?
Автор: ant0ni02004
Дата сообщения: 12.01.2015 20:14
SuPriTo
а вы уверены что сам сервис Окажется "Без всяких оконных компанент"?
там же (SvcMgr.pas) ссылки на Forms...
Автор: xpin2013
Дата сообщения: 12.01.2015 20:52
ant0ni02004

Цитата:
там же (SvcMgr.pas) ссылки на Forms...

Да им там нужно переопределить компонент TApplication. Даже если будут формы, но TService.Interactie = false, то ни одно окно не появится.
Автор: Shaman2
Дата сообщения: 12.01.2015 21:02

Цитата:
Даже если будут формы, но TService.Interactie = false, то ни одно окно не появится.


чтобы не открывать вопрос в отдельной ветке, может подскажите способ взаимодействия с безоконным сервисом? Я о управлении и командовании ним из основного приложения. Встал вопрос получения данных из него, так как в windows 2008 окна сервиса невидно
Автор: xpin2013
Дата сообщения: 12.01.2015 21:22
Shaman2

Цитата:
так как в windows 2008 окна сервиса невидно

В любой виндовс не видно. Оконные хендлы сервиса - это одно пространство, оконные хендлы сессии юзера - другое пространство. Это же касается Мьютексов и многих других хендлов. Приемлемый для меня способ TCP/IP порт.
Автор: SuPriTo
Дата сообщения: 12.01.2015 22:40

Цитата:
чтобы не открывать вопрос в отдельной ветке, может подскажите способ взаимодействия с безоконным сервисом?

Pipes, FileMapping, TCP/IP. Сейчас пишу библиотеку для обмена сообщениями на базе FileMapping.
_http://msdn.microsoft.com/en-us/library/windows/desktop/aa366537%28v=vs.85%29.aspx
Автор: ant0ni02004
Дата сообщения: 13.01.2015 03:51
xpin2013
TCP однозначно. Хотя бы потому, что расширяемо до удалённого управления/мониторинга сервисом с другого компьютера.
Автор: xpin2013
Дата сообщения: 13.01.2015 05:29
SuPriTo

Цитата:
Сейчас пишу библиотеку для обмена сообщениями на базе FileMapping.

Отпишите плиз, получается ли? Я подозревал что FileMapping тоже не доступен.

Добавлено:
Или нужно указывать \"System.Spacename"\fname
Автор: SuPriTo
Дата сообщения: 13.01.2015 09:20

Цитата:
Отпишите плиз, получается ли? Я подозревал что FileMapping тоже не доступен.

Я пока не тестировал. В help написано, что имя нужно указывать следующим образом "Global\Name" - для глобальных сессий (возможно потребуются еще права) и "Local\Name" - для локальных сессий.
Автор: mrUlugbek
Дата сообщения: 29.01.2015 09:39
Привет всем
Дайте пример заполнение мастер детайл (инвойс) одним хранимой процедурой?
Хотел спросить можно ли заполнить мастер детайл (инвойс) одним хранимой процедурой?..
Использую компонент Devart Ibdac
Примерно делаю так
Главная форма+ДбГрид+Датасет='select * from view order by 1'
Три кнопки Добавить,Редактировать,Удалить
При нажатия кнопки Добавить открываю вторую форму детали
для редактирование использую два датасета у обоих cachedUpdate = true стоит
1 - МастерДатасет = 'select * from master where id=-1'
2 - Детайл = 'select * from master where id=:master_id'

Мастер Сиквенс беру при инсерте. Заполняю мастера потом заполняю детали много товара если нажимать на отмену то все отменяется в базе ничего ни пишется если нажимать сохранить то все сохраняеться.. и обновляю Главную форму датасет..
Мне не нравиться в этом подходе что генерация сиквенса при инсерте если отменяет юзер то секвенс уже генерировался.

Как та можно все это в одном процедуре сделать
Примерно заполнил шапку инвойса потом детали к нему... и сохранить
Try
СтартТранзакция
вызов процедуры
Коммит
except
Роллбек

Рефреш датасет

ХП Процедура примерно

insert into master (gen(seq,1),name)
returning id into :id

insert detail (mastid)
:id

Как такое реализовать

Детали как буду передавать в цикле? Или есть какойта способ пакетно передача
Автор: SuPriTo
Дата сообщения: 29.01.2015 10:08

Цитата:
Try
СтартТранзакция
вызов процедуры
Коммит
except
Роллбек

Все эти действия нужно выполнять в хранимой процедуре.


Цитата:
insert into master (gen(seq,1),name)
returning id into :id
insert detail (mastid)
:id

Создаешь хранимую процедуру, передаешь туда необходимые параметры. В хранимой процедуре делаешь всю логику по добавлению данных и возвращаешь результат.
Конкретный пример не приведу, т. к. давно этим занимался.
Автор: mrUlugbek
Дата сообщения: 29.01.2015 11:50
SuPriTo
Можете пример как передать параметры
Передача данных как идет?
Автор: SuPriTo
Дата сообщения: 29.01.2015 12:45
mrUlugbek
Все зависит от компонентов, которые вы используете. Например, в FireDac есть специальный компонент TFDStoredProc, при помощи которого можно обратиться к хранимым процедурам на стороне сервера.
А в целом работа с хранимыми процедурами ничем не отличаются от работы с запросами.
http://www.firebirdsql.org/refdocs/langrefupd21-ddl-procedure.html
http://www.ibase.ru/devinfo/sp_call.htm
Автор: Andryshok
Дата сообщения: 29.01.2015 15:54
Ничего не зависит от компонентов которые используете - это лишь обертка над API субд

Пример бы дал да не стоит у мню фаер а ставить лень, все на самом деле просто
В самом теле процедуры получаете значние генератора первичного ключа поля мастера - читать тут http://www.firebirdsql.org/manual/ru/generatorguide-sqlsyntax-ru.html
Пишите полученный ключ во внейшний детайла .... и т.д., делов то...
Автор: OXDBA
Дата сообщения: 30.01.2015 07:56
Andryshok
SuPriTo

mrUlugbek жаждет передать неопределенное количество параметров в хранимую процедуру(что невозможно без извращений, да на самом деле и не нужно) ибо не знает количество detail'ов.
Автор: chAlx
Дата сообщения: 30.01.2015 10:26
Andryshok
OXDBA

Такая постановка задачи, что каждый понимает по-своему ;) Я вот понял, что проблема в убегающем автоинкременте, который по-любому должен оставаться независимым от транзакций. Ну, можно после роллбэка его вручную перекрутить на max(id)+1, но это, опять же, может совпасть с параллельным инсертом...
Автор: jonikDk
Дата сообщения: 30.01.2015 10:42
mrUlugbek
Как мне видится тут 3 варианта
1. Передавать все параметры в ХП и в ней уже раскидывать по мастер и детали. Но возникает проблема с количеством параметров. (пример проблемы: в детальную таблицу нужно записать несколько записей)
2. Использовать механизм CasheUpdates (по моему так называется) - тут зависит наверное от конкретной реализации этого механизма в компонентах. (Если честно, сам пробовал этот механизм около 10 лет назад, но результат не помню)
3. Использование In Memory DataSet - заполняем все данные, проверяем и только затем передаем на сервер. Сохраняя в начале запись в мастере, а затем в подчиненных таблицах.

У всех методов есть недостатки...
Автор: OXDBA
Дата сообщения: 30.01.2015 12:49
chAlx
Собственно вопрос

Цитата:
Дайте пример заполнение мастер детайл (инвойс) одним хранимой процедурой?

Если бы mrUlugbek поставил себе задачу

Цитата:
проблема в убегающем автоинкременте, который по-любому должен оставаться независимым от отката транзакций.

То давно бы уже решил ее сам, заменив пункт вызов процедуры из

Цитата:
Try
СтартТранзакция
вызов процедуры
Коммит
except
Роллбек

на выполнение одного Insert для мастера и N для detail, используя тот же TIBCSQL из IBDAC.
Автор: Andryshok
Дата сообщения: 30.01.2015 15:41
Что тут сложного? Вопрос именно в том что чел не знает как получить занчение генераторного поля мастера, как его получить я писал выше. Алгортим:
-старт транзакции
-вызов нужной процедуры/процедур сколько нужно раз для массива данных
-завершение транзакции

Усе
А выполнять это все в одной транзакции или в мильене это решение разработчика.
Автор: mrUlugbek
Дата сообщения: 31.01.2015 09:06
Andryshok
Пример дайте если есть
Вот Firebird поддерживает тип массив..

Пример

Create Procedure Invoice
(id integer)
if id=-1 then
insert into masttable(gen(id,1) )
returning id into :mastID
ProcedureDetailinsert(-1,mastID,tovar)
end

Create Procedure detail
(id integer
,mastid integer
,tovarID [10, 500] -- пример массив параметр допустим максимальный будет 500 )

вот не знаю как получить данные от клиента

примерно так будет

count=Tovarid --- Узнаем состав инвойса

for mass to count
insert into detailinsert (id,mastid,tovar[mass])



Ладно буду использовать обычный кешапдейт без процедуры
try
start
except
rollback
end



Автор: tanaseduard
Дата сообщения: 05.02.2015 09:50
Народ кто то тестил FireBird 3. Очень интересуют пакеты.
Автор: miwa
Дата сообщения: 05.02.2015 18:34
tanaseduard
А что интересует? Работают пакеты, как описано в документации. В IBExpert еще рюшками и ленивым режимом не обвешаны, но автор експерта над этим работает.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465

Предыдущая тема: Сравнение двух строк


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.