powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / операция не допускается если объект открыт
14 сообщений из 14, страница 1 из 1
операция не допускается если объект открыт
    #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
операция не допускается если объект открыт
    #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
операция не допускается если объект открыт
    #36540002
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавьте в процедуру первой строкой

Код: plaintext
set nocount on
...
Рейтинг: 0 / 0
операция не допускается если объект открыт
    #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
операция не допускается если объект открыт
    #36540068
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pervert,

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

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

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

Если нет возможности изменить процедуру, то можно решить и на стороне VB
надо выполнять
Код: plaintext
Set rs = rs.NextRecordset
до тех пор пока не наткнетесь на открытый рекордсет
...
Рейтинг: 0 / 0
операция не допускается если объект открыт
    #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
операция не допускается если объект открыт
    #36591588
пробовал через добавление
автордобавьте в процедуру первой строкой

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

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

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

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

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

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

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


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