Сотрудница
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
f_vadim
02.03.16
✎
14:57
а drop table разве возвращает какой-то recordset?
или я чего-то не понимаю?
Сотрудница
02.03.16
✎
15:03
он таблицу временную удаляет, без этого на sql ms идет ошибка, что такая таблица уже существует
f_vadim
02.03.16
✎
15:07
видимо придётся сделать усилие и вынести drop table в третий запрос
rsv
02.03.16
✎
15:07
(0) Да оберните все в хранимку и дерните ее.
rsv
02.03.16
✎
15:09
В хранимке drop table #points можно не писать т.к. они удаляются сами .
f_vadim
02.03.16
✎
15:12
а можно ещё сделать соответствие соответствий по общим полям и запихать в них структуру с дополнительными полями.
это просто мысль, как альтернатива — производительность и потребление ресурсов нужно проверять.
f_vadim
02.03.16
✎
15:12
(6) не в ту ветку
rsv
02.03.16
✎
15:14
и всего одна строка вызова Exec МояХранимка . Просто и коротко.
Сотрудница
09.03.16
✎
12:45
(3)
убрала «drop table #points» из запроса
выходит та же ошибка
HardBall
09.03.16
✎
13:45
(9) Нет записей?
Сотрудница
09.03.16
✎
13:46
(10) копирую текст запроса, выполняю его в sql — записи есть
Ёпрст
09.03.16
✎
13:50
по адо хочешь пакетник выполнить ?
Ёпрст
09.03.16
✎
13:51
выкини дроп и первый запрос помести просто в подзапрос во втором селекте(заместо создания временной таблички)
Ёпрст
09.03.16
✎
13:51
усё
Сотрудница
09.03.16
✎
13:55
(12,13,14)
угу, хотела
не работает такое, да?
сначала так и сделала, но в sql посмотрела, что с подзапросом намного дольше выполняется
хотела оптимизировать
Ёпрст
09.03.16
✎
13:56
(15) неа
olegves
09.03.16
✎
13:57
(15) между запросами знак ; проставь или операторы используй Begin…End
olegves
09.03.16
✎
13:59
+(17) а дроп выполняй уже после обработки результата запроса
Сотрудница
09.03.16
✎
14:09
(17, 18) «;» уже пробовала, не помогло
дроп убрала вообще, почему-то не ругается на существующую таблицу, может она между запросами уничтожается…
Записьдампа
09.03.16
✎
14:14
(0) Верни запрос в исходное сосотяние и напиши в начале SET NOCOUNT ON
Специалистов развелось…
Сотрудница
09.03.16
✎
14:16
(20) в исходное — это в какое? как в (0)?
Записьдампа
09.03.16
✎
14:18
(21) да, вместе с дропом времянки и т.п.
Сотрудница
09.03.16
✎
14:20
(22) оо, спасибо большое!! все получилось
Записьдампа
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
asked Jun 20, 2014 at 22:07
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
answered Jun 20, 2014 at 22:35
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 |
|
||
---|---|---|---|
Ошибка при получении значения атрибута контекста (ТекущийПользователь): Попытка получения неинициализированного значения параметра сеанса
Пользователь = ПараметрыСеанса.ТекущийПользователь; по причине: Попытка получения неинициализированного значения параметра сеансаКод 1C v 8.х
Где происходит их инициализация? |
Yandex |
|
||
---|---|---|---|
E_Migachev |
|
||
---|---|---|---|
Когда в Общие — Параметры сеанса добавил ТекущийПользователь, то его нужно определять при загрузке:
так же в процедуре ПриНачалеРаботыСистемы пишешь что то типо: Код 1C v 8.х
Это работает при условии, что ИмяПользователя заданное в конфигураторе, равно Имени введенному в справочнике Пользователей в реквизит Код |
bless18 |
|
||
---|---|---|---|
|
А если не совпадают, можно как-нибудб привязать пользователя к сотруднику? |
E_Migachev |
|
||
---|---|---|---|
А лучше добавить процедуру в Модуль сеанса(Правой клавишей щелкаещь на названии конфигурации и выбираешь Открыть модуль сеанса)
В ней создаешь Процедура УстановкаПараметровСеанса () и в ней пишешь код который я предложил выше или так, Если не совпадают: Код 1C v 8.х
Эта процедура вызывается раньше чем ПриНачалеРаботыСистемы. Ну а дальше подставлять сопоставленное значение при создании соответствующего документа: Код 1C v 8.х
События модуля сеанса: |
bless18 |
|
||
---|---|---|---|
|
Спасибо вам огромное! Вы мне очень помогли! |
bless18 |
|
||
---|---|---|---|
Спасибо вам огромное! Вы мне очень помогли! |
E_Migachev |
|
||
---|---|---|---|
Пожалуйста |
Подсказка: Вы получили ответ на свой вопрос — закройте вопрос! |