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

Ошибка при добавлении записи

Добавлено: 22 апр 2008, 11:22
Nikos
Добрый день!
Есть интерфейс, в котором некая таблица katPZS является корневой как у броуза так и у скрина (как обычно). Все работает нормально, но если я добавляю новую запись, то при обработке события cmInsertRecord возникает ошибка 5 Дублированное значение при уникальном ключе... Продолжить редактирование? Да Нет. Если выбрать нет, то дальше все работает нормально.
Если событие обрабатывать следующим образом:
cmInsertRecord: if insert current katPZS <> tsOk {};
то вообще все работает без ошибок.
Как я понимаю, это связано с тем, что cmInsertRecord отрабатывает 2 раза (для броуза и скрина). Как правильно избежать такой ошибки? Или проблема в другом?

Добавлено: 22 апр 2008, 12:30
Алексей
проблема в этом. можно попробовать в panel взять и браузер и скрин... в общем добейтейсь чтобы событие отрабатывало 1 раз.

Добавлено: 22 апр 2008, 13:29
edward_K
в cmSetDefault еще бы добавить
clearbuffer(#katpzs)

Добавлено: 22 апр 2008, 13:44
Nikos
Вот как частично выглядит интерфейс:
window editPZS 'Редактирование ПЗС' escClose; show at (,,,31);
panel pnHeader show at (,,,6) table katPZS;
screen scrHeader fields
katPZS.year ('Год' ,,sci178Esc ), protect;
katPZS.DesGr ('Дескриптор групы пользователей',,sci178Esc ), protect;
katPZS.Descr ('Дескриптор номера накладной' ,,sci178Esc ), protect;
katStroy.code ('Код объекта строительства' ,,sci1378Esc), protect, pickButton;
katStroy.name ('Объект строительства' ,,sci1378Esc), protect, pickButton;
katOrg.name ('Контрагент' ,,sci1378Esc), protect, pickButton;
dogovor.NoDoc ('Номер договора' ,,sci1378Esc), protect, pickButton;
dogovor.dDoc ('Дата договора' ,,sci1378Esc), protect;
<<
Год .@@@@@@ Группа .@@@@@@ Дескр .@@@@@@
Код объекта .@@@@@@@@@@@@@@@@@@@@
Объект строительства .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Контрагент .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Договор .@@@@@@@@@@@@@@@@@@@@ Дата .@@@@@@@@@@
>>
end; // screen
..........................
panel pnSelect table katPZS
browse br show at (,4); fields
katStroy.code 'Код' :[10], skip;
katStroy.name 'Наименование' ('Наименование'):[70], protect;
end
HandleEvent
cmDefault : runWindow(editPZS);
cmHotKeys : putHotCommAnd(runMenu('menu1'));
cmPrintDoc: runInterface(UserReportPZS0, katPZS.nRec);
cmSetDefault: {
clearbuffer(#katpzs);
katPZS.descr := sGetTune('USER.DESCR');
katPZS.desGr := sGetTune('User.DesGr');
katPZS.year := pYear;
putCommand(cmDefault);
}
end
end

tableEvent table katPZS
cmUpdateRecord: update current katPZS;
cmInsertRecord: insert current katPZS;
cmDeleteRecord: {
if (message(''#3'Удалить ПЗС ?',YesNo+mfSwapButtons+Confirmation) <> cmYes)
{ abort; exit; }
delete spPZS where ((katPZS.nRec == spPZS.cPZS));
delete current katPZS; reReadRecord(#katPZS); }
end;

Добавлено: 22 апр 2008, 15:35
edward_K
cmSetDefault тоже табличное событие. А так вы его тока для броуса вызываете. Проверте когда туда попадаете.

Добавлено: 22 апр 2008, 16:04
Nikos
cmSetDefault вызывается действительно, только один раз, но, наверное так и должно? Я нажимаю F7 - открывается окно с какими-то начальными условиями (дескриптор стоит), произвожу заполнение, а когда теряется фокус запись из буфера записывается в БД по событию cmInsertRecord. Правильно?
Но когда теряется фокус и появляется ошибка о дублировании NRECа. Я думал, что появляется потому, что событие cmInsertRecord отрабатывает 2 раза. Но оказалось, что нет - проверил мессаджами. Тогда почему?

Добавлено: 22 апр 2008, 16:45
edward_K
1. cmSetDefault переместите в табличные события
2. во все события добавте
rescanpanel(#katPZS)
вообще чем чаще это делаете тем надежней.
3.постарайтесь отловить в каком же из событий возникает сообщение.
4. tableevent надеюсб идет после закрытия кода относящегося к
window editPZS 'Редактирование ПЗС' escClose; show at (,,,31); ?
по вашему куску не ясно - вроде как внутри окна.

Добавлено: 22 апр 2008, 17:01
Nikos
Все сделал.
1. Переместил cmSetDefault в табличное событие
2. Во все табличные события добавил rescanpanel(#katPZS)
3. ошибка возникает в событии cmInsertRecord. При выполнении оператора insert current katPZS; Если заменить его на if insert current katPZS <> tsOk {}; то ошибок нет и все работает нормально
4. tableevent располагается после window

Ну и после того как я перенес cmSetDefault в табличные события у меня перестало запускаться окно runWindow(editPZS); т.е. в событии cmSetDefault броуза не отрабатывает putCommand(cmDefault); Но это на данном этапе не важно, т.к. пока все-равно изменений нет.

Добавлено: 22 апр 2008, 17:31
Nikos
Интерфейс не такой и большой - выложу здесь весь код:

#include excel.vih
#include rundsel.vih
vipInterface userReport_PZS implements iUserReport;

interface userReport_PZS 'Пообъектная заказная спецификация' EscClose, Cyan;
show at (,,,31);

table struct rpt (
PZSType : word,
groupCode : string[20],
mcCode : string[30],
nRec : comp
) With Index (
rpt01 = PZSType + groupCode + mcCode
);

create view
var
fyear, pyear, typePZS: word;
(
otpEd
)
as select
if (spPZS.cOtpEd=0,katEd.abbr,katOtpEd.abbr)
From
katStroy(readonly), vidStroy(readOnly), katPZS, spPZS, spPZS PZS,
katMC(readonly), katOtpEd(readOnly), katEd(readOnly), groupMc(readonly),
dogovor(readonly), katOrg(readOnly), katOrg katOrgSp(readOnly), wayMove(readOnly)
Where
((
pYear == katPZS.year and
katPZS.cDogovor == dogovor.Nrec and
katPZS.cKatOrg == katOrg.Nrec and
katPZS.cStroy == katStroy.nRec and
katStroy.cVidStroy== vidStroy.NRec and
typePZS == spPZS.typ and
katPZS.nRec == spPZS.cPZS and
spPZS.cKatOrg == katOrgSp.nRec and
spPZS.cWayMove == wayMove.nRec and
spPZS.cOtpEd == katOtpEd.nRec and
spPZS.cMc == katMC.nRec and
katMC.cEd == katEd.nRec and
katMC.cGroupMc == groupMc.NRec
));

Var
pRunDSel: runDocSelObj;

procedure checkKolDiskretAll;
var tmpKol :double;
i :integer;
{
if isvalid(#katOtpEd) {
if katOtpEd.Diskret <> 1
exit;
} else if isValid(#katEd) {
if katEd.diskret <> 1
exit;
}
for (i:=1; i<=12; i:=i+1)
if (round(spPZS.kol) <> spPZS.kol) {
tmpKol:= round(spPZS.kol, 0);
if (tmpKol < spPZS.kol)
tmpKol:= tmpKol + 1.0;
spPZS.kol:= tmpKol;
}
}

#include gmckatpzs.vpp

window editPZS 'Редактирование ПЗС' escClose; show at (,,,31);
panel pnHeader show at (,,,6) table katPZS;
screen scrHeader fields
katPZS.year ('Год' ,,sci178Esc ), protect;
katPZS.DesGr ('Дескриптор групы пользователей',,sci178Esc ), protect;
katPZS.Descr ('Дескриптор номера накладной' ,,sci178Esc ), protect;
katStroy.code ('Код объекта строительства' ,,sci1378Esc), protect, pickButton;
katStroy.name ('Объект строительства' ,,sci1378Esc), protect, pickButton;
katOrg.name ('Контрагент' ,,sci1378Esc), protect, pickButton;
dogovor.NoDoc ('Номер договора' ,,sci1378Esc), protect, pickButton;
dogovor.dDoc ('Дата договора' ,,sci1378Esc), protect;
<<
Год .@@@@@@ Группа .@@@@@@ Дескр .@@@@@@
Код объекта .@@@@@@@@@@@@@@@@@@@@
Объект строительства .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Контрагент .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Договор .@@@@@@@@@@@@@@@@@@@@ Дата .@@@@@@@@@@
>>
end; // screen
handleEvent
cmPick:
case curField of
#katStroy.name, #katStroy.code:
if runInterface(L_UKS::katstroy, katPZS.cStroy, true, katPZS.cStroy, false, false, false) <> cmCancel
if insert current katPzs = tsOk {}
#dogovor.noDoc, #dogovor.dDoc: {
if (RunInterface(L_DOGOVOR::GetSomeDogovor,
word(0), word(0FFFFh), word(0), word(1), false, katPZS.cDogovor, false, comp(0)) <> cmCancel)
set katPZS.cDogovor:= katPZS.cDogovor }
#katOrg.name: runInterface(L_KATORG::getKatOr, katPZS.cKatOrg, comp(0), false, comp(0), comp(0));
end
cmDelOnProtect:
case curField of
#katOrg.name : katPZS.cKatorg:= comp(0);
#dogovor.noDoc: katPZS.cDogovor:= comp(0);
end
end; // handleevent
end; // panel


panel pnSpecif show at (,30,,) table spPZS;
tabbedsheet bottom tab
screen scrSpecif0 'Поставки заказчика' fields
<<
>>
end; //screen
screen scrSpecif1 'Поставки подрядчика' fields
<<
>>
end; //screen
screen scrSpecif2 'из наличия ДАО МН' fields
<<
>>
end; //screen
screen scrSpecif3 'из наличия других ДАО МН' fields
<<
>>
end; //screen
end; // panel

browse brPZS show at (,7,,28) fields
spPZS.status '#' ('И-Исходная, К-Корректирована, У-Удалена',,sci1378Esc):[list 'И', 'К', 'У'], protect;
katMC.barKod 'Код' (,,sci1378Esc):[08],protect,pickButton;
katMC.name 'Наименование товара'(,,sci1378Esc):[20] ,protect,pickButton;
otpEd 'Ед.' (,,sci1378Esc):[08],protect,pickButton;
katOrgSp.Name 'Поставщик'(,,sci1378Esc):[20],protect,pickButton;
WayMove.Name 'Cпособ' (,,sci1378Esc):[10],protect,pickButton;
spPZS.price 'Цена с НДС'(,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[1] 'Январь' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[2] 'Февраль' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[3] 'Март' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[4] 'Апрель' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[5] 'Май' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[6] 'Июнь' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[7] 'Июль' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[8] 'Август' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[9] 'Сентябрь' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[10] 'Октябрь' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[11] 'Ноябрь' (,,sci178Esc):[prSignsInKol] ,noprotect;
spPZS.kol[12] 'Декабрь' (,,sci178Esc):[prSignsInKol] ,noprotect;
end //browse
Screen scrPZS fields
katMC.BarKod ('Код',,sci1378Esc) :[14],protect,pickButton;
katMC.Name ('Наименование товара',,sci1378Esc):[20],protect,pickButton;
otpEd ('Ед.',,sci1378Esc) :[10],protect,pickButton;
spPZS.price ('Цена с НДС',,sci178Esc):[12.2],noprotect;
spPZS.kol[1] ('Январь' ,,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[2] ('Февраль' ,,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[3] ('Март' ,,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[4] ('Апрель' ,,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[5] ('Май' ,,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[6] ('Июнь' ,,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[7] ('Июль' ,,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[8] ('Август' ,,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[9] ('Сентябрь',,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[10] ('Октябрь' ,,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[11] ('Ноябрь' ,,sci178Esc):[prSignsInKol],noprotect;
spPZS.kol[12] ('Декабрь' ,,sci178Esc):[prSignsInKol],noprotect;
katOrgSP.name ('Поставщик',,sci1378Esc):protect,pickButton;
wayMove.name ('Cпособ' ,,sci1378Esc):protect,pickButton;
spPZS.status ('И-Исходная, К-Корректирована, У-Удалена',,sci1378Esc):[list 'Исходная', 'Корректирована', 'Удалена'], protect;
<<
`Код` .@@@@@@@@@@
`Наименование:` .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
`Ед. изм:` .@@@@@@@@@@
`Цена с НДС:` .@@@@@@@@@@

Январь Февраль Март
1кв. `Кол-во:` .@@@@@@@@@@ .@@@@@@@@@@ .@@@@@@@@@@

Апрель Май Июнь
2кв. `Кол-во:` .@@@@@@@@@@ .@@@@@@@@@@ .@@@@@@@@@@

Июль Август Сентябрь
3кв. `Кол-во:` .@@@@@@@@@@ .@@@@@@@@@@ .@@@@@@@@@@

Октябрь Ноябрь Декабрь
4кв. `Кол-во:` .@@@@@@@@@@ .@@@@@@@@@@ .@@@@@@@@@@

`Поставщик` .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
`Способ поставки` .@@@@@@@@@@@@@@
`Статус` .@@@@@@@@@@@@@@
>>
end; // screen
end; // panel
text spPZS.note show at (,29)

handleEvent
cmInit : { setFormat( brPZS); selectPanel(#katPzs); }
cmAttrib: setFormat(scrPZS)
cmCancel: if curFormatInArea(scrPZS) = scrPZS { setFormat(brPZS); abort }
cmChangeTabbedSheetFormat: {
updatetable;
case Target of
scrSpecif0: { set typePZS:= 0; setFieldState (#katOrgSp.name, sfVisible) }
scrSpecif1: { set typePZS:= 1; clearFieldState(#katOrgSp.name, sfVisible) }
scrSpecif2: { set typePZS:= 2; clearFieldState(#katOrgSp.name, sfVisible) }
scrSpecif3: { set typePZS:= 3; setFieldState (#katOrgSp.name, sfVisible) }
else exit;
end;
setFormat(brPZS)
reReadRecord(curtable) }
cmPrintDoc: { upDateTable; runInterface(UserReportPZS0, katPZS.nRec); }

cmPick:
case curfield of
#katMC.name, #katMC.barKod: getMCKatPZS(spPZS.typ);
#otpEd: { runInterface(L_MCU::getOtpEd,spPZS.cMc,spPZS.cOtpEd,1); checkKolDiskretAll; }
#katOrgSp.name: runInterface(L_KATORG::getKatOr, spPZS.cKatOrg, comp(0), false, comp(0), comp(0));
#wayMove.name : runInterface(L_MOVECELL::getWayMove,spPZS.cWayMove);
end;
cmCheckField:
case curField of
#spPZS.kol[1]..#spPZS.kol[12]: checkKolDiskretAll;
end;
cmHotKeys:
if (curTable = #katPZS) putHotCommAnd(runMenu('menu2'));
else putHotCommAnd(runMenu('menu3'));
end; // handleevent
end; // window

panel pnDate;
screen scrStroy show at (,,,3) fixed_y
fields
fyear('Год',,sci178Esc ), noprotect, spinButton [1, 2000, 3000];
<<

Год .@@@@@@

>>
end; // screen
HandleEvent
cmCheckField: { pyear:= fyear; reReadRecord(#katPzs) }
cmDefault: if curField = #fYear stop;
end
end

panel pnSelect table katPZS
browse br show at (,4); fields
katStroy.code 'Код' :[10], skip;
katStroy.name 'Наименование' ('Наименование'):[70], protect;
end
HandleEvent
cmDefault : runWindow(editPZS);
cmHotKeys : putHotCommAnd(runMenu('menu1'));
cmPrintDoc: runInterface(UserReportPZS0, katPZS.nRec);
cmSetDefault: { rescanpanel(#katPZS); putCommand(cmDefault); }

end
end

handleEvent
cmInit: {
if pYear = 0
pYear := year(cur_date);
fyear:= pyear;
selectPanel(#katPZS); }
end;

tableEvent table katPZS
cmUpdateRecord: {update current katPZS; rescanpanel(#katPZS);}
cmInsertRecord: {insert current katPZS; rescanpanel(#katPZS);}
cmSetDefault: {
clearbuffer(#katpzs);
katPZS.descr := sGetTune('USER.DESCR');
katPZS.desGr := sGetTune('User.DesGr');
katPZS.year := pYear;
rescanpanel(#katPZS);
}
cmDeleteRecord: {
if (message(''#3'Удалить ПЗС ?',YesNo+mfSwapButtons+Confirmation) <> cmYes)
{ abort; exit; }
delete spPZS where ((katPZS.nRec == spPZS.cPZS));
delete current katPZS; reReadRecord(#katPZS); }
end; // tableEvent table katPZS

tableEvent table spPZS
cmUpdateRecord: update current spPZS;
cmInsertRecord:
if (katPZS.cStroy = 0) abort;
else insert current spPZS;
cmDeleteRecord: {
if (message(''#3'Удалить текущую позицию ?',YesNo+mfSwapButtons+Confirmation) <> cmYes)
{ abort; exit; }
delete current spPZS; reReadRecord(#spPZS); }
end; // tableEvent table spPZS

procedure run; { runInterface(userReport_PZS) }
function getReportName: string; { getReportName := 'Комплектация объектов' }
function getGroupName (level: word): string; {
getGroupName := ''
case level of 1: getGroupName:= 'ПЗС'
end }
function getPriority: integer; { GetPriority:= 1 }
function visibleInModule(ind: byte): string; {
visibleInModule := ''
case ind of 1: visibleInModule:= 'BUY'
2: VisibleInModule:= 'STROY'
end }

end.

#include menuPZS.vpp