Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема при вставке записи с помощью хранимой процедуры [D6, MSSQL]


Страницы:   1 2

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] Мне она нужна просто как текст который постоянно изменяться вот и всё т.е я не рабоатю с датой я просто скидываю её для выявления изменений


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо