Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / операция не допускается если объект открыт / 14 сообщений из 14, страница 1 из 1
24.03.2010, 15:36
    #36539991
Pervert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
операция не допускается если объект открыт
Пришлось переписывать за предыдущим программистом код, на VB 6/0, столкнулся с такой проблемой

Код: plaintext
1.
2.
3.
4.
5.
6.
comm.ActiveConnection = ds.cn
comm.CommandType = adCmdText
comm.CommandTimeout =  0 

comm.CommandText = "exec GetBonus_New 'bonus" + mag + "', '" + id_grups + "', '" + CStr(Format(Me.DatePicker1.value, "yyyy-mm-dd")) + "', '" + CStr(Format(Me.DatePicker2.value, "yyyy-mm-dd")) + "'"

Set rs = comm.Execute

Do While Not rs.EOF - выдает операция не допускается если объект открыт, при этом если смотреть в профайлере что получается с запросом , а потом с QA выполнить результат, 1000 записей....
Где копать?
...
Рейтинг: 0 / 0
24.03.2010, 15:38
    #36540001
Pervert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
операция не допускается если объект открыт
а код процедры

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
ALTER   procedure GetBonus_New
@bonus as nvarchar( 100 ),
@id_gr as nvarchar( 200 ),
@d1 as nvarchar( 10 ),
@d2 as nvarchar( 10 ) 
as

declare @intb as nvarchar( 4000 )
declare @tb as nvarchar( 20 )
declare @pos as int



create table #SelectGruppa 
(
id_grup int
)


set @pos= 1 
while @pos<> 0 
begin
   set @pos=charindex(',',@id_gr)
   if @pos<> 0 
	begin
	   set @tb=left(@id_gr,@pos- 1 )
	   insert into #SelectGruppa select id from GetChild(@tb) 	
	   set @id_gr=right(@id_gr,len(@id_gr)-@pos)
	end
   else
	begin
	   	set @tb=@id_gr
		insert into #SelectGruppa select id from GetChild(@tb) 	
        end
end



set @pos= 1 
create table #Tab 
(
id_tov int,
naim varchar( 50 ),
prodsum real,
prodkol real,
prib_rub real,
senz_prkol real,
senr_prkol real,
id_post int,
id_proizv int,
senz real,
senr real,
ost real,
dat datetime
)


while @pos<> 0 
begin
set @pos=charindex(',',@bonus)
if @pos<> 0 
  begin
   set @tb=left(@bonus,@pos- 1 )
   set @bonus=right(@bonus,len(@bonus)-@pos)
  end
else
  begin
    set @tb=@bonus
  end
