Ну вот, наконец-то, в результате плясок с бубном выявили в чем проблема
Значит так, есить интерфейс
Код: Выделить всё
Interface i015qwerty '' Cyan;
var deleteresult,markers : LONGINT;
CREATE VIEW V1
SELECT * FROM
SYNONYM dogovor DUBL
,SYNONYM KATORG K1
,SYNONYM KATORG K2
,SYNONYM KATORGDESCR KD1
,SYNONYM KATORGDESCR KD2
,SYNONYM KATORGDESCR KDNAME1
,SYNONYM KATORGDESCR KDNAME2
,SYNONYM ATTRDOG A1
,SYNONYM ATTRDOG A2
,SYNONYM dogovor D2
WHERE
((
'J_C' /== d2.DESCR
AND d2.CMYORG /== K1.NREC
AND d2.CORG /== K2.NREC
AND K1.NREC /== KD1.CREC
AND K2.NREC /== KD2.CREC
AND KD1.CGROUP /== KDNAME1.NREC
AND KD2.CGROUP /== KDNAME2.NREC
AND d2.Cdogovor == DUBL.Cdogovor
AND d2.CORG == DUBL.CORG
AND d2.DDOC == DUBL.DDOC
AND d2.NODOC == DUBL.NODOC
AND d2.DBEG == DUBL.DBEG (noindex)
AND d2.DEND == DUBL.DEND (noindex)
AND d2.SUMMA == DUBL.SUMMA (noindex)
AND d2.CMYORG == DUBL.CMYORG (noindex)
AND d2.CVIDDOG == DUBL.CVIDDOG (noindex)
AND d2.NODOC_EXT == DUBL.NODOC_EXT (noindex)
AND d2.NREC == A1.Cdogovor
AND DUBL.NREC == A2.Cdogovor
))
AND KDNAME1.NAME = 'Некоммерческое партнерство'
AND KDNAME2.NAME = 'Некоммерческое партнерство'
AND A1.SUBJECT1 = A2.SUBJECT1
AND d2.NREC <> DUBL.NREC
AND d2.TIDK = 401
AND d2.NREC = 281474976715722 // для отладки
;
CREATE VIEW V2
SELECT * FROM ATTRDOG;
HandleEvent
cmInit:{
markers := InitMarker('', 8, 100, 10);
_loop d2 {
_loop DUBL {
InsertMarker (markers, DUBL.NREC);
}
}
message('В маркере '+GetMarkerCount(markers));
var c : LONGINT;
c := GetMarkerCount(markers);
var i : LONGINT;
for(i := 0; i < c; i++){
var com : COMP;
GetMarker (markers, i, com);
message('УРАААА - Нашли '+String(com,0,0));
if((getfirst Dubl WHERE ((com /== Dubl.NREC))) = tsOK){
if((deleteresult := delete DUBL WHERE ((com /== Dubl.NREC))) = 0){
}else{}
message('deleteresult='+deleteresult);
}else{
message('Не нашли D2 c номером записи '+String(com,0,0));
}
if((V2.getfirst ATTRDOG WHERE ((com /== ATTRDOG.Cdogovor))) = tsOK){
if((deleteresult := V2.delete ATTRDOG WHERE ((com /== ATTRDOG.Cdogovor))) = 0){
}else{}
message('deleteresult1='+deleteresult);
}else{
message('Не нашли Cdogovor c номером записи '+String(com,0,0));
}
}
DoneMarker(markers, '');
closeinterface(cmOK);
}
End; //HandleEvent
End.
В данной версии все работает отлично, НО. Как только я делаю вот так
Код: Выделить всё
Interface i015qwerty '' Cyan;
var deleteresult,markers : LONGINT;
CREATE VIEW V1
SELECT * FROM
SYNONYM dogovor DUBL
,SYNONYM KATORG K1
,SYNONYM KATORG K2
,SYNONYM KATORGDESCR KD1
,SYNONYM KATORGDESCR KD2
,SYNONYM KATORGDESCR KDNAME1
,SYNONYM KATORGDESCR KDNAME2
,SYNONYM ATTRDOG A1
,SYNONYM ATTRDOG A2
,SYNONYM dogovor D2
WHERE
((
'J_C' /== d2.DESCR
AND d2.CMYORG /== K1.NREC
AND d2.CORG /== K2.NREC
AND K1.NREC /== KD1.CREC
AND K2.NREC /== KD2.CREC
AND KD1.CGROUP /== KDNAME1.NREC
AND KD2.CGROUP /== KDNAME2.NREC
AND d2.Cdogovor == DUBL.Cdogovor
AND d2.CORG == DUBL.CORG
AND d2.DDOC == DUBL.DDOC
AND d2.NODOC == DUBL.NODOC
AND d2.DBEG == DUBL.DBEG (noindex)
AND d2.DEND == DUBL.DEND (noindex)
AND d2.SUMMA == DUBL.SUMMA (noindex)
AND d2.CMYORG == DUBL.CMYORG (noindex)
AND d2.CVIDDOG == DUBL.CVIDDOG (noindex)
AND d2.NODOC_EXT == DUBL.NODOC_EXT (noindex)
AND d2.NREC == A1.Cdogovor
AND DUBL.NREC == A2.Cdogovor
))
AND KDNAME1.NAME = 'Некоммерческое партнерство'
AND KDNAME2.NAME = 'Некоммерческое партнерство'
AND A1.SUBJECT1 = A2.SUBJECT1
AND d2.NREC <> DUBL.NREC
AND d2.TIDK = 401
AND d2.NREC = 281474976715722 // для отладки
;
HandleEvent
cmInit:{
markers := InitMarker('', 8, 100, 10);
_loop d2 {
_loop DUBL {
InsertMarker (markers, DUBL.NREC);
delete ATTRDOG WHERE ((DUBL.NREC /== ATTRDOG.Cdogovor));
}
}
message('В маркере '+GetMarkerCount(markers));
var c : LONGINT;
c := GetMarkerCount(markers);
var i : LONGINT;
for(i := 0; i < c; i++){
var com : COMP;
GetMarker (markers, i, com);
message('УРАААА - Нашли '+String(com,0,0));
if((getfirst Dubl WHERE ((com /== Dubl.NREC))) = tsOK){
if((deleteresult := delete DUBL WHERE ((com /== Dubl.NREC))) = 0){
}else{}
message('deleteresult='+deleteresult);
}else{
message('Не нашли D2 c номером записи '+String(com,0,0));
}
}
DoneMarker(markers, '');
closeinterface(cmOK);
}
End; //HandleEvent
End.
т.е. по сути дела, я удаляю ATTRDOG до удаления договоров, используя вьюшку интерфейса для получения CDOGOVOR.
Далее удаляю договора, которые позиционируются через найденный в маркере номер записи. И на это, как мне кажется, я имею право, ведь написано в мануале:
Если вызван оператор навигации с конструкцией where, то на время своего выполнения он отменяет текущую подцепку для таблицы в которой происходит поиск /перебор записей и если найденная запись не попадает в текущую подцепку, то модификатор возвращает статус tsOk, но текущая запись становится невалидной.
Дак вот, после такого удаления ATTRDOG, договора в коде
Код: Выделить всё
if((getfirst Dubl WHERE ((com /== Dubl.NREC))) = tsOK){
if((deleteresult := delete DUBL WHERE ((com /== Dubl.NREC))) = 0){
}else{}
message('deleteresult='+deleteresult);
}else{
message('Не нашли D2 c номером записи '+String(com,0,0));
}
вообще не позиционируются, т.е. таких договоров, по мнению интерфейса нет, хотя если в саппорте проверить и тоже запросом, то договор на месте.
Пробовал вот так сделать:
Код: Выделить всё
if((getfirst Dubl WHERE ((com /== Dubl.NREC))) = tsOK){
delete ATTRDOG WHERE ((com /== ATTRDOG.Cdogovor));
if((deleteresult := delete DUBL WHERE ((com /== Dubl.NREC))) = 0){
}else{}
message('deleteresult='+deleteresult);
}else{
message('Не нашли D2 c номером записи '+String(com,0,0));
}
удаляет ATTRDOG, но после этого договора не удаляет, хотя говорит, что deleteresult = 0, а если сделать вот так
Код: Выделить всё
if((getfirst Dubl WHERE ((com /== Dubl.NREC))) = tsOK){
if((deleteresult := delete DUBL WHERE ((com /== Dubl.NREC))) = 0){
delete ATTRDOG WHERE ((com /== ATTRDOG.Cdogovor));
}else{}
message('deleteresult='+deleteresult);
}else{
message('Не нашли D2 c номером записи '+String(com,0,0));
}
тогда удаляет договора, а ATTRDOG не удаляет
И еще заметили такую вещь, что если указать вот так
Код: Выделить всё
if((getfirst DOGOVOR WHERE ((com /== DOGOVOR .NREC))) = tsOK){
if((deleteresult := delete DOGOVOR WHERE ((com /== DOGOVOR .NREC))) = 0){
}else{}
message('deleteresult='+deleteresult);
}else{
message('Не нашли DOGOVOR c номером записи '+String(com,0,0));
}
то даже с закоментированным полностью _loop d2 {} удаления не происходит, так же как и если поставить вместо DOGOVOR синоним D2, т.е. удаление почему-то проходит только с синонимом DUBL
В чем ошибка, в Атлантисе, Галактике или вообще в моем ДНК???