Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Проблема при вставке записи с помощью хранимой процедуры   Найти похожие ветки 

 
silvestr   (2005-07-13 09:45) [0]

В общем процедура :

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 ( т.е добавляет их ) а как сделать чтобы записть происходила в одну строчку например в первую и процедура не добавляла записи а обновляла одну строчку


 
ANB ©   (2005-07-13 09:50) [1]

Гы. А чего ты еще хотел ? Посмотри в словарике слово Insert. И поищи в книжке update. А вообще, сначала надо книжку про SQL прочитать, а потом начинать писать хранимки.


 
Ega23 ©   (2005-07-13 09:53) [2]


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
declare @X int
Set @X=-1
Select @X=1 from Tab_update where Seans=@seans and User=@user and Group=@group and Comp=@comp
and Bron=@bron and Uslug=@uslug and Sotrudnik=@sotrudnik and Periodi=@periodi and acess=@acess

if @X=-1
Insert Into Tab_update
Values (@seans,@user,@group,@comp,@bron,@uslug,@sotrudnik,@periodi,@acess)
else
Update Tab_update Set
 Seans=@seans,
 User=@user,
 Group=@group,
 Comp=@comp,
 Bron=@bron,
 Uslug=@uslug,
 Sotrudnik=@sotrudnik,
 Periodi=@periodi,
 Acess=@acess
GO


Хотя это всё жуткая глупость. Таблица составлена безобразно.


 
ANB ©   (2005-07-13 09:58) [3]


> Ega23 ©   (13.07.05 09:53) [2]
- гы, смеялся еще раз. Зачем тут человеку пример, если он до сих пор не понимает, что Insert делает. И про апдейт не слышал. И ты еще удивляешься, как таблица безобразно придумана. Орех.


 
Ega23 ©   (2005-07-13 10:07) [4]

- гы, смеялся еще раз. Зачем тут человеку пример, если он до сих пор не понимает, что Insert делает. И про апдейт не слышал. И ты еще удивляешься, как таблица безобразно придумана. Орех.

Да так, настроение с утра сегодня хорошее. Работать не хоцца


 
silvestr   (2005-07-13 10:08) [5]

> ANB ©   (13.07.05 09:58) [3]

Раз так хорошо знаешь то и подскажи !

> Ega23 ©   (13.07.05 09:53) [2]

Переделал название полей , в базу всё равно добавяються данные а не обновляються :(

CREATE PROCEDURE update_data  (@udp_seans Char(10), @udp_user char(10), @udp_group char(10), @udp_comp char(10),@udp_bron char(10), @udp_uslug char(150),@udp_sotrudnik char(10), @udp_periodi char(10), @udp_acess char(10))

AS
declare @X int
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

if @X=-1
Insert Into Tab_update
Values (@udp_seans,@udp_user,@udp_group,@udp_comp,@udp_bron,@udp_uslug,@udp_sotrudnik,@udp_periodi,@udp_acess)
else
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_Periodi=@udp_periodi,
udp_Acess=@udp_acess
GO


 
Ega23 ©   (2005-07-13 10:12) [6]

Структуру таблицы Tab_update в студию!

З.Ы.
Таблица составлена безобразно.


 
silvestr   (2005-07-13 10:18) [7]

> Ega23 ©   (13.07.05 10:12) [6]

Структура таблици :



ind              int         4
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



 
silvestr   (2005-07-13 10:19) [8]

udp_acess то же

udp_acess     varchar     10


 
evvcom ©   (2005-07-13 10:21) [9]


> в базу всё равно добавяються данные а не обновляються

Значит такие данные передаешь. Учти, что, вставив в Char(10) строку "123", а потом результат сравнив с "123", ты получишь false. Потому и вставляются.

> Ega23 ©   (13.07.05 09:53) [2]

Ты в апдейте where забыл. Но до него дело пока все равно не доходит.


 
silvestr   (2005-07-13 10:25) [10]

> evvcom ©   (13.07.05 10:21) [9]

Если я передаю текущее время в формате 12:54:34 ? проблема будет ?


 
Ega23 ©   (2005-07-13 10:25) [11]

А, ну да, точно. Where забыл.
Так, автор, я у тебя вижу поле ind. Подозреваю, что это от Identificator.
А почему ты его не вставляешь? И параметром не передаёшь?


 
Ega23 ©   (2005-07-13 10:31) [12]

Если я передаю текущее время в формате 12:54:34 ? проблема будет ?

Для текущего времени есть тип datetime

З.Ы.
Таблица составлена безобразно.


 
evvcom ©   (2005-07-13 11:11) [13]


> передаю текущее время в формате 12:54:34

с передачей даты/времени в текстовом формате всегда связаны проблемы. Сегодня ее может не быть, а завтра она всплывет. Связано это с региональными настройками. Измени разделитель времени с : на что-нибудь другое и встретишься с проблемой лицом к лицу. Аналогично с датой.


 
silvestr   (2005-07-13 11:21) [14]

> Ega23 ©   (13.07.05 10:25) [11]

Where куда вставить ?

Ind по идее можно удалить , я по привычке его туда вписал

> evvcom ©   (13.07.05 11:11) [13] Мне она нужна просто как текст который постоянно изменяться вот и всё т.е я не рабоатю с датой я просто скидываю её для выявления изменений


 
yk ©   (2005-07-13 11:30) [15]


> 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:46) [16]

