Ошибка при получении значения атрибута контекста eof

запрос sql возвращает ошибку ☑ 0

Сотрудница

02.03.16

14:53

есть пара функций, откуда вызываются запросы, соответственно запросов тоже два.

один попроще, отрабатывает нормально

на втором выходит ошибка:

Ошибка при получении значения атрибута контекста (EOF)

        Если RecordSet.EOF И RecordSet.BOF Тогда

по причине:

Произошла исключительная ситуация (ADODB.Recordset): Operation is not allowed when the object is closed.

функции с запросами отличаются только собственно текстами запросов.

второй запрос на sql ms отработал тоже верно, но в 1с идет ошибка

в чем может быть дело?

вот тест второго запроса

SELECT distinct

    n_rtcustomer

into #points

FROM rtcustomers  

WHERE n_kc = 0

        and n_canal = ‘2’

        and n_region = ‘1063’

        AND n_rtcustomerDS = ‘120328’

        and n_zone = 0

        and n_categ in (‘5′,’6’)

        and n_mmode in (‘1’)

CREATE unique clustered  index MyIndex1 on #points(n_rtcustomer)

SELECT distinct

    Sale.n_rtcustomer

FROM

    Sale

    inner join #points as t2

    on Sale.n_rtcustomer = t2.n_rtcustomer

WHERE

    SaleMarker = ‘1’

    AND date < ‘20160201’

    AND date >= ‘20150801’

    AND n_region = ‘1063’AND n_rtcustomerDS = ‘120328’

                                
drop table #points

1

f_vadim

02.03.16

14:57

а drop table разве возвращает какой-то recordset?

или я чего-то не понимаю?

2

Сотрудница

02.03.16

15:03

он таблицу временную удаляет, без этого на sql ms идет ошибка, что такая таблица уже существует

3

f_vadim

02.03.16

15:07

видимо придётся сделать усилие и вынести drop table в третий запрос

4

rsv

02.03.16

15:07

(0) Да оберните все в хранимку  и дерните ее.

5

rsv

02.03.16

15:09

В хранимке drop table #points можно  не писать т.к. они  удаляются сами  .

6

f_vadim

02.03.16

15:12

а можно ещё сделать соответствие соответствий по общим полям и запихать в них структуру с дополнительными полями.

это просто мысль, как альтернатива — производительность и потребление ресурсов нужно проверять.

7

f_vadim

02.03.16

15:12

