WWW.DISS.SELUK.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА
(Авторефераты, диссертации, методички, учебные программы, монографии)

 

Pages:     | 1 |   ...   | 2 | 3 || 5 | 6 |   ...   | 8 |

«Краткое оглавление КРАТКОЕ ОГЛАВЛЕНИЕ 1 ПОДРОБНОЕ ОГЛАВЛЕНИЕ 4 ВВЕДЕНИЕ 17 Для кого предназначено настоящее руководство 17 История создания платформы 17 Платформа с открытым кодом 18 Обзор архитектуры 20 УСТАНОВКА И ...»

-- [ Страница 4 ] --

• gdcObject – дает доступ к главному бизнес-объекту на диалоге. Здесь нельзя путать понятия главного объекта на форме просмотра и главного объекта на диалоге, т.к. главный объект на диалоговом окне может быть детальным на форме просмотра.

• gdcDetailObject – дает доступ к детальному (т.е. зависимому от некоторых свойств главного) бизнес-объекту на диалоге. Данное свойство доступно только на сложных диалогах.

Базовым классом для таких диалогов является класс Tgdc_dlgHGR.

Следует еще остановится на транзакциях при работе с диалоговыми окнами. Чаще всего на простых диалоговых окнах транзакция на изменение стартует только в момент сохранения изменений в базу, т.е.

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

Окно Свойства Объекта Любой бизнес-объект может обратиться к окну «Свойства объекта». Из макроса его можно вызвать через метод бизнес-объекта EditDialog("Tgdc_dlgObjectProperties"), оно доступно и с любой формы просмотра.

Окно «Свойства объекта» предназначено для просмотра основных полей объекта, назначения/изменения прав доступа, просмотра SQL запроса, а также просмотра и возможного изменения значений всех полей объекта.

Окно имеет три закладки:

• Общие – предоставляет основную информацию об объекте: его класс, подтип, подмножество, идентификатор, РУИД, кем и когда был создан объект, кто последний его менял (эта информация приводится только для объектов, для которых отслеживается создание и изменение под разными пользователями, т.е. в главной таблице присутствуют поля editorkey и creatorkey), отображаются права доступа. Для деревьев выводится идентификатор родителя, а для интервальных деревьев – правая и левая границы. Пример закладки «Общие» можно увидеть на рисунке 6. Рисунок 0. • Доступ – предназначена для установки прав пользователей к текущей записи (не следует путать с правами доступа на уровне класса). Данная закладка доступна только если в главной таблице присутствуют поля AVIEW, ACHAG, AFULL, которые хранят соответственно доступ к записи на просмотр, изменение, полный доступ. Права устанавливаются для групп пользователей. См. рисунок 6. • Данные – отображает данные текущей записи с возможностью их изменения. Кроме того, отображается сколько записей считано в буфер бизнес-объекта и сколько под них выделено оперативной памяти. Внизу закладки располагается кнопка, по которой можно посмотреть запрос бизнес-объекта на выборку данных, и выпадающий список с перечислением параметров и их текущих значений, если таковые имеются в запросе. См. рис 6. Окно «Свойства объекта» выводится также в том случае, если для текущего бизнес-объекта не предусмотрена (или не описана) операция добавления/редактирования записей.

Подробнее о свойствах форм можно узнать в главе 7.

Рисунок 0. Рисунок 0. Связь master-detail. Множества.

Одна из основных причин использования реляционных баз данных (таких как Interbase, MSSQL, Oracle и т.д.) заключается в том, что формат базы данных прост для понимания и с ним легко обращаться. Кроме того, реляционная база данных позволяет в полной мере использовать механизмы по обеспечению целостности данных. Одним из таких механизмов является использование внешних ключей.

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

Между таблицами может быть три вида отношений:

Таблицы с отношением один-к-одному достаточно редки, т.к. в этом случае вся информация может быть включена в одну таблицу. Однако иногда такая связь имеет смысл. Т.к. мы можем использовать вспомогательную таблицу для хранения некоторых специфичных свойств, которые сопоставляются не всем записям главной таблицы. В Гедымине существует механизм для создания таких таблиц. Смотри в главе 7 описание объекта «Таблица со ссылкой».

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

Одному товару может соответствовать несколько единиц измерения, и в то же время одной единице измерения соответствуют несколько товаров.

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



Master-detail Говоря об отношении master-detail в Гедымине мы чаще всего имеем ввиду отношения типа многие-кодному. И как уже было сказано выше, мастер-таблица – это таблица, хранящая главные записи, а детальная таблица – это таблица хранящая детализацию записей главной таблицы. Т.к. наш бизнесобъект – это, по сути, набор данных, то вполне целесообразно использовать такие понятия, как мастеробъект и детальный объект.

Как же организуется связь master-detail в Гедымине?

Если рассмотреть эту ситуацию в отрыве от какой-либо платформы и базы данных, то вывод записей детального объекта, соответствующих мастеру, означает фильтрацию или отбор детальных записей по конкретному значению внешнего ключа. Т.е., например, нам нужно вывести все расчетные счета конкретной организации с идентификатором 650010. Для этого мы бы могли выполнить запрос вида:

SELECT * FROM gd_companyaccount WHERE companykey = В данный запрос значение ключа компании подставлено сразу в текст. Если нам нужно будет найти все счета для другой компании, то нам придется переприсвоить полностью весь текст запроса. Изменение текста запроса каждый раз, когда нам нужно изменить только значение какого-либо параметра, нецелесообразно. Т.к. компоненты для работы с Interbase (далее IBX-компоненты) отслеживают, что запрос был изменен, и каждый раз проводят все операции по подготовке запроса на выполнение сначала.

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

SELECT * FROM gd_companyaccount WHERE companykey = :companykey Запрос детального объекта также содержит параметр, в который будет подставляться значение ключа мастера. Теперь поговорим о том, как добавить в запрос на выборку дополнительное условие с параметром и задать, какое значение в этот параметр должно передаваться.

Итак, мы уже знаем, что основные запросы бизнес-объекта генерируются автоматически, исходя из названий главной таблицы (метод GetListTable) и ключевого поля (метод GetKeyField). Также мы знаем, что для добавления некоторых условий в запрос можно использовать свойство бизнес-объекта SubSet. В принципе у всех бизнес-объектов существует некий стандартный набор подмножеств, задающих условия. Этот набор можно расширить при помощи перекрытия определенных методов. Как это сделать мы рассмотрим несколько ниже. А сейчас, на основе уже приведенного примера, организуем связь master-detail между двумя объектами gdcCompany и gdcAccount.

Если нам нужно организовать механизм master-detail в скрипте, то он будет выглядеть подобным образом:

‘Объявляем необходимые переменные Dim gdcCompany, gdcAccount, MasterSource, Creator 'Создаем вспомогательный VB-объект 'для управления созданием/уничтожением объектов Гедымина set Creator = new TCreator 'Создаем бизнес-объект Компания set gdcCompany = Creator.GetObject(nil, "TgdcCompany", "") 'Создаем "источник данных" set MasterSource = Creator.GetObject(nil, "TDataSource", "") 'Указываем, из какого датасета мы будем тянуть данные MasterSource.DataSet = gdcCompany 'Создаем бизнес-класс "Расчетный счет" set gdcAccount = Creator.GetObject(nil, "TgdcAccount", "") 'Указываем, что нас интересует подмножество "по компании" gdcAccount.SubSet = "ByCompany" 'Указываем по какому источнику данных будет идти фильтрация gdcAccount.MasterSource = MasterSource 'Указываем название поля мастера, по которому будет ‘идти фильтрация gdcAccount.MasterField = _ gdcCompany.GetKeyField(gdcCompany.SubType) 'Указываем название параметра в запросе детального 'объекта, в которое будет подставляться значение из 'поля мастера gdcAccount.DetailField = "companykey" Здесь нам встречается понятие источника данных. Остановимся на нем поподробнее. Источник данных предоставляет данные из указанного датасета другому датасету или визуальным компонентам.

Использование такого промежуточного объекта, как источник данных, обусловлено тем, что он может предоставлять данные из любых датасетов, т.е. мы можем получать данные из базы даже не интересуясь, при помощи каких компонентов они оттуда считаны. Все визуальные компоненты, работающие с базой данных, подключаются к ней через источник данных.

Источник данных является реализацией класса TDataSource. Для указания, из какого датасета он будет получать данные, используется свойство DataSet.

При организации связи master-detail нам необходимо своевременно получать значение ключа мастера.

Для этого мы указываем детальному объекту источник данных, который предоставляет нам доступ к мастеру. Для указания источника данных мастера используется свойство бизнес-объекта MasterSource.

Далее нам нужно добавить в запрос условие для фильтрации данных по ключу мастера. Для этого мы используем специфичный SubSet (описание стандартных подмножеств для различных бизнес-объектов смотрите в приложении a!!!!!). В нашем случае SubSet, равный «ByCompany», добавляет в запрос условие z.companykey = :companykey В итоге запрос на выборку для расчетных счетов выглядит следующим образом:

SELECT

z.id, z.bankkey, t.name as joinaccounttype, z.companykey, z.disabled, z.currkey, z.account, z.accounttypekey, z.payername, c.name as bankname, b.bankcode, b.bankmfo, b.swift FROM gd_companyaccount z LEFT JOIN gd_bank b ON z.bankkey = b.bankkey LEFT JOIN gd_contact c ON z.bankkey = c.id LEFT JOIN gd_compacctype t ON z.accounttypekey = t.id WHERE z.companykey = :companykey Теперь нам нужно указать, как называется ключевое поле мастера. Для этого в детальном объекте используется свойство MasterField. Также мы указываем название параметра, в который необходимо подставлять значение ключевого поля мастера. Для этого в детальном объекте используется свойство DetailField. Осталось открыть наши объекты. Теперь при движении по записям мастер-объекта записи в детальном объекте будут каждый раз отфильтровываться по новому ключу. Здесь важно учесть следующий момент: при фильтрации детального объекта по значению ключа мастера каждый раз выполняется запрос к базе. Поэтому, если вы изменяете запрос через соответствующие методы бизнесобъекта, постарайтесь оптимизировать время его выполнения.

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

Рисунок 0. Также стоит остановиться на транзакциях. Как мы уже знаем, у бизнес-объекта есть две транзакции: на чтение и на запись. Транзакция на чтение предназначена для считывания записей и открыта, пока идет работа с бизнес-объектом. Транзакция на изменение обычно открывается только в момент сохранения изменений в базу. В случае связи master-detail транзакция на изменение может быть открыта значительно дольше.

Рассмотрим простейший пример. Мы добавили новую запись мастера и хотим добавить также записи детального объекта на одной транзакции. Чтобы добавить новую запись, детальному объекту необходимо видеть мастер-объект. А, следовательно, мы или должны закрыть транзакцию, на которой шло добавление записи в мастер-объект, или считать содержимое мастера на той же транзакции, на которой была добавлена запись. В Гедымине эта проблема решается через переприсвоение транзакций детального объекта в режиме редактирования связки master-detail. Т.е. при вызове диалога редактирования всем детальным объектам присваивается и на чтение и на запись транзакция на изменение (свойство Transaction) мастер-объекта. Данное присвоение осуществляется в методе SetupDialog диалогового окна. По окончанию редактирования детальным объектам возвращаются транзакции, которые были до начала редактирования.

Забегая вперед, скажем, что при создании сложных документов связь master-detail настраивается автоматически.

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

Итак, нам необходимо отобразить все возможные единицы измерения для товаров. Базовой таблицей для товаров является GD_GOOD, базовой таблицей для единиц измерения – GD_VALUE. Связкой между этими двумя таблицами является таблица GD_GOODVALUE. Если мы просто к таблице GD_VALUE присоединим при помощи JOIN GD_GOODVALUE, то в нашей выборке данных может не оказаться ни одного поля с уникальным значением. Почему? Потому что на одну единицу измерения может приходиться более чем один товар. Итак, мы получаем запрос вида (для вывода результатов присоединим также таблицу GD_GOOD):

SELECT

z.id as valuekey, z.name as valuename, g.id as goodkey, g.name as goodname FROM gd_value z JOIN gd_goodvalue gd$st ON gd$st.valuekey = z.id JOIN gd_good g ON g.id = gd$st.goodkey При этом результаты могут быть представлены следующей таблицей:

