Страница 2 из 2

Re: редактирование в browse

Добавлено: 09 дек 2013, 15:14
s2176
Всего то нужно пробежаться по всем полям и разрешить им редактирование (хоть по ClearFieldOption /SetFieldOption), по enter соотв. запретить редактирование. Ну и может быть статус строку заменить.
это ровно то, что я хотела)))
А как статус строку поменять?

Re: редактирование в browse

Добавлено: 09 дек 2013, 15:31
edward_K
установить свойство объекта "StatusCtx" в требуемое. При этом обратите внимание, что если вы его задавали для каждого, то и переназначать нужно для каждого, иначе для корневого.
cfsSetProp('наименование элемента','StatusCtx',sci13Esc);
Ну еще способ продисаблить команды.

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

var
  w_mode :word;
Procedure ReadEdit ;
{  if w_mode=0 
   {DisableCommand(cmInsert);
    DisableCommand(cmAddNewRec);
    DisableCommand(cmInsertRecord);
    DisableCommand(cmSetDefault);
    DisableCommand(cmDelete);
    DisableCommand(cmDeleteRecord);
  }
  else
  { .. } 
}

HandleEvent
cmPositionChanged:
{ if w_mode=0
    ProtectRecord(#table,true)

}
...
end.
  

Re: редактирование в browse

Добавлено: 10 дек 2013, 09:25
s2176
Победила, спасибо!

Re: редактирование в browse

Добавлено: 11 дек 2013, 10:59
s2176
Задача немного изменилась.
Теперь из таблицы Arxshtrf надо выбрать записи по одному сотруднику, показать их в порядке возрастания datan (ключа по этому полю нет).
Показать все это на экране и дать возможность редактировать.
Не смогла добиться сортировки по datan, решила сделать вспомогательную табличку, ее структура:
Table Struct tArxSotr
( dataR : date,
nrec_arx : comp
)
with index
( ind1 = dataR
);
Сделала ее в запросе главной, отображается все красиво, только не редактируется(((
собственно текст:

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

interface CorrectReserveSotr 'Просмотр/корректировка резерва по сотруднику' cyan;
var ...

create view
as select arx.*, tArxSotr.*, arxshtrf.*
from tArxSotr, arxshtrf, arxshtrf arx
where ((tArxSotr.nrec_arx/==arxshtrf.nrec and
        ltabn==arx.tabn
      ))
;

browse b_resView (,,sci14esc);
show at (,,,);
table tArxSotr;
  fields
  tArxSotr.DataR  'Дата'#13'резерва': protect, centered;
  arxshtrf.namepl2 'Категория': [15], skip, centered;
  arxshtrf.Procpsb  'Норма'#13'дн.': [5.0,#IntSumformat], protect, centered;
  arxshtrf.koldn  #3'Заработ.'#13#3'дн.': [9.2,#Sumformat], protect;
  arxshtrf.Summa0  #3'Использ.'#13#3'дн.': [7.0,#IntSumformat], protect;
  arxshtrf.sumnach #3'СДЗ': [9.2,#Sumformat], protect;
  arxshtrf.ostatpr  #3'Всего'#13#3'отпускых': [12.2,#BigSumformat], protect;
  arxshtrf.dat1  'Дата'#13'приема': protect, centered;
  arxshtrf.dat2  'Дата ув.': protect, centered;
end;
tableevent table tArxSotr
 cmUpdateRecord:
 { kdpo:=arxshtrf.koldn-arxshtrf.summa0; _sdz:=arxshtrf.sumnach;
   arxshtrf.summa1:=kdpo; arxshtrf.summa2:=kdpo*_sdz;
   if message('Вы уверены?',YesNo) = cmYes then update current arxshtrf;
 }
 cmSetDefault:
 { message('cmSetDefault')
 }
end;
HandleEvent
cmInit:
{ var famio: string;
  Disablecommand(cmInsert);
  Disablecommand(cmDelete);
  delete all from tArxSotr;
  runinterface(Pick_OnePerson_AnyDate,nrec_pers,ltabn);
  if getfirst persons where ((nrec_pers==persons.nrec)) = tsOk then famio:=persons.fio;
  SetTitle('Ввод/корректировка резерва по сотруднику '+famio);
  _loop arx { insert tArxSotr set dataR:=arx.datan, nrec_arx:=arx.nrec; }
}
cmEdit:
{ _prizEdit:=1;
  enablecommand(cmInsert);
  enablecommand(cmDelete);
  cfsSetProp(cfsGetCurrentContainerSelf,'Palette',0) //Изменение цвета окна: был cyan(1), стал blue(0), 2-серый
  ClearFieldOption(#arxshtrf.Procpsb, ofProtected);
  ClearFieldOption(#arxshtrf.koldn, ofProtected);
  ClearFieldOption(#arxshtrf.Summa0, ofProtected);
  ClearFieldOption(#arxshtrf.sumnach, ofProtected);
  ClearFieldOption(#arxshtrf.ostatpr, ofProtected);
  rescanpanel(b_resView);
}
cmCancel:
{ if _prizEdit=1
  { cfsSetProp(cfsGetCurrentContainerSelf,'Palette',1) //Изменение цвета окна: был cyan(1), стал blue(0), 2-серый
	SetFieldOption(#arxshtrf.Procpsb, ofProtected);
	SetFieldOption(#arxshtrf.koldn, ofProtected);
	SetFieldOption(#arxshtrf.Summa0, ofProtected);
	SetFieldOption(#arxshtrf.sumnach, ofProtected);
	SetFieldOption(#arxshtrf.ostatpr, ofProtected);
    Disablecommand(cmInsert);
    Disablecommand(cmDelete); rescanpanel(b_resView);
	_prizEdit:=0; abort();
  }
}
cmClose:
{ closeinterface(cmClose);
}
end;
end.
Редактировать мне нужно значения из Arxshtrf.
Менять значения на экране получается, но ничего при этом не сохраняется.
Какое событие ловит такие изменения?

Re: редактирование в browse

Добавлено: 11 дек 2013, 11:14
edward_K
Тут проблема.
Дело в том что cmUpdateRecords по умолчанию срабатывает только для основной таблицы окна
Поэтому либо вы перетащите это поле во времянку и в событии cmUpdateRecords пропишите синхронное изменение либо хватайте изменение cmCheckFields.

Re: редактирование в browse

Добавлено: 11 дек 2013, 12:27
s2176
Понятно, спасибо!
Буду копать дальше.
Получается, что мне в cmCheckField нужно понять было ли изменение.
Я могу достать старое значение из OldFieldValue, но можно ли как-то, не перебирая все поля, сравнить старое значение с новым?

Re: редактирование в browse

Добавлено: 11 дек 2013, 12:50
Den
можно попробовать UpdatePanels

добавьте еще

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

tableevent table arxshtrf;

CmUpdateRecord : {
                              Message('get CmUpdateRecord table arxshtrf');
                              update current arxshtrf;
                            }

...
end;

а тут :

tableevent table tArxSotr
cmUpdateRecord:
{ kdpo:=arxshtrf.koldn-arxshtrf.summa0; _sdz:=arxshtrf.sumnach;
   if isvalid(#arxshtrf)
   {
   arxshtrf.summa1:=kdpo; arxshtrf.summa2:=kdpo*_sdz;
   UpdatePanels;
   }
}

Re: редактирование в browse

Добавлено: 11 дек 2013, 13:03
s2176
И еще до кучи..
Как можно отловить событие "выхода из записи"?
Чтобы один раз запросить подтверждения от пользователя.

Re: редактирование в browse

Добавлено: 11 дек 2013, 13:12
Алексей
вроде cmPositionChanged

Re: редактирование в browse

Добавлено: 11 дек 2013, 13:26
Den
s2176 писал(а):И еще до кучи..
Как можно отловить событие "выхода из записи"?
Чтобы один раз запросить подтверждения от пользователя.

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

Re: редактирование в browse

Добавлено: 11 дек 2013, 13:30
s2176
Понятно, тогда проще сделать временную таблицу - кальку с arxshtraf, но с нужными индексами, работать с ней, а по выходу все это переписывать в arxshtraf.
Спасибо за помощь!

Re: редактирование в browse

Добавлено: 11 дек 2013, 13:42
Den