Страница 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]
надо бы заменить на
Re:
Добавлено: 19 фев 2011, 03:12
Ged
Max_Fin писал(а):Ged писал(а):
_Loop katsopr
{ _loop Spsopr
{
Delete Current Spsopr;
}
}
[/code]
надо бы заменить на
чего то начал смотреть свои реплики, да и комменты к ним.
Delete all Spsopr; - нельзя так делать.
по идее алл- удаляет все в не зависимости от подцепок во вью!
С Эдиком ловили такую фичу, думаю он подтвердит.
Re: sql - запрос на удаление спецификации
Добавлено: 19 фев 2011, 21:26
edward_K
ну мож уже и починили, но врядли. All и вводили чтобы дать команду на удаление всей не временной таблицы.
А так да было all + условия = all без условий.