Начисляем деньги. А если способ начисления изменится?

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 09 июн 2005, 10:13

Доброе утро,
Ivan_Pisarevsky писал(а):Если развить тему про генераторы, хочь это и квадратноколесный лисапет, ну раз уж назвался груздем...
Можно сделать так: В основной программе растим специально обученый генератор и ...
А для работы в многопользовательской среде сляпаем, а потом будем пасти пул генераторов, на случай одновременного запуска аналогичных задач несколькими пользователями одновременно. Ну, если очень хочется, то можно, конечно. Генератор, внешнюю таблицу (а чем не пацанский вариант?) и ышо что-нибудь прикрутить.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 09 июн 2005, 12:03

А для работы в многопользовательской среде сляпаем, а потом будем пасти пул генераторов, на случай одновременного запуска аналогичных задач несколькими пользователями одновременно.
На запуске крейт генератор, на входе дроп генератор, правда работать с ХП с динамически меняющимся генератором секс явно нетрадиционный, извратиться с чем-то вроде экзекут стэйтмент...

Да я вообще за то, чтоб показать юзеру анимашку и пусть любуется :) и сервер БД фигней не парягает :D
Генератор, внешнюю таблицу (а чем не пацанский вариант?) и ышо что-нибудь прикрутить.
Добро пожаловать на борт нашего самолета к вашим услугам бар, сауна, бассейн... А теперь со всем этим добром мы попытаемся взлететь, пристегните ремни! :lol:

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 09 июн 2005, 13:19

Ivan_Pisarevsky писал(а):На запуске крейт генератор, на входе дроп генератор
А вот с помощью этого угла колеса мона и задницу отбить об седло. Ва-первых, дроп генератор появился не так давно, счастливые обладатели IB меньше 7 этого сделать не могут. Ва-втарых, этот дроп только сносит данные о генераторе из системной таблицы и не освобождает место на странице генераторов, тут порядок может навести только b/r. И исчерпание там места ведёт к получению corrupted database. Не знаю какие цифры нынче предельные в этом смысле для текущих версий какого клона, но упомянутые счастливые обладатели были ограничены вовсе не астрономическими цифрами, зависящими от номера версии и размера страницы, сотни какие-то в общем. В МИ табличка даже есть, там где причины повреждения баз расписаны, сам для Ковязина рисовал, уже не помню ни хрена этих цифирек.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 09 июн 2005, 15:08

Ну что я могу сказать, одну из возможных концепций я предложил, грабли есть, где лежат тоже вроде расписали, пусть автор сам решает надо ли ему это.

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Сообщение Solo » 10 июн 2005, 04:17

Ivan_Pisarevsky писал(а):А теперь со всем этим добром мы попытаемся взлететь, пристегните ремни! :lol:
Да, пожалуй, что так. Убедили. Наступили песне прямо на горло... не такое уж у меня крутое программо, чтобы прогресс был сложнее всего.
Придется показывать crHourGlass...

Вот есть более приземленный вопрос: опять же про начисление денег.


Читал-читал я про хранимые процедуры, но до конца не понял. Зауск одной процы из другой - понял и использую. Но передача параметров пока не требовалась. И вот потребовалась, а как забрать-то значение выходной переменной, так и не понял.

Конкретнее: процедура начисления оценивает SmallInt-поле "KATEGORY". В зависимости от значения этой самой категории CASE-методом предполагается вызывать разные процедуры расчета. С передачей в них значений других полей:

Код: Выделить всё

CASE :KATEG IN /*или какой там синтаксис, не помню... ну смысл такой - если категория = числу*/
  1 : begin EXECUTE PROCEDURE PERVAYA(PRICE, KOLVO) end;
  2 : begin EXECUTE PROCEDURE VTORAYA(PRICE, KOLVO) end; 
  ... и т.д.
Выходом из расчетных процедур должно быть ITOGO (типа ЦЕНА*КОЛИЧЕСТВО. Естественно, я упрощаю). Так вот: где его вылавливать - то, этот выход?

Заранее благодарю за подробный пример :oops:

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 10 июн 2005, 08:05

begin EXECUTE PROCEDURE PERVAYA(PRICE, KOLVO) end;
дочитай доку до слова "RETURNING_VALUES" :wink:
Что мешает в конце процедуры поставить "suspend" и в вызывающей процедуре просто выбирать селектом?
Придется показывать crHourGlass...
Положи на форму Танимэйт и показывай, например, анимашку поиска файлов. делов-то...

