Страница 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 без условий.