Имя: Пароль:
1C
1С v8
ADODB текст запроса из файла
,
0 vbh
 
16.05.12
09:07
можно ли исполнить sql запрос из файла, например "c:\zapros.sql"
т.е. не использовать

   Command.CommandText ="текст запроса"
       Command.Execute();
а что-нибудь типа
       RS=Новый COMОбъект("ADODB.Recordset");
       RS.Open("C:\zapros.sql",Конект,2,3);

задача исполнить запрос из файла c:\zapros.sql и загрузить его в ТЗ
1 shuhard
 
16.05.12
09:14
(0) нет
2 Wobland
 
16.05.12
09:17
Опен(ТекстДок.ПолучитьТекст()) тогда уж
3 vbh
 
16.05.12
09:32
(2) работает но 1ска вылетает (
4 shuhard
 
16.05.12
09:33
(3) текст запроса  в студию
5 vbh
 
16.05.12
09:35
SELECT * from
 (select
   SS.SRVTYPEID*ST.SRVTYPEID AS "SRVTYPEID",
   SS.UNAME||ST.UNAME AS "UNAME",
   A.ID,  
   AI.ANAME AS ADVCOMMENT,
   AI.CONTRACTNUM,
   billing_applications.stat_summ_sf(A.ID,S.SRVTYPEID,:SD,:ED, SS.SRVTYPEID) as SUMM,
   AI.SFNEED,
   billing_applications.Stat_Quantity_SF(A.ID,S.SRVTYPEID,:SD,:ED, SS.SRVTYPEID) as AMOUTH,
   AI.POSTDISPACH,
   (select t.SFNUM from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCNUM,
   (select t.tdate from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCDATE
 from
   Accounts A, Accountsinfo AI, Servicetypes ST,
     (select distinct S.ID,S.SRVTYPEID from services S) S,(select '' AS "UNAME",1 AS "SRVTYPEID" from dual /*union select '????. ?????: ',-1 from dual*/) SS
 where
 A.ID=AI.ID AND S.ID=A.ID AND
 A.DELETED = 'N' AND A.DFLAG='U' AND
 S.SRVTYPEID=ST.SRVTYPEID
 union all
 select
   -1*ST.SRVTYPEID AS "SRVTYPEID",
   '????. ?????: '||ST.UNAME AS "UNAME",
   A.ID,  
   AI.ANAME AS ADVCOMMENT,
   AI.CONTRACTNUM,
   P.SUMM as SUMM,
   AI.SFNEED,
   P.QUANTITY as AMOUTH,
   AI.POSTDISPACH,
   (select t.SFNUM from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCNUM,
   (select t.tdate from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCDATE
 from
   Accounts A, Accountsinfo AI, Servicetypes ST, services SS, payments P
     --(select distinct S.ID,S.SRVTYPEID from ) S,(/*select '' AS "UNAME",1 AS "SRVTYPEID" from dual union*/ select '????. ?????: ' AS "UNAME",-1 AS "SRVTYPEID" from dual) SS
 where
 A.ID=AI.ID
 AND SS.ID=A.ID
 AND A.DELETED = 'N'
 AND A.DFLAG='U'
 AND P.PDATE between :SD AND :ED)
6 vbh
 
16.05.12
09:40
в жабе запрос исполняется на ура
7 Wobland
 
16.05.12
09:41
'????. ?????: '||ST.UNAME AS "UNAME",

явно не текст запроса
8 vbh
 
16.05.12
09:42
(7) да, там на русском, скопировалось коряво, сейчас подправлю
9 vbh
 
16.05.12
09:43
SELECT * from
 (select
   SS.SRVTYPEID*ST.SRVTYPEID AS "SRVTYPEID",
   SS.UNAME||ST.UNAME AS "UNAME",
   A.ID,  
   AI.ANAME AS ADVCOMMENT,
   AI.CONTRACTNUM,
   billing_applications.stat_summ_sf(A.ID,S.SRVTYPEID,:SD,:ED, SS.SRVTYPEID) as SUMM,
   AI.SFNEED,
   billing_applications.Stat_Quantity_SF(A.ID,S.SRVTYPEID,:SD,:ED, SS.SRVTYPEID) as AMOUTH,
   AI.POSTDISPACH,
   (select t.SFNUM from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCNUM,
   (select t.tdate from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCDATE
 from
   Accounts A, Accountsinfo AI, Servicetypes ST,
     (select distinct S.ID,S.SRVTYPEID from services S) S,(select '' AS "UNAME",1 AS "SRVTYPEID" from dual /*union select 'Абон. плата: ',-1 from dual*/) SS
 where
 A.ID=AI.ID AND S.ID=A.ID AND
 A.DELETED = 'N' AND A.DFLAG='U' AND
 S.SRVTYPEID=ST.SRVTYPEID
 union all
 select
   -1*ST.SRVTYPEID AS "SRVTYPEID",
   'Абон. плата: '||ST.UNAME AS "UNAME",
   A.ID,  
   AI.ANAME AS ADVCOMMENT,
   AI.CONTRACTNUM,
   P.SUMM as SUMM,
   AI.SFNEED,
   P.QUANTITY as AMOUTH,
   AI.POSTDISPACH,
   (select t.SFNUM from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCNUM,
   (select t.tdate from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCDATE
 from
   Accounts A, Accountsinfo AI, Servicetypes ST, services SS, payments P
     --(select distinct S.ID,S.SRVTYPEID from ) S,(/*select '' AS "UNAME",1 AS "SRVTYPEID" from dual union*/ select 'Абон. плата: ' AS "UNAME",-1 AS "SRVTYPEID" from dual) SS
 where
 A.ID=AI.ID
 AND SS.ID=A.ID
 AND A.DELETED = 'N'
 AND A.DFLAG='U'
 AND P.PDATE between :SD AND :ED)
10 Wobland
 
16.05.12
09:43
(8) AS "UNAME"
что за кавычки в запросе?
11 vbh
 
16.05.12
09:46
(10) согласен для 1с-ки они не приемлимы, но оракл их глотает на ура. Сейчас попробую без кавычек
12 vbh
 
16.05.12
09:51
не помогло, 1с-ка по-прежнему вылетает

запрос без кавычек

SELECT * from
 (select
   SS.SRVTYPEID*ST.SRVTYPEID AS SRVTYPEID,
   SS.UNAME||ST.UNAME AS UNAME,
   A.ID,  
   AI.ANAME AS ADVCOMMENT,
   AI.CONTRACTNUM,
   billing_applications.stat_summ_sf(A.ID,S.SRVTYPEID,:SD,:ED, SS.SRVTYPEID) as SUMM,
--    decode(SS.SRVTYPEID,1,billing_applications.Stat_Duration(A.ID,S.SRVTYPEID,:SD,:ED),-1,0,NULL)/decode(ST.SRVTYPEID,1,60,2,60,3,60,4,60,5,1024*1024,6,60,1) as DUR,
--    decode(ST.SRVTYPEID*ST.SRVTYPEID,1,'мин',2,'мин',3,'мин',4,'мин',5,'мб',6,'мин','шт') as DUR_UNIT,
   AI.SFNEED,
   billing_applications.Stat_Quantity_SF(A.ID,S.SRVTYPEID,:SD,:ED, SS.SRVTYPEID) as AMOUTH,
   AI.POSTDISPACH,
   (select t.SFNUM from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCNUM,
   (select t.tdate from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCDATE
 from
   Accounts A, Accountsinfo AI, Servicetypes ST,
     (select distinct S.ID,S.SRVTYPEID from services S) S,(select '' AS UNAME,1 AS SRVTYPEID from dual /*union select 'Абон. плата: ',-1 from dual*/) SS
 where
 A.ID=AI.ID AND S.ID=A.ID AND
 A.DELETED = 'N' AND A.DFLAG='U' AND
 S.SRVTYPEID=ST.SRVTYPEID
 union all
 select
   -1*ST.SRVTYPEID AS SRVTYPEID,
   'Абон. плата: '||ST.UNAME AS UNAME,
   A.ID,  
   AI.ANAME AS ADVCOMMENT,
   AI.CONTRACTNUM,
   P.SUMM as SUMM,
--    0 as DUR,
--    'шт' as DUR_UNIT,
   AI.SFNEED,
   P.QUANTITY as AMOUTH,
   AI.POSTDISPACH,
   (select t.SFNUM from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCNUM,
   (select t.tdate from transactions t where t.id = a.id and t.tdate = (select max(t.tdate) from transactions t where t.id = a.id) and t.SFNUM is not null and rownum=1) as DOCDATE
 from
   Accounts A, Accountsinfo AI, Servicetypes ST, services SS, payments P
     --(select distinct S.ID,S.SRVTYPEID from ) S,(/*select '' AS UNAME,1 AS SRVTYPEID from dual union*/ select 'Абон. плата: ' AS UNAME,-1 AS SRVTYPEID from dual) SS
 where
 A.ID=AI.ID
 AND SS.ID=A.ID
 AND A.DELETED = 'N'
 AND A.DFLAG='U'
 AND P.PDATE between :SD AND :ED)
13 vbh
 
16.05.12
10:39
видимо на параметрах даты глючит
between :SD AND :ED
14 vbh
 
16.05.12
11:09
переделал параметры всё заработало

на (0) может кому пригодится...

   ТекстДок = новый ТекстовыйДокумент;
   ТекстДок.Прочитать("C:\zapros.sql");
   запрос=ТекстДок.ПолучитьТекст();
   
   Recordset=Новый COMОбъект("ADODB.Recordset");
   ТЗ=Recordset.Open(запрос,Конект,2,3);
   Если НЕ Recordset.EOF() Тогда
       Recordset.MoveFirst();
       Пока RecordSet.EOF=0 Цикл
            Сообщить(RecordSet.Fields.Item("DOCNUM").value);
            RecordSet.MoveNext();
       КонецЦикла;    
   КонецЕсли;    
   Recordset.Close();
15 vbh
 
16.05.12
11:10
Wobland,shuhard - Спасибо!
16 Wobland
 
16.05.12
11:12
(15) двоеточия мешались? ну я всё не глядел, больно страшно. мог бы после кавычек сразу догадаться ;)
17 vbh
 
16.05.12
11:12
(16) вот я и догадался после кавычек )))
18 shuhard
 
16.05.12
11:23
(14)  Если НЕ Recordset.EOF() Тогда
       Recordset.MoveFirst();

может  Если НЕ Recordset.BOF() Тогда
19 vbh
 
17.05.12
06:30
(18) да вроде верно "current record position is after the last record"
20 vbh
 
17.05.12
06:39
(19) блин...опять не туда смотрю
верно. если не 1я запись то на первую.   shuhard спасибо.
21 Wobland
 
17.05.12
06:47
я вижу тут люди знают больше меня.. скажите уж по пути, что не так? после открытия base.eof сразу истина.

ado.Open("DRIVER={Microsoft Visual FoxPro Driver}; SourceType=DBF; SourceDb="+Путь);
base.open("select price0 from 00002", ado);
22 vbh
 
17.05.12
08:35
не буду спорить, не силён в ADODB
(0)задача исполнить запрос из файла c:\zapros.sql и загрузить его в ТЗ
как то так получилось

   Конект = Новый ComОбъект("ADODB.Connection");
   СтрокаСоединения3 ="Provider=MSDAORA.1;Password=1C1C1C;User ID=1C;Data Source=dianet;Persist Security Info=True";
   Конект.ConnectionString = СтрокаСоединения3;
       Попытка
       Конект.Open();
   Исключение
       Сообщить("Подключение к шине не удалось!");
       Возврат;
   КонецПопытки;
   
   ТекстДок = новый ТекстовыйДокумент;
   //ТекстДок.Прочитать("C:\zapros.sql");
   ТекстДок.Прочитать("C:\zapros2.sql");
   запрос=ТекстДок.ПолучитьТекст();

   ТЗ=Новый ТаблицаЗначений;
   Recordset=Новый COMОбъект("ADODB.Recordset");
   Recordset.Open(запрос,Конект,2,3);
   Если RecordSet.Fields.Count>0 Тогда
       Для i=0 По RecordSet.Fields.Count-1 Цикл
             ТЗ.Колонки.Добавить(RecordSet.Fields(i).name());
       КонецЦикла;    
   КонецЕсли;    
   Если НЕ Recordset.BOF() Тогда
       Recordset.MoveFirst();
           Пока RecordSet.EOF=0 Цикл
               СтрТЗ=ТЗ.Добавить();
               Для i=0 По RecordSet.Fields.Count-1 Цикл
                   СтрТЗ.Установить(i,RecordSet.Fields.Item(RecordSet.Fields(i).name()).value);
               КонецЦикла;    
               RecordSet.MoveNext();
           КонецЦикла;    
   КонецЕсли;    
   ТЗ.ВыбратьСтроку();
   Сообщить(ТЗ.Количество());
   Recordset.Close();
Программист всегда исправляет последнюю ошибку.