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

Re: Создание интерфейса

Добавлено: 08 авг 2012, 15:17
edward_K
set LimitKont.kontr_name:=katorg.name;
или
LimitKont.kontr_name:=katorg.name;
update current LimitKont;
Первый способ предпочтительней поскольку для новой записи он вызовет cmInsertRecord А для старой cmUpdateRecord
По второму в начале Pick нужно вызвать UpdateTable
Не совсем понятно каким макаром вы спозиционировались на katorg - по идее это вообще не должно работать. Да и фейс наверное лучше либо выбрать не множ.выбора а одиночного, либо обрабатывать все помеченные организации (то есть нужен цикл по pick с проверкой на повтор вставки).
Да. Хранить в базе со ссылочной структурой наименование контрагента дурной тон. Если уж очень надо, то можно кусок имени хранить в поле для сортировки, но также нужно заполнять и ссылку.

Re: Создание интерфейса

Добавлено: 09 авг 2012, 16:52
Marisha_P
Полностью переделала все таблицы и привязки. Получилось вот так
create view
var
wyear:word;
select
*
from
kontrlimits,
katorg
where((
kontrlimits.ckatorg==katorg.nrec and wyear==kontrlimits.year
));
Browse brKontr
show at (,,100,30)
Table kontrlimits;
Fields
katorg.name : [50],pickbutton, protect;
kontrlimits.limit[1] '1 квартал': [10],noprotect;
kontrlimits.limit[2] '2 квартал': [10],noprotect;
kontrlimits.limit[3] '3 квартал': [10],noprotect;
kontrlimits.limit[4] '4 квартал': [10],noprotect;
End;

screen scrDebit
show at (,31,,33)

buttons
cmOk;
fields
wyear: [8],noprotect,pickbutton;
<<

<. Новый КА - F7 .> `Год `.@@@@@@

>>
end;




Handleevent
CmInit:{wyear:=year(cur_date);
}
cmsetdefault:{
var c:comp;
set kontrlimits.year := wyear;
if(RunInterface('GetKatOr',c) <> cmCancel)
set kontrlimits.ckatorg := c;
}
cminsertrecord:{
if(kontrlimits.ckatorg <> 0)
insert current kontrlimits;
}
cmdeleterecord:{
if(isvalidall(tnkontrlimits))
delete current kontrlimits;
}
cmupdaterecord:{
if(isvalidall(tnkontrlimits))
update current kontrlimits;
}

Сейчас всё хорошо, только есть вопрос, когда нажимаешь F7 для добавления записи, та позиция, на которой стоишь в данный момент обнуляется, но после выбора контрагента прорисываются обе позиции. Как этого избежать?:)

Re: Создание интерфейса

Добавлено: 10 авг 2012, 11:30
Marisha_P
вопрос решился добавлением
clearbuffer(#kontrlimits);
rescanpanel(#kontrlimits);
:grin:

В связи с этим осталась самая последняя проблема: у меня есть поле
wyear: [8],noprotect,pickbutton; в котором по умолчанию стоит текущий год и соответственно в таблицу выводятся данные по контрагентам за этот год. Как реализовать выбор года, с помощью какой функции, как очистить browse и заполнить его данными по выбранному году?

Re: Создание интерфейса

Добавлено: 10 авг 2012, 12:03
edward_K
В году редко делают выбор. Ну может быть SpinButton или как его там.
ловить изменения нужно в
cmCheckField:
{ case curfield of
#ваше_поле:
{ ...
}
end;
}
- там можно еще сравнить с OldFieldValue(строковое).
Заполнение лучше реализовать в отдельной функции.

Re: Создание интерфейса

Добавлено: 10 авг 2012, 12:39
Marisha_P
Спасибо большое! буду пробовать;)

Re: Создание интерфейса

Добавлено: 10 авг 2012, 12:41
Starry
Год через SpinButton можно сделать так:
wyear: [8], noprotect, SpinButton [1, 2000, 2020];

А еще можно через список значений :grin:
wyear: [list 2010 '2010', 2011 '2011', 2012 '2012', 2013 '2013'];

Re: Создание интерфейса

Добавлено: 10 авг 2012, 15:44
Marisha_P
спасибо! так и сделала:) хотела сделать в спине пробег между уear(сur_date)-5 до уear(сur_date)+5. Но через переменные что -то не выходит.. Принимает только конкретные значения в качестве параметров:(
А с обновлением browse не складывается... Как только меняешь год,в строчке на которой стоишь отображается контрагент из списка только что выбранного года.. Остальное всё неизменно и только при щелчке на browse уже отображаются все остальные контрагенты для выбранного года....
не знаю какой функцией обнулить ненужные значения сразу ...

Re: Создание интерфейса

Добавлено: 10 авг 2012, 15:58
n0where

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

rereadrecord(#kontrlimits);
Для обновления окна програмно

Re: Создание интерфейса

Добавлено: 13 авг 2012, 09:19
Marisha_P
Спасибо за помощь! Может я что-то не так делаю, но у меня при смене года - одна запись меняется сразу, а вот чтоб обновились все контрагенты нужно щелкнуть на поле browse.
cmCheckField:{
case curfield of
#wyear:{
set kontrlimits.year := wyear;
rereadrecord(#kontrlimits);
}
end;
}
Может еще нужно что-то добавить в этот код... событие для Spinbutton отрабатывает только после щелчка по полю browse. Если вместо spinbutton сделать ручной ввод, то после ввода и нажатия enter всё обновляется корректно....

Re: Создание интерфейса

Добавлено: 13 авг 2012, 11:02
edward_K
а зачем set?
обычно в этом случае
rescanpanel(#table)
if getlast table=0 {}
- у вас же данные сидят в вашей таблоице по годам? зачем вы год то в ней перетираете?
ну может быть в разных вариациях - вам мож захочется спозиционироваться на того же контрагента.

Re: Создание интерфейса

Добавлено: 13 авг 2012, 11:35
n0where

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

set kontrlimits.year := wyear;
rereadrecord(#kontrlimits);
set уже делает перерисовку. Не совсем понялзачем set если после него нет update? почему бы не в cmupdaterecord брать значение и сразу записывать?

Re: Создание интерфейса

Добавлено: 13 авг 2012, 13:22
Marisha_P
set убрала, просто не обновляется нормально, уже не знала, что попробовать:(( может у меня не обновляется потому, что есть browse отдельно и screen, в котором размещен spinbutton
добавляла и if getlast table=0 {}, и getfirst всё равно одно и тоже. сначала обновляется одна строка при смене года, и только потом полностью:((((((

Re: Создание интерфейса

Добавлено: 13 авг 2012, 14:31
edward_K
if getlast table=0 {}
rescanpanel(#table)
так правильней. Помогает 100%. Приравнивание поля с годом вообще уберите.

Re: Создание интерфейса

Добавлено: 13 авг 2012, 16:56
Marisha_P
Замучала уже всех:)) Но не помогает, хоть ты тресни. Всё равно обновляется не сразу:((( Приведу код полностью, может все-таки ошибка не в данном месте кода, а где то выше..
create view
var
wyear:word;
select
*
from
kontrlimits,
katorg
where(( wyear==kontrlimits.year and
kontrlimits.ckatorg==katorg.nrec
));
Browse brKontr
show at (,,100,30)
Table kontrlimits;
Fields
katorg.name : [50],pickbutton, protect;
kontrlimits.limit[1] '1 квартал': [10],noprotect;
kontrlimits.limit[2] '2 квартал': [10],noprotect;
kontrlimits.limit[3] '3 квартал': [10],noprotect;
kontrlimits.limit[4] '4 квартал': [10],noprotect;
End;

screen scrDebit
show at (,31,,33)

buttons
cmOk;
fields
wyear: noprotect,spinbutton[1,2010,2100];
<<

<. Новый КА - F7 .> `Год `.@@@@@@

>>
end;

Handleevent
CmInit:{wyear:=year(cur_date);
}
cmOk: {
PutCommand(cminsert);
}
cmcheckfield:{
case curfield of
#wyear:{ if getlast kontrlimits=0 {}
rescanpanel(#kontrlimits);
}
end;
}
Cmpick:{
//Выбор контрагентов
Case Curfield Of
#katorg.name:{
var c:comp;
if(RunInterface('GetKatOr',c) <> cmCancel)
set kontrlimits.ckatorg := c;
}
end;
}
end;

tableEvent table kontrlimits

cmsetdefault:{
var c:comp;
clearbuffer(#kontrlimits);
set kontrlimits.year := wyear;
rescanpanel(#kontrlimits);
if(RunInterface('GetKatOr',c) <> cmCancel)
set kontrlimits.ckatorg := c;
}
cminsertrecord:{
if(kontrlimits.ckatorg <> 0)
insert current kontrlimits;
}
cmdeleterecord:{
if(isvalidall(tnkontrlimits))
delete current kontrlimits;
}
cmupdaterecord:{
if(isvalidall(tnkontrlimits))
update current kontrlimits;
}
end;
end.

Re: Создание интерфейса

Добавлено: 13 авг 2012, 17:01
n0where
Как вариант разделить элементы так

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

create view
var
wyear,wyearspin:word;
select
*
from
kontrlimits,
katorg
where(( wyear==kontrlimits.year and
kontrlimits.ckatorg==katorg.nrec
));
Browse brKontr
show at (,,100,30)
Table kontrlimits;
Fields
katorg.name : [50],pickbutton, protect;
kontrlimits.limit[1] '1 квартал': [10],noprotect;
kontrlimits.limit[2] '2 квартал': [10],noprotect;
kontrlimits.limit[3] '3 квартал': [10],noprotect;
kontrlimits.limit[4] '4 квартал': [10],noprotect;
End;

screen scrDebit
show at (,31,,33)

buttons
cmOk;
fields
wyearspin: noprotect,spinbutton[1,2010,2100];
<<

<. Новый КА - F7 .> `Год `.@@@@@@

>>
end;

Handleevent
CmInit:{wyear:=year(cur_date);
}
cmOk: {
PutCommand(cminsert);
}
cmcheckfield:{
case curfield of
#wyearspin:{ wyear:=wyearspin; rereadrecord(#kontrlimits); }
end;
}
Cmpick:{
//Выбор контрагентов
Case Curfield Of
#katorg.name:{
var c:comp;
if(RunInterface('GetKatOr',c) <> cmCancel)
set kontrlimits.ckatorg := c;
}
end;
}
end;

tableEvent table kontrlimits

cmsetdefault:{
var c:comp;
if(RunInterface('GetKatOr',c) <> cmCancel) {
clearbuffer(#kontrlimits);
kontrlimits.ckatorg := c;
kontrlimits.year := wyearspin;
insert current kontrlimits;
}
}
cmdeleterecord:{
if(isvalidall(tnkontrlimits))
delete current kontrlimits;
}
cmupdaterecord:{
if(isvalidall(tnkontrlimits))
update current kontrlimits;
}
end;
end.