единицы измерения) единицы измерения) товара) Как мы видим, в результирующем наборе данных нет ни одного уникального поля. Идентификаторы товара и единицы измерения уникальны только внутри своих таблиц. При объединении этих таблиц в запросе через промежуточную таблицу уникальность можно наблюдать только по нескольким полям (в данном случае уникальной является связка полей goodkey и valuekey).

Как вывести результаты подобного запроса при помощи бизнес-объектов?

Итак, у нас есть бизнес-объект Товар (класс TgdcGood) и бизнес-объект Единица измерения (класс TgdcValue). Для таблицы-связки (GD_GOODVALUE) бизнес-класса не существует. При просмотре товара мы бы хотели видеть все доступные для него единицы измерения. Для этого нам нужно отфильтровать единицы измерения по товару через таблицу-связку (также называется таблицамножество). В бизнес-объекте есть свойство SetTable, которое указывает название таблицы-множества.

Если таблица указана, то бизнес-объект работает в режиме обработки множества. Т.е. при операциях изменения/добавления/удаления обрабатываются только записи таблицы связки. Основные записи самого объекта играют чисто информационную роль. Это значит, что в режиме работы со множеством вы не сможете создать новую единицу измерения, но сможете указать новую связь между уже существующей единицей измерения и товаром или изменить признаки уже существующей связки (в нашем примере это может быть поле коэффициента перевода из основной единицы измерения товара в текущую).

Свойство SetTable работает в паре со свойством MasterSource. Если вы указываете таблицу-множество, то у вас обязательно должен быть указан мастер-объект, по которому будут фильтроваться записи множества. В нашем примере мастер-объектом является Товар. При указании SetTable в бизнес-объекте автоматически заполняются свойства MasterField и DetailField, а в запрос добавляется условие для фильтрации. Запрос на выборку объекта Единицы измерения будет выглядеть следующим образом:

SELECT

z.id, z.name, z.description, z.goodkey, z.ispack, gd$st.goodkey as s$goodkey, gd$st.valuekey as s$valuekey, gd$st.scale as s$scale, gd$st.discount as s$discount, gd$st.decdigit as s$decdigit FROM gd_value z gd_goodvalue gd$st gd$st.goodkey = :master_record_id gd$st.valuekey = z.id Как мы уже знаем, алиас базовой таблицы всегда будет «z». Алиас для таблицы множества в любом запросе будет «gd$st», при этом псевдонимы полей таблицы-множества будут формироваться как префикс «s$» + реальное наименование поля. Только поля таблицы-связки в данном объекте будут редактируемыми, остальные поля (без префикса «s$») будут иметь флаг «Только для чтения».

Как добавить таблицу-множество средствами Гедымина мы узнаем несколько позднее. Однако, забегая вперед, могу сказать, что при добавлении новой таблицы связки, она будет автоматически настраивать дополнительный бизнес-объект для работы со множествами и отображать его на отдельной закладке диалога редактирования основного объекта. В рассмотренном выше примере на диалоге редактирования объекта Товар появится закладка «Единицы измерения».

Основные методы и свойства В данной подглаве будут рассмотрены основные методы и свойства, присущие всем бизнес-объектам.

Платформа Гедымин была написана на Delphi, а потому в описании методов и свойств используется синтаксис языка Object Pascal. Также при рассмотрении иерархии наследования бизнес-класса TgdcBase будут использованы классы Delphi.

Иерархия наследования базового бизнес-класса TgdcBase представлена на рисунке 6.8. Принцип наследования позволяет наследникам использовать методы и свойства родительских классов. Потому в описании свойств и методов бизнес-объекта вы можете встретить свойства и методы не столько самого бизнес-объекта, а сколько его родителя.

Рисунок 0. Свойства бизнес-объектов • Active: Boolean – указывает, открыт объект или нет. Доступно на чтение и на запись. При присвоении значения, равного Истине, открывает объект, при значении, равным Ложь, • BaseState: String – хранит флаги состояний бизнес-объекта в текстовом виде через пробел.

• sView – владельцем бизнес-объекта является форма просмотра. Если объект был создан из макроса без указания принадлежности к форме просмотра, то данного флага не будет.

• sDialog – бизнес-объект вызвал диалоговое окно для редактирования/добавления записи.

редактирования/добавления записи. Под понятием вложенное диалоговое окно будем подразумевать диалог, вызванные с другой диалоговой формы.

• sSyncControls – указывает, что при редактировании бизнес-объекта при помощи диалогового окна был вызван метод диалога SyncControls. Данный метод используется для синхронизации состояния визуальных элементов в соответствии с введенными данными.

Флаг будет установлен ровно на протяжении работы SyncControls.

• sLoadFromStream – указывает, что данные объекта загружаются из потока. Загрузка и сохранение данных в поток позволяет переносить данные с одной базы на другую. Про • sMultiple – указывает, что идет обработка сразу нескольких записей бизнес-объекта.

Например, удаление нескольких выделенных записей или их редактирование.

Пример содержимого свойства BaseState для бизнес-объекта, который лежит на форме просмотра, и вызвал диалог для редактирования:

" sView sDialog " Свойство BaseState доступно только для чтения.

• Bof: Boolean – указывает, что курсор стоит на первой записи бизнес-объекта.

Устанавливается в Истину при открытии бизнес-объекта, вызове метода First. Только для • Bookmark: String – определяет текущий маркер в датасете. Вы можете установить или считать маркер. При считывании маркера возвращается текущее положение курсора в датасете, при установке, курсор переходит на запись по маркеру.

• CanChangeRights: Boolean – возвращает для текущего пользователя права на изменение прав доступа к записи. Только для чтения.

• CanCreate: Boolean – возвращает, имеет ли право текущий пользователь на создание новой • CanDelete: Boolean – возвращает, имеет ли право текущий пользователь на удаление записи.

• CanEdit: Boolean – возвращает, имеет ли право текущий пользователь на изменение записи.

• CanPrint: Boolean – возвращает, имеет ли право текущий пользователь на печать данных.

• CanView: Boolean – возвращает, имеет ли право текущий пользователь на просмотр данных.

• CreationDate: Date – возвращает дату создания записи, если в базовой таблице есть поле CREATIONDATE. Если данное поле отсутствует, то возвращается значение свойства EditionDate. Только для чтения.

• CreatorKey: Integer – возвращает идентификатор контактного лица, создавшего запись, если в базовой таблице есть поле CREATORKEY. Если данное поле отсутствует, то возвращается значение свойства EditorKey. Только для чтения.

• CreatorName: String – возвращает наименование контактного лица, создавшего запись, используя идентификатор, возвращаемый свойством CreatorKey. Только для чтения.

• Database: TIBDatabase – база данных, к которой подключен бизнес-объект. Доступно для • DeleteSQL: TStrings – запрос на удаление записи из базовой таблицы. Формируется автоматически. Может быть перекрыт в методе CustomDelete. Только для чтения. Данное свойство доступно и для записи, но при изменении подмножества объекта все SQL-запросы • DetailField: String – название параметра в SQL-запросе, через который будет идти связка с мастер-объектом (читайте про связь master-detail). Доступно для чтения и для записи.

• DetailLinks(Index: Integer): TgdcBase – список детальных объектов. Обращение к детальному объекту идет через индекс Index (порядковый номер в списке). Только для чтения.

• DetailLinksCount: Integer – количество детальных объектов. Только для чтения.

• DSModified: Boolean – флаг, указывающий, что содержимое текущей записи бизнес-объекта было изменено. Только для чтения.

• EditionDate: Date – дата последнего изменения записи. Если в базовой таблице присутствует поле EDITIONDATE, то значение берется из этого поля, иначе значение берется из поля MODIFIED таблицы GD_RUID, если в ней содержится РУИД текущей записи. Иначе возвращается текущая дата. Только для чтения.

• EditorKey: Integer – идентификатор контакта, который последний изменял запись. Если в базовой таблице присутствует поле EDITORKEY, то значение берется из этого поля, иначе значение берется из поля EDITORKEY таблицы GD_RUID, если в ней содержится РУИД текущей записи. Иначе возвращается ключ контакта текущего пользователя. Только для • EditorName: String – возвращает наименование контактного лица, изменявшего запись, используя идентификатор, возвращаемый свойством EditorKey. Только для чтения.

• ExtraConditions: TStrings – список дополнительных условий, добавляемых в SELECTзапрос бизнес-объекта. Как мы уже знаем, некоторые условия добавляются в запрос через подмножества (свойство Subset). Однако предусмотреть все ситуации через подмножества нереально. Обновление данного списка вызывает переформирование всех запросов бизнесобъекта. При этом если до изменения списка бизнес-объект был открыт, то после переформирования запросов он открывается. Поэтому, если вам необходимо добавить несколько условий, сначала закройте бизнес-объект, а после добавления условий, откройте.

Иначе на каждое добавление условия бизнес-объект будет закрываться-открываться.

Например, в запрос бизнес-объекта, представляющего товары, необходимо добавить условие, которое будет выбирать товар по штрих-коду.

Dim gdcGood, Creator Set Creator = new TCreator Set gdcGood = Creator.GetObject(nil, “TgdcGood”, “”) call gdcGood.ExtraConditions.Add(“z.barcode = :barcode”) gdcGood.ParamByName(“barcode”).AsString = “154002545” gdcGood.Open В результате SELECT-запрос для бизнес-объекта Товар будет выглядеть следующим образом:

SELECT

z.id, z.groupkey, z.name, z.alias, z.shortname, z.description, z.barcode, z.valuekey, z.tnvdkey, z.isassembly, z.reserved, z.discipline, z.disabled, z.editiondate, z.editorkey, z.afull, z.achag, z.aview, t.name as tnvd, v.name as valuename FROM gd_goodgroup gg JOIN gd_good z ON z.groupkey = gg.id LEFT JOIN gd_value v ON v.id = z.valuekey LEFT JOIN gd_tnvd t ON t.id = z.tnvdkey WHERE z.barcode = :barcode • FieldCount: Integer – количество полей, возвращаемых бизнес-объектом. Только для чтения.

