BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
[ Закрыто ] УРОК 6, Работа над формой редактирования грида.
 
Продолжаем публикацию уроков.
В продолжение темы по уроку 4 рассмотрим создание формы редактирования грида.
Задавать Вопросы и обсуждать принцип работы мы будем здесь : Переход к обсуждению

СОДЕРЖАНИЕ УРОКА
1.Вносим изменения в грид для подключения МетаБО
2.Вносим изменения в форму редактирования
3.Подключаем вызов формы
4.Самостоятельное задание
 
1.Вносим изменения в грид и настраиваем МетаБО

ШАГ 1
- Открываем форму грида в BestIde
- Находим объект TBObject и перетаскиваем его на форму грида
- Вносим изменения в инспекторе

TBObject
Код
Name                         BO
xbsClassName             boDover

DS
Код
BOObject                     BO
TableName                 очищаем значение


- Вносим изменения в текст frmDover.prg

в метод FORM_CREATE
Цитата
::BO:Active:= .T.
::DS:Active:= .T.

в метод FORM_CLOSE
Цитата
::DS:Active:= .F.
::BO:Active:= .F.


ШАГ 2
Теперь для того чтобы наш МетаБО объект заработал нам надо создать класс для его описания

- Выделяем в проекте раздел "Программы" Файл - Создать новый - Модуль - ОК
- Переименуем файл в boDover.prg

Создание текста класса

- Сначала подключим необходимые определения
Цитата
#include "hbclass.ch"
#include "BO_const.ch"

-Теперь объявим класс и небольщой набор методов
:!: Количество методов гораздо больше, мы сейчас строим простейгий пример для начала
Цитата
CLASS boDover FROM clsMetaBO
EPORTED:
ACCESS ASSIGN METHOD NUMDOC()

:!: Для редактирования каждого поля таблицы надо делать свой подобный метод
Мы сейчас делаем ввод.корректировку пока на примере одного поля
Цитата
ACCESS METHOD FieldList()

:!: При наличии данного метода мы можем не прописывать в гриде перечень стобцов
Тогда они будут созданы автоматически на основе данного метода. Ситуацию, при
которой столбцы все-таки придется прописывать в гриде вручную рассмотрим дополнительно.
Цитата
METHOD Init()
METHOD Open()
METHOD Append()
ENDCLASS


Инициализация класса
Цитата
METHOD boDover:Init()
::clsMetaBO:Init()
::mboVersion:=1
::NameBO:="boDover"
::ModifyType:=mtNewEditDel
::clsMetaBO:subself:=self
RETURN self

Открытие баз
Цитата
METHOD boDover:Open()
RETURN ::clsMetsBO:Open("user\dover\dover.dbf")

Создание FieldList()
:!: Данный пример не показателен.Обязательно обратите Внимание на создание из списка
минимум в 2 строки
Цитата
METHOD FieldList()
Local s
s:= "NUMDOC;1;6;0;;Номер доверенности"
RETURN s

:?: Второй параметр строки - 1, говорит о том что тип поля "С".
Здесь должна быть ссылка на перечень вариантов. Обязательно с меня потребовать,если забуду :lol:
Цитата
METHOD boDover:Append()
IF !::clsMetaBO:Append()
Return .F.
EndIf
RETURN .T.

Ну и собственно метод заполнения значения поля в таблице
:!: Для каждого изменяемого поля следует создавать подобный метод
Цитата
METHOD boDover:NumDoc(value)
IF value <> NIL .AND. ::EditMode<>0
::DS:FieldValue("Numdoc",value)
ENDIF
RETURN ::DS:FieldValue("NUMDOC")


Компилируем и проверяем что синтаксических ошибок не допустили
 
2.Вносим изменения в форму редактирования
Для простоты решения Вопроса рассматриваем пока только на основе поля номер доверенности.

- В BestIde открываем на редактирование форму frmDoveredit.prg
- В форму перетаскиваем объект TBObject
- в форму перетаскиваем объект xbButton
- в форму перетсакиваем еще один объект xbButton
(готовим два объекта под кнопки "ОК" и "ОТМЕНА")

- настраиваем в инспекторе
ВО
Код
name...........................BO
xbsClassName...................boDover

DSR
Код
BOObject.............................BO
TableName............................очищаем значение

Первая xbButton
Код
Caption................................OK
ModalResult............................mrOk
Name...................................btnOk

Вторая xbButton
Код
Caption................................ОТМЕНА
ModalResult............................mrCancel
Name...................................btnCancel


- На кнопке ОК делаем двойной щелчок мышкой - получилась заготовка в тескте прогамммы формы
- Повторяем действие на кнопке ОТМЕНА

- Вносим изменения в текст prg файла формы:

Определяем новые методы

Цитата
METHOD DocSave
METHOD DocClose

METHOD btnOk_Click
METHOD btnCanctl_Click

Переписываем метод From_Create
Цитата
::BO:Active:=.T.
::DS:Active:=.T.
::FormState:=p[1]

:!: FormState выполняет роль аналогичную nApp в InitList
Цитата
IF ::FormState=2
::bo:bo:append()

Отрабатываем открытие карточки по F4 (режим ввода)
:!: Не стоит покупаться на append() выполнение этого действия не означает что в
таблице dover.dbf появится новая запись. Ввод записи как бы разделен на две половинки.
Первую часть мы сейчас делаем и вносим данные в некую виртуальную таблицу.
Вторая половинка действия будет выполнена позже - непосредственная запись в таблицу.
Такой механизм позволяет нам легко реализовывать варианты отката, когда нажатие на
клавишу ОК или еще как-либо не инициирует реальную запись. Т.е. в случае кнопки ОТМЕНА
пустой записи в таблице не появится.
Цитата
elseif ::FormState=1
::ds:goto(p[2])

:!: От того что мы открыли новую форму еще не значит что курсор в DS стоит на нужной нам строке. Для этого вторым параметром при открытии формы мы передаем номер записи а тут выполняем переход на нее
Цитата
::bo:bo:edit()
endif
::ds:refresh()

После смещения курсора неплохо бы обновить данные в DS

В метод FORM_CLOSE() добавляем строку ::BO:Active:=.F.

В заготовку метода кнопки ОК вносим строки
Цитата
::DocSave()
::DocClose(0)

И в метод кнопки ОТМЕНА
Цитата
::Close(1)


Теперь собственно и выполним вторую половинку действия записи в таблицу
Цитата
METHOD DocSave class frmDoveredit
local lSave
lSave:=::BO:BO:SAVE()
RETURN lSave

Ну и последний метод для закрытия формы после работы со строкой БД
Цитата
METHOD DocClose(nAction) class frmDoveredit
if(::parent == nil) .and. (nAction == 0)
::ReturnValue:= ::DS:bo:Recno
endif
::Close(nAction)
RETURN .T.


Теперь опять компилируем для проверки на отсутствие синтаксических ошибок
Страницы: 1
Читают тему (гостей: 1)