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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

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

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

Сообщение 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 для добавления записи, та позиция, на которой стоишь в данный момент обнуляется, но после выбора контрагента прорисываются обе позиции. Как этого избежать?:)
Последний раз редактировалось Marisha_P 10 авг 2012, 11:30, всего редактировалось 1 раз.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

вопрос решился добавлением
clearbuffer(#kontrlimits);
rescanpanel(#kontrlimits);
:grin:

В связи с этим осталась самая последняя проблема: у меня есть поле
wyear: [8],noprotect,pickbutton; в котором по умолчанию стоит текущий год и соответственно в таблицу выводятся данные по контрагентам за этот год. Как реализовать выбор года, с помощью какой функции, как очистить browse и заполнить его данными по выбранному году?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

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

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

Сообщение Marisha_P »

Спасибо большое! буду пробовать;)
Starry
Посетитель
Сообщения: 33
Зарегистрирован: 20 июл 2012, 15:13

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

Сообщение Starry »

Год через SpinButton можно сделать так:
wyear: [8], noprotect, SpinButton [1, 2000, 2020];

А еще можно через список значений :grin:
wyear: [list 2010 '2010', 2011 '2011', 2012 '2012', 2013 '2013'];
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

спасибо! так и сделала:) хотела сделать в спине пробег между уear(сur_date)-5 до уear(сur_date)+5. Но через переменные что -то не выходит.. Принимает только конкретные значения в качестве параметров:(
А с обновлением browse не складывается... Как только меняешь год,в строчке на которой стоишь отображается контрагент из списка только что выбранного года.. Остальное всё неизменно и только при щелчке на browse уже отображаются все остальные контрагенты для выбранного года....
не знаю какой функцией обнулить ненужные значения сразу ...
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение n0where »

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

rereadrecord(#kontrlimits);
Для обновления окна програмно
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

Спасибо за помощь! Может я что-то не так делаю, но у меня при смене года - одна запись меняется сразу, а вот чтоб обновились все контрагенты нужно щелкнуть на поле browse.
cmCheckField:{
case curfield of
#wyear:{
set kontrlimits.year := wyear;
rereadrecord(#kontrlimits);
}
end;
}
Может еще нужно что-то добавить в этот код... событие для Spinbutton отрабатывает только после щелчка по полю browse. Если вместо spinbutton сделать ручной ввод, то после ввода и нажатия enter всё обновляется корректно....
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

а зачем set?
обычно в этом случае
rescanpanel(#table)
if getlast table=0 {}
- у вас же данные сидят в вашей таблоице по годам? зачем вы год то в ней перетираете?
ну может быть в разных вариациях - вам мож захочется спозиционироваться на того же контрагента.
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение n0where »

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

set kontrlimits.year := wyear;
rereadrecord(#kontrlimits);
set уже делает перерисовку. Не совсем понялзачем set если после него нет update? почему бы не в cmupdaterecord брать значение и сразу записывать?
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение Marisha_P »

set убрала, просто не обновляется нормально, уже не знала, что попробовать:(( может у меня не обновляется потому, что есть browse отдельно и screen, в котором размещен spinbutton
добавляла и if getlast table=0 {}, и getfirst всё равно одно и тоже. сначала обновляется одна строка при смене года, и только потом полностью:((((((
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

if getlast table=0 {}
rescanpanel(#table)
так правильней. Помогает 100%. Приравнивание поля с годом вообще уберите.
Marisha_P
Местный житель
Сообщения: 232
Зарегистрирован: 10 ноя 2010, 13:49

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

Сообщение 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.
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение 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.
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Ответить