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

sql - запрос на удаление спецификации

Добавлено: 21 июн 2005, 18:45
fedfed
Не могу решить проблему по удалению спецификации


1. При выдачи sql - запроса
Select SpSopr.kol ,katsopr.name, katsopr.nsopr, katsopr.DSOPR, katsopr.VIDSOPR from SpSopr
where ((katsopr.nrec /== SpSopr.cSopr and word(9999) /== katsopr.VIDSOPR));
выдает нужное количество записей. Все верно.

При выдачи sql - запроса
delete SpSopr
where ((katsopr.nrec /== SpSopr.cSopr and word(9999) /== katsopr.VIDSOPR));

в первый раз удаляет специфмкации для первой накладной.
во-второй и по - следующие ничего не удаляет.

В чем причина не понятно

2. Более глобальная проблнма - как удалить спецификацию накладной зная Nrec документа основания

sql - запрос на удаление наклодной проходит

delete katsopr where
(( stepdoc.nrec==katsopr.cstepdoc and basedoc.nrec==stepdoc.CBASEDOC and _nrec == basedoc.nrec ));
где _nrec nrec ДО

а при попытке подцепить и удалить спецификации ко ВСЕМ накладным по этому ДО не получается

Добавлено: 21 июн 2005, 19:25
Max_Fin
Проблема в Атлантис-SQL, ну не умеет, многое не умеет.
Так что либо использовать VIP, либо использовать SQL непосредственно БД.

Добавлено: 21 июн 2005, 19:44
Sheinina
Попробуйте написать так
delete spsopr where ((spsopr.csopr /== katsopr.nrec)) and katsopr.vidsopr=word(9999);
и для удаления по basedoc:
delete spsopr where ((spsopr.csopr /== katsopr.nrec and
katsopr.cstepdoc /== stepdoc.nrec ))
and stepdoc.cbasedoc =_nrec;

Проверить не могу, нет тестовой базы с наполненными этими табличками, но по опыту должно получиться:)

Добавлено: 22 июн 2005, 12:35
Ged
для верности можно и так
Select
' Delete SpSopr Where SpSopr.Nrec='+String(SpSopr.Nrec)+';'
from SpSopr
where ((katsopr.nrec /== SpSopr.cSopr and word(9999) /== katsopr.VIDSOPR))
to txt DelSpSopr.lot
;
#include DelSpSopr.lot

Добавлено: 22 июн 2005, 14:46
fedfed
Sheinina

спасибо заработало, но

В начале выдало (и в первом и втором случае):

«Предупреждение:Нельзя полностью удалять таблицу SpSopr не поставив DELETE ALL или ограничения или условия! ….
delete spsopr where ((spsopr.csopr /== katsopr.nrec)) and katsopr.vidsopr=word(9999);»

потом через 5 минут запрос отрабатывает (записи удаляет)

1. Предупреждение к чему ?
2. Нельзя ли по- быстрее ?

Добавлено: 22 июн 2005, 14:51
Sheinina
Ругается потому, что удаляем записи из корневой таблицы. На это наплевать и забыть. А побыстрее - наверное, стоит воспользоваться
советом господина Ged, только написать в запросе так
select 'Delete Spsopr where (('+spsopr.nrec+'==nrec));' далее по тексту

Добавлено: 22 июн 2005, 16:05
Ged
(('+spsopr.nrec+'==nrec))'
На самом деле так можно и не писать индекс в моем случае подхватиться автоматом. Это проверено.[/quote]

Добавлено: 22 июн 2005, 16:11
fedfed
Ged и Sheinina

большое спасибо, работает быстро.

Но к сожалению у меня был план использовать SQL - запрос в ARD- форме. А именно:

.form "ard01"
.NameInList 'Удаление накладных и спецификаций по ДО'
.ard
.var
_nrec : comp;
.endvar
.begin
GetDBase,true,1,201,_nrec,0,0,0)end.
.Create View MyView;
.begin

delete spsopr where
((spsopr.csopr /== katsopr.nrec and katsopr.cstepdoc /== stepdoc.nrec )) and stepdoc.cbasedoc =_nrec;

delete katsopr where basedoc.nrec == stepdoc.CBASEDOC and _nrec == basedoc.nrec ));

end.
.endform

Как я понимаю использовать совет господина Ged мне нельзя в ARD- форме. А совет Sheinina приводит к большой задержке примерно 5 минут.

Так , что мне посоветуете делать

Добавлено: 22 июн 2005, 16:15
fedfed
естественно д.б.

.begin
GetDBase,true,1,201,_nrec,0,0,0)
end.

Добавлено: 22 июн 2005, 16:46
Ged
// С учетом вышеописанных ограничений
// where ((katsopr.nrec /== SpSopr.cSopr and word(9999) /== katsopr.VIDSOPR))

.begin
_Loop katsopr
{
_loop Spsopr
{
Delete Current Spsopr;
}
}
end.

Добавлено: 23 июн 2005, 14:53
Ged
Вернее

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

.form "ard01" 
.NameInList 'Удаление накладных и спецификаций по ДО' 
.ard 
.var 
_nrec : comp; 
.endvar 
.begin 
GetDBase,true,1,201,_nrec,0,0,0)end. 
.Create View MyView
As Select *
From 
 Spsopr,
 Katsopr
where 
   ((katsopr.nrec /== SpSopr.cSopr  and 
     word(9999) /== katsopr.VIDSOPR
   ))
; 
.begin 
 _Loop katsopr 
        {  _loop Spsopr 
               { 
                  Delete Current Spsopr; 
                } 
         }
end. 
.endform

Добавлено: 23 июн 2005, 16:25
fedfed
Ged
большое спасибо. работает

Добавлено: 23 июн 2005, 16:38
Max_Fin
Ged писал(а): _Loop katsopr
{ _loop Spsopr
{
Delete Current Spsopr;
}
}
[/code]
надо бы заменить на

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

 _Loop katsopr 
 {  
     Delete all Spsopr; 
  }

Re:

Добавлено: 19 фев 2011, 03:12
Ged
Max_Fin писал(а):
Ged писал(а): _Loop katsopr
{ _loop Spsopr
{
Delete Current Spsopr;
}
}
[/code]
надо бы заменить на

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

 _Loop katsopr 
 {  
     Delete all Spsopr; 
  }
чего то начал смотреть свои реплики, да и комменты к ним.
Delete all Spsopr; - нельзя так делать.
по идее алл- удаляет все в не зависимости от подцепок во вью!
С Эдиком ловили такую фичу, думаю он подтвердит. :)

Re: sql - запрос на удаление спецификации

Добавлено: 19 фев 2011, 21:26
edward_K
ну мож уже и починили, но врядли. All и вводили чтобы дать команду на удаление всей не временной таблицы.
А так да было all + условия = all без условий.