Solo
Сообщения: 108
Зарегистрирован: 18 апр 2005, 04:05

Сообщение Solo » 10 июн 2005, 09:07

Ivan_Pisarevsky писал(а):begin EXECUTE PROCEDURE PERVAYA(PRICE, KOLVO) end;
дочитай доку до слова "RETURNING_VALUES" :wink:
Да читал я эту доку. И фак читал, и статьи скачал... Только до стихов про InterBase не добрался еще. Везде так и написано хитроумно да с вывертом. Вот мы в простой ХП делаем FOR SELECT что-нибудь откуда-нибудь. И потом сажаем эти значения полей в переменные:

INTO :Переменная1, :Переменная2, .... и т.д.
Во-о-о-от. Потом с ними работаем, потом некоторые из них передаем в расчетную процедуру (Цену, количество и т.п.), потом забираем результат.
Потом INSERT в таблицу начислений на предмет присвоения значений ее полям. Причем в одно из них и попадает результат.

Это ясно.
А как должна выглядеть строка, где мы забираем выходную переменную-то, сиречь результат?

Select из таблицы INTO в переменные
а тут что SELECT'ить - то? Как это оформить документально?

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 10 июн 2005, 09:57

solo писал(а):Да читал я эту доку. И фак читал, и статьи скачал...
Статьи читать. Купи еще книжку "Мир Interbase"(по вопросу см.главу "Хранимые процедуры")
Еще:
http://www.ibase.ru/firebird.htm#doc
доки и релизные ноты скачать, изучить.

см.тут
http://www.ibase.ru/v6/doc/langref.zip
Language Reference
Procedures and Triggers

и даже тут :
http://www.ibase.ru/v6/doc/embedsql.zip
Embedded SQL Guide
CHAPTER 10 WORKING WITH STORED PROCEDURES
USING SELECT PROCEDURES
USING EXECUTABLE PROCEDURES
(хоть это мануал подходит "только если вы используете GPRE", 10 глава ответит на твой последний вопрос:
SELECT PROJ_ID FROM GET_EMP_PROJ (:number);
или
EXECUTE PROCEDURE DEPT_BUDGET( 100 ) RETURNING_VALUES :sumb;)
solo писал(а):Только до стихов про InterBase не добрался еще. Везде так и написано хитроумно да с вывертом.
:)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 10 июн 2005, 12:28

Ivan_Pisarevsky писал(а): Что мешает в конце процедуры поставить "suspend" и в вызывающей процедуре просто выбирать селектом?
Типа опять ворнинг. Да, зануда я, зануда :-D По идее не мешает ничего, но по состоянию дел на текущий момент я бы этим _увлекаться_ не советовал. Нет, где нужно, значит нужно. А при singleton-result, где можно обойтись Execute, лучше не надо. Бажок там есть с ужором памяти, вот пофиксят, тогда уж...

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 10 июн 2005, 14:27

to Merlin
Ну раз ворнинг, примем к сведению :wink:
Да, зануда я, зануда
дык за конструктивную критику я не в обиде :)

Налево пойдешь (это про старый баг с TIBStoreProc, типа не пользоваться запускными процедурами, а лучше выборками...) направо пойдешь (теперь наоборот, пользоваться лучше запускаемыми процедурами, а не выборками...) Куда бедному программеру податься... :lol:

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 10 июн 2005, 14:37

Ivan_Pisarevsky писал(а): Налево пойдешь (это про старый баг с TIBStoreProc, типа не пользоваться запускными процедурами, а лучше выборками...) направо пойдешь (теперь наоборот, пользоваться лучше запускаемыми процедурами, а не выборками...) Куда бедному программеру податься... :lol:
Старый баг чиста клиентский и чиста IB-шный, усиленный маразмиком в FIB-IBX, а этот наоборот, чиста серверный, при селекте из процедуры внутри другой процедуры. Так шта судьба наша - преодолевать склероз и помнить где какие грабли и как обходить. Кстати, вот насчёт борьбы со склерозом - медики рекомендуют http://www.medicus.ru/?cont=news&nws_id=7905
;) Но я поступил просче - выкинул из IBX эту дурость, а поскольку клиент FB-шный, то при работе с клиента и помнить ничо не надо стало.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 14 июн 2005, 09:00

Аднака методы лечения у вас... :roll:

Ответить