• Fields: TFields – список полей бизнес-объекта. Только для чтения. Обращение к каждому полю возможно через его порядковый номер в списке (совпадает со следованием полей в • FieldsCallDoChange: TStringList – список полей, при изменении которых вызывается метод DoFieldChange. Если список пустой, то метод DoFieldChange вызывается при изменении любого поля объекта, что значительно может снизить скорость обработки данных. Не изменяйте это свойство просто в режиме работы с бизнес-объектом! Правильнее всего будет задать его значение один раз после создания полей объекта (в методе CreateFields).

Например, в для бизнес-объекта Товар будем обрабатывать только изменение поля штрих-код. Для этого перекроем метод CreateFields.

option explicit sub TgdcGoodCreateFields(Self) call Inherited(Self, "CreateFields", Array(Self)) call Self.FieldsCallDoChange.Add("barcode") end sub В случае перекрытия методов параметр Self означает объект, метод которого перекрывается. В нашем примере это будет экземпляр класса TgdcGood (т.е. бизнес-объект Товар).

• ID: Integer – идентификатор текущей записи бизнес-объекта. Доступно для чтения и записи.

При присваивании данного свойства в режиме просмотра бизнес-объект пытается позиционировать курсор на запись с данным идентификатором. Если запись с подобным идентификатором не найдена, то возможно два варианта поведения: если бизнес-объект имеет подмножество ByID, то он просто переоткроется и будет пустым, иначе пользователю будет выдано исключение с сообщением о некорректном идентификаторе. При присваивании данного свойства в режиме редактирования бизнес-объект попытается изменить идентификатор текущей записи. Не меняйте идентификатор записи вручную!

• InsertSQL: TStrings – запрос на вставку записи в базовую таблицу. Формируется автоматически. Может быть перекрыт в методе CustomInsert. Только для чтения. Данное свойство доступно и для записи, но при изменении подмножества объекта все SQL-запросы будут перестроены.

• MasterField: String – название ключевого поля мастер-объекта. Используется только при организации связи master-detail или при установке режима множества. Доступно для чтения и записи.

• MasterSource: TDataSource – источник записей мастер-объекта. Доступно для чтения и записи.

• ModifySQL: TStrings – запрос на изменение записи в базовой таблице. Формируется автоматически. Может быть перекрыт в методе CustomModify. Только для чтения. Данное свойство доступно и для записи, но при изменении подмножества объекта все SQL-запросы будут перестроены.

• Name: String – название компоненты, представляющей текущий бизнес-объект. Доступно для чтения и записи.

• Objects(Name: String): IDispatch – список объектных переменных, связанных с текущим бизнес-объектом. Обращение к переменной идет по ее наименованию. Добавить переменную в список можно используя метод AddObjectItem. Доступно для чтения и записи.

• Owner: TComponent – владелец бизнес-объекта. Только для чтения.

• OwnerForm: TForm – форма-владелец бизнес-объекта (т.е. форма, на которой лежит бизнесобъект). Только для чтения.

• Params: TParams – список параметров, присутствующих в SELECT-запросе бизнес-объекта.

Обращение к параметрам идет по их порядковому номеру.

• ParentForm: TWinControl – аналогично OwnerForm.

• Plan: String – возвращает план выполнения SELECT-запроса. Только для чтения.

• QueryFilter: TQueryFilterGDC – возвращает ссылку на объект фильтрации для текущего бизнес-объекта. Объект фильтрации автоматически применяет к бизнес-объекту последний использованный фильтр, если свойство QueryFiltered установлено в Истину. Только для чтения. Про фильтры читайте в главе 9.

• QueryFiltered: Boolean – указывает, устанавливать ли после открытия бизнес-объекта последний использовавшийся фильтр. Доступно для чтения и записи.

• ReadTransaction: TIBTransaction – транзакция, используемая бизнес-объектом для чтения данных из базы. Для всех бизнес-объектов по умолчанию присваивается одна транзакция на чтение (она доступна через свойство глобального объекта gdcBaseManager.ReadTransaction).

Доступно для чтения и записи.

• RecordCount: Integer – количество записей, считанных из базы. Для того чтобы получить реальное количество записей, которое может быть представлено через SELECT-запрос бизнес-объекта, вам необходимо сначала спозиционировать курсор на последнюю запись (метод Last), что повлечет за собой передачу всех записей на клиента. Если вы просто открыли бизнес-объект внутри макроса (метод Open), то данное свойство для непустого бизнес-объекта всегда будет возвращать единицу, для пустого ноль. Только для чтения.

• RecordSize: Integer – возвращает размер записи бизнес-объекта. Только для чтения.

• RefreshMaster: Boolean – если установлено в Истину, то после сохранения записи обновляет также запись в мастер-объекте (если такой имеется). По умолчанию отключено. Доступно • RefreshSQL: TStrings – запрос для обновления записи в бизнес-объекте после сохранения изменений. Формируется автоматически. Может быть перекрыт для класса в методах GetSelectClause, GetFromClause, GetGroupClause, или для конкретного объекта, используя события OnGetSelectClause, OnGetFromClause, OnGetGroupClause. Только для чтения.

Данное свойство доступно и для записи, но при изменении подмножества объекта все SQLзапросы будут перестроены.

• SelectedID: TgdKeyArray – сортированный список ключей отмеченных записей.

• SelectSQL: TStrings – запрос для выборки записей бизнес-объекта. Формируется автоматически. Может быть перекрыт для класса в методах GetSelectClause, GetFromClause, GetGroupClause, GetOrderClause, GetWhereClause, или для конкретного объекта, используя события OnGetSelectClause, OnGetFromClause, OnGetGroupClause, OnGetOrderClause, OnGetWhereClause. Только для чтения. Данное свойство доступно и для записи, но при изменении подмножества объекта все SQL-запросы будут перестроены.

• SetTable: String – название таблицы-множества. Используется только в режиме множеств.

• SQLSetup: TatSQLSetup – объект, который разбирает заданные пользователем (или сформированные автоматически) запросы, добавляет в них поля атрибуты, таблицы, на которые ссылаются атрибуты-ссылки, поля для отображения и расширенного отображения этих таблиц (читайте в главе 8 про таблицы). Используя данный объект можно заблокировать добавление полей-атрибутов для конкретной таблицы, входящей в первоначальный запрос.

Для каждого бизнс-объекта при необходимости формируется список «Игнорирований» (свойство SQLSetup.Ignores). Причем, игнорироваться (т.е. поля-атрибуты этой таблицы не добавляются в SELECTчасть) может как таблица целиком, так и только определенные атрибуты этой таблицы. По умолчанию при добавлении нового объекта Игнорирования пропускаются все поля-атрибуты (свойство объекта TatIgnore.IgnoryType = 0). Однако вы можете указать, что хотите игнорировать только атрибуты ссылки (свойство объекта TatIgnore.IgnoryType = 1). Таблицы, которые вы хотите проигнорировать нужно задать до открытия бизнес-объекта (например, в методе GetFromClause).

Например, для бизнес-объекта Подразделение проигнорируем все поля атрибуты для таблицы GD_CONTACT с алиасом CLB.

option explicit function TgdcDepartmentGetFromClause(Self, ARefresh) TgdcDepartmentGetFromClause = _ Inherited(Self, "GetFromClause", Array(Self, ARefresh)) Dim Ig set Ig = Self.SQLSetup.Ignores.Add Ig.AliasName = "CLB" end function • State: Integer – состояние бизнес-объекта. Может принимать следующие значения: Не активный = 0, Режим просмотра = 1, Режим редактирования = 2, Режим вставки = 3, 4 (не используется), При вычислении значений калькулируемых полей = 5. Только для чтения.

• SubSet: String – хранит подмножества, установленные для бизнес-объекта. Если данное свойство пустое, то значит бизнес-объект вернет все записи. Бизнес-объект может использовать совокупность подмножеств (задается через запятую). Про сабсеты читайте в главе 6.3. Доступно для чтения и записи.

• SubSetCount: Integer – количество подмножеств, заданных для текущего бизнес-объекта.

• SubSets(Index: Integer): String – обращение к списку заданных сабсетов по индексу. Только • SubType: String – текущий подтип бизнес-объекта. Может быть присвоено только один раз.

При переприсвоении подтипа пользователь получит ошибку. Доступно для чтения и записи.

• Transaction: TIBTransaction – транзакция на изменение. Про транзакции читайте в главе 6.3.

• Variables(Name: String): Variant – список простых переменных, связанных с ткущим бизнесобъектом. Обращение к переменной идет по ее наименованию. Добавить переменную в список можно используя метод AddVariableItem. Доступно для чтения и записи.

Методы бизнес-объектов • AddObjectItem(Name: String) – добавляет в список новую объектную переменную с именем Name, инициализируя ее nil.

• AddSubSet(ASubSet: String) – добавляет подмножество с именем ASubSet в список активных подмножеств бизнес-объекта. При этом добавляемое подмножество должно быть заявлено ранее, т.е. должно пройти проверку в методе CheckSubSet. Иначе AddSubSet кинет ошибку, что подмножество ASubSet не определено для данного класса.

• AddToSelectedArray(ASelectedID: TgdKeyArray) – добавляет элементы из сортированного списка ASelectedID в список отмеченных записей (свойство SelectedID) бизнес-объекта.

• AddToSelectedBookmark(BL: TBookmarkList) – добавляет идентификаторы выделенных в гриде записей в список отмеченных записей (свойство SelectedID) бизнес-объекта.

• AddToSelectedID(ID: Integer) – добавляет идентификатор ID в список отмеченных записей (свойство SelectedID) бизнес-объекта.

• AddVariableItem(Name: String) – добавляет в список новую переменную простого типа с именем Name, инициализируя ее пустым значением.

• Append – устанавливает курсор на последнюю запись бизнес-объекта и добавляет новую запись. Не рекомендуется использовать в бизнес-объектах, возвращающих большие объемы данных, т.к. установка курсора на последнюю запись означает перекачку записей с сервера • BeforeDestruction(Self: TgdcBase) – вызывается перед уничтожением бизнес-объекта. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• Cancel – отменяет последнюю операцию изменения. Может быть применимо, если бизнесобъект находится в состоянии вставки новой записи или редактирования уже существующей (смотрите свойство State).

• CheckBrowseMode – проверяет, находится ли бизнес-объект в состоянии просмотра записей (State = 1). Если нет, то переводит объект в это состояние. Это значит, что если вы редактировали запись и после этого вызвали метод CheckBrowseMode, то запись будет • CheckCurrentRecord – проверяет, открыт ли бизнес-объект и содержит ли он записи. Если нет, то кидает исключение.

• CheckSubSet(ASubSetStr: String): Boolean – перекрываемый метод. Проверяет, заявлено ли подмножество ASubSetStr для текущего класса. Все подмножества, которые вы создали сами, необходимо прописать в данном методе. Метод CheckSubSet используется при изменении активного подмножества бизнес-объекта.

• CheckTheSameStatement(Self: TgdcBase): String – возвращает запрос, который используется для определения записи бизнес-объекта по некоторым уникальным признакам. Этот необходимо при загрузке данных из потока для определения существует ли загружаемая запись в базе. Self – бизнес-объект, вызвавший метод, который в данный момент загружается из потока. Доступен только для перекрытия.

• ChooseItems – используется для вывода формы выбора бизнес-объекта с заданным классом и подтипом. Если пользователь подтвердил выбор записей, то метод вернет Истина, в противном случае (при отмене операции выбора) – Ложь. Подробнее читайте в пункте 6.4. • ChooseItemsSelf - используется для вывода формы выбора бизнес-объекта вызвавшего метод. При этом отмеченные записи попадают в свойство SelectedID объекта. Если перед вызовом SelectedID был не пустой, то на форме выбора будут отмечены записи, идентификаторы которых попали в SelectedID. Если пользователь подтвердил выбор записей, то метод вернет Истина, в противном случае (при отмене операции выбора) – Ложь.

Подробнее читайте в пункте 6.4. • ChooseOrderItems – аналогичен методу ChooseItems, за исключением того, что возвращает отмеченные записи в том порядке, в котором они были отмечены. Подробнее читайте в пункте 6.4. • ChooseOrderItemsSelf – аналогичен методу ChooseItemsSelf, за исключением того, что возвращает отмеченные записи в том порядке, в котором они были отмечены. Подробнее читайте в пункте 6.4. • ClassName: String – возвращает название класса бизнес-объекта.

• ClassParent: String – возвращает название класса, от которого наследован класс бизнесобъекта.

• ClearFields – очищает содержимое полей текущей записи бизнес-объекта. При этом бизнесобъект должен быть в состоянии вставки или редактирования записи (State = 2 или 3).

• ClearSubSets – удаляет все активные подмножества бизнес-объекта. Данный метод делает активным единственное подмножество All, оповещая таким образом бизнес-объект, что нужно отобразить все записи. Если перед вызовом метода бизнес-объект был открыт, то после отчистки активных подмножеств, он переоткроется.

• Close – закрывает бизнес-объект.

• CloseOpen – переоткрывает объект с сохранением текущей позиции курсора. Нередко подобная операция необходима, чтобы синхронизировать содержимое бизнес-объекта с • ControlsDisabled: Boolean – указывает, что визуальные элементы управления, связанные с бизнес-объектом, не обновляются при изменении содержимого бизнес-объекта. Отключить обновление визуальных элементов управления можно, используя метод DisableControls, включить – EnableControls.

• Copy(AFields: String; AValues: Variant; ACopyDetail: Boolean; APost: Boolean): Boolean – создает копию с текущей записи бизнес-объекта и устанвливает на нее курсор. При этом параметр AFields означает список полей, разделенных точкой с запятой, которым необходимо передать значения, отличные от значений этих полей в копируемой записи;

параметр AValues - список значений, которые необходимо присвоить полям из параметра AFields; ACopyDetail - при значении истина, производит копирование детальных объектов;

APost - указывает, сохранить скопированную запись или оставить ее в состоянии вставки.

• CopyDialog – копирует текущую запись и выводит диалог для ее редактирования.

Подробнее читайте в пункте 6.4.3. Является перекрываемым методом.

• CreateDialog(ADlgClassName: String): Boolean – переводит бизнес-объект в состояние вставки и выводит на экран модальное окно для редактирования содержимого объекта.

Параметр ADlgClassName содержит наименование класса окна для редактирования. Если передана пустая строка, используется окно, заданное для текущего объекта по умолчанию (см. свойство CreateDialogForm). Подробнее читайте в пункте 6.4.3. Является перекрываемым методом.

• CreateDialogForm: TCreateableForm – создает форму диалога, заданную для класса по умолчанию. Является перекрываемым методом.

• CreateDialogSubType(AClassName: String; ASubType: String): Boolean – добавляет запись заданного класса и подтипа и выводит окно для ее редактирования. Используется чаще всего при добавлении новых записей в базовый бизнес-объект. Подробнее читайте в пункте 6.4. • CreateFields(Self: TgdcBase) – вызывается после создания полей бизнес-объекта. Поля создаются в момент первого открытия бизнес-объекта. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• CreateNext – сохраняет текущую запись и вставляет новую. При этом, если редактирование шло через диалоговое окно и у вас включена опция сохранять значения полей в диалоговых окнах, то новой вставленной записи будут присвоены значения полей предыдущей записи.

• CreateViewForm(AnOwner: TComponent; AClassName: String; ASubType: String): TForm – создает форму просмотра с переданным классом (AClassName) и сабтайпом (ASubType).

Владельцем формы является AnOwner. Данный метод проверяет, была ли уже создана необходимая форма. Если такая форма действительно уже создана, то метод просто вернет на нее указатель. В обратном случае, он сначала создаст форму, а затем вернет на нее указатель. Подробнее читайте в пункте 6.4. • CreateViewFormNewInstance(AnOwner: TComponent; AClassName: String; ASubType: String;

ANewInstance: Boolean): TForm – данный метод аналогичен CreateViewForm, за исключением того, что он позволяет создавать несколько форм одного класса и сабтайпа.

Для этого необходимо параметр ANewInstance установить в истину. Подробнее читайте в пункте 6.4. • CustomDelete(Self: TgdcBase; Buff: Pointer) – посылает запрос на удаление записи бизнесобъекта на сервер. Self – бизнес-объект, вызвавший метод, Buff – ссылка на область памяти, которая хранит удаляемую запись. Доступен только для перекрытия. Перекрывается обычно для выполнения дополнительных запросов. Транзакция на изменение в данном методе открыта.

• CustomInsert(Self: TgdcBase; Buff: Pointer) – посылает запрос на вставку новой записи бизнес-объекта на сервер. Self – бизнес-объект, вызвавший метод, Buff – ссылка на область памяти, которая хранит добавляемую запись. Доступен только для перекрытия.

Перекрывается обычно для выполнения дополнительных запросов. Транзакция на изменение в данном методе открыта.

• CustomModify(Self: TgdcBase; Buff: Pointer) – посылает запрос на изменение записи бизнесобъекта на сервер. Self – бизнес-объект, вызвавший метод, Buff – ссылка на область памяти, которая хранит изменяемую запись. Доступен только для перекрытия. Перекрывается обычно для выполнения дополнительных запросов. Транзакция на изменение в данном методе открыта.

• Delete – удаляет текущую запись бизнес-объекта. Если бизнес-объект неактивен или пустой генерирует исключение.

• DeleteMultiple(BL: TBookmarkList): Boolean – удаляет отмеченные в гриде (параметр BL) записи бизнес-объекта. Перед удалением запрашивает у пользователя подтверждение. Если BL не задан или не отмечено ни одной записи пытается удалить текущую запись (т.е. запись на которой стоит курсор). Если на удаляемую запись имеются ссылки и бизнес-объект лежит на форме, то выводит окно с перечислением записей, которые зависят от удаляемой.

• DeleteSubSet(Index: Integer) – удаляет из списка активное подмножество по индексу Index.

• DestroyObject – уничтожает бизнес-объект (высвобождает занимаемую им память).

• DisableControls – отключает обновление визуальных элементов управления, связанных с бизнес-объектом. Данный метод полезен, если вы производите много операций обновления над бизнес-объектом, а отобразить хотите лишь конечный результат. Однако не желательно использовать данный метод, если у ваш бизнес-объект участвует в связке master-detail.

• DoAfterCancel(Self: TgdcBase) – вызывается после отмены изменений. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• DoAfterCustomProcess(Self: TgdcBase; Buff: Pointer; Process: Integer) • DoAfterDelete(Self: TgdcBase) – вызывается после удаления записи. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• DoAfterEdit(Self: TgdcBase) – вызывается после перевода бизнес-объекта в состояние редактирования. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• DoAfterExtraChanged(Self: TgdcBase; Sender: TStrings) – вызывается после изменения списка дополнительных условий (свойство объекта ExtraConditions). Self – бизнес-объект, вызвавший метод, Sender – изменяемый список условий. Доступен только для перекрытия.

• DoAfterInsert(Self: TgdcBase) – вызывается после перевода бизнес-объекта в состояние втсавки. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• DoAfterOpen(Self: TgdcBase) – вызывается после открытия бизнес-объекта. Self – бизнесобъект, вызвавший метод. Доступен только для перекрытия.

• DoAfterPost(Self: TgdcBase) – вызывается после сохранения изменений. Self – бизнесобъект, вызвавший метод. Доступен только для перекрытия.

• DoAfterShowDialog(Self: TgdcBase, DlgForm: TCreateableForm; IsOk: Boolean) – запускается после закрытия диалогового окна редактирования бизнес-объекта. Является перекрываемым методом. Параметр Self - бизнес-объект, вызвавший метод, DlgForm – диалоговое окно, IsOk – говорит о том, как было закрыто окно (с сохранением изменений или с их отменой).

• DoAfterTransactionEnd(Self: TgdcBase; Field: TIBBase) – вызывается после завершения транзакции на изменение. Транзакция может быть завершена как успешно, так и не успешно.

Self – бизнес-объект, вызвавший метод, Field – база данных, с которой работает бизнесобъект. Доступен только для перекрытия.

• DoBeforeClose(Self: TgdcBase) – вызывается перед закрытием бизнес-объекта. Self – бизнесобъект, вызвавший метод. Доступен только для перекрытия.

• DoBeforeDelete(Self: TgdcBase) – вызывается перед удалением записи. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• DoBeforeEdit(Self: TgdcBase) – вызывается перед переводом бизнес-объекта в состояние редактирования. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• DoBeforeInsert(Self: TgdcBase) – вызывается перед переводом бизнес-объекта в состояние вставки. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• DoBeforeOpen(Self: TgdcBase) – вызывается перед открытием бизнес-объекта. Self – бизнесобъект, вызвавший метод. Доступен только для перекрытия.

• DoBeforePost(Self: TgdcBase) – вызывается перед сохранением изменений. Self – бизнесобъект, вызвавший метод. Доступен только для перекрытия.

• DoBeforeShowDialog(Self: TgdcBase, DlgForm: TCreateableForm) – запускается перед появлением диалогового окна редактирования бизнес-объекта. Является перекрываемым методом. Параметр Self – бизнес-объект, вызвавший метод, DlgForm – диалоговое окно.

• DoFieldChange(Self: TgdcBase; Field: TField) – вызывается при изменении содержимого полей бизнес-объекта. Список полей, на изменение которых выполняется метод DoFieldChange, задается свойством FieldsCallDoChange. Self – бизнес-объект, вызвавший метод, Field – изменяемое поле. Доступен только для перекрытия. Перекрытие этого метода следует использовать только в случае задания постоянных взаимозависимостей между полями.

• DoOnFilterChanged(Self: TgdcBase; Sender: TQueryFilterGDC; AnCurrentFilter: Integer) – вызывается при изменении фильтра. Self – бизнес-объект, вызвавший метод, Sender – объект фильтрации, связанный с бизнес-объектом, AnCurrentFilter – идентификатор устанавливаемого фильтра. Если фильтр снимается, то AnCurrentFilter будет равен нулю.

Доступен только для перекрытия.

• DoOnReportClick(Self: TgdcBase; Sender: TMenuItem) – вызывается после закрытия построенного отчета. Self – бизнес-объект, вызвавший метод, Sender – пункт меню, по выбору которого был построен отчет. Доступен только для перекрытия.

• DoOnReportListClick(Self: TgdcBase; Sender: TMenuItem) – вызывается при выборе любого пункта меню отчетов. Self – бизнес-объект, вызвавший метод, Sender – выбранный пункт меню. Доступен только для перекрытия.

• Edit – переводит бизнес-объект в состояние редактирования текущей записи или вставки новой (если бизнес-объект пустой). Если бизнес-объект был неактивным, то генерирует исключение. Если до вызова метода бизнес-объект уже был в состоянии редактирования или вставки, то сначала будет вызван метод Post, а только затем Edit.

• EditDialog(ADlgClassName: String): Boolean – используется для вывода диалога для редактирования текущей записи. Параметр ADlgClassName хранит наименование класса диалога для редактирования записи. По умолчанию передается пустая строка, что означает использование диалога, заданного изначально для текущего объекта. Является перекрываемым методом. Подробнее читаете в пункте 6.4.3.

• EditMultiple(BL: TbookmarkList; ADlgClassName: String): Boolean - одновременное редактирование некоторого множества записей. Параметр BL означает список отмеченных записей для редактирования, ADlgClassName - наименование класса диалоговой формы.

Если передана пустая строка, то берется диалог, заданный по умолчанию. Если BL = nil, на редактирование пойдет текущая запись, иначе – текущая. После редактирования записи (при закрытии диалога) внесенные изменения накладываются на оставшиеся выделенные записи.

Редактирование нескольких записей одновременно накладывает некоторые ограничения:

редактировать можно только записи одного класса и подтипа. При пустом бизнес-объекте будет сгенерировано исключение.

• EnableControls – делает визуальные элементы управления, связанные с бизнес-объектом, обновляемыми.

• FetchAll – выбирает все записи на клиента.

• FieldByName(FieldName: String): TField – возвращает поле бизнес-объекта по его наименованию FieldName. Если такого поля нет, то генерирует исключение.

• FieldNameByAliasName(AnAliasName: String): String - для заданного алиаса AnAliasName возвращает физическое имя поля в таблице.

• FindField(FieldName: String): TField – ищет поле бизнес-объекта по его наименованию FieldName. Если поле не найдено, возвращает nil.

• FindFieldByRelation(ARelationName: String; AFieldName: String) – находит первое поле с именем AFieldName таблицы ARelationName, входящей в запрос. Внимание: в запросе может быть несколько одинаковых таблиц. Вернет только первое найденное поле.

• First – устанавливает курсор на первую запись бизнес-объекта. Если объект неактивен, сгенерирует исключение. Если перед вызовом метода какая-либо запись изменялась, то как и все методы, перемещающие курсор, First сохранит изменявшуюся запись бизнес-объекта.

• GetCurrRecordClass(AgdcClassName: String; ASubType: String) – возвращает через параметры AgdcClassName и ASubType класс и подтип текущей записи бизнес-объекта. Как мы уже знаем, можно работать с базовыми бизнес-объектами, которые отображают записи всех наследников. Примером тому может служить адресная книга, в которой одним списком представлены организации, контакты и т.д. Данный метод используется для уточнения класса и подтипа текущей записи для того, чтобы корректно обработать ее изменения, вызвать диалоги непосредственно относящиеся к возвращаемым им классу и подтипу. При этом класс и подтип должны быть «зашиты» в самой записи в виде некого признака.

Например, в той же адресной книге (таблица GD_CONTACT) есть поле Тип контакта (CONTACTTYPE), которое и репрезентирует класс записи.

• GetCurrRecordSubType(Self: TgdcBase): String – используется в методе GetCurrRecordClass для определения пользовательского подтипа. Self – бизнес-объект, вызвавший метод.

Доступен только для перекрытия. Перекрывать данный метод следует только в том случае, если вы создавали новые подтипы для стандартных классов (например, новый подтип товара). Для всех пользовательских классов подтип определяется автоматически.

Определение подтипа должно быть «зашито» в записи бизнес-объекта в виде некого признака. Возвращает подтип в виде строки.

• GetDialogDefaultsFields(Self: TgdcBase): String – возвращает список полей, значения которых сохраняются и автоматически подставляются в поля в диалоговом окне при вводе новой записи. Имена полей разделены точкой с запятой. В конце не пустого списка точка с запятой. Пустой список вернет пустую строку. Доступен только для перекрытия.

• GetDisplayName(ASubType: String): String – возвращает локализованное название бизнесобъекта по его подтипу ASubType.

• GetDistinctColumnValues(AFieldName: String; S: TStrings; DoSort: Boolean) - метод заполняет переданный список S уникальными значениями из заданного поля AFieldName базовой таблицы. Параметр DoSort означает сортировать список или нет.

• GetFieldList(List: TList; FieldName: String) – возвращает список List указанных полей FieldName. FieldName содержит названия полей через точку с запятой. List будет содержать найденные поля –объекты (класс TField).

• GetFieldNames(List: TStrings) – возвращает список (List) наименований всех полей бизнесобъекта.

• GetFieldValueForID(AnID: Integer; AFieldName: String): Variant – возвращает значение поля AFieldName для записи с идентификатором AnID. При этом, если поля с таким названием не существует, будет сгенерировано исключение. Если нет записи с заданным идентификатором, то вернет пустое значение.

• GetFromClause(Self: TgdcBase; ARefresh: Boolean): String – возвращает FROM-часть SELECT-запроса бизнес-объекта. Self – бизнес-объект, вызвавший метод, ARefresh – указывает, что вызвало метод: формирование запроса на выборку или запроса на обновление записи. Доступен только для перекрытия.

• GetGroupClause(Self: TgdcBase): String – возвращает GROUP BY-часть SELECT-запроса бизнес-объекта. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• GetKeyField(ASubType: String): String – возвращает название ключевого поля бизнесобъекта для заданного подтипа. Подробнее читайте в главе 6. • GetListField(ASubType: String): String – возвращает отображаемое поле бизнес-объекта для заданного подтипа. Подробнее читайте в главе 6. • GetListFieldExtended(ASubType: String): String – возвращает список дополнительных отображаемых полей бизнес объекта для заданного подтипа. Подробнее читайте в главе 6. • GetListNameByID(AnID: Integer): String – возвращает значение поля отображения по идентификатору записи AnID. Аналогичен методу GetFieldValueForID.

• GetListTable(ASubType: String): String – возвращает название базовой таблицы бизнесобъекта по подтипу. Подробнее читайте в главе 6. • GetListTableAlias: String – возвращает алиас базовой таблицы бизнес-объекта. Подробнее читайте в главе 6. • GetNextID(Increment: Boolean): Integer – возвращает следующий (если Increment равен Истине) или последний сгенерированный ключ. Генерация ключей происходит при помощи генератора GD_G_UNIQUE. Подробнее читайте в главе 6. • GetNotCopyField: String – возвращает строку, в которой через запятую перечислены поля, не использующиеся при копировании записей (метод Copy). Является перекрываемым методом. Чаще всего в копировании не нуждаются поля, значения которым присваиваются на _DoOnNewRecord, например, идентификатор записи.

• GetOrderClause(Self: TgdcBase): String – возвращает ORDER BY-часть SELECT-запроса бизнес-объекта. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• GetRestrictCondition(ATableName: String; ASubType: String): String – возвращает условия, использующиеся для фильтрации записей главной таблицы бизнес-объекта ATableName c подтипом ASubType. Применяется при подстановке класса бизнес-объекта в свойство gdClassName выпадающего списка.

• GetSelectClause(Self: TgdcBase): String – возвращает SELECT-часть SELECT-запроса бизнес-объекта. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• GetSubSetList: String – возвращает список допустимых для бизнес-объекта подмножеств в строке через точку с запятой. В этом списке не присутствуют подмножества, созданные настройщиком платформы Гедымин!

• GetSubTypeList(SubTypeList: TStrings): Boolean – возвращает список допустимых для бизнес-объекта подтипов (SubTypeList) в формате Локализованное имя подтипа = Подтип.

Возвращает истину, если есть подтипы, Ложь – в обратном случае.

• GetViewFormClassName(ASubType: String): String - возвращает название класса формы просмотра для текущего объекта по указанному сабтайпу (ASubType). Подробнее читайте в • GetWhereClause(Self: TgdcBase): String – возвращает WHERE-часть SELECT-запроса бизнес-объекта. Self – бизнес-объект, вызвавший метод. Доступен только для перекрытия.

• HasSubSet(ASubSet: String): Boolean – возвращает Истину, если для бизнес-объекта задано указанное подмножество ASubSet (т.е. ASubSet является активным).

• InheritsFrom(AClassName: String): Boolean – возвращает Истину, если объект является наследником класса AClassName.

• Insert – переводит объект в состояние вставки. Если объект закрыт, генерирует исключение.

• IsEmpty: Boolean – возвращает Истину, если объект пустой (RecordCount = 0).

• Last – передвигает курсор на последнюю запись бизнес-объекта. Если объект закрыт, генерирует исключение.

• LoadFromFile(AFileName: String) – загружает данные бизнес-объекта из файла AFileName.

Данный файл должен быть сформирован средствами Гедымина. (Читайте про сохранение • Locate(KeyFields: String; KeyValues: Variant; Options: String): Boolean – позиционирует курсор на запись с указанными параметрами. KeyFields – перечисление названий полей через запятую, KeyValues – массив с искомыми значениями полей KeyFields, Options – опции поиска через запятую. Options может содержать следующие опции:

CASEINSENSITIVE – поиск без учета регистра, PARTIALKEY – поиск по частичному значению, т.е. сравнивается не слово целиком, а начало содержимого поля с указанным значением. Использование Locate вытягивает записи на клиента, пока не найдет необходимую. При удачном завершении поиска возвращает Истину и устанавливает курсор на найденную запись. Если искомая запись не найдена, то курсор не изменяет положения, Например, необходимо найти товар, начинающийся со слова «Колбаса» со ссылкой на единицу измерения, равной 147027774.

Dim gdcGood, Creator Set Creator = new TCreator Set gdcGood = Creator.GetObject(nil, "TgdcGood", "") gdcGood.Open MsgBox gdcGood.Locate("name;valuekey", _ Array("колбаса", 147027774), "CASEINSENSITIVE,PARTIALKEY") • MoveBy(Distance: Integer): Integer – перемещает курсор на количество записей Distance. При этом, если параметр Distance отрицательный, то курсор возвращается на указанное количество записей, если положительный, то курсор перемещается вперед на указанное количество записей. Возвращает реальное количество записей, на которое был перемещен • Next – перемещает курсор на следующую запись. Если курсор стоял на последней записи, то устанавливает свойство EOF в Истину. если бизнес-объект не активен, генерирует • ObjectExists(Name: String): Boolean – возвращает Истина, если в списке объектных переменных, связанных с текущим бизнес-объектом, присутствует переменная с именем • Open – открывает бизнес-объект.

• ParamByName(Idx: String): TIBXSQLVAR – возвращает параметр из SELECT-запроса бизнес-объекта по его имени Idx. Если параметр с таким наименованием не найден, то генерирует исключение.

• PopupFilterMenu(X: Integer; Y: Integer) – выводит меню работы с фильтрами в точке экрана с координатами X и Y. Если X и Y равны -1, то меню будет выведено в точке положения указателя мыши.

• PopupReportMenu(X: Integer; Y: Integer) – выводит меню работы с отчетами в точке экрана с координатами X и Y. Если X и Y равны -1, то меню будет выведено в точке положения указателя мыши.

• Post – сохраняет изменения текущей записи бизнес-объекта и переводит объект в состояние просмотра записей. При этом бизнес-объект должен быть активен и находится в состоянии вставки или изменения записи. Иначе метод Post сгенерирует исключение.

• Prepare – подготавливает запросы бизнес-объекта к выполнению. Данный метод вызывается каждый раз после изменения запроса перед его выполнением или перед присваиванием значений параметров.

• Prior – перемещает курсор на предыдущую запись бизнес-объекта. Если курсор находился на первой записи, то устанавливает свойство BOF в Истину. Если бизнес-объект не активен, генерирует исключение.

• Reduction(BL: TBookmarkList): Boolean – вызывает диалог для слияния записей бизнесобъекта. Параметр BL – хранит список маркеров отмеченных записей, которые должны сливаться.

• Refresh – обновляет данные текущей записи на клиентской части, выполняя запрос RefreshSQL.

• RelationByAliasName(AnAliasName: String): String – возвращает реальное наименование таблицы по ее алиасу в запросе.

• RemoveFromSelectedArray(BL: TBookmarkList) – удаляет идентификаторы выделенных в гриде записей из списка отмеченных записей (свойство SelectedID) бизнес-объекта.

• RemoveFromSelectedID(ID: Integer) – удаляет идентификатор ID из списка отмеченных записей (свойство SelectedID) бизнес-объекта • RemoveSubSet(ASubSet: String) – удаляет подмножество с именем ASubSet из списка активных подмножеств бизнес-объекта.

• SaveToFile(AFileName: String) – сохраняет в файл с именем AFileName текущую запись бизнес-объекта.

• SetExclude(ReOpen: Boolean) – исключает текущую запись из множества. Используется только в режиме работы множества. Параметр ReOpen указывает переоткрыть ли бизнесобъект по завершению операции.

• SetInclude(AnID: Integer) – добавляет запись с идентификатором AnID в множество.

Используется только в режиме работы множества.

• SetRefreshSQLOn(SetOn: Boolean) – устанавливает (SetOn = Истина) или сбрасывает (SetOn = ложь) запрос ResfreshSQL. Если запрос RefreshSQL не задан, то после выполнения операций изменения записи не синхронизируются с базой. Отключение запроса обновления может быть необходимо для увеличения скорости выполнения большого количества операций изменения над бизнес-объектом.

• ShowFieldInGrid(AField: TField): Boolean – возвращает Истину, если поле является видимым в гриде, Ложь – в обратном случае.

• VariableExists(Name: String): Boolean – возвращает Истина, если в списке переменных простых типов, связанных с текущим бизнес-объектом, присутствует переменная с именем Name, Ложь – в обратном случае.

• _DoOnNewRecord(Self: TgdcBase) – вызывается при вставке новой записи. Устанваливает значения по умолчанию полям бизнес-объекта. Self – бизнес-объект, вызвавший метод.

Доступен только для перекрытия.

События бизнес-объектов • AfterCancel(Dataset: TgdcBase) – вызывается после отмены изменений. DataSet – бизнесобъект, вызвавший событие.

• AfterClose(Dataset: TgdcBase) – вызывается после закрытия бизнес-объекта. DataSet – бизнес-объект, вызвавший событие.

• AfterDelete(Dataset: TgdcBase) – вызывается после удаления записи. DataSet – бизнесобъект, вызвавший событие.

• AfterEdit(Dataset: TgdcBase) – вызывается после перевода бизнес-объекта в состояние редактирования. DataSet – бизнес-объект, вызвавший событие.

• AfterInsert(Dataset: TgdcBase) – вызывается после перевода бизнес-объекта в состояние вставки новой записи. DataSet – бизнес-объект, вызвавший событие.

• AfterOpen(Dataset: TgdcBase) – вызывается после открытия бизнес-объекта. DataSet – бизнес-объект, вызвавший событие.

• AfterPost(Dataset: TgdcBase) – вызывается после сохранения изменений. DataSet – бизнесобъект, вызвавший событие.

• AfterRefresh(Dataset: TgdcBase) – вызывается после обновления записи. DataSet – бизнесобъект, вызвавший событие.

• AfterScroll(Dataset: TgdcBase) – вызывается после перемещения курсора внутри бизнесобъекта. DataSet – бизнес-объект, вызвавший событие.

• AfterShowDialog(Sender: TgdcBase; DlgForm: TForm; IsOk: Boolean) – вызывается после закрытия диалогового окна редактирования бизнес-объекта. Sender – бизнес-объект, вызвавший событие, DlgForm – диалоговое окно, IsOk – говорит о том, как было закрыто окно (с сохранением изменений или с их отменой).

• BeforeClose(Dataset: TgdcBase) – вызывается перед открытием бизнес-объекта. DataSet – бизнес-объект, вызвавший событие.BeforeDelete(Dataset: TgdcBase) • BeforeEdit(Dataset: TgdcBase) – вызывается перед переводом бизнес-объекта в состояние редактирования. DataSet – бизнес-объект, вызвавший событие.

• BeforeInsert(Dataset: TgdcBase) – вызывается перед переводом бизнес-объекта в состояние вставки новой записи. DataSet – бизнес-объект, вызвавший событие.

• BeforeOpen(Dataset: TgdcBase) – вызывается перед открытием бизнес-объекта. DataSet – бизнес-объект, вызвавший событие.

• BeforePost(Dataset: TgdcBase) – вызывается перед сохранением изменений. DataSet – бизнесобъект, вызвавший событие.

• BeforeScroll(Dataset: TgdcBase) – вызывается перед перемещением указателя внутри бизнесобъекта. DataSet – бизнес-объект, вызвавший событие.

• BeforeShowDialog(Sender: TgdcBase; DlgForm: TForm) – вызывается перед появлением диалогового окна редактирования бизнес-объекта. Self – бизнес-объект, вызвавший метод, DlgForm – диалоговое окно.

• OnCalcFields(Dataset: TgdcBase) – вызывается при вычислении значения вычисляемых полей. DataSet- бизнес-объект, вызвавший событие.

• OnDeleteError(Dataset: TgdcBase; E: Exception; Action: Integer) – вызывается при возникновении ошибки при удалении записи. DataSet – бизнес-объект, вызвавший событие, E – исключение, Action – действие. Action может принимать следующие значения: 0 = прерывание операции и вывод ошибки на экран, 1 = прерывание операции без вывода ошибки, 2 = повтор операции.

• OnEditError(Dataset: TgdcBase; E: Exception; Action: Integer) – вызывается при возникновении ошибки при попытке изменения записи. DataSet – бизнес-объект, вызвавший событие, E – исключение, Action – действие. Action может принимать следующие значения:

0 = прерывание операции и вывод ошибки на экран, 1 = прерывание операции без вывода • OnFilterChanged(Sender: TgdcBase) – вызывается при изменении фильтра. Sender – бизнесобъект, вызвавший событие.

• OnGetFromClause(Sender: TgdcBase; Clause: String) – вызывается при считывании FROMчасти SELECT-запроса бизнес-объекта. Sender – бизнес-объект, вызвавший событие, Clause – сформированная методом GetFromClause FROM-часть. Изменение запроса возможно через дополнение параметра Clause: Clause.Value = Clause.Value +.

• OnGetGroupClause(Sender: TgdcBase; Clause: String) – вызывается при считывании GROUP BY-части SELECT-запроса бизнес-объекта. Sender – бизнес-объект, вызвавший событие, Clause – сформированная методом GetGroupClause GROUP BY-часть. Изменение запроса возможно через дополнение параметра Clause: Clause.Value = Clause.Value +.

• OnGetOrderClause(Sender: TgdcBase; Clause: String) – вызывается при считывании ORDER BY-части SELECT-запроса бизнес-объекта. Sender – бизнес-объект, вызвавший событие, Clause – сформированная методом GetOrderClause ORDER BY-часть. Изменение запроса возможно через дополнение параметра Clause: Clause.Value = Clause.Value +.

• OnGetSelectClause(Sender: TgdcBase; Clause: String) – вызывается при считывании SELECTчасти SELECT-запроса бизнес-объекта. Sender – бизнес-объект, вызвавший событие, Clause – сформированная методом GetSelectClause SELECT-часть. Изменение запроса возможно через дополнение параметра Clause: Clause.Value = Clause.Value +.

• OnGetWhereClause(Sender: TgdcBase; Clause: String) – вызывается при считывании WHERE-части SELECT-запроса бизнес-объекта. Sender – бизнес-объект, вызвавший событие, Clause – сформированная методом GetWhereClause WHERE-часть. Изменение запроса возможно через дополнение параметра Clause: Clause.Value = Clause.Value + • OnNewRecord(Dataset: TgdcBase) – вызывается при добавлении новой записи. DataSet – бизнес-объект, вызвавший событие.

• OnPostError(Dataset: TgdcBase; E: Exception; Action: Integer) – вызывается при возникновении ошибки при попытке сохранения изменений. DataSet – бизнес-объект, вызвавший событие, E – исключение, Action – действие. Action может принимать следующие значения: 0 = прерывание операции и вывод ошибки на экран, 1 = прерывание операции без вывода ошибки, 2 = повтор операции.

Создание связанных с бизнес-объектом переменных Итак, у нас есть бизнес-объект, обладающий некоторыми свойствами. Однако вам в run-time режиме могут понадобится дополнительные переменные, хранящие промежуточную информацию о бизнесобъекте. Существуют специальные свойства и методы, создающие связанные с бизнес-объектом переменные. Эти переменные будут ассоциированы с бизнес-объектом на протяжении его существования. Доступ к ним может быть получен из любой процедуры, из которой доступен бизнесобъект.

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

• AddObjectItem(Name: String) – добавляет в список новую объектную переменную с именем • AddVariableItem(Name: String) – добавляет в список новую переменную простого типа с именем Name, инициализируя ее пустым значением.

• ObjectExists(Name: String): Boolean – возвращает Истина, если в списке объектных переменных, связанных с текущим бизнес-объектом, присутствует переменная с именем • Objects(Name: String): IDispatch – список объектных переменных, связанных с текущим бизнес-объектом. Обращение к переменной идет по ее наименованию.

• VariableExists(Name: String): Boolean – возвращает Истина, если в списке переменных простых типов, связанных с текущим бизнес-объектом, присутствует переменная с именем • Variables(Name: String): Variant – список простых переменных, связанных с ткущим бизнесобъектом. Обращение к переменной идет по ее наименованию.

Рассмотрим пример использования связанных переменных. Довольно часто переменные простых типов используются как флаги, например в методе DoFieldChange.

‘Если существует уже такая переменная, то выходим if Self.VariableExists("BN_BillNDS_DoFieldChange") then exit sub end if ‘Иначе, добавляем переменную call Self.AddVariableItem("BN_BillNDS_DoFieldChange") ‘далее идет код процедуры В рассмотренном выше примере связанная переменная используется для того, чтобы выполнить какуюто часть кода всего один раз. При входе в процедуру проверяется, существует ли такая переменная, если существует, значит процедура уже выполнялась. А т.к. повторного выполнения не требуется, то мы выходим из процедуры. Если связанной с бизнес-объектом (в данном случает это Self) переменной не существует, то мы добавляем эту переменную и выполняем процедуру.

В следующем примере мы создали какой-то внутренний объект и хотим его связать с нашим бизнесобъектом.

‘Объявляем переменную Dim NewObject ‘Создаем объект с классом MyClass set NewObject = new MyClass ‘Создаем объектную переменную, связанную с бизнес-объектом ‘gdcObject call gdcObject.AddObjectItem(“AssociateObject”) ‘Присваиваем нашей объектной переменной созданный объект set gdcObject.Objects(“AssociateObject”) = NewObject Внимание! Связанные с бизнес-объектом объектные переменные уничтожаются при уничтожении бизнес-объекта.

Создание своих бизнес-классов Мы уже не раз сталкивались с понятиями стандартного и пользовательского бизнес-объектов. Уточним, что же они значат. Стандартный бизнес-объект – это бизнес-объект, который заложен в платформу Гедымин. Он будет присутствовать даже при ненастроенной (т.е. эталонной) базе. Пользовательский бизнес-объект – это бизнес-объект, созданный пользователем-настройщиком платформы.

Пользовательский бизнес-объект создается средствами Гедымина и представляет собой экземпляр одного из следующих классов (иерархию смотрите на Рисунок 0.9) :

• TgdcAttrUserDefined, TgdcAttrUserDefinedTree, TgdcAttrUserDefinedLBRBTree – бизнес-объекты, созданные на основании пользовательских таблиц. Подтип равен названию таблицы (первых символов). Про создание таких бизнес-объектов читайте в главе 8.

• TgdcUserDocument, TgdcUserDocumentLine – бизнес-объекты, созданные на основании простых пользовательских документов. Подтип равен РУИД-у пользовательского документа. Про создание таких бизнес-объектов читайте в главе 11.

• TgdcInvDocument, TgdcInvDocumentLine – бизнес-объекты, созданные на основании складских пользовательских документов. Подтип равен РУИД-у документа. Про создание таких бизнесобъектов читайте в главе 11.

• TgdcInvPriceList, TgdcInvPriceListLine – бизнес-объекты, созданные на основании пользовательских прайс-листов. Подтип равен РУИД-у пользовательского прайс-листа. Про создание таких бизнесобъектов читайте в главе 11.

У пользовательского бизнес-объекта обязательно присутствует подтип. И напротив, изначально все стандартные бизнес-объекты идут без подтипа. Здесь есть одна оговорка: вы можете создать свою разновидность стандартного бизнес-объекта за счет создания для него некого уникального подтипа.

Любой созданный бизнес-объект обладает всеми возможностями базового бизнес-объекта. Кроме того, создание бизнес-объекта не потребует больших затрат по времени, т.к. платформа настраивает созданный объект в соответствии с принятой бизнес-логикой. Вы можете дополнить или изменить существующую функциональность за счет перекрытия методов или событий и настройки визуальных форм в соответствии с необходимыми требованиями.

Рисунок 0. Модифицирование поведения бизнес-объектов. Перекрытие методов и событий Итак, повторимся: в системе Гедымин используются понятия стандартного и пользовательского бизнесобъектов. Пользовательские бизнес-объекты создаются от определенных классов (смотрите предыдущую главу) и всегда имеют подтип. Попытка открыть пользовательский бизнес-объект с пустым подтипом приведет к генерации исключения. Стандартные бизнес-объекты изначально не имеют подтипов. Но, т.к.

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

Зарегистрировать подтип для стандартного бизнес-класса можно через исследователь. Для этого вам нужно создать новую ветку исследователя, выбрать переключатель «Бизнес-класс», в выпадающем списке указать стандартный бизнес-класс и ввести новый подтип. Создавая таким образом новое расширение стандартного класса, помните, что подтип должен быть уникален в пределах базы.

Если рассматривать, как это организуется на уровне работы с базой, то в таблицу GD_COMMAND, добавляется новая запись, которая и хранит в себе связку «стандартный бизнес-класс - подтип».

После того, как вы создали ветку в исследователе, в окне Редактор скрипт-объектов в дереве бизнесклассов появится бизнес-класс с новым подтипом. Вы можете перекрывать все доступные методы, чтобы определить его поведение. Кроме того, вам обязательно нужно перекрыть метод GetCurrRecordSubType в классе, который вы расширили. Например, вы создали новый тип Товара – Услугу, введя подтип SERVICE. Значит, в классе TgdcGood (без подтипа) вам необходимо перекрыть метод GetCurrRecordSubType, чтобы указать признак, по которым запись будет определяться как услуга.

Данный метод используется для определения подтипа при создании / изменении / удалении записи. Если вы не перекроете GetCurrRecordSubType, то при работе с базовым классом Гедымин не сможет корректно определить тип изменяемой записи, а следовательно отработают не ваши перекрытые методы, а методы базового класса.

Ввод нового подтипа для стандартного класса всегда должен соответствовать существованию некого признака в базовой таблице. По данному признаку и будет определяться, что конкретная запись репрезентирует не просто стандартный объект, но объект с подтипом. В качестве признака вы можете использовать либо уже существующее поле, либо добавить новое поле. Данное поле должно заполняться значениями, которые будут соответствовать конкретному подтипу.

Например, в настройке Аренда расширен бизнес-класс Товар (TgdcGood, подтип пустой, базовая таблица GD_GOOD). В Аренде созданы бизнес-объекты Услуга (класс TgdcGood, подтип SERVICE, признак – поле USR$REN_ISSERVICE, для данного подтипа содержит 1) и Объект (класс TgdcGood, подтип OBJECT, признак - поле USR$REN_ISOBJECT, для данного подтипа содержит 1).

Теперь обратим внимание на перекрытие методов и событий. Итак, само понятие перекрытие метода означает его дополнение некой функциональностью. Чтобы перекрыть метод, вам необходимо в дереве бизнес-объектов найти требуемый класс и подтип (если он задан), выбрать метод. Двойной щелчок мыши по методу выводит окно редактирования метода.

Внимание: не желательно изменять название функции метода или подключать функцию другого метода!

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

При перекрытии метода или события тело скрипта изначально не пустое. В нем обязательно присутствует строка с вызовом Inherited. Вызов Inherited дает возможность отработать функциональности, заданной изначально в платформе Гедымин для данного класса. Обычно Inherited из скрипта не убирают, т.к. некорректное обращение с Inherited может привести к неправильной работе данного класса. Однако бывают случаи, когда вызов Inherited не нужен. Например, вы можете перекрыть метод бизнес-класса CreateDialogForm, который возвращает диалоговое окно бизнес-объекта, и сделать так чтобы он возвращал ваше диалоговое окно. В этом случае вызов Inherited не нужен. При перекрытии метода или события во входных параметрах обязательно присутствует объект, вызвавший метод или событие. Если вы перекрываете метод бизнес-объекта на его открытие, то во входных параметрах обязательно будет данный бизнес-объект, если вы перекрыли событие, вызванное нажатием кнопки, то во входных параметрах будет кнопка. Чаще всего входной параметр, представляющий объект, в методах называется Self, а в событиях Sender.

Чем отличается перекрытие методов от перекрытия событий?

Перекрывая метод, вы определяете поведение класса с заданным подтипом. Перекрывая событие, вы определяете поведение конкретного объекта. Например, на форме Адресная книга вы хотите кроме прочей информации отображать еще и главный счет для организаций. Для этого из запроса SELECT z.* FROM gd_contact z вам нужно сделать запрос вида SELECT z.*, ca.account, b.bankcode FROM gd_contact z LEFT JOIN gd_company c ON z.id = c.contactkey LEFT JOIN gd_companyaccount ca ON ca.id = c.companyaccountkey LEFT JOIN gd_bank b ON b.bankkey = ca.bankkey Согласитесь, что данный запрос является более громоздким, и его время выполнения несколько больше, чем время выполнения первоначального запроса. Расширить запрос можно двумя способами:

1. Перекрыть методы GetSelectClause и GetFromClause бизнес-класса TgdcBaseContact. В этом случае дополнительные таблицы будут добавляться в запрос для всех экземпляров, созданных от TgdcBaseContact или от классов, являющихся его наследниками.

2. Перекрыть события OnGetSelectClause и OnGetFromClause бизнес-объекта gdcContacts, непосредственно лежащего на форме Адресная книга. В этом случае дополнительные таблицы будут подключаться к запросу только в случае отображения записей на форме Теперь рассмотрим, как это выглядит на практике.

В первом случае мы перекрываем методы базового класса TgdcBaseContact для всех типов контактов:

option explicit function TgdcBaseContactGetSelectClause(Self) TgdcBaseContactGetSelectClause = _ Inherited(Self, "GetSelectClause", Array(Self)) TgdcBaseContactGetSelectClause = TgdcBaseContactGetSelectClause + ", ca.account, b.bankcode " end function option explicit function TgdcBaseContactGetFromClause(Self, ARefresh) TgdcBaseContactGetFromClause = _ Inherited(Self, "GetFromClause", Array(Self, ARefresh)) TgdcBaseContactGetFromClause = TgdcBaseContactGetFromClause + _ " LEFT JOIN gd_company c ON z.id = c.contactkey " + _ " LEFT JOIN gd_companyaccount ca " + _ " ON ca.id = c.companyaccountkey " + _ " LEFT JOIN gd_bank b ON b.bankkey = ca.bankkey " end function Во втором случае перекрываются события:

option explicit sub gdcContactsOnGetSelectClause(ByVal Sender, ByRef Clause) Dim ParamArr(1) Set ParamArr(0) = Sender ParamArr(1) = Clause call Inherited(Sender, "OnGetSelectClause", ParamArr) Clause.Value = ParamArr(1) Clause.Value = Clause.Value + ", ca.account, b.bankcode " end sub option explicit sub gdcContactsOnGetFromClause(ByVal Sender, ByRef Clause) Dim ParamArr(1) Set ParamArr(0) = Sender ParamArr(1) = Clause call Inherited(Sender, "OnGetFromClause", ParamArr) Clause.Value = ParamArr(1) Clause.Value = Clause.Value + _ " LEFT JOIN gd_company c ON z.id = c.contactkey " + _ " LEFT JOIN gd_companyaccount ca " + _ " ON ca.id = c.companyaccountkey " + _ " LEFT JOIN gd_bank b ON b.bankkey = ca.bankkey " end sub Если вы рассмотрели примеры внимательно, то заметили некоторые отличия в перекрытии методов и событий. В данном случае методы GetSelectClause и GetFromClause сами возвращают сформированную часть запроса в виде строки. События ничего не возвращают. Они срабатывают в определенное время и выполняют определенные действия. Если нам необходимо что-либо вернуть из события, мы должны передать для этого переменную в качестве входного параметра. Чтобы вернуть какое-либо значение именно платформе Гедымин, а не другому скрипту, вам необходимо использовать конструкцию.Value – т.е. своеобразное обращение к значению переменной.

А теперь обобщим различия между методами и событиями:

• метод перекрывается для класса и его наследников; обработчик события определяется только для конкретного объекта. Т.е. перекрытие методов несет более глобальный характер.

• в методе нельзя можно обращаться только к объекту, вызвавшему метод, или к глобальным объектам. Событие позволяет обращаться также к объектам, которые созданы в момент его вызова.

Например, к форме, на которой лежит объект. Обращение к форме, на которой лежит объект из метода недопустимо. Метод срабатывает для всех объектов, созданных с определенным классом и подтипом. И эти объекты могут не лежать на форме.

• метод может непосредственно возвращать некоторое значение; событие ничего не возвращает.

Вернуть что-либо из события можно через некоторый входной параметр. Работа со значением такого параметра происходит через.Value.

Пример перекрытия событий бизнес-объекта Разработчики типового решения «Банк и Касса» не предусмотрели поле «Наименование банка получателя» в бизнес-объекте платежное поручение. Конечно, увидеть наименование банка можно, открыв платежное поручение в диалоговом окне на редактирование, однако намного удобнее было бы иметь соответствующую колонку в окне просмотра списка документов.

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

Прежде всего, следует определиться, откуда можно получить необходимую информацию. Платежные поручения хранятся в таблице USR$BN_PAYMENT. Просмотреть структуру данной таблицы можно, если последовательно перейти в Исследователе системы в раздел «Сервис», «Атрибуты» и выбрать команду «Таблицы». Найдем в верхнем списке позицию, соответствующую USR$BN_PAYMENT и установим на нее курсор. В нижней части окна можно просмотреть список полей выбранной таблицы.

Рис. 40 Список таблиц системы.

Интересующее нас поле, ссылка на расчетный счет получателя денег, имеет наименование USR$BN_RECEIVERACCOUNT. Данное поле ссылается на таблицу GD_COMPANYACCOUNT.

Последняя, в свою очередь, имеет поле BANKKEY — ссылку на таблицу GD_CONTACT, которая и содержит искомое наименование банка.

Итак, мы знаем, где находится нужная нам информация. Для ее извлечения необходимо изменить исходный запрос бизнес-объекта, подключив в секцию FROM две таблицы: GD_COMPANYACCOUNT и GD_CONTACT и добавив поле наименования банка в секцию SELECT.

Поскольку мы будем соединять таблицу GD_COMPANYACCOUNT с таблицей USR$BN_PAYMENT необходимо узнать, какой алиас имеет она в запросе. Для этого, находясь в списке платежных поручений, нажмем клавишу F10. На экране появится диалоговое окно «Мастер установок» таблицы.

Нас интересует вкладка «Запрос».

Рис. 41 Определение алиаса таблицы в запросе.

Как видно на рисунке, таблица USR$BN_PAYMENT имеет псевдоним U. Закроем окно «Мастера установок».

Теперь внесем изменения в запрос бизнес-объекта. Для этого активизируем форму просмотра списка платежных поручений и переведем ее в режим дизайнера путем нажатия комбинации клавиш Ctrl+Alt+E.

Отыщем на ней и выделим компонент gdcUserDocument.

Рис. 42 Форма в режиме дизайнера.

Нажмем F11 для того, чтобы перейти в окно Инспектора объектов. Переключимся на вкладку События.

SQL запрос бизнес-объекта собирается из пяти частей: SELECT, FROM, WHERE, GROUP и ORDER. При формировании каждой из них вызывается соответствующее событие. Перекрыв событие можно изменить или даже целиком заменить текст соответствующей секции SQL запроса. В нашем случае мы будем обрабатывать события OnGetSelectClause и OnGetFromClause. Для ввода программного кода найдем событие в списке и нажмем кнопку «…» справа от него, как показано на следующем рисунке.

Рис. 43 Инспектор объектов.

На экране откроется редактор скрипт-объектов с текстом обработчика события по-умолчанию. Внесем в него свои коррективы и сохраним с помощью команды меню «Скрипт»—«Сохранить».

Ниже приводится исходный код перекрытых обработчиков. Текст, выделенный жирным начертанием, был добавлен нами.

option explicit sub gdcUserDocumentOnGetFromClause(ByVal Sender, ByRef Clause) '*** Данный код необходим для вызова встроенного обработчика *** '*** В случае его удаления возможно нарушение работы системы *** Dim ParamArr(1) Set ParamArr(0) = Sender ParamArr(1) = Clause call Inherited(Sender, "OnGetFromClause", ParamArr) Clause.Value = ParamArr(1) '*** конец кода поддержки встроенного обработчика *** Clause.Value = Clause & _ " JOIN gd_companyaccount receiver_account ON" & _ " receiver_account.id = U.USR$BN_RECEIVERACCOUNT " & _ " JOIN gd_contact receiver_bank ON" & _ " receiver_bank.id = receiver_account.bankkey " end sub option explicit sub gdcUserDocumentOnGetSelectClause(ByVal Sender, ByRef Clause) '*** Данный код необходим для вызова встроенного обработчика *** '*** В случае его удаления возможно нарушение работы системы *** Dim ParamArr(1) Set ParamArr(0) = Sender ParamArr(1) = Clause call Inherited(Sender, "OnGetSelectClause", ParamArr) Clause.Value = ParamArr(1) '*** конец кода поддержки встроенного обработчика *** Clause.Value = Clause & _ ",receiver_bank.name AS receiver_bank_name " end sub Как видно из листингов все достаточно просто. Мы добавили две таблицы в секцию FROM, связав их с таблицей платежных поручений, и одно поле в секцию SELECT.

Испытаем наше творение в действии. Для этого необходимо пересоздать окно со списком платежных поручений. Именно пересоздать, а не закрыть-открыть. Для этого нажмем клавишу Shift и, удерживая ее, щелкнем мышью по крестику в правом верхнем углу окна. Оно исчезнет не только с экрана, но и удалится из оперативной памяти компьютера. Теперь заново откроем его используя Исследователь системы13. Если на экран не выдалось никаких сообщений об ошибках, то все было сделано правильно.

Осталось сделать нашу новую колонку видимой в таблице. Нажимаем F10, переходим на вкладку «Колонки», находим наше поле в списке, выделяем его и устанавливаем флаг «Колонка отображается».

Рис. 44 Мастер установок.

Закроем «Мастер установок». Теперь в таблице, для каждого платежного поручения отображается наименование банка клиента.

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

Для того чтобы сохранить данные в файл, вам необходимо открыть форму отображения бизнес-объекта, выделить записи, которые вы хотите сохранить и нажать на панели инструментов кнопку «Сохранить в объект файл». На второй базе на форме отображения нужно нажать кнопку «Загрузить объект из файла»

и указать файл, который хранит данные (смотрите Рисунок 0.10).

Рисунок 0. Более долгий вариант — это выйти из Гедымина и запустить его снова.

К сожалению, из макросов вы не сможете работать с сохранением нескольких записей в один файл, используя механизм потоков. Однако это можно обойти, используя механизм настроек, который доступен и из макросов, и в виде мастеров.

Формы В данной главе будут описаны основные виды форм, доступные при работе с платформой Гедымин, рассказано про особенности их поведения. Также будут указаны различия между просмотровыми и диалоговыми окнами, описано взаимодействие между формами и бизнес-объектами. Здесь мы познакомимся со способами создания новых форм, с возможностями изменения уже существующих, рассмотрим иерархию и наследование. Также эта глава содержит описание наиболее часто использующихся свойств и методов базовых форм.

Иерархия классов форм В данном пункте мы рассмотрим иерархию классов форм, используемых при работе с платформой Гедымин.

Каждая форма – это по сути экземпляр определенного класса. Базовым классом для всех форм, используемых в Гедымине является класс TgdcCreateableForm, все остальные классы наследованы от него. На рисунке 7.1 вы можете увидеть иерархию классов форм.

Рис. 45Иерархия классов форм просмотра Рис. 46 Иерархия классов диалоговых форм Как мы видим, от основного класса TgdcCreateableForm наследовано два класса Tgdc_dlgG (отвечает за работу с диалоговыми окнами) и Tgdc_frmG (отвечает за работу с формами просмотра). Более подробное описание классов можно увидеть в таблице 7.1.

Tgdc_dlgG Базовый класс для работы с диалоговыми окнами. Содержит основные Tgdc_dlgTR Наследован от Tgdc_dlgG. Содержит дополнительную транзакцию, которая Tgdc_dlgHGR Наследован от Tgdc_dlgTR. Используется для редактирования бизнесобъекта, у которого есть детальный объект. Содержит грид для отображения Tgdc_dlgTRPC Наследован от Tgdc_dlgTR. Используется для редактирования бизнесобъекта, на базовую таблицу которого есть ссылка типа множество.



Pages:     | 1 |   ...   | 2 | 3 || 5 | 6 |   ...   | 8 |


Похожие работы:

«Рабочая программа по русскому языку начального общего образования Разработчик: Учитель начальных классов Алексеенко О.В. Педагогический стаж: 25 лет Вторая квалификационная категория 2011 год Русский язык I. Пояснительная записка Рабочая программа составлена на основе Федерального государственного стандарта начального общего образования, Концепции духовнонравственного развития и воспитания личности гражданина России, планируемых результатов начального общего образования. Предмет Русский язык...»

«ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ ГОУ ВПО АЛТАЙСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ЮРИДИЧЕСКИЙ ФАКУЛЬТЕТ Кафедра теории и истории государства и права ПРОГРАММА вступительного квалификационного экзамена на соответствие уровню бакалавра по направлению Юриспруденция для направления 030500 Юриспруденция Барнаул 2010 1. Методологические основы научного понимания государства и права Понятие юридической науки. Предмет теории государства и права. Теория государства и права в системе наук, изучающих...»

«1 Государственное образовательное учреждение высшего профессионального образования Московской области Международный университет природы, общества и человека Дубна (университет Дубна) Факультет естественных и инженерных наук Кафедра биофизики УТВЕРЖДАЮ проректор по учебной работе _С.В. Моржухина __2011 г. ПРОГРАММА ДИСЦИПЛИНЫ Микробиология (наименование дисциплины) по направлению 140800 – ядерные физика и технологии (№, наименование направления, специальности) Форма обучения: очная Уровень...»

«ДЕПАРТАМЕНТ ОБРАЗОВАНИЯ ГОРОДА МОСКВЫ Государственное бюджетное образовательное учреждение высшего профессионального образования города Москвы Московский городской педагогический университет Институт психологии, социологии и социальных отношений Кафедра психологии развития и инноваций Программа вступительных испытаний в магистратуру по направлению 44.04.02 Психолого-педагогическое образование, программа подготовки Психолого-педагогическое сопровождения развития) Очная форма обучения Москва 2014...»

«ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования Тихоокеанский государственный университет УТВЕРЖДАЮ Проректор по учебной работе С.В. Шалобанов “_” 200_ г. ПРОГРАММА ДИСЦИПЛИНЫ по кафедре Лесное и лесопарковое хозяйство Основы научных исследований в лесном хозяйстве Утверждена научно-методическим советом университета для направлений подготовки (специальностей) в области воспроизводства и переработки лесных ресурсов...»

«Академия управления при Президенте Республики Беларусь УДК 316.245 ББК 60.7 Л 24 Лапина С.В., Арсюткина Л.Н. СОЦИАЛЬНАЯ ДЕМОГРАФИЯ научное обеспечение демографической политики Республики Беларусь Минск 2012 СОДЕРЖАНИЕ ВВЕДЕНИЕ.. 4 1 ОТ ДЕМОГРАФИИ – К СОЦИАЛЬНОЙ ДЕМОГРАФИИ.. 9 1.1 Объект и предмет демографии. 9 1.2 Краткая история становления демографии как социальной науки о народонаселении. 1.3 Социальная демография в системе наук. 2 ИСТОЧНИКИ ИНФОРМАЦИИ О НАСЕЛЕНИИ И ДЕМОГРАФИЧЕСКИХ...»

«ПОВЫШЕНИЕ ЭНЕРГОЭФФЕКТИВНОСТИ И ПЕРСПЕКТИВЫ ЭНЕРГОМЕНЕДЖМЕНТА В РОССИИ Романов Г.А., ст.науч.сотр, к.т.н., руководитель Рабочей группы при Комитете РСПП по разработке международного стандарта по энергоменежменту (ИСО 50001), (Холдинг МЭИ-Интехэнерго, Институт проблем энергоэффективности МЭИ) Одним из основных приоритетов утвержденной в 2003 г. Энергетической стратегии России на период до 2020 г. является повышение энергоэффективности российской экономики, за счет рационализации потребления ТЭР,...»

«НЕГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ СМОЛЕНСКИЙ ГУМАНИТАРНЫЙ УНИВЕРСИТЕТ ФАКУЛЬТЕТ КОМПЬТЕРНЫХ ТЕХНОЛОГИЙ, ЭКОНОМИКИ И ДИЗАЙНА КАФЕДРА ДИЗАЙНА ПРОГРАММА РИСОВАЛЬНОЙ ПРАКТИКИ специальность 070601.65 Дизайн Форма обучения очная Квалификация (степень) 01.Дизайнер (графический дизайн) Смоленск 2012 СОДЕРЖАНИЕ 1. Цели рисовальной практики 2. Задачи рисовальной практики 3. Место рисовальной практики в структуре ООП 4. Формы проведения рисовальной практики...»

«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ ВЫСШАЯ ШКОЛА ЭКОНОМИКИ НИЖНИЙ НОВГОРОД РЕГИОН В ПЕРИОД МОДЕРНИЗАЦИИ: СОЦИАЛЬНЫЕ ИНСТИТУТЫ Материалы II Международной научно-практической конференции, 5 апреля 2013 г. Нижний Новгород 2013 ББК 60.59 УДК 316.3 Р32 Регион в период модернизации: социальные институты: материалы II Международной научно-практической конференции, 5 апреля 2013 г. – Н. Новгород, изд. НИСОЦ, 2013. – 551 с. В сборнике представлены статьи по актуальным вопросам, существующим в...»

«Федеральное государственное казенное образовательное учреждение высшего профессионального образования Академия Генеральной прокуратуры Российской Федерации Санкт-Петербургский юридический институт (филиал) Академии Генеральной прокуратуры Российской Федерации ПРОКУРОРСКИЙ НАДЗОР ПРОГРАММА ВСТУПИТЕЛЬНОГО ЭКЗАМЕНА по направлению подготовки научно-педагогических кадров в аспирантуре 40.06.01 Юриспруденция направленность (профиль) Судебная деятельность, прокурорская деятельность, правозащитная и...»

«МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ АГРАРНЫЙ УНИВЕРСИТЕТ РАБОЧАЯ ПРОГРАММА дисциплины: Хозяйственное право направление: 080100.62 ЭКОНОМИКА факультет: Экономический Кафедра-разработчик: международного частного и предпринимательского права Дневная форма обучения Вид учебной работы Курс, Часов /з.е. семестр 2 курс Аудиторные занятия – 4 севсего местр...»

«Республика Таджикистан: Оценка национальных расходов в связи со СПИДом, 2010-2011 гг. РЕСПУБЛИКА ТАДЖИКИСТАН ТАДЖИКИСТАН: ОЦЕНКА НАЦИОНАЛЬНЫХ РАСХОДОВ В СВЯЗИ СО СПИДом: 2010-2011гг. Республика Таджикистан: Оценка национальных расходов в связи со СПИДом, 2010-2011 гг. ТАДЖИКИСТАН: ОЦЕНКА НАЦИОНАЛЬНЫХ РАСХОДОВ В СВЯЗИ СО СПИДом: 2010-2011 гг. ПОТОКИ ФИНАНСОВЫХ СРЕДСТВ И РАСХОДЫ В СВЯЗИ С ВИЧ Душанбе 2012 Республика Таджикистан: Оценка национальных расходов в связи со СПИДом, 2010-2011 гг....»

«Вторая международная научно-техническая конференция Аэрокосмические технологии, посвященная 95-летию со дня рождения академика В.Н. Челомея ПРОГРАММА КОНФЕРЕНЦИИ Российская Федерация Реутов – Москва 19-20 мая 2009 Вторая МНТК Аэрокосмические технологии. 2009 ОРГАНИЗАТОРЫ: Открытое акционерное общество Военно-промышленная корпорация НПО машиностроения Московский государственный технический университет имени Н.Э. Баумана Союз ученых и инженеров имени академика В.Н. Челомея СОПРЕДСЕДАТЕЛИ...»

«Аттестационные испытания при переводе, восстановлении, поступлении на второе высшее образование на дефектологический факультет ПРОГРАММЫ вступительных испытаний: • для лиц, имеющих высшее профессиональное образование и поступающих в МПГУ для получения второго высшего образования; • для студентов, переводящихся внутри МПГУ и из других учебных заведений; • для студентов, отчисленных из МПГУ и восстанавливающихся на соответствующий курс. Специальность Сурдопедагогика (заочная форма обучения) 2...»

«Министерство образования и науки Российской Федерации ПРОГРАММА - МИНИМУМ кандидатского экзамена по специальности 08.00.05 - Экономика и управление народным хозяйством (связь и информатизация) по экономическим наукам Программа-минимум содержит 18 стр. 2007 2 Введение Основу настоящей программы составили ключевые положения следующих дисциплин: Экономика связи, Специфика управления производством услуг и средств связи, Организация производства на предприятиях связи, Статистика связи,...»

«Программа поддержки EPYRU молодежной политики региона ППМП ПРОГРАММА Восточного партнерства ФИНАНСИРУЕТСЯ ЕВРОПЕЙСКИМ СОЮЗОМ Программа поддержки молодежной политики региона Восточного Партнерства – Анкета об информационных источниках и механизмах молодежной политики Следующая информация была предоставлена проектом EPYRU Министерством спорта и по делам молодежи Республики Армении в ответ на анкету, направленную ему в ходе проекта вступительной миссии в июне 2013 года. 1. 1. Пожалуйста, дайте...»

«Аннотированные программы дисциплин, курсов и модулей ООП по направлению 130102 – Технологии геологической разведки Дисциплины Гуманитарного, социального и экономического цикла С.1.Б.1 Философия Цели и задачи дисциплины: формирование представления о специфике философии как способе познания и духовного освоения мира, основных разделах современного философского знания, мировоззренческих, социально и личностно значимых философских проблемах и методах их исследования; овладение базовыми принципами и...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ НЕФТИ И ГАЗА ИМЕНИ И.М. ГУБКИНА АННОТАЦИЯ ОСНОВНАЯ ОБРАЗОВАТЕЛЬНАЯ ПРОГРАММА ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ Направление подготовки 240100 ХИМИЧЕСКАЯ ТЕХНОЛОГИЯ Профиль подготовки ХИМИЧЕСКАЯ ТЕХНОЛОГИЯ ПРИРОДНЫХ ЭНЕРГОНОСИТЕЛЕЙ И УГЛЕРОДНЫХ МАТЕРИАЛОВ Квалификация выпускника БАКАЛАВР Нормативный срок обучения 4 ГОДА Форма обучения ОЧНАЯ МОСКВА, 2011 г. Назначение ООП ВПО ООП ВПО представляет собой...»

«ПРАВИТЕЛЬСТВО РОССИЙСКОЙ ФЕДЕРАЦИИ ФВДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ (СПбГУ) ПРИКАЗ г по Математико-механическому 1 Г факультету Об утверждении новой редакции компетентностно-ориентированного J L L учебного плана основной образовательной программы В соответствии с приказом проректора по учебной работе от 13.03.2009 № 329/1 О порядке регистрации изменений в учебных планах...»

«Федеральное агентство по рыболовству ФГБОУ СПО Архангельский морской рыбопромышленный техникум Рассмотрена и одобрена УТВЕРЖДАЮ цикловой комиссией морского Начальник техникума судовождения и _Н.В. РУШАКОВ промышленного рыболовства 08 ноября 2012г. Протокол № 3 от 06 ноября 2012г. СОГЛАСОВАНО Заместитель начальника техникума по учебной работе _ Н.А. КРОМОВА 07 ноября 2012г ПРОГРАММА ИТОГОВОЙ ГОСУДАРСТВЕННОЙ АТТЕСТАЦИИ ВЫПУСКНИКОВ СПЕЦИАЛЬНОСТИ 180406 Морское судовождение базовый уровень...»






 
2014 www.av.disus.ru - «Бесплатная электронная библиотека - Авторефераты, Диссертации, Монографии, Программы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.