Применение три́ггера (хранимой процедуры) в Clarion

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Developer »

Привет всем!

Очень нуждаюсь в помощи участников форума знающих Clarion применительно к серверу SQL.

К примеру, на сервере SQL есть три таблицы:

!Таблица операций
DataTableOperation FILE,DRIVER('SQLAnywhere'),OWNER('Database,DBA,sql'),PRE(OPR),BINDABLE,CREATE,THREAD
KeyRecordID KEY(OPR:RecordID),NOCASE,PRIMARY !
Record RECORD,PRE()
RecordID ULONG !
DateOperation DATE !Дата операции
Arrival DECIMAL(7,2) !Приход


!Таблица условий расчёта
DataTableConditions FILE,DRIVER('SQLAnywhere'),OWNER('Database,DBA,sql'),PRE(CON),BINDABLE,CREATE,THREAD !
KeyRecordID KEY(CON:RecordID),NOCASE,PRIMARY !
Record RECORD,PRE()
RecordID ULONG
PeriodName STRING(30) !
PeriodDateStartedOperation DATE !Дата начала периода операции
PeriodExpiryDateOperation DATE !Дата окончания периода операции

!Таблица итогов
DataTableTotals FILE,DRIVER('SQLAnywhere'),OWNER('Database,DBA,sql'),PRE(TOT),BINDABLE,CREATE,THREAD !
KeyRecordID KEY(TOT:RecordID),NOCASE,PRIMARY !
Record RECORD,PRE()
RecordID ULONG !
PeriodDateStartedOperation DATE !Дата начала периода операции
PeriodExpiryDateOperation DATE !Дата окончания периода операции
Totals DECIMAL(7,2) !Сумма прихода Arrival таблицы DataTableOperation за период между значениями PeriodDateStartedOperation и PeriodExpiryDateOperation из таблицы условий DataTableConditions

Локальная переменная в окне Browse
LOC:SummArrivalByDateInterval

Необходимо используя триггер (хранимую процедуру) автоматически отображать (обновлять) значение расчёта в локальной переменной LOC:SummArrivalByDateInterval в окне Browse, а также добавлять (обновлять) значение Totals в таблице DataTableTotals сумм итогов в случае добавления, удаления или изменения в заданной таблице операций DataTableOperation, если эти изменения были инициированы как данным приложением, так и другими приложениями находящимися на компьютерах в локальной сети.

В связи с этим вопросы:

1)Как программно из приложения Clarion создать хранимую процедуру (функцию) на SQL сервере?

2)Как программно из приложения Clarion создать триггер на SQL сервере?

3)Как правильно вызвать хранимую процедуру (функцию) SQL в коде Clarion и передать результат переменной Clarion?

4)Как правильно назначить условие выполнения и передать результат работы триггера SQL переменной Clarion или полям таблицы?

5)Как правильно отлавливать событие работы триггера SQL?

6)Каким образом автоматически отображать (обновлять) в окне Browse возвращаемое значение результата работы триггера (хранимой процедуры) в локальную переменную LOC:SummArrivalByDateInterval по условию из таблицы условий DataTableConditions по интервалу указанному в полях PeriodDateStartedOperation и PeriodExpiryDateOperation для расчёта суммы итога по дате операции поля DateOperation для поля Arrival таблицы DataTableValue.

7) Каким образом автоматически добавлять (обновлять) значение суммы итога в таблице DataTableTotals значение результата работы триггера (хранимой процедуры) по условию из таблицы условий DataTableConditions по интервалу указанному в полях PeriodDateStartedOperation и PeriodExpiryDateOperation для расчёта суммы итога по дате операции поля DateOperation для поля Arrival таблицы DataTableValue.

Нужен простой подробный пример текста кода Clarion и SQL.

P. S. С применением Clarion для SQL и самим SQL сервером (языком SQL) пока практически не знаком, поэтому просьба не судите строго, и по возможности предложите более подробные варианты (исходники) для решения поставленной задачи.

Заранее всем спасибо! :D
С Уважением, Developer
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Дед Пахом »

Развёрнутый ответ давать не буду, вкратце:
создать хранимку/триггер:

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

File{prop:sql}='код создания хп'
или

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

SEND(File, 'код создания хп')
Получение значения из хп смотри в хелпе "Stored procedures". Как создать процедуру можно посмотреть например здесь
С уважением, ДП
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Developer »

Дед Пахом спасибо за столь оперативные ответы!

Приступил к изучению примеров...
С Уважением, Developer
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Дед Пахом »

Собственно, не могу не добавить к вышеизложенному: создавать хранимки/триггера из Clarion - не самая лучшая идея...
С уважением, ДП
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Developer »

А каким образом лучше создавать три́ггера (хранимые процедуры) для программно создаваемой пустой базы SQL конечного пользователя?

Если есть возможность, прошу сообщить о недостатках (достоинствах) создания три́ггера (хранимой процедуры) из Clarion.

На данном этапе, для меня важно изучить технологию (язык SQL) создания и применения три́ггера (хранимой процедуры) созданных в базе данных SQL любыми способами во взаимодействии с приложением Clarion.
С Уважением, Developer
Ал
✯ Ветеран ✯
Сообщения: 1011
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Ал »

Дед Пахом писал(а):Собственно, не могу не добавить к вышеизложенному: создавать хранимки/триггера из Clarion - не самая лучшая идея...
:)
Developer писал(а):А каким образом лучше создавать три́ггера (хранимые процедуры) для программно создаваемой пустой базы SQL конечного пользователя?

Если есть возможность, прошу сообщить о недостатках (достоинствах) создания три́ггера (хранимой процедуры) из Clarion.

