Удаление записи в таблице из формы

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

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

Ответить
victorpvp
Новичок
Сообщения: 24
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Удаление записи в таблице из формы

Сообщение victorpvp »

:-( Народ! Кто может помочь?
Проблема такая: нужно из формы удалить в зарплатной таблице Nachisl
записи у всех сотрудников с определенным пользовательским кодом (у меня 797). Сделал форму, где оставил удаление записи для одного сотрудника. Для наглядности. Запись удаляется, но не с кодом 797, а первая в предыдущем select'e, с кодом 701.

Вот текст формы:

.Form 'Upd_Nachisl3'
.ARD
.Group 'Зарплата'
.NameInList ' * Корректировка результатов расчета заработной платы (797 премия по сд.опл.) '
.F 'Upd_Nachisl3.OUT'
.Var
lngLsChetTabN:LongInt
szPersonsFIO:String
cmpNRecNachisl:Comp
cmpNRecLsChet:Comp
szNRecLsChet:String
intNumbOplat:Integer
dblNachislSumm:Double
dblNachislSummALL:Double
dblNachislKoeffSumm:Double
dblNachislPremiruemSumm:Double
dblNachislPremiruemSummALL:Double
dblNachislSummaPremiaALL:Double
lngNachislVidOpl:LongInt
lngNachislProc:LongInt
lngProcPremia:LongInt
szNachisKAU1:String
szNachisKAU2:String
cmpNRecNachisl797:Comp
szNRecNachisl797:String
.EndVar
.Create View vtNachisl_ALL As
SELECT
String(LsChet.nRec,17,0) (FieldName=LsChetNRec)
,LsChet.nRec
,LsChet.TabN
,Persons.FIO
,Nachisl.nRec
,String(Nachisl.nRec,17,0) (FieldName=NachislNRec)
,Nachisl.Summa
,Nachisl.VIDOPL
,Nachisl.Proc
,Nachisl.cKAUD[1]
,KAU_D1.Name
,Nachisl.cKAUD[2]
,KAU_D2.Name

FROM
Nachisl
,synonym SPKAU KAU_D1
,synonym KatPodr KAU_D2
WHERE
((
Nachisl.cLsCh == LsChet.nRec
and Nachisl.tPerson == Persons.nrec
and Nachisl.cKAUD[1] == KAU_D1.nrec
and Nachisl.cKAUD[2] == KAU_D2.nrec
and LsChet.Cex == KatPodr.Name
))
and Nachisl.YearN = 2006
and Nachisl.MesN = 9
and LsChet.TabN = 9311
ORDER External BY LsChet.TabN,Nachisl.VIDOPL
;
.Create View vtNachisl As
SELECT
*
FROM
Nachisl
WHERE
Nachisl.nRec = cmpNRecNachisl797
;
.fields
CommonFormHeader
lngLsChetTabN
szPersonsFIO
lngNachislVidOpl
lngNachislProc
DoubleToStr(dblNachislSumm,'66666666666667.88')
DoubleToStr(dblNachislPremiruemSumm,'66666666666667.88')
szNachisKAU1
szNachisKAU2
cmpNRecNachisl
.endfields
^
Корректировка результатов расчета заработной платы

Таб.ном. ФИО Код Процент сумма Премируем. КАУ1 КАУ2 nRec
вида оплаты сумма Nachisl
оплаты


.{Table vtNachisl_ALL
.Begin
cmpNRecLsChet:=vtNachisl_ALL.LsChet.NRec ;
szNRecLsChet:=vtNachisl_ALL.LsChetNRec ;
lngLsChetTabN:=vtNachisl_ALL.LsChet.TabN ;
szPersonsFIO:=vtNachisl_ALL.Persons.FIO ;
cmpNRecNachisl:=vtNachisl_ALL.Nachisl.nRec ;
dblNachislSumm:=vtNachisl_ALL.Nachisl.Summa ;
lngNachislVidOpl:=vtNachisl_ALL.Nachisl.VIDOPL ;
szNachisKAU1:=vtNachisl_ALL.KAU_D1.Name ;
szNachisKAU2:=vtNachisl_ALL.KAU_D2.Name ;
lngNachislProc:=vtNachisl_ALL.Nachisl.Proc ;

if lngNachislProc = 0
lngNachislProc := 100;

IF lngNachislVidOpl =701 Then begin dblNachislPremiruemSumm := dblNachislSumm end ;
IF lngNachislVidOpl >701 AND lngNachislVidOpl <730 Then begin dblNachislPremiruemSumm := 0 end ;
IF lngNachislVidOpl =730 Then begin dblNachislPremiruemSumm := dblNachislSumm*0.5 end ;
IF lngNachislVidOpl =731 Then begin dblNachislPremiruemSumm := dblNachislSumm*0.5 end ;
IF lngNachislVidOpl >731 AND lngNachislVidOpl <733 Then begin dblNachislPremiruemSumm := 0 end ;
IF lngNachislVidOpl =733 Then begin dblNachislPremiruemSumm := dblNachislSumm end ;
IF lngNachislVidOpl =734 Then begin dblNachislPremiruemSumm := dblNachislSumm end ;
IF lngNachislVidOpl =735 Then begin dblNachislPremiruemSumm := dblNachislSumm end ;
IF lngNachislVidOpl =736 Then begin dblNachislPremiruemSumm := (dblNachislSumm/3)*2 end ;
IF lngNachislVidOpl >736 AND lngNachislVidOpl <745 Then begin dblNachislPremiruemSumm := 0 end ;
IF lngNachislVidOpl =745 Then begin dblNachislPremiruemSumm := dblNachislSumm end ;
IF lngNachislVidOpl >745 AND lngNachislVidOpl <752 Then begin dblNachislPremiruemSumm := 0 end ;
IF lngNachislVidOpl =752 Then begin dblNachislPremiruemSumm := dblNachislSumm end ;
IF lngNachislVidOpl >752 Then begin dblNachislPremiruemSumm := 0 end ;
IF lngNachislVidOpl =797 Then begin cmpNRecNachisl797:= vtNachisl_ALL.Nachisl.nRec end ;
End.
|&&&&& |@@@@@@@@@@@@@| &&&& | &&&&&|&&&&&&&.&&|&&&&&&.&&|@@@@@@@@@@@@@@@@|@@@@@@@@@@|@@@@@@@@@@@@@@@@@@

.} // End vtNachisl_ALL...
----------------------------------
|вид опл.| nRec удаляемой записи |
----------------------------------
.fields
vtNachisl.Nachisl.VidOpl
cmpNRecNachisl797
.endfields
|&&&&&& |@@@@@@@@@@@@@@@@@@@@@@@|
.{Table vtNachisl
.Begin
IF cmpNRecNachisl797 > comp(0h) then
{ delete current Nachisl ;};
ELSE {} ;
End.
.}


.EndForm
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение m0p3e »

delete Nachisl where ....
victorpvp
Новичок
Сообщения: 24
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Как-то так ?

Сообщение victorpvp »

{ delete Nachisl where( Nachisl.nRec = cmpNRecNachisl797);};

??? Да, можно и так. Пробовал. Но в таком случае удаления записи вообще не происходит. Даже ошибочной.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Сообщение m0p3e »

delete Nachisl where (( cmpNRecNachisl797 == Nachisl.nRec ));
Лучше все-таки так.

Delete Current не проходит т.к. позиционирование идет vtNachisl_ALL.Nachisl, а не в Nachisl
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

попробуй вот так :

вместо
.{Table vtNachisl
.Begin
IF cmpNRecNachisl797 > comp(0h) then
{ delete current Nachisl ;};
ELSE {} ;
End.
.}

написать :
.begin
if vtNachisl.getfirst Nachisl=
{
vtNachisl.delete current nachisl;
}
end
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

if vtNachisl.getfirst Nachisl= 0

сорри...
victorpvp
Новичок
Сообщения: 24
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Не получается...

Сообщение victorpvp »

Не получается, даже при использовании
.{Table vtNachisl
.Begin
IF cmpNRecNachisl797 > comp(0h) then
{ delete Nachisl where(( cmpNRecNachisl797 == Nachisl.nRec));};
ELSE {} ;
End.
.}
Я правильно понял ?
...Не позиционируется никак. Удаления записи не вообще происходит.
Это я пробовал еще до обращения к форуму.
victorpvp
Новичок
Сообщения: 24
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

ВСЕ НОРМАЛЬНО !!!

Сообщение victorpvp »

Всем спасибо !!!

Неправильное использование синтаксиса оператора DELETE.
Короче, мне надо больше читать,читать,читать....литературу.

Совет уважаемого DEN - и все заработало , как надо!
.begin
if vtNachisl.getfirst Nachisl=0
{
vtNachisl.delete current nachisl;
}
end.
Еще раз, ВСЕМ СПАСИБО !!!
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Пустяки..не за что :-)
А вообще реализовывать в fcom insert, delete,update еще тот изврат. На ВИПе это гораздо проще )
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

даже в Vip действует правило
если несколько view, то к первому еще можно обращаться без указания view , а ко всем остальным указывать имя вьюшки в командах и таблицах обязательно.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

В vip все что пишешь в программных блоках по умолчанию делается в рамках объявленной лог. таблицы. В фком же если ты что то делаешь вне конструкции
.{table t1
.}
или вне программного блока, в котором происходит навигациия по лог. таблице, то невозможно использвать операторы delete,insert update. Проще говоря, нельзя работать с модификаторами БД вне лог. таблицы. По мне дак, несколько странная реализация этого моментика у разработчиков...
Ответить