(6) не в ту ветку :(

8

rsv

02.03.16

15:14

и всего одна строка вызова Exec МояХранимка .  Просто и коротко.

9

Сотрудница

09.03.16

12:45

(3)

убрала «drop table #points» из запроса

выходит та же ошибка

10

HardBall

09.03.16

13:45

(9) Нет записей?

11

Сотрудница

09.03.16

13:46

(10) копирую текст запроса, выполняю его в sql — записи есть

12

Ёпрст

09.03.16

13:50

по адо хочешь пакетник выполнить ?

13

Ёпрст

09.03.16

13:51

выкини дроп и первый запрос помести просто в подзапрос во втором селекте(заместо создания временной таблички)

14

Ёпрст

09.03.16

13:51

усё

15

Сотрудница

09.03.16

13:55

(12,13,14)

угу, хотела

не работает такое, да?

сначала так и сделала, но в sql посмотрела, что с подзапросом намного дольше выполняется

хотела оптимизировать

16

Ёпрст

09.03.16

13:56

(15) неа

17

olegves

09.03.16

13:57

(15) между запросами знак ; проставь или операторы используй Begin…End

18

olegves

09.03.16

13:59

+(17) а дроп выполняй уже после обработки результата запроса

19

Сотрудница

09.03.16

14:09

(17, 18) «;» уже пробовала, не помогло

дроп убрала вообще, почему-то не ругается на существующую таблицу, может она между запросами уничтожается…

20

Записьдампа

09.03.16

14:14

(0) Верни запрос в исходное сосотяние и напиши в начале SET NOCOUNT ON

Специалистов развелось…

21

Сотрудница

09.03.16

14:16

(20) в исходное — это в какое? как в (0)?

22

Записьдампа

09.03.16

14:18

(21) да, вместе с дропом времянки и т.п.

23

Сотрудница

09.03.16

14:20

(22) оо, спасибо большое!! все получилось

24

Записьдампа

09.03.16

14:21

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

if not object_id(‘tempdb..points’) is null drop table #points

Тогда при развале логики неожиданностей не будет

вот запрос:

WITH GOODS AS (SELECT TT.N_USER_ID,
TT.VC_CODE,
TT.N_GOOD_ID,
TT.N_PRICE_DOC_ID,
TT.VC_PRICE_DOC

FROM SI_V_USER_GOODS UG,
TABLE(SI_USERS_PKG_S.USER_AVAILABLE_SERVS_LIST(
num_N_CONTRACT_ID => UG.N_DOC_ID,
num_N_ACCOUNT_ID => UG.N_ACCOUNT_ID,
num_N_OBJECT_ID => UG.N_OBJECT_ID,
dt_D_OPER => SYSDATE)) TT

WHERE UG.C_FL_CLOSED = ‘N’
AND UG.N_SUBJ_GOOD_TYPE_ID != SYS_CONTEXT(‘CONST’, ‘GOOD_SUBJ_Enable’)
),

PRICE AS (SELECT DISTINCT G.N_GOOD_ID,
G.N_USER_ID,
G.VC_CODE,
G.VC_PRICE_DOC,
DC.N_PRICE,
INDC.N_SPEED_VOLUME IN_SPEED,
INDC.N_SPEED_UNIT_ID IN_VALUE_SPEED,
OUTDC.N_SPEED_VOLUME OUT_SPEED,
OUTDC.N_SPEED_UNIT_ID OUT_VALUE_SPEED
FROM GOODS G,
SD_V_PRICE_ORDERS_C DC,
SD_V_PRICE_ORDERS_C INDC,
SD_V_PRICE_ORDERS_C OUTDC
WHERE G.N_PRICE_DOC_ID = DC.N_DOC_ID
AND G.N_GOOD_ID = DC.N_GOOD_ID
AND DC.N_PRICE_ORDER_LINE_ID = INDC.N_PAR_LINE_ID (+)
AND DC.N_PRICE_ORDER_LINE_ID = OUTDC.N_PAR_LINE_ID (+)
AND INDC.N_GOOD_ID (+) = 40213701
AND OUTDC.N_GOOD_ID (+) = 40213501)

SELECT SI_SUBJECTS_PKG_S.GET_VC_CODE(N_USER_ID) VC_SUBJ,
VC_CODE,
VC_PRICE_DOC,
N_PRICE,
IN_SPEED,
CASE IN_VALUE_SPEED
WHEN 2050 THEN ‘Мбит/с’
WHEN 1050 THEN ‘Кбит/с’
WHEN 3050 THEN ‘бит/с’
END IN_VALUE_SPEED,
OUT_SPEED,
CASE OUT_VALUE_SPEED
WHEN 2050 THEN ‘Мбит/с’
WHEN 1050 THEN ‘Кбит/с’
WHEN 3050 THEN ‘бит/с’
END OUT_VALUE_SPEED
FROM PRICE;

Всем привет! Читаю данные из файла Excel через ado. Все читается нормально, но: есть колонка «Счет», и счет может быть представлен как строка, например, «60.01», а может как число, например 76. Так вот, которые как строка — нормально считываются, а которые как число — те равны Null. Есть ли какой-то выход в данной ситуации?

Null когда читаешь с excel  или когда ?

Null при чтении, т.е. если в ячейке число (например,76), то rs.Fields.value = Null а если в ячейке строка, например «60.2», то rs.Fields.value = «60.2»

Да, через меня нормально только строки читаются. По крайней мере в 1С. Делай в запросе преобразование к строке.

!!!! ты именно тот, кто может помочь !!! помоги, пожалуйста, не соображу, как мне в данном случае запрос переделать, сейчас код такой:        Сообщить(«Не удалось выполнить запрос к файлу Excel

Звездочку убери, перечисли поля поименно и заключи каждое вот в такую конструкцию: CAST(имя_поля AS char)

Вопрос под тему: АДО поймет русское название колонок?

А фик его знает. По идее должен.

+ Вообще, это, конечно, от драйвера источника зависит.

зависит от провайдера, во многих случаях помогает [] на крайний случай есть индекс колонки

Поменял запрос на такой (никакой код, кроме текста запроса не менял): В итоге ошибка: {Форма.Форма.Форма}: Ошибка при получении значения атрибута контекста (EOF)    Пока НЕ rs.EOF Цикл по причине: Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.

) Спасибо, Попробую. Если не взлетит, буду делать классическим способом.

Еще вопросик: через dll-ку «ёсел.dll» будет не медленнее читать файл Excel, чем COMОбъект(«Excel.Application»)?

строку подключения поменяй поставь в ней заветные ;HDR=No;IMEX=1″ и убери CAST

наверное, это тестировать надо. У меня всё же просьба ответить на , а то начинаем немного от темы отходить.

ты не мог бы строку подключения полностью привести? Моя первоначальная: А то вот так пишу — ошибку выдает: ConnectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=» + ИмяФайлаЗагрузки + «;Extended Properties=» + «Excel 8.0;HDR=No;IMEX=1»;

Огромное спасибо, взлетело!!! Спасибо всем участникам!!!

вот что IMEX животворящий делает

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

I’m getting this error with my asp page when i try to run a SQL query:

ADODB.Recordset error ‘800a0bcd’

Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.

The code is:

' -- connect to Database1.accdb database --

set conn1 = server.createobject("adodb.connection")
conn1.open "provider = microsoft.ace.oledb.12.0;data source =  C:\Users\nam2611\Documents\My Web Sites\WebSite1\Database3.accdb"

' -- get product recordset --

set rs1 = server.createobject("ADODB.Recordset")
rs1.open "select * from product where P_code like 'ap'", conn1

x = "<table border = 1 width= 1000><tr><th>code<Th>product name<th>Type<th>Price</Tr>"
response.write x

' -- create the table entries for each student --

rs1.movefirst
while not rs1.eof
    x = "<tr><td>" & rs1("P_code") & "<td>" & rs1("P_name") & "<td>" & rs1("P_description") & "<td>" & rs1("P_price") & "</tr>"
    response.write x
    rs1.movenext
wend
response.write "</table>"

' -- close the datbase --
rs1.close
conn1.close
set rs1 = nothing

  • sql
  • asp.net
  • vbscript
  • asp-classic
  • adodb

Cristian Ciupitu's user avatar

asked Jun 20, 2014 at 22:07

user37616's user avatar

1 Answer

If you call MoveFirst() and the recordset is empty, it throws an error.
You should check for EOF:

If Not rs1.EOF Then
    rs1.movefirst
    ' your loop
    ' ...
End If

Cristian Ciupitu's user avatar

answered Jun 20, 2014 at 22:35

marathonman's user avatar

marathonmanmarathonman

4524 silver badges9 bronze badges

1

  • How do you check if a RecordSet is empty? It’s entirely possible for a non-empty recordset to have EOF = true.

    Jul 24, 2017 at 19:47

Ошибка при получении значения атрибута контекста (ТекущийПользователь)

bless18
06.04.2010 09:32 Прочитано: 52563

Ошибка при получении значения атрибута контекста (ТекущийПользователь): Попытка получения неинициализированного значения параметра сеанса
Пользователь = ПараметрыСеанса.ТекущийПользователь;
по причине:
Попытка получения неинициализированного значения параметра сеансаКод 1C v 8.х

 Процедура ПриНачалеРаботыСистемы()
Пользователь = ПараметрыСеанса.ТекущийПользователь;
Если обЗначениеНеЗаполнено(Пользователь.Сотрудник) Тогда
ИмяПользователя = СокрЛП(Пользователь.Наименование);
Иначе
ИмяПользователя = СокрЛП(Пользователь.Сотрудник.Наименование);
КонецЕсли;
Предупреждение("Здравствуйте уважаемый пользователь """+ИмяПользователя+"""
|Система готова к работе.", 3);
КонецПроцедуры

Где происходит их инициализация?

Yandex
Возможно, вас также заинтересует

Реклама на портале

E_Migachev
06.04.2010 09:48 Ответ № 1

Когда в Общие — Параметры сеанса добавил ТекущийПользователь, то его нужно определять при загрузке:
так же в процедуре ПриНачалеРаботыСистемы пишешь что то типо:
Код 1C v 8.х

 ИмяПользователя = ИмяПользователя();
Если Не ПустаяСтрока(ИмяПользователя) Тогда
ТекущийПользователь = Справочники.Пользователи.НайтиПоКоду(ИмяПользователя);
КонецЕсли;
ПараметрыСеанса.ТекущийПользователь = ТекущийПользователь;

Это работает при условии, что ИмяПользователя заданное в конфигураторе, равно Имени введенному в справочнике Пользователей в реквизит Код

bless18
06.04.2010 09:56 Ответ № 2

А если не совпадают, можно как-нибудб привязать пользователя к сотруднику?

E_Migachev
06.04.2010 09:57 Ответ № 3

А лучше добавить процедуру в Модуль сеанса(Правой клавишей щелкаещь на названии конфигурации и выбираешь Открыть модуль сеанса)

В ней создаешь Процедура УстановкаПараметровСеанса () и в ней пишешь код который я предложил выше или так, Если не совпадают:

Код 1C v 8.х

 Процедура УстановкаПараметровСеанса()
Спр = Справочники.Сотрудники;
ПараметрыСеанса.ТекущийПользователь=Спр.НайтиПоРеквизиту("Пользователь1С", ИмяПользователя());
КонецПроцедуры
//где Пользователь1С, это реквизит справочника сотрудники, и именем как вбито в конфигураторе

Эта процедура вызывается раньше чем ПриНачалеРаботыСистемы.

Ну а дальше подставлять сопоставленное значение при создании соответствующего документа:

Код 1C v 8.х

  Док.Пользователь=ПараметрыСеанса.Пользователь;   

События модуля сеанса:
Глобальный контекст
УстановкаПараметровСеанса (SessionParametersSetting)
Синтаксис:
УстановкаПараметровСеанса(<Требуемые параметры>)
Параметры:
<Требуемые параметры>
Тип: Массив; Неопределено. Массив устанавливаемых идентификаторов параметров сеанса, которые нужно инициализировать, если обработчик вызывается перед использованием неинициализированных параметров сеанса.
Неопределено, если обработчик события вызывается системой при начале сеанса или при захвате соединения из пула.
Описание:
Событие предназначено для инициализации параметров сеанса.
Вызывается системой:
при установке соединения с информационной базой или при захвате соединения с информационной базой из пула до вызова всех остальных обработчиков. Значение параметра «Параметры сеанса» — Неопределено;
перед фактическим использованием значений параметров сеанса, которые не были инициализированы ранее. В этом случае значением параметра «Параметры сеанса» является массив идентификаторов неинициализированных параметров сеанса, значения которых используются. Если после выполнения обработчика хотя бы один из перечисленных параметров сеанса остается неинициализированным, то возникает исключение.

bless18
06.04.2010 12:13 Ответ № 4

Спасибо вам огромное! Вы мне очень помогли!

bless18
06.04.2010 12:15 Ответ № 5

Спасибо вам огромное! Вы мне очень помогли!

E_Migachev
06.04.2010 15:44 Ответ № 6

Пожалуйста )

Подсказка: Вы получили ответ на свой вопрос — закройте вопрос!

Понравилась статья? Поделить с друзьями:
  • Ошибка при подготовке описаний подсистем 1с
  • Ошибка при перезагрузке при установке windows
  • Ошибка при получении доступа к микрофону вк яндекс
  • Ошибка при подготовке к установке autodesk revit 2022
  • Ошибка при открытии gpedit msc