На данном этапе, для меня важно изучить технологию (язык SQL) создания и применения три́ггера (хранимой процедуры) созданных в базе данных SQL любыми способами во взаимодействии с приложением Clarion.
:D - начать изучать, а не писать поэмы...
Без обид :lol:
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение kreator »

И я согласен с предыдущими ораторами, что SQL базу сначала надо создать на сервере его средствами (в т.ч. хранимки, триггеры), а потом структуру импортировать в словарь и работать с созданной базой. Ведь прелесть хранимок и триггеров в том, что нет траффика от клиента к серваку. Посылаешь из клариона маленький запрос с вызовом хранимки, а сервер выполняет 10000 строк кода и выдаёт одну цифру, класс!!!
We are hard at work… for you. :)
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Алексей- Софт-Центр »

Добрый день!
Не только трафик и время сокращает, но и еще позволяет часть программного кода хранить в "открытом" виде.
При изменении которого не требуется перекомпиляция программы.

Но, есть и некоторое разумное зерно в этом вопросе.
Как пример:
Если я хочу написать собственное управление базой с ,например, ограниченными возможностями.
Да и еще , чтобы конкретый пользователь-программист мог только работать с хранимыми запросами, особо не вдаваясь в SQL

А по этому поводу:
что SQL базу сначала надо создать на сервере его средствами (в т.ч. хранимки, триггеры), а потом структуру импортировать в словарь и работать с созданной базой
на вкус и цвет,... Мне привычней сначала создать словарь, а при выполнении программы- таблицы сами создадутся в SQL...

Алексей
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение kreator »

Алексей- Софт-Центр писал(а):а при выполнении программы- таблицы сами создадутся в SQL...
Ну а как сами? Подсовываешь скрипты создания? Или оставляешь всё на усмотрения Клариона?
We are hard at work… for you. :)
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Алексей- Софт-Центр »

добрый день!
Базу и пользователей создаю средствами баз (sql, mysql,...)
При описании таблиц (файлов) в словаре использую флаг create
процедуры создаю или средствами баз ручками или скриптами.
поэтому при старте программы таблицы в базе создаются "сами" :)


Алексей
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение kreator »

Понятно. А как с форейн ключами, триггерами? Кларион на автомате может форейн ключи создавать? Это принципиальный вопрос. Если нет, то получается, что SQL сервер используется банально как хранилище данных. А, чтобы его использовать полноценно, нужны все возможности SQL (хранимки, триггеры ...). Такая работа (как хранилище), может быть, достаточна для SQLite.
We are hard at work… for you. :)
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Алексей- Софт-Центр »

Добрый день!
процедуры создаю или средствами баз ручками или скриптами
процедурки = "хронимки"
естественно, что сюда входят и функции, и тригеры и прочие бантики...

Что касается внешних ключей (и прочих прелестей) - да, их приходится создавать ручками средствами баз.


Алексей
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение kreator »

Ну а в чём тогда смысл создания SQL таблиц Кларионом? Проще выгрузить структуру БД в скрипт. А потом на стороне клиента его запускать.
We are hard at work… for you. :)
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Shur »

добрый день!
Базу и пользователей создаю средствами баз (sql, mysql,...)
При описании таблиц (файлов) в словаре использую флаг create
процедуры создаю или средствами баз ручками или скриптами.
поэтому при старте программы таблицы в базе создаются "сами" :)
Алексей, присоединяюсь к Kreator'у, я тоже не понимаю, какой в этом сермяжный смысл?
IMHO Не лучше ли всё сделать одним скриптом и сразу (заодно и форейн кеи прописать, триггеры, и, возможно, calculated fields)?
Кстати, знает ли кто, как в Clarion 9.x при создании индекса для таблицы MS SQL указать, что поле должно быть в included fields? Боюсь, что никак.
А это очень важные штуки, если вы собираетесь писать по-настоящему клиент-серверное приложение и обрабатывать большие массивы данных.
Developer
Ветеран
Сообщения: 551
Зарегистрирован: 26 Март 2012, 17:18

Re: Применение три́ггера (хранимой процедуры) в Clarion

Сообщение Developer »

Полностью согласен с Shur:
Алексей, присоединяюсь к Kreator'у, я тоже не понимаю, какой в этом сермяжный смысл?
IMHO Не лучше ли всё сделать одним скриптом и сразу (заодно и форейн кеи прописать, триггеры, и, возможно, calculated fields)?
Однако, все предложения использования внешнего SQL скрипта хорошо применимы при наличии системного администратора баз данных SQL у конечного пользователя.

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

Мои вопросы в основном связаны с заменой файлов TPS на SQL базу Sybase Anywhere без полной поставки и установки всего пакета Sybase Anywhere и средств администрирования баз данных.

Как вариант, поставлять конечному пользователю пустую базу данных с готовой структурой (пользователи, триггеры, хранимые процедуры, форейн ключи и т.д.), однако база данных SQL Sybase Anywhere конкретного персонального пользователя должна быть зашифрована на этапе создания автоматически сгенерированным паролем с определённым алгоритмом шифрования, и этот пароль на базу SQL Sybase Anywhere в целях безопасности программисту не должен быть известен.

Есть ли возможность программно (RunTime) из приложения Clarion сменить параметры существующей пустой готовой базы данных SQL Sybase Anywhere (пароль (ключ) шифрования, алгоритм шифрования, пользователи, пароль DBA (администратора базы)) поставляемой вместе с приложением Clarion для решения вопросов связанных с конфиденциальностью и защитой информации данной базы данных.

Прошу участников форума, имеющих опыт работы в Clarion с Sybsae SQL Anywhere в качестве хорошей альтернативы по замене файлов Clarion TPS высказать свои мнения и предоставить конкретные решения по данному вопросу.
С Уважением, Developer
Ответить