set @intb=
'insert into #Tab (id_tov, naim, prodsum, prodkol, prib_rub, Senz_prkol, Senr_prkol, Id_post, Id_proizv, senz, senr, ost, dat)
    select a.id_tov, 
    naim, 
    prodsum, 
    prodkol,
    prib_rub,
    senz*prodkol as Senz_prkol, 
    senr*prodkol as Senr_prkol,
    (select id_post from tovar where id=a.id_tov) as Id_post,
    (select id_proizv from tovar where id=a.id_tov) as Id_proizv,
     senz,
     senr,
     ost,
     dat from '+@tb+' a
         where (dat between '''+@d1+''' and '''+@d2+''')
            and id_tov in (select id from tovar where id_grup in (select * from #SelectGruppa ))' 
exec (@intb)
end

select b.id_tov,
    naim,
    sum(prodsum) as Prodsum, 
    sum(prodkol) as Prodkol,
    sum(prib_rub) as Prib,
    sum(Senz_prkol) as Sum_senz,
    sum(Senr_prkol) as Sum_senr,
    Id_post, Id_proizv, 
    (select top  1  senz from #Tab where id_tov=b.id_tov order by dat desc) as Max_Senz,
    (select top  1  senr from #Tab where id_tov=b.id_tov order by dat desc) as Max_Senr,
    (select sum(ost) from #Tab where id_tov=b.id_tov and dat=@d2) as ost
    from #Tab
b group by id_tov, naim, Id_post, Id_proizv



ALTER  FUNCTION GetChild (@Id int) -- Идентификатор элемента дерева об'ектов
RETURNS 
@Tree Table (
	Id int,
	IdParent int,
	Name varchar( 50 ),
	Level int)
AS BEGIN 

Declare 
@Level int
if @Id is NULL RETURN select @Level= 0 
	insert into @Tree
	select @Id,  0 , Naim, @Level
		from Gruppa 
			where Id = @Id
	while  1  =  1  
	begin
	  insert into @Tree
		select 
			a.Id,
			b.Id,
			a.Naim,
			@Level+ 1 
		from Gruppa a, @Tree b
			 where a.Id_count = b.Id and
			 Level = @Level
if @@ROWCOUNT =  0 
	 break 
	select @Level=@Level+ 1 
end
RETURN END
...
Рейтинг: 0 / 0
24.03.2010, 15:38
    #36540002
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
операция не допускается если объект открыт
добавьте в процедуру первой строкой

Код: plaintext
set nocount on
...
Рейтинг: 0 / 0
24.03.2010, 15:43
    #36540023
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
операция не допускается если объект открыт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public Function OpenDisconnectedRecordsetFromCommand(ByRef cmd as ADODB.Command) as ADODB.Recordset
Dim rs ADODB.Recordset
  Set rs = New ADODB.Recordset
  rs.CursorLocation =  3  ' adUseClient
  rs.Open cmd
  rs.ActiveConnection = Nothing
  Set OpenDisconnectedRecordsetFromCommand = rs
End Function

юзайте через эту ф-ю, вместо cmd.Execute
...
Рейтинг: 0 / 0
24.03.2010, 15:52
    #36540068
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
операция не допускается если объект открыт
Pervert,

Модератор: для форматирования кода используйте тег SRC.
...
Рейтинг: 0 / 0
24.03.2010, 15:59
    #36540114
Pervert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
операция не допускается если объект открыт
Понял, буду тегить...

set nocount on - помог спс большое
...
Рейтинг: 0 / 0
24.03.2010, 16:11
    #36540161
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
операция не допускается если объект открыт
Pervertset nocount on - помог спс большое

дам еще один хинт, если кто наткнется на эту тему.
Во-первых ошибка звучит так:
"операция не допускается если объект закрыт"

Если нет возможности изменить процедуру, то можно решить и на стороне VB
надо выполнять
Код: plaintext
Set rs = rs.NextRecordset
до тех пор пока не наткнетесь на открытый рекордсет
...
Рейтинг: 0 / 0
22.04.2010, 09:27
    #36591581
операция не допускается если объект открыт
У меня тоже возникает ошибка:
Ситуация такая имеется процедура, в ней содержатся все запросы. В одной форме несколько гридов, загрузка в первый грид проходит, а на остальных выдает ошибку на строке:
Do While Not rst.EOF

Запрос выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
alter proc dbo.AnCach @nazv varchar( 30 ),@Prvo smallint,@DLeft datetime,@DRight Datetime,@cex smallint = 0   as 
--set nocount on
Declare @DLefter int,@DRighter int
set @DLefter=Year(@DLeft)* 100 +Month(@DLeft)
set @DRighter=Year(@DRight)* 100 +Month(@DRight)

If @nazv='KolVozvZag'
begin 
SELECT  Name_C_K,DS, nesw, KolD From BrKolWozZag left join RekPodr on cex = kod_c and prvo=kod_p
 Where IsNull(sz,  0 ) =  0  and Prvo = @Prvo and (dataP between @DLeft and @DRight) and cex = @cex
end
If @nazv='PrichVozvIzd'
Begin
SELECT case when kod_w= 1  then 'ОТК'
when kod_w= 2  then 'ПЗ' end as Who, tip,nesw,sum(KolB) as KolB,sum(KolW) as KolW
From BrWozw 
where nesw is not null and isnull(sz, 0 ) =  0  and BrWozw.KolP >  0  And Kod_w >  0  And Kod_cat >  0  and Prvo = @Prvo and (dataP between @DLeft and @DRight) and cex = @cex
group by tip,nesw,kod_w
order by Who
End


код программы выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
strB="exec dbo.AnCach PrichVozvIzd,6,'01.01.2010','03.01.2010',23"
Set con = New ADODB.Connection
Set rst = New ADODB.Recordset
 con.Open strCon
rst.Open strB, con, adOpenStatic, adLockReadOnly
.Height =  530 
Do While Not rst.EOF
ii = ii +  1 
.TextMatrix(ii,  0 ) = CVar(IIf(IsNull(rst.Fields( 0 )) = True, "", rst.Fields( 0 )))
.TextMatrix(ii,  1 ) = CVar(IIf(IsNull(rst.Fields( 1 )) = True, "", rst.Fields( 1 )))
.TextMatrix(ii,  2 ) = CVar(IIf(IsNull(rst.Fields( 2 )) = True, "", rst.Fields( 2 )))
.TextMatrix(ii,  3 ) = CVar(IIf(IsNull(rst.Fields( 3 )) = True, "", rst.Fields( 3 )))
rst.MoveNext
Loop
rst.Close
con.Close


strB="exec dbo.AnCach KolVozvZag,6,'01.01.2010','03.01.2010',23"
Set con = New ADODB.Connection
Set rst = New ADODB.Recordset
 con.Open strCon
rst.Open strB, con, adOpenStatic, adLockReadOnly
.Height =  530 
Do While Not rst.EOF
ii = ii +  1 
.TextMatrix(ii,  0 ) = CVar(IIf(IsNull(rst.Fields( 0 )) = True, "", rst.Fields( 0 )))
.TextMatrix(ii,  1 ) = CVar(IIf(IsNull(rst.Fields( 1 )) = True, "", rst.Fields( 1 )))
.TextMatrix(ii,  2 ) = CVar(IIf(IsNull(rst.Fields( 2 )) = True, "", rst.Fields( 2 )))
.TextMatrix(ii,  3 ) = CVar(IIf(IsNull(rst.Fields( 3 )) = True, "", rst.Fields( 3 )))
rst.MoveNext
Loop
rst.Close
con.Close
...
Рейтинг: 0 / 0
22.04.2010, 09:30
    #36591588
операция не допускается если объект открыт
пробовал через добавление
автордобавьте в процедуру первой строкой

Warning: Null value is eliminated by an aggregate or other SET operation.
...
Рейтинг: 0 / 0
22.04.2010, 09:45
    #36591617
операция не допускается если объект открыт
Какие могут быть варианты решения проблемы?
...
Рейтинг: 0 / 0
22.04.2010, 09:57
    #36591637
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
операция не допускается если объект открыт
Александр ВеликийКакие могут быть варианты решения проблемы?

Тем не менее set nocount on поставьте. Предупреждение про NULL - это из другой оперы, к нему отношения не имеет.

Варианты решения:
1) избавиться от указанного предупреждения
2) "проскочить" это предупреждение на стороне VB

по варианту 2 я тоже пример давал выше. Смысл в том, что в первом рекордсете возвращается предупреждение (то есть рекордсет закрыт, а предупреждение в дополнительных свойствах), а второй рекордсет уже содержит сами данные. То есть проверяете, если первый рекордсет не открыт - делаете NextRecordset.

Но лично я стараюсь следовать первому варианту.

P.S. Для форматирования SQL-кода используйте тэг не "src vba", a "src sql"
...
Рейтинг: 0 / 0
22.04.2010, 11:34
    #36591944
операция не допускается если объект открыт
Проблема решена!!!У меня входной параметр @nazv был не тот.
Оказывается, когда процедура возвращает рекордсету "Command(s) completed successfully" и ничего кроме этого, то рекордсет ничего не получает.
А сделать эту проверку в условии???
...
Рейтинг: 0 / 0
22.04.2010, 11:38
    #36591955
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
операция не допускается если объект открыт
Александр ВеликийПроблема решена!!!У меня входной параметр @nazv был не тот.
Оказывается, когда процедура возвращает рекордсету "Command(s) completed successfully" и ничего кроме этого, то рекордсет ничего не получает.
Command(s) completed successfully - это пишет QA, процедура в этом случае ничего не возвращает.

Александр ВеликийА сделать эту проверку в условии???
Проверяйте свойство State у рекордсета.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
27.07.2011, 12:52
    #37368748
r18romik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
операция не допускается если объект открыт
set nocount on - помогло, спасиб
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / операция не допускается если объект открыт / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]