Имя: Пароль:
1C
1C 7.7
v7: SQLLite. Как выполнить запрос по двум ИБ одновременно?
,
0 КонецЦикла
 
модератор
22.04.12
19:42
Привык к ИБ.dbo.Таблица в SQL
Допустим базы находятся на одном сервере
Тут как? Через временную таблицу?
В классе ПрямойЗапрос есть ПрисоединитьБазуДанных, но что-то пока не взлетает
Подкиньте примерчик использования
1 Aleksey
 
22.04.12
19:44
SQLLite он работает только с текущей БД, к левым нельзя
2 Aleksey
 
22.04.12
19:45
Даже нельзя обратится к двум БД одновременно, если они лежат в разных файлах
3 Torquader
 
22.04.12
19:55
Если не нужно их собирать вместе, то можно выполнить запрос к одной базе, потом переключиться и выполнить запрос к другой.
4 КонецЦикла
 
модератор
22.04.12
20:06
Это DBF
Хотелось бы левое соединение с аналогичным справочником другой базы, расположенной на том же сервере
5 Torquader
 
22.04.12
20:09
В DBF я знаю только, как через Visual FoxPro драйвер и ADODB можно заглянуть, причём, написав запрос и несколько файлов, но что-то мне кажется, что вам это не подходит.
6 КонецЦикла
 
модератор
22.04.12
20:14
Через VFPOLEDB получилось
Но фишка в том чтобы не городить огород
А временная таблица не поможет?
7 Torquader
 
22.04.12
20:15
(6) Ну, если одну таблицу запихнуть во временную (ну или вообще в таблицу значений), а потом выбирая её сделать соединение с другой (или выбрать другую и пристыковать к первой), то можно, но, похоже, что огород ещё больше выходит.
8 КонецЦикла
 
22.04.12
20:29
(7) Через временную тоже не прокатит
Ведь ее не будет существовать в другой базе
Получается нужно создать копию файла DBF в базе-приемнике (для которой он будет родным)?
Вот жеж не очень красиво
9 Torquader
 
22.04.12
20:32
(8) А если индексированную таблицу в памяти и выбирать ручками ?
Просто, всё зависит от того, сколько в этих таблицах данных - если много, то время копирования может превзойти время выполнения отчёта (копировать-то нужно с индексированием, чтобы потом можно было выполнить запрос).
10 КонецЦикла
 
модератор
22.04.12
20:35
(9) В смысле ИТЗ = СоздатьОбъект("ИндексированнаяТаблица") и погнали?
С копированием я погорячился тоже... в базе же будут работать люди, а там хз что может скопироваться
11 Torquader
 
22.04.12
20:41
(10) Ну в таблицу тоже данные не быстро залезут, просто из индексированной будет проще выбирать.
12 КонецЦикла
 
модератор
22.04.12
21:08
(11) Спс

Покамист отлучусь
Если кто-то применял более интересные решения буду очень благодарен
OLE в последнюю очередь рассматриваем
13 Туц
 
22.04.12
21:21
Данный часто изменяются? Если что-то типа продаж, то грузи в скуль.
14 badboychik
 
22.04.12
21:34
http://www.sqlite.org/lang_select.html

вроде как никто не мешает написать
Select * from dbname1.table1 join dbname2.table2 ...
15 КонецЦикла
 
модератор
22.04.12
23:40
Да вроде должно работать, но...

ATTACH DATABASE 'G:\DB77\LQБух' AS Buh
Приводит к "unable to open database: G:\DB77\LQБух"

ХЗ куда копать? Или не так делается?
16 КонецЦикла
 
модератор
22.04.12
23:43
(13) Загружать нужно каждый день и возможно не один раз
Справочники, документы и всякие остатки-продажи по бух. итогам
Должно работать "для чайников". Грузить некому в SQL
Да и все отчеты написал уже под DBF
17 kiruha
 
23.04.12
00:29
Используй foxpro драйвер
Элементарно, хоть к 10 базам
18 КонецЦикла
 
модератор
23.04.12
00:46
(17) Кидани пример плиз
У меня такая строка соединения (это запрос к базе-источнику):
Соединение = "Provider=VFPOLEDB.1; Set Deleted =Yes; data Source=G:\DB77\LQБух; Mode=ReadWrite;Extended Properties=""; User ID=""; Password=""; Mask Password=False; Collating Sequence=MACHINESN=""";

Что мне писать для базы приемника в том же запросе?
Можно простой примерчик?
Хрен с ними, с метаименами, главное чтобы принципиально работало
19 orefkov
 
23.04.12
01:00
Тут важно не путать.
Со своими "родными" базами и таблицами sqlite может работать с целой толпой, attach database и вперед.
А вот виртуальные таблицы, отображающие 1Сные дбф-файлы в 1sqlite - подключаются только от текущей базы.
20 Torquader
 
23.04.12
01:03
Если базы в разных директориях,то придётся писать две строки подключения-то есть использовать два объекта.
Также можно попробовать написать подключение без файла,а в строке команды попробовать подключить два различных файла и не забыть про индексы.
21 КонецЦикла
 
модератор
23.04.12
01:16
Вот попробовал, получилось
Но... без монопольного и без метаимен
А как придется мучаться с иерархией и главное бух запросами... ужос :)

   База =СоздатьОбъект("ODBCDatabase");
   Если База.Соединение("Driver={Microsoft dBase Driver (*.dbf)};datasource=dBase Files") = 0 Тогда
       Предупреждение("Ошибка открытия файла", 20);
       Возврат;
   КонецЕсли;

   RS =СоздатьОбъект("ODBCRecordSet");
   RS.УстБД(База);

   ТекстЗапроса ="
   |select BuhGoods.Code
   |, Goods.Code
   |from G:\DB77\LQБух\sc245.dbf as BuhGoods
   |left join G:\DB77\LQ\sc19.dbf as Goods on BuhGoods.Code = Goods.Code
   |";

   ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
   ТЗ.ВыбратьСтроку();
22 Torquader
 
23.04.12
01:19
За монопольность можно не переживать - при записи можно писать with lock,и таблица будет блокироваться автоматически - только эти блокировки не совместимы с 1С.
23 КонецЦикла
 
модератор
23.04.12
01:19
(19) Рассчитываю на помощь
Цель - хотя бы подключиться нормально с помощью SQLLite к другой базе, у меня не получилось
А в идеале - соединиться еще с таблицами "родной" базы
Как бы использовать наработки сообщества, чтобы не писать офигенные запросы для бух. итогов
24 Torquader
 
23.04.12
01:27
Насколько я понимаю,обращение в базу 1С требует,чтобы она не была запущена,так как различные способы подключения могут нарушить работу.
Если файловая система ntfs,то можно попробовать изготовить ссылки на dbf-файлы в одной директории-тогда как сами файлы будут в разных.
После этого их можно будет рассматривать как одну базу.
P.S.интересно попробовать на справочниках из разных баз.
Проблему я пока вижу только в удалении индекса при реиндексации - индекс окажется свой в каждой директории.
25 КонецЦикла
 
23.04.12
01:30
(24) Нет, там нормально в моем примере
Просто не будет работать если 1С запушена в монопольном режиме
26 КонецЦикла
 
23.04.12
03:11
Кстати, в варианте (21) еще фигня с кодировкой
В общем пишите умные мысли если будут
27 wsxedc83
 
23.04.12
16:18
ТС, если у тебя есть тестовый полигон для отработки вариантов, то можно, мне кажется, попробовать в одной базе в файле 1cv7.dd дописать дополнительные таблицы, а в тех местах где пишется имя файла - написать файлы с unc-путями второй базы.
Ну и, конечно, обращения ко всем полям таких "присоединенных" таблиц - только по внутренним их идентификаторам.

Сам такого не делал, но теоретически может сработать - главное чтобы sqlite брал информацию о расположении таблиц из файла 1cv7.dd, а не из каталога бд.
28 kiruha
 
23.04.12
18:53
29 КонецЦикла
 
23.04.12
20:40
(28) Спасибо :)
Забылось уже
Использовал ОбрМетаСКЛ и 2 базы на СКЛ, но тут что-то не так видно пытался сделать
С примером все получилось