powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / SQL в VBA (операция не допускается если объект закрыт)
21 сообщений из 21, страница 1 из 1
SQL в VBA (операция не допускается если объект закрыт)
    #36711348
chester49
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый. По долгу службы стало мне необходимо выбирать данные в экселевскую табличку из базы на sql server. Процедура написана, опробована на сервере, все работает.
Данные выбираются очень просто:
Код: 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.
Sub GetReport(Chair As Integer, EducationYear As Integer)
    Dim cn As New ADODB.Connection
    cn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;" _
    & "Persist Security Info=False;Initial Catalog=IISU_RELEASE;Data Source=SQL1"
    cn.Open
    
    Dim cmd As ADODB.Command
    Set cmd = CreateObject("ADODB.Command")
    cmd.ActiveConnection = cn
    cmd.CommandType = adCmdText
    cmd.CommandText = "execute [IISU_RELEASE].[Curriculum].[GetChairReport] @Chair =" _
    & Chair & ", @EducationYear = " & EducationYear
    
    Dim rs As New ADODB.Recordset
    rs.Open cmd
    rs.MoveFirst
    
    Cells( 1 ,  1 ) = "Группа"
    Cells( 1 ,  2 ) = "Дисциплина"
    Cells( 1 ,  3 ) = "Лекции"
    Cells( 1 ,  4 ) = "Семинары"
    Cells( 1 ,  5 ) = "Консультации"
    Cells( 1 ,  6 ) = "Экзам. конс."
    Cells( 1 ,  7 ) = "КП"
    Cells( 1 ,  8 ) = "КР"
    Cells( 1 ,  9 ) = "ИРЗ"
    Cells( 1 ,  10 ) = "Коллоквиум"
    Cells( 1 ,  11 ) = "Зачет"
    Cells( 1 ,  12 ) = "Экзамен"
    Cells( 1 ,  13 ) = "Аспир. магистр."
    Cells( 1 ,  14 ) = "ГАК"
    Cells( 1 ,  15 ) = "Практика"
    Cells( 1 ,  16 ) = "ВКР"
    
    q =  2 
    Do Until rs.EOF
        Cells(q,  1 ) = rs.Fields( 0 )
        Cells(q,  2 ) = rs.Fields( 1 )
        Cells(q,  3 ) = rs.Fields( 2 )
        Cells(q,  4 ) = rs.Fields( 3 )
        Cells(q,  5 ) = rs.Fields( 4 )
        Cells(q,  6 ) = rs.Fields( 5 )
        Cells(q,  7 ) = rs.Fields( 6 )
        Cells(q,  8 ) = rs.Fields( 7 )
        Cells(q,  9 ) = rs.Fields( 8 )
        Cells(q,  10 ) = rs.Fields( 9 )
        Cells(q,  11 ) = rs.Fields( 10 )
        Cells(q,  12 ) = rs.Fields( 11 )
        Cells(q,  13 ) = rs.Fields( 12 )
        Cells(q,  14 ) = rs.Fields( 13 )
        Cells(q,  15 ) = rs.Fields( 14 )
        Cells(q,  16 ) = rs.Fields( 15 )
        q = q +  1 
        rs.MoveNext
    Loop
End Sub

Столкнулся с такой проблемой. При параметре Chair равном, скажем, 72 данные отлично забираются из базы и представляются в табличке. Но если этот параметр равен, конкретно у меня, 64, 76, 82 или 69, то на строке:
Код: plaintext
rs.MoveFirst
выдается ошибка "Операция не допускается если объект закрыт".
И это при том, что на самом сервере эта процедура выполняется и возвращает данные без ошибок независимо от параметров.
В чем может быть дело? Что именно может не понимать VBA, чтобы выдавать такую ошибку?

P.S. процедуру, если нужно, тоже напишу.
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36711355
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36711403
chester49
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, уже читал.
set nocount on написал, но изменения не появились.
Пробовал и этой функцией:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
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
Если так то на строке
Код: plaintext
rs.ActiveConnection = Nothing
появляется ошибка "Не удается изменить свойство ActiveConnection объекта RecordSet с объектом Command в качестве источника."
И при этом свойство State у rs все время равно нулю, и это:
Код: plaintext
1.
2.
3.
    Do While rs.State =  0 
        rs.NextRecordset
    Loop
Не помогает, происходит зацикливание.
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36711412
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chester49,

CopyFromRecordset
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36711413
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chester49появляется ошибка "Не удается изменить свойство ActiveConnection объекта RecordSet с объектом Command в качестве источника."Потому что соединение открыто по умолчанию с серверным курсором.
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36711414
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причина может быть только одна - либо рекордсет не возвращается вовсе, либо возвращаются дополнительные сообщения. Это лечится "set nocount on"

