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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

fedfed
Сообщения: 17
Зарегистрирован: 21 июн 2005, 18:04

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

Сообщение 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 ДО

а при попытке подцепить и удалить спецификации ко ВСЕМ накладным по этому ДО не получается
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение Max_Fin »

Проблема в Атлантис-SQL, ну не умеет, многое не умеет.
Так что либо использовать VIP, либо использовать SQL непосредственно БД.
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение 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;

Проверить не могу, нет тестовой базы с наполненными этими табличками, но по опыту должно получиться:)
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение 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
fedfed
Сообщения: 17
Зарегистрирован: 21 июн 2005, 18:04

Сообщение fedfed »

Sheinina

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

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

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

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

1. Предупреждение к чему ?
2. Нельзя ли по- быстрее ?
Sheinina
Местный житель
Сообщения: 366
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение Sheinina »

Ругается потому, что удаляем записи из корневой таблицы. На это наплевать и забыть. А побыстрее - наверное, стоит воспользоваться
советом господина Ged, только написать в запросе так
select 'Delete Spsopr where (('+spsopr.nrec+'==nrec));' далее по тексту
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

(('+spsopr.nrec+'==nrec))'
На самом деле так можно и не писать индекс в моем случае подхватиться автоматом. Это проверено.[/quote]
fedfed
Сообщения: 17
Зарегистрирован: 21 июн 2005, 18:04

Сообщение 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 минут.

Так , что мне посоветуете делать
fedfed
Сообщения: 17
Зарегистрирован: 21 июн 2005, 18:04

Сообщение fedfed »

естественно д.б.

.begin
GetDBase,true,1,201,_nrec,0,0,0)
end.
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение Ged »

// С учетом вышеописанных ограничений
// where ((katsopr.nrec /== SpSopr.cSopr and word(9999) /== katsopr.VIDSOPR))

.begin
_Loop katsopr
{
_loop Spsopr
{
Delete Current Spsopr;
}
}
end.
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение 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
fedfed
Сообщения: 17
Зарегистрирован: 21 июн 2005, 18:04

Сообщение fedfed »

Ged
большое спасибо. работает
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение Max_Fin »

Ged писал(а): _Loop katsopr
{ _loop Spsopr
{
Delete Current Spsopr;
}
}
[/code]
надо бы заменить на

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

 _Loop katsopr 
 {  
     Delete all Spsopr; 
  }
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Re:

Сообщение Ged »

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

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

 _Loop katsopr 
 {  
     Delete all Spsopr; 
  }
чего то начал смотреть свои реплики, да и комменты к ним.
Delete all Spsopr; - нельзя так делать.
по идее алл- удаляет все в не зависимости от подцепок во вью!
С Эдиком ловили такую фичу, думаю он подтвердит. :)
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

ну мож уже и починили, но врядли. All и вводили чтобы дать команду на удаление всей не временной таблицы.
А так да было all + условия = all без условий.
Ответить