> yk ©   (13.07.05 11:30) [15]

Да одна запись.

Это код не мой :( я тут новичёк , по этому не знаю что думать :(


 
Ega23 ©   (2005-07-13 11:55) [17]

Ну так и ищи эту запись по ind, в чём проблема-то?


 
silvestr   (2005-07-13 11:58) [18]

> Ega23 ©   (13.07.05 11:55) [17]

Как ? Пробывал так не хочет работать :(

declare @X int
Set @X=-1
Select @X=1 from Tab_update where  @ind="0"


 
yk ©   (2005-07-13 11:59) [19]

Сделай две процедуры - одна для создания новой записи,
другаю для обновления

В своей проге ты можешь узнать идешник нужной тебе записи и искать запись для обновления по идешнику - тогда точно будет только одна запись


 
silvestr   (2005-07-13 12:10) [20]

Да я вручную в базе создам сам запись. Мне нужно чтобы хранимая процедура писала только в эту запись и всё ! не будет там записи никакой больше кроме одной. А вот как написать процедуру для обновления этой записи не знаю :( вот в этом и прошу помоч


 
Ega23 ©   (2005-07-13 12:13) [21]

Эх, молодёж-ж-ж-жь...


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



Только параметры все надо будет подавать.


 
ЮЮ ©   (2005-07-13 12:17) [22]

>не будет там записи никакой больше кроме одной.

В чем тогда проблемы?
DELETE FROM Tab_update
Insert Into Tab_update ... все остальное уже у тебя есть :)

З.Ы. Не называй таблицу, которую и таблицей назвать стыдно, базой :)


 
silvestr   (2005-07-13 12:42) [23]

Сделал так :



/*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



В итоге всё равно запись добавляеться а не обновляеться.
Код создания таблици убрал так как таблица должна быть создана с самого начала, потому что к ней обращаються до того момента как была выполнена хранимая процедура


 
Ega23 ©   (2005-07-13 12:45) [24]

В итоге всё равно запись добавляеться а не обновляеться.

Строку вызова SP - в студию!


 
evvcom ©   (2005-07-13 12:48) [25]


> Сделай две процедуры - одна для создания новой записи,
> другаю для обновления

Я это делаю в одной ХП. Если ID<>0, то update, иначе insert.


 
Ega23 ©   (2005-07-13 12:52) [26]

2 evvcom ©   (13.07.05 12:48) [25]
Я это делаю в одной ХП. Если ID<>0, то update, иначе insert.

Ашипка. ID может быть хоть 100, если нет записи с таким ID - Insert, есть - Update.


 
evvcom ©   (2005-07-13 13:00) [27]


> Ega23 ©   (13.07.05 12:52) [26]

Я делаю именно так, как написал. Если записи с ID=100 нет, то update ... where ID=100 ничего не обновит. Это проблемы клиента, что он такой ID передал. Мои программы обновляют записи с известными им ID. Поэтому ошибки никакой нет.


 
Ega23 ©   (2005-07-13 13:17) [28]

Ну, может быть, может быть.
Это всего лишь стильпрограммирования. У разных людей он разный.


 
evvcom ©   (2005-07-13 13:47) [29]

В данном случае это не стиль, а идея.


 
silvestr   (2005-07-13 14:23) [30]

всё спасибо всем , решил радикальным методом , очищаю таблицу потом пишу зановог в неё , получаеться одна запись :)

> Ega23 ©   (13.07.05 12:45) [24]

Я твой код возьму как основу для эксперементов , учиться нужно ведь :) Спасибо


 
ANB ©   (2005-07-13 17:58) [31]


> Если записи с ID=100 нет, то update ... where ID=100 ничего
> не обновит. Это проблемы клиента, что он такой ID передал.

- а зачем тогда вообще ХП ? Одним апдейтом можно обойтись.


 
evvcom ©   (2005-07-14 08:15) [32]


> - а зачем тогда вообще ХП ? Одним апдейтом можно обойтись.

Во-первых, не всегда одним апдейтом. Почти всегда присутствуют дополнительные условия в ХП.
А во-вторых, у меня привычка уже такая, никогда не давать пользователям прямой доступ к таблицам.


 
Ega23 ©   (2005-07-14 09:48) [33]

А во-вторых, у меня привычка уже такая, никогда не давать пользователям прямой доступ к таблицам.

И это пгавильно, тваорищЪ!
На самом деле этим ты в первую очередь себе упрощение делаешь. На случай, если структура базы поменяется.



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.043 c
1-1122483643
Galiaf
2005-07-27 21:00
2005.08.21
Аттрибуты файлов.


9-1114282991
DemonP
2005-04-23 23:03
2005.08.21
Задача оптимизации пути


1-1122623099
Mishenka
2005-07-29 11:44
2005.08.21
Как в ListView запретить вручную изменять ширину столбцов?


4-1119850461
MTsv DN
2005-06-27 09:34
2005.08.21
Открыть два фала из Проводника или как послать WM_DROPFILES...


3-1121251256
-=snoop=-
2005-07-13 14:40
2005.08.21
глюк с DBCheckBox