Ну опубликуйте код процедуры...
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36711428
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Dim cmd As ADODB.Command
    Set cmd = CreateObject("ADODB.Command")
    cmd.ActiveConnection = cn
    cmd.CommandType = adCmdText
    cmd.CommandText = "execute [IISU_RELEASE].[Curriculum].[GetChairReport] @Chair =" _
    & Chair & ", @EducationYear = " & EducationYear
    
    Dim rs As New ADODB.Recordset
    rs.Open cmd
    rs.MoveFirst
безболезненно меняется на это:
Код: plaintext
1.
2.
3.
    Dim rs As New ADODB.Recordset
    set rs=cn.Execute "execute [IISU_RELEASE].[Curriculum].[GetChairReport] @Chair =" _
    & Chair & ", @EducationYear = " & EducationYear
    
rs.MoveFirst тоже не нужен
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36711801
chester49
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"set nocount on" стоит, поэтому остается первое.
самое интересное то, что с одними данными rs работает, а с другими нет, при том что в MS SQL Server процедуры выполняются все.

завтра с работы выложу процедуру.
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712300
chester49
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот процедура:
Код: 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.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
USE [IISU_RELEASE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [Curriculum].[GetChairReport]
	@Chair INT, -- Кафедра, по которой нужно получить отчет
	@EducationYear INT -- Год обучения

AS
SET NOCOUNT ON

EXECUTE [IISU_RELEASE].[Curriculum].[PGetChairTeachingLoad] 
   @ChairID = @Chair
  ,@AcademicYearNumber = @EducationYear

DECLARE @TeachingLoadCalculationID INT

CREATE TABLE #TeachingLoadCalculationList
(
	ChairTeachingLoadCalculationID INT PRIMARY KEY,
	ChairID INT,
	AcademicYearNumber INT,
	CalculationDate DATETIME,
	DisciplineTeachingLoadHourQuantity DECIMAL( 12 , 2 ),
	OtherTeachingLoadHourQuantity DECIMAL( 12 , 2 ),
	IsCurrent BIT,
	IsApproved BIT,
	IsDistributed BIT
)

INSERT INTO 
	#TeachingLoadCalculationList
	EXECUTE [IISU_RELEASE].[Curriculum].[PGetChairTeachingLoadCalculationList] 
	   @ChairID = @Chair
	  ,@AcademicYearNumber = @EducationYear

SELECT 
	@TeachingLoadCalculationID = ChairTeachingLoadCalculationID
FROM
	#TeachingLoadCalculationList

DROP TABLE #TeachingLoadCalculationList


CREATE TABLE #FullReport
(
	ChairTeachingLoadCalculationItemID INT PRIMARY KEY,
	ChairTeachingLoadCalculationID INT,
	TeachingLoadObjectID INT ,
	TeachingLoadObjectName VARCHAR( 200 ),
	TeachingLoadObjectShortName VARCHAR( 200 ),
	PlannedStudentGroupID INT,
	PlannedStudentGroupName VARCHAR( 100 ),
	StreamID INT,
	StreamName VARCHAR( 100 ),
	PersonQuantity INT,
	SubGroupQuantity DECIMAL( 4 , 2 ),
	CurriculumDisciplineID INT,
	DisciplineFullName VARCHAR( 200 ),
	CurriculumID INT,
	CurriculumCode VARCHAR( 100 ),
	EducationFormID INT,
	EducationFormName VARCHAR( 100 ),
	TeachingLoadHourQuantity DECIMAL( 6 , 2 ),
	EducationYearID INT,
	EducationYearNumber INT,
	TermID INT,
	TermNumber INT,
	[TeachingLoadObjectCalculationTypeID] INT
)

INSERT INTO
	#FullReport
EXEC [IISU_RELEASE].[Curriculum].[PGetChairTeachingLoadCalculationItemList]
	@ChairTeachingLoadCalculationID = @TeachingLoadCalculationID


-- Внешний запрос: Группирует и суммирует данные полученные во внутреннем запросе
SELECT
	PlannedStudentGroupName,
	DisciplineFullName,
	SUM(Lectures) as 'Lectures',
	SUM(Seminars) as 'Seminars',
	SUM(Consultation) as 'Consultation',
	SUM(ExamConsultation) as 'ExamConsultation',
	SUM(CourseProject) as 'CourseProject',
	SUM(ControlWork) as 'ControlWork',
	SUM(IRZ) as 'IRZ',
	SUM(Colloquium) as 'Colloquium',
	SUM(Offset) as 'Offset',
	SUM(Exam) as 'Exam',
	SUM(GraduateManage) as 'GraduateManage',
	SUM(GAK) as 'GAK',
	SUM(Practice) as 'Practice',
	SUM(VKR) as 'VKR'
FROM
	(
	-- Внутренний запрос: формирует набор записей, отображающий данные о количестве часов
	-- по конкретному виду работ, в каждой группе и по каждой дисциплине
	SELECT
		PlannedStudentGroupID,
		PlannedStudentGroupName,
		CurriculumDisciplineID,
		DisciplineFullName,
		CASE TeachingLoadObjectID
			WHEN  30  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'Lectures',

		CASE TeachingLoadObjectID
			WHEN  1  THEN TeachingLoadHourQuantity
			WHEN  2  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'Seminars',

		CASE TeachingLoadObjectID
			WHEN  54  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'Consultation',

		CASE TeachingLoadObjectID
			WHEN  53  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'ExamConsultation',

		CASE TeachingLoadObjectID
			WHEN  7  THEN TeachingLoadHourQuantity
			WHEN  8  THEN TeachingLoadHourQuantity
			WHEN  9  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'CourseProject',

		CASE TeachingLoadObjectID
			WHEN  51  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'ControlWork',

		CASE TeachingLoadObjectID
			WHEN  10  THEN TeachingLoadHourQuantity
			WHEN  11  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'IRZ',

		CASE TeachingLoadObjectID
			WHEN  52  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'Colloquium',

		CASE TeachingLoadObjectID
			WHEN  3  THEN TeachingLoadHourQuantity
			WHEN  4  THEN TeachingLoadHourQuantity
			WHEN  41  THEN TeachingLoadHourQuantity
			WHEN  56  THEN TeachingLoadHourQuantity
			WHEN  57  THEN TeachingLoadHourQuantity
			WHEN  60  THEN TeachingLoadHourQuantity
			WHEN  61  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'Offset',

		CASE TeachingLoadObjectID
			WHEN  5  THEN TeachingLoadHourQuantity
			WHEN  6  THEN TeachingLoadHourQuantity
			WHEN  58  THEN TeachingLoadHourQuantity
			WHEN  59  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'Exam',

		CASE TeachingLoadObjectID
			WHEN  21  THEN TeachingLoadHourQuantity
			WHEN  22  THEN TeachingLoadHourQuantity
			WHEN  24  THEN TeachingLoadHourQuantity
			WHEN  25  THEN TeachingLoadHourQuantity
			WHEN  26  THEN TeachingLoadHourQuantity
			WHEN  27  THEN TeachingLoadHourQuantity
			WHEN  28  THEN TeachingLoadHourQuantity
			WHEN  29  THEN TeachingLoadHourQuantity
			WHEN  34  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'GraduateManage',

		CASE TeachingLoadObjectID
			WHEN  12  THEN TeachingLoadHourQuantity
			WHEN  13  THEN TeachingLoadHourQuantity
			WHEN  14  THEN TeachingLoadHourQuantity
			WHEN  23  THEN TeachingLoadHourQuantity
			WHEN  35  THEN TeachingLoadHourQuantity
			WHEN  39  THEN TeachingLoadHourQuantity
			WHEN  50  THEN TeachingLoadHourQuantity
			WHEN  55  THEN TeachingLoadHourQuantity
			WHEN  64  THEN TeachingLoadHourQuantity
			WHEN  65  THEN TeachingLoadHourQuantity
			WHEN  85  THEN TeachingLoadHourQuantity
			WHEN  87  THEN TeachingLoadHourQuantity
			WHEN  89  THEN TeachingLoadHourQuantity
			WHEN  90  THEN TeachingLoadHourQuantity
			WHEN  91  THEN TeachingLoadHourQuantity
			WHEN  92  THEN TeachingLoadHourQuantity
			WHEN  93  THEN TeachingLoadHourQuantity
			WHEN  94  THEN TeachingLoadHourQuantity
			WHEN  95  THEN TeachingLoadHourQuantity
			WHEN  96  THEN TeachingLoadHourQuantity
			WHEN  97  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'GAK',

		CASE TeachingLoadObjectID
			WHEN  16  THEN TeachingLoadHourQuantity
			WHEN  17  THEN TeachingLoadHourQuantity
			WHEN  31  THEN TeachingLoadHourQuantity
			WHEN  32  THEN TeachingLoadHourQuantity
			WHEN  33  THEN TeachingLoadHourQuantity
			WHEN  36  THEN TeachingLoadHourQuantity
			WHEN  37  THEN TeachingLoadHourQuantity
			WHEN  38  THEN TeachingLoadHourQuantity
			WHEN  48  THEN TeachingLoadHourQuantity
			WHEN  49  THEN TeachingLoadHourQuantity
			WHEN  66  THEN TeachingLoadHourQuantity
			WHEN  67  THEN TeachingLoadHourQuantity
			WHEN  80  THEN TeachingLoadHourQuantity
			WHEN  81  THEN TeachingLoadHourQuantity
			WHEN  82  THEN TeachingLoadHourQuantity
			WHEN  83  THEN TeachingLoadHourQuantity
			WHEN  84  THEN TeachingLoadHourQuantity
			WHEN  86  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'Practice',

		CASE TeachingLoadObjectID
			WHEN  18  THEN TeachingLoadHourQuantity
			WHEN  19  THEN TeachingLoadHourQuantity
			WHEN  20  THEN TeachingLoadHourQuantity
			WHEN  40  THEN TeachingLoadHourQuantity
			WHEN  42  THEN TeachingLoadHourQuantity
			WHEN  44  THEN TeachingLoadHourQuantity
			WHEN  45  THEN TeachingLoadHourQuantity
			WHEN  62  THEN TeachingLoadHourQuantity
			WHEN  63  THEN TeachingLoadHourQuantity
			WHEN  88  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'VKR'

	FROM #FullReport
	) AS TMP
GROUP BY PlannedStudentGroupName, DisciplineFullName
ORDER BY PlannedStudentGroupName
	
DROP TABLE #FullReport
На первые экзекуты можете не смотреть, они всего лишь формируют табличку из которой будут представляться данные посредством основных запросов (внешнего и внутреннего)
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712304
chester49
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proвот это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    Dim cmd As ADODB.Command
    Set cmd = CreateObject("ADODB.Command")
    cmd.ActiveConnection = cn
    cmd.CommandType = adCmdText
    cmd.CommandText = "execute [IISU_RELEASE].[Curriculum].[GetChairReport] @Chair =" _
    & Chair & ", @EducationYear = " & EducationYear
    
    Dim rs As New ADODB.Recordset
    rs.Open cmd
    rs.MoveFirst
безболезненно меняется на это:
Код: plaintext
1.
2.
3.
    Dim rs As New ADODB.Recordset
    set rs=cn.Execute "execute [IISU_RELEASE].[Curriculum].[GetChairReport] @Chair =" _
    & Chair & ", @EducationYear = " & EducationYear
    
rs.MoveFirst тоже не нужен

Сделал, теперь на проблемных данных свойство State у rs равно нулю, а при попытке rs.NextRecordset выдается ошибка "Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции"
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712395
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chester49,

у вас в процедурах PGetChairTeachingLoad и PGetChairTeachingLoadCalculationItemList стоит set nocount on?
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712413
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только щас заметил - неправильно:
chester49
Код: plaintext
1.
2.
3.
    Do While rs.State =  0 
        rs.NextRecordset
    Loop
Не помогает, происходит зацикливание.
вот так должно быть:
Код: plaintext
1.
2.
3.
    Do While rs.State =  0 
        set rs=rs.NextRecordset
    Loop
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712421
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chester49
Сделал, теперь на проблемных данных свойство State у rs равно нулю, а при попытке rs.NextRecordset выдается ошибка "Текущий проводник не поддерживает возврат нескольких наборов записей в результате одной операции"

Что-то непонятно... очень сложно удаленно разбираться.
Драйвер у вас стандартный, все он должен поддерживать...
ADO, надеюсь, свежий?

попробуйте сделать процедуру
Код: plaintext
1.
2.
3.
4.
create proc _a
as 
select  1 
select  2 
select  3 
и принять эти данные на клиенте
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712491
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первичный код автора рабочий, забирал данные на VB и запихивал в грид, все работает.
Применял в Excel'е, с небольшими отличиями, проблем также не наблюдал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
   Set cn = CreateObject("ADODB.Connection")
   Set rs = CreateObject("ADODB.Recordset")
   Set cmd = CreateObject("ADODB.Command")
   
    cn.ConnectionString = "......"
    cn.Open
    
    cmd.ActiveConnection = cn
    cmd.CommandType =  1 
    cmd.CommandText = "select * from table"
    
    rs.Open cmd
    rs.MoveFirst
    
    q =  2 
    Do Until rs.EOF
        Cells(q,  1 ) = rs.Fields( 0 )
        Cells(q,  2 ) = rs.Fields( 1 )
        q = q +  1 
        rs.MoveNext
    Loop
Формирование проходит без проблем.
Автору еще раз обратить внимание на свою процедуру и на возвращаемые данные.
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712612
chester49
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо.
Проблема решилась.
Скорее всего ошибка была именно тут:
Код: plaintext
1.
2.
3.
    Do While rs.State =  0 
        rs.NextRecordset
    Loop
После того как подписал "Set rs = " все данные грузятся нормально.
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712622
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chester49Всем спасибо.
Проблема решилась.
Скорее всего ошибка была именно тут:
Код: plaintext
1.
2.
3.
    Do While rs.State =  0 
        rs.NextRecordset
    Loop
После того как подписал "Set rs = " все данные грузятся нормально.

странно другое - что получали пустые рекордсеты, несмотря на set nocount
ну да ладно, решилось и решилось.
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712638
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chester49,

Тогда еще дам несколько советов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    Do Until rs.EOF
        Cells(q,  1 ) = rs.Fields( 0 )
        Cells(q,  2 ) = rs.Fields( 1 )
        Cells(q,  3 ) = rs.Fields( 2 )
        Cells(q,  4 ) = rs.Fields( 3 )
        Cells(q,  5 ) = rs.Fields( 4 )
        Cells(q,  6 ) = rs.Fields( 5 )
        Cells(q,  7 ) = rs.Fields( 6 )
        Cells(q,  8 ) = rs.Fields( 7 )
        Cells(q,  9 ) = rs.Fields( 8 )
        Cells(q,  10 ) = rs.Fields( 9 )
        Cells(q,  11 ) = rs.Fields( 10 )
        Cells(q,  12 ) = rs.Fields( 11 )
        Cells(q,  13 ) = rs.Fields( 12 )
        Cells(q,  14 ) = rs.Fields( 13 )
        Cells(q,  15 ) = rs.Fields( 14 )
        Cells(q,  16 ) = rs.Fields( 15 )
        q = q +  1 
        rs.MoveNext
    Loop
можно заменить на
Код: plaintext
1.
2.
3.
4.
5.
6.
    Do Until rs.EOF
        for i= 0  to  15 
          Cells(q, i+ 1 ) = rs.Fields(i)
        next
        q = q +  1 
        rs.MoveNext
    Loop

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
		CASE TeachingLoadObjectID
			WHEN  12  THEN TeachingLoadHourQuantity
			WHEN  13  THEN TeachingLoadHourQuantity
			WHEN  14  THEN TeachingLoadHourQuantity
			WHEN  23  THEN TeachingLoadHourQuantity
			WHEN  35  THEN TeachingLoadHourQuantity
			WHEN  39  THEN TeachingLoadHourQuantity
			WHEN  50  THEN TeachingLoadHourQuantity
			WHEN  55  THEN TeachingLoadHourQuantity
			WHEN  64  THEN TeachingLoadHourQuantity
			WHEN  65  THEN TeachingLoadHourQuantity
			WHEN  85  THEN TeachingLoadHourQuantity
			WHEN  87  THEN TeachingLoadHourQuantity
			WHEN  89  THEN TeachingLoadHourQuantity
			WHEN  90  THEN TeachingLoadHourQuantity
			WHEN  91  THEN TeachingLoadHourQuantity
			WHEN  92  THEN TeachingLoadHourQuantity
			WHEN  93  THEN TeachingLoadHourQuantity
			WHEN  94  THEN TeachingLoadHourQuantity
			WHEN  95  THEN TeachingLoadHourQuantity
			WHEN  96  THEN TeachingLoadHourQuantity
			WHEN  97  THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'GAK',
можно заменить на это

Код: plaintext
1.
2.
3.
		CASE WHEN TeachingLoadObjectID IN ( 12 , 13 , 14 , 23 , 35 , 39 , 50 , 55 , 64 , 65 , 85 , 87 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 , 97 )
			THEN TeachingLoadHourQuantity
			ELSE  0 
		END AS 'GAK',
хотя для таких списков по уму заводятся таблицы...
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712780
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    Do Until rs.EOF
        for i= 0  to rs.Fields.Count
          Cells(q, i+ 1 ) = rs.Fields(i)
        next
        q = q +  1 
        rs.MoveNext
    Loop

Так еще лучше :)
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712787
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kiv-1980Так еще лучше :)
Не лучше, это не эквивалент.
К тому же советуй внимательней:
Код: plaintext
rs.Fields.Count- 1 
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36712799
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro ,
Спасибо за поправку :)
...
Рейтинг: 0 / 0
SQL в VBA (операция не допускается если объект закрыт)
    #36713175
няка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а еще лучше весь этот цикл заменить на:
Код: plaintext
1.
Cells( 2 ,  1 ).CopyFromRecordset rs
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / SQL в VBA (операция не допускается если объект закрыт)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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