Имя: Пароль:
1C
1С v8
1C и SQL. Ошибка
0 Катя84
 
09.07.12
18:38
Делаю запрос к SQL

НаSQLSrvMP = "";
СоединениеМП = ПолучитьCOMОбъект("","ADODB.Connection");
СоединениеМП.ConnectionTimeOut = 600;
стрПодключения = "Provider=SQLOLEDB;";
стрПодключения = стрПодключения + "Data Source=MP-Server;";
стрПодключения = стрПодключения + "Uid=mp;";
стрПодключения = стрПодключения + "Pwd=mp;";
стрПодключения = стрПодключения + "DataBase=GuidForMP;";
СоединениеМП.Open(стрПодключения);
cmdMP=ПолучитьCOMОбъект("","ADODB.Command");
cmdMP.ActiveConnection = СоединениеМП;
cmdMP.CommandTimeOut = 600;
cmdMP.CommandType = 1;
НаSQLSrvMP = "
|use processingserver
|select  'Время' = cast(substring(DOC.accountdoctime,1,8)+' '+substring(DOC.accountdoctime,9,2)+':'+substring(DOC.accountdoctime,11,2)+':'+substring(DOC.accountdoctime,13,2) as datetime),
|   'Карта' = DOC.dcardid-- when '' then 'Выгружено из 1С' else 'Маркет+' end
|,
|'ТТ' = case doc.systemid when 0 then 'Внешнаяя Система' else sareaname end,
|doc.systemid as Kacca,
|   'Сумма' = cast(TRANS.transsum/100 as decimal(18,2)) ,
|   'тип документа' = case DOC.ACCOUNTDOCTYPE  
|      when 0 then 'Оплата'
|      /*when 2 then 'Возврат'*/
|      when 3 then 'Отмена оплаты'
|      when 4 then 'Начисление'
|      when 5 then 'Снятие через внешнюю систему'
|      when 6 then 'Перемещение'
|      when 7 then 'Конвертация'
|      when 8 then 'Возврат по схеме оплаты'
|      when 9 then 'Возврат по чеку'
|     end
|     from accounttransroot as  TRANS
|     join accountdocroot as DOC
|        on TRANS.ACCOUNTDOCID1=DOC.ACCOUNTDOCID1 and TRANS.ACCOUNTDOCID2=DOC.ACCOUNTDOCID2
|     join sarea on doc.sareaid=sarea.sareaid
|     where accountid1=(select accountid1 from account where clntid=(select clntid from dcard where dcardcode='"+ТКС1+"') and accounttypeid=(select clntgrpid from clnt where clntid=(select clntid from dcard where dcardcode='"+ТКС1+"'))) and accountid2=(select accountid2 from account where clntid=(select clntid from dcard where dcardcode='"+ТКС1+"') and accounttypeid=(select clntgrpid from clnt where clntid=(select clntid from dcard where dcardcode='"+ТКС1+"'))) and accountdoctime >= '20120707'
|
|order by Время
|select 'Текущая сумма на счету' = cast(accountsum/100 as decimal(18,2)) from account where clntid=(select clntid from dcard where dcardcode='"+ТКС1+"') and accounttypeid=(select clntgrpid from clnt where clntid=(select clntid from dcard where dcardcode='"+ТКС1+"'))
";
cmdMP.CommandText = НаSQLSrvMP;
RsMP = cmdMP.Execute();<---- ЗДЕСЬ ВЫЛЕТАЕТ ПО ОШИБКЕ
.........

На этом месте выскакивает ошибка:
Ошибка при вызове метода контекста (EOF)
Пока RsMP.EOF()=0 Цикл
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.

Что это означает "объект закрыт"?
1 Jaap Vduul
 
09.07.12
18:39
Означает, что объект не открыт.
2 Катя84
 
09.07.12
18:41
(1)как его открыть?
3 Jaap Vduul
 
09.07.12
18:43
set nocount on
4 МихаилМ
 
09.07.12
18:47
сделайте раздельно prepere и open (~= execute)

ну и документацию на ado db почитайте.

вобщее бред а не текст запроса

where accountid1=(select  ... where accountid1=(select  ... where accountid1=(select

это профнепригодность.
5 Стальная Крыса
 
09.07.12
18:47
созданный запрос не возвращает набора данных.
лучше увидеть текст созданного запроса, а не код, который его формирует
6 Стальная Крыса
 
09.07.12
18:50
условия WHERE просто пипец...
7 Катя84
 
09.07.12
18:51
(4) да,дурацкий текст. Я второй день как пытаюсь напрямую с SQL данные получать.
при использовании команд use, set не выполнялся запрос в 1с. Прочитала в инете, что с ними не дружит 1с. Обманули? Когда пытаюсь обойти команды,то работает.
(5) в SQL менеджмент студии запрос выполняется
8 Катя84
 
09.07.12
18:52
самой весело смотреть:) так что попрошу без пипец. учусь методом тыка и чтением инета,других материалов нет под рукой...
9 Катя84
 
09.07.12
18:53
Изначально запрос был такой:
use processingserver
declare @dcard nvarchar(13);
declare @clnt int;
declare @account1 bigint;
declare @account2 bigint;
declare @doc1 bigint;
declare @doc2 bigint;
declare @type int;
     /*  /   .!!!!!!!!!!!!!!!!!!!!!!!.  */
set @dcard = '2907010854266';
   
set @clnt = (select clntid from dcard where dcardcode=@dcard);
set @type  = (select clntgrpid from clnt where clntid=@clnt);
if @type not between 3 and 4 set @type=1;
set @account1 = (select accountid1 from account where clntid=@clnt and accounttypeid=@type);
set @account2 = (select accountid2 from account where clntid=@clnt and accounttypeid=@type);

select  'Время' = cast(substring(DOC.accountdoctime,1,8)+' '+substring(DOC.accountdoctime,9,2)+':'+substring(DOC.accountdoctime,11,2)+':'+substring(DOC.accountdoctime,13,2) as datetime),
  'Карта' = DOC.dcardid-- when '' then 'Выгружено из 1С' else 'Маркет+' end
,
'ТТ' = case doc.systemid when 0 then 'Внешнаяя Система' else sareaname end,
doc.systemid as Kacca,
  'Сумма' = cast(TRANS.transsum/100 as decimal(18,2)) ,
  'тип документа' = case DOC.ACCOUNTDOCTYPE  
     when 0 then 'Оплата'
     /*when 2 then 'Возврат'*/
     when 3 then 'Отмена оплаты'
     when 4 then 'Начисление'
     when 5 then 'Снятие через внешнюю систему'
     when 6 then 'Перемещение'
     when 7 then 'Конвертация'
     when 8 then 'Возврат по схеме оплаты'
     when 9 then 'Возврат по чеку'
    end
    from accounttransroot as  TRANS
    join accountdocroot as DOC
       on TRANS.ACCOUNTDOCID1=DOC.ACCOUNTDOCID1 and TRANS.ACCOUNTDOCID2=DOC.ACCOUNTDOCID2
    join sarea on doc.sareaid=sarea.sareaid
    where accountid1=@account1 and accountid2=@account2 and accountdoctime >= '20120707'

order by Время
select 'Текущая сумма на счету' = cast(accountsum/100 as decimal(18,2)) from account where clntid=@clnt and accounttypeid=@type
10 Стальная Крыса
 
09.07.12
18:53
(7) чтобы понять - что не так
нужно посмотреть в текст сформированного запроса, текст запроса в студию
11 Стальная Крыса
 
09.07.12
19:00
(9) мда... кто-то конкретную траву курил...
у меня такой травы нету, буквы расплываются
12 Стальная Крыса
 
09.07.12
19:02
processingserver - это БД ?
13 Sorm
 
09.07.12
19:10
(12) Это БД.
(0) Для начала выполните вот такой запрос  = "Select top 1  clntid from dcard". Если выполнится - проблема в запросе, если нет - в ком-объекте.
14 Стальная Крыса
 
09.07.12
19:14
(0) а какой сакральный смысл подключения к одной БД, а данные тянуть из другой ?
15 МихаилМ
 
09.07.12
19:18
странный подход

стрПодключения = стрПодключения + "DataBase=GuidForMP;";

и

use processingserver
16 sapphire
 
09.07.12
20:28
(0)
1)EOF - это свойство, а не метод.
2) Желательно вызвать метод MoveFirst() для объекта RecordSet
3) Запрос гумно
17 Катя84
 
10.07.12
10:23
(13)запрос выполняется.
18 Конфигуратор1с
 
10.07.12
10:35
а чем внешние источники данных не подошли?
19 Катя84
 
10.07.12
10:39
(18)Данные все в СКЛ базе хранятся.
20 netDog
 
10.07.12
10:40
(19) и? Внешние источники прекрасно забирают данные из СКЛ)
21 Конфигуратор1с
 
10.07.12
10:45
(19)так внешние источники данных для того и создали, что бы данные из других баз тянуть