Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[9]

• если нужно менять активное окно данных (z: Zoom имеет значение rw - окно данных), то происходит выбор нового активного окна данных функцией newActiveRW.

По функциям обновления видно, что такое обновление окна как сортировка, выполняется функциями sort, а перемещение курсора и скроллинг -функциями move.

-- Start of Scheme

rsl/T0, rsl/L3 CNT2

scheme L3 CNT = with T0 in

extend L3 CNT2 with class value cnt : PanContent -> in setIn, itIn out setOut, itOut PanContent cnt((t, isActive, rw, tw, acs)) = - - title, , recordwindow, tablewindow, actions let (p, d, z, n) = setIn? in if tw = empty Л rw = empty then

setOut!mkRWOutput(t, 0, empty, empty, acs) ; cnt(t, 0, empty, empty, acs) elsif rw = empty V (isActive = 0 Л z = rw) then

setOut!

mkRWOutput(

t, 1, rw, refTW(tw, (p, d, z, n)), acs) ; cnt(t, 1, rw, refTW(tw, (p, d, z, n)), acs) elsif tw = empty V (isActive = 0 Л z = rw) then

setOut!

mkRWOutput(

t, 0, refRW(rw, (p, d, z, n)), tw, acs) ; cnt(t, 0, refRW(rw, (p, d, z, n)), tw, acs) else - - elsif z = rw then

setOut!

mkRWOutput(

t, newActiveRW(isActive, (p, d, z, n)), rw, tw, acs) ; cnt(

t, newActiveRW(isActive, (p, d, z, n)), rw, tw, acs)


end end,

refTW : RWTable x SETInput - RWTable - - move cursor

refTW(tw, (p, d, z, n)) =

if d = horz Л p = curr then sort(tw, n)

else move(tw, (p, d, z, n))

refRW :

RWRecord x SETInput - in itIn out itOut RWRecord

refRW(rw, (p, d, z, n)) = if d = vert Л p = curr

then--get started to edit a field

replace(rw, item(field(rw))) elsif d = horz Л p = curr then sort(rw, n) else move(rw, (p, d, z, n)) end,

newActiveRW : Nat x SETInput - Nat

newActiveRW(isActive, (p, d, z, n)) = - - if p € { prev, next, first, last} then

if p € { prev, next}

then if isActive = 0 then 1 else 0 end

elsif p = first then 0

else - - elsif p = last then

end else isActive end

-- End Of Scheme

Функция edit представляется самой сложной. Рассмотрим ее работу.

Эта функция вызывается при нажатии на кнопку Edit в текущей панели. Причем, если не задан оператор заполнения окна данных (slc = ) или пуст список запросов ( (len acs > 0)), то не заданы окна данных и редактировать нечего.

Если длина списка запросов равна 1 (len acs > 1) или не задан следующий оператор заполнения окна данных, то считается, что сущность описывается записью.


Если задан следующий оператор заполнения окна данных (len acs > 1 /\ slc2 = ), то считается, что сущность описывается отношением один ко многим. В этом случае, значения ключевых полей текущей записи подставляются в запрос select, который и заполняет окно данных RWRecord (главная запись) - mkRWRecord (slc, pKeys(tw, ka)), а подчиненные строчки окна данных RWTable заполняются при помощи оператора select второго кортежа из списка запросов, который и заполняет окно данных RWTable подчиненных записей новой открываемой панели.

Список запросов кортежей из запросов уменьшается (tl tl acs) с изменением верхнего кортежа и передается в панель редактирования сущности. Описанная процедура может быть повторена при нажании на кнопку Edit в панели редактирования сущности.

-- Start of Scheme

rsl/T0, rsl/L3 CNT1 scheme L3 CNT2 =

with T0 in

extend L3 CNT1 with

class value edit : PanContent -

Bool х PanContent--

edit(t, n, rw, tw, acs) = if len acs > 0 then

(ta, ka, ua, slc, ins, upd, del) = hd acs - - title, keys, parent update, select, insert, - - update, delete

if slc = Л len acs = 1 then - - it = record, but not entity (false,

(ta, 0, mkRWRecord(slc, pKeys(tw)), empty, ( (, 0, upd, , , , )> )) elsif slc = Л len acs > 1

then - - it = entity, but not record

(ta2, ka2, ua2, slc2, ins2, upd2, del2) =

hd tl acs

if slc2 =



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15]