![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема при вставке записи с помощью хранимой процедуры [D6, MSSQL]
silvestr © (2005-07-13 09:45:00)В общем процедура :
CREATE PROCEDURE update_data (@seans Char(10), @user char(10), @group char(10), @comp char(10),@bron char(10), @uslug char(150),@sotrudnik char(10), @periodi char(10), @acess char(10))
AS
Insert Into Tab_update
Values (@seans,@user,@group,@comp,@bron,@uslug,@sotrudnik,@periodi,@acess)
GO
Вставляет каждый раз новые записи а таблиwe ( т.е добавляет их ) а как сделать чтобы записть происходила в одну строчку например в первую и процедура не добавляла записи а обновляла одну строчку
Ega23 (2005-07-14 09:48:00) [1]А во-вторых, у меня привычка уже такая, никогда не давать пользователям прямой доступ к таблицам.
И это пгавильно, тваорищЪ!
На самом деле этим ты в первую очередь себе упрощение делаешь. На случай, если структура базы поменяется.
evvcom (2005-07-14 08:15:00) [2]
> - а зачем тогда вообще ХП ? Одним апдейтом можно обойтись.
Во-первых, не всегда одним апдейтом. Почти всегда присутствуют дополнительные условия в ХП.
А во-вторых, у меня привычка уже такая, никогда не давать пользователям прямой доступ к таблицам.
ANB (2005-07-13 17:58:00) [3]
> Если записи с ID=100 нет, то update ... where ID=100 ничего
> не обновит. Это проблемы клиента, что он такой ID передал.
- а зачем тогда вообще ХП ? Одним апдейтом можно обойтись.
silvestr (2005-07-13 14:23:00) [4]всё спасибо всем , решил радикальным методом , очищаю таблицу потом пишу зановог в неё , получаеться одна запись :)
> Ega23 © (13.07.05 12:45) [24]
Я твой код возьму как основу для эксперементов , учиться нужно ведь :) Спасибо
evvcom (2005-07-13 13:47:00) [5]В данном случае это не стиль, а идея.
Ega23 (2005-07-13 13:17:00) [6]Ну, может быть, может быть.
Это всего лишь стильпрограммирования. У разных людей он разный.
evvcom (2005-07-13 13:00:00) [7]
> Ega23 © (13.07.05 12:52) [26]
Я делаю именно так, как написал. Если записи с ID=100 нет, то update ... where ID=100 ничего не обновит. Это проблемы клиента, что он такой ID передал. Мои программы обновляют записи с известными им ID. Поэтому ошибки никакой нет.
Ega23 (2005-07-13 12:52:00) [8]2 evvcom © (13.07.05 12:48) [25]
Я это делаю в одной ХП. Если ID<>0, то update, иначе insert.
Ашипка. ID может быть хоть 100, если нет записи с таким ID - Insert, есть - Update.
evvcom (2005-07-13 12:48:00) [9]
> Сделай две процедуры - одна для создания новой записи,
> другаю для обновления
Я это делаю в одной ХП. Если ID<>0, то update, иначе insert.
Ega23 (2005-07-13 12:45:00) [10]В итоге всё равно запись добавляеться а не обновляеться.
Строку вызова SP - в студию!
silvestr (2005-07-13 12:42:00) [11]Сделал так :
/*udp_seans varchar 10 NOT NULL,
udp_user varchar 10 NOT NULL,
udp_group varchar 10 NOT NULL,
udp_comp varchar 10 NOT NULL,
udp_bron varchar 10 NOT NULL,
udp_uslug varchar 10 NOT NULL,
udp_sotrudnik varchar 10 NOT NULL,
udp_periodi varchar 10 NOT NULL,
udp_acess varchar 10 NOT NULL,*/
CREATE PROCEDURE update_data
@ind int=-1,
@udp_seans varchar(10)='',
@udp_user varchar(10)='',
@udp_group varchar (10)='',
@udp_comp varchar (10)='',
@udp_bron varchar (10)='',
@udp_uslug varchar (10)='',
@udp_sotrudnik varchar (10)='',
@udp_periodi varchar (10)='',
@udp_acess varchar (10)=''
AS
declare
@result int,
@X int
set nocount ON
set @result=-1
begin
Set @X=-1
Select @X=ind from Tab_Update where ind=@ind
if @X=-1
begin -- Insert
if @ind=-1 Select @Ind=IsNull(Max(ind)+1, 1) from Tab_Update
Insert Into Tab_Update (ind,udp_seans,udp_user,udp_group,udp_comp,udp_bron,udp_uslug,udp_sotrudnik,udp_periodi,udp_acess)
Values (@ind, @udp_seans, @udp_user,@udp_group,@udp_comp,@udp_bron,@udp_uslug,@udp_sotrudnik,@udp_periodi, @udp_acess)
Select @Result=@ind
end
else
begin -- Update
Update Tab_Update Set udp_seans=@udp_Seans, udp_user=@udp_user, udp_group=@udp_group,udp_comp=@udp_comp,udp_bron=@udp_bron,
udp_uslug=@udp_uslug,@udp_sotrudnik=@udp_sotrudnik, udp_acess=@udp_acess
where ind=@ind
Select @Result=@ind
end
Goto Fin
end
fin:
set nocount off;
return(@result);
GO
В итоге всё равно запись добавляеться а не обновляеться.
Код создания таблици убрал так как таблица должна быть создана с самого начала, потому что к ней обращаються до того момента как была выполнена хранимая процедура
ЮЮ (2005-07-13 12:17:00) [12]>не будет там записи никакой больше кроме одной.
В чем тогда проблемы?
DELETE FROM Tab_update
Insert Into Tab_update ... все остальное уже у тебя есть :)
З.Ы. Не называй таблицу, которую и таблицей назвать стыдно, базой :)
Ega23 (2005-07-13 12:13:00) [13]Эх, молодёж-ж-ж-жь...
Print 'Creating Table Tab_Update'
GO
Create Table Tab_Update
(
ind int 4 NOT NULL,
udp_seans varchar 10 NOT NULL,
udp_user varchar 10 NOT NULL,
udp_group varchar 10 NOT NULL,
udp_comp varchar 10 NOT NULL,
udp_bron varchar 10 NOT NULL,
udp_uslug varchar 10 NOT NULL,
udp_sotrudnik varchar 10 NOT NULL,
udp_periodi varchar 10 NOT NULL,
udp_acess varchar 10 NOT NULL,
Constraint PK_Ind primaty key (ind)
)
GO
Print 'Creating SP SP_Tab_UpdateEdit'
go
if exists (select * from sysobjects where id = object_id(N'[SP_Tab_UpdateEdit]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [SP_Tab_UpdateEdit]
GO
CREATE PROCEDURE SP_Tab_UpdateEdit
@ind int=-1,
@udp_seans varchar(10)='',
@udp_user varchar(10)='',
.....
@udp_acess varchar (10)='',
@ActNam varchar(32)='NONE'
AS
declare
@result int,
@X int
set nocount ON
set @result=-1
set @ActNam=Upper(LTrim(RTrim(@ActNam)))
if @ActNam='TAB_UPDATE.UPD'
begin
Set @X=-1
Select @X=ind from Tab_Update where ind=@ind
if @X=-1
begin -- Insert
if @ind=-1 Select @Ind=IsNull(Max(ind)+1, 1) from Tab_Update
Insert Into Tab_Update (ind, upd_seans, upd_user, ... , upd_acess)
Values (@ind, @upd_seans, @upd_user, ... , @upd_acess)
Select @Result=@ind
end
else
begin -- Update
Update Tab_Update Set upd_seans=@updSeans, upd_user=@upd_user, .....,
upd_acess=@upd_acess
where ind=@ind
Select @Result=@ind
end
Goto Fin
end
fin:
set nocount off;
return(@result);
GO
Только параметры все надо будет подавать.
silvestr (2005-07-13 12:10:00) [14]Да я вручную в базе создам сам запись. Мне нужно чтобы хранимая процедура писала только в эту запись и всё ! не будет там записи никакой больше кроме одной. А вот как написать процедуру для обновления этой записи не знаю :( вот в этом и прошу помоч
yk (2005-07-13 11:59:00) [15]Сделай две процедуры - одна для создания новой записи,
другаю для обновления
В своей проге ты можешь узнать идешник нужной тебе записи и искать запись для обновления по идешнику - тогда точно будет только одна запись
silvestr (2005-07-13 11:58:00) [16]> Ega23 © (13.07.05 11:55) [17]
Как ? Пробывал так не хочет работать :(
declare @X int
Set @X=-1
Select @X=1 from Tab_update where @ind='0'
Ega23 (2005-07-13 11:55:00) [17]Ну так и ищи эту запись по ind, в чём проблема-то?
silvestr (2005-07-13 11:46:00) [18]> yk © (13.07.05 11:30) [15]
Да одна запись.
Это код не мой :( я тут новичёк , по этому не знаю что думать :(
yk (2005-07-13 11:30:00) [19]
> Set @X=-1
> Select @X=1 from Tab_update where udp_Seans=@udp_seans and
> udp_User=@udp_user and udp_Group=@udp_group and udp_Comp=@udp_comp
>
> and udp_Bron=@udp_bron and udp_Uslug=@udp_uslug and udp_Sotrudnik=@udp_sotrudnik
> and udp_Periodi=@udp_periodi and udp_acess=@udp_acess
если тебе всё равно нужна одна конкретна запись для обновления (Или это не так?), то почему ищешь её не по идешнику (primary key)?
silvestr (2005-07-13 11:21:00) [20]> Ega23 © (13.07.05 10:25) [11]
Where куда вставить ?
Ind по идее можно удалить , я по привычке его туда вписал
> evvcom © (13.07.05 11:11) [13] Мне она нужна просто как текст который постоянно изменяться вот и всё т.е я не рабоатю с датой я просто скидываю её для выявления изменений