Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) SQL для DBF - возможно ли ? (число прочтений - 10892 )
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
SQL для DBF - возможно ли ?
19. Мая 2006 :: 10:01
Печать  
Прошу сразу извинить, если вопрос покажется глупым - прямыми запросами на 1С++ занимаюсь недавно Улыбка Смотрел разработку "Расширенный журнал 2" acsent`а, очень понравилась (особенно если идентификатор журнала передавать как параметр), но она чисто для скуля, а я преимущественно работаю с дбф. И все бы ничего - можно переписать для дбф, а можно пойти по другому пути. Насколько я понимаю (даже из сообщений OLE DB) Visual FoxPro драйвер не поддерживает некоторые функции SQL (например CASE и COALESCE из вышеназванной разработки), однако поиск в инете показал, что есть OLE DB\ODBC драйверы поддерживающие SQL-92 (не знаю достаточно ли этого) на локальной машине для DBF (FoxPro). Например Advantage Locale Server (используется для отладки на локальной машине перед портированием) - он совершенно бесплатный. Строка подключения ("Provider=Advantage.OLEDB.1;Data Source=" + КаталогИБ()+";ServerType=ADS_LOCAL_SERVER;TableType=ADS_CDX;"). При включенной Отладка(1) выдает в окно сообщений :


SELECT
j.IDDoc as [Документ_1c_type_Документ],
j.IDDocDef as Документ_вид,
j.DATE as ДатаДок,
j.DOCNO as НомерДок,
  у.sp2894) as [Сумма],
   COALESCE('  BY' + ДокВнутреннееПеремещениеМатериалов.sp39361,'  DK' + ДокОтпускМатериаловНаСторону.sp2885) as [Объект_1c_type_Справочник]
FROM
       1SJourn as j          
LEFT JOIN dh2882 as ДокОтпускМатериаловНаСторону ON
       j.IDDoc = ДокОтпускМатериаловНаСторону.IDDoc          
LEFT JOIN dh39366 as ДокВнутреннееПеремещениеМатериалов ON
       j.IDDoc = ДокВнутреннееПеремещениеМатериалов.IDDoc          
WHERE
      j.IDJournal = ' 2C9' AND
       (j.DATE BETWEEN {d '2004-01-01'} AND {d '2005-12-31'})

тз = RS.ВыполнитьИнструкцию(ТекстЗапроса);
{D:\444.ERT(181)}: FAILED! ICommandText::Execute(): Error 7200: AQE Error: State = 42000;  NativeError = 2115; [Extended Systems][Advantage SQL Engine]Expected lexical element not found: <identifier> missing table name. There was a problem parsing the table names after the FROM keyword in your SELECT statement. -- Location of error in the SQL statement is: 370 (line: 11 column: 3)  SELECT


j.IDDoc as [Документ_1c_type_Документ],
j.IDDocDef as Документ_вид,
j.DATE as ДатаДок,
j.DOCNO as НомерДок,
  у.sp2894) as [Сумма],
   COALESCE('  BY' + ДокВнутреннееПеремещениеМатериалов.sp39361,'  DK' + ДокОтпускМатериаловНаСторону.sp2885) as [Объект_1c_type_Справочник]
FROM
       1SJourn as j          
LEFT JOIN dh2882 as ДокОтпускМатериаловНаСторону ON
       j.IDDoc = ДокОтпускМатериаловНаСторону.IDDoc          
LEFT JOIN dh39366 as ДокВнутреннееПеремещениеМатериалов ON
       j.IDDoc = ДокВнутреннееПеремещениеМатериалов.IDDoc          
WHERE
      j.IDJournal = ' 2C9' AND
       (j.DATE BETWEEN {d '2004-01-01'} AND {d '2005-12-31'})

Из чего я делаю вывод, что функции в запросе вроде бы не вызывают нареканий , а вот найти нужные таблицы не получилось. Может это оттого , что 1С++ заточен под Microsoft - тогда вопрос разработчикам (я с ними не знаком) можно ли посмотреть в этом направлении. Может быть есть еще подобные драйвера , позволяяющие для дбф использовать всю полноту SQL`я ? Заранее прошу не бить ногами если это бред Улыбка
     
Да ссылка на Advantage - http://www.advantagedatabase.com/web/content.aspx?key=AECA300F77B85AF3E24F710D1A...
  
Наверх
 
IP записан
 
spock
Экс-Участник



Пол: Мужской
Re: SQL для DBF - возможно ли ?
Ответ #1 - 19. Мая 2006 :: 11:24
Печать  
Вот мануал от провайдера девятого фокса:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_foxhelp9/htm...
  
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: SQL для DBF - возможно ли ?
Ответ #2 - 19. Мая 2006 :: 12:38
Печать  
И что бы это значило - что я не нашел в мануале, что функции CASE и COALESCE поддерживаются на самом деле провайдером Visual FoxPro 9 ? Если так - ткните подробнее !
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SQL для DBF - возможно ли ?
Ответ #3 - 19. Мая 2006 :: 15:08
Печать  
ткни меня в то место, где в доке написано, что подерживается CASE or COALESCE?
Запросы, написанные на t-sql не перекладываются на fox обычно в явном виде!
  
Наверх
ICQ  
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: SQL для DBF - возможно ли ?
Ответ #4 - 19. Мая 2006 :: 18:07
Печать  
У нас как в том анекдоте про вдух глухих рыбаков : "Мужик ты рыбу ловишь? Нет я рыбу ловлю ! А я думал ты рыбу ловишь !"
Я о том и пишу что FoxPro их не поддерживает а очень бы хотелось. И приведенный первым текст относится не к VFPOLEDB.1 для которого есть описание в 1С++ , а Advantage.OLEDB.1 который поддерживает T-SQL на локальной машине, а не на сервере. И просто хотел услышать мнения более меня разбирающихся в этих вещах людей по поводу существования подобных (поддерживающих полный SQL) драйверах ODBC\OLE DB и возможности их связки с объектами прямых запросов 1С++.
Я конечно понимаю, что серьезные люди работают с MS SQL и их в принципе эти заморочки не сильно волнуют, но попытка ведь не пытка Улыбка
  
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: SQL для DBF - возможно ли ?
Ответ #5 - 21. Мая 2006 :: 18:42
Печать  
Для тех кому интересно: дело оказалось в том , что данный провайдер почему-то не воспринимает названия файлов начинающиеся на 1s*. Вообщем если искуственно скопировать файл 1sjourn в любой начинающийся на букву ( journ.dbf например) и в from подставить его то запрос работает.
  
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: SQL для DBF - возможно ли ?
Ответ #6 - 21. Мая 2006 :: 19:46
Печать  
Уважаемый Кирилл Мирошниченко aka spock ( подсистема прямого доступа к данным через OLE DB) !  Может быть Вы как человек разбиравшийся и написавший этот кусок 1С++ сможете сказать почему в VFP работает обращение к таблицам 1s*, а в advantage (и не только, я пробовал еще Apollo и DBF - SQL Expert) не работает ??? Очень уж заманчивая идея, как мне кажется (может мне одному). Ведь можно один и тотже запрос почти без изменений использовать и под SQL и под DBF.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SQL для DBF - возможно ли ?
Ответ #7 - 22. Мая 2006 :: 03:29
Печать  
Alister писал(а) 21. Мая 2006 :: 19:46:
Ведь можно один и тотже запрос почти без изменений использовать и под SQL и под DBF.

Может это утопия?
Думается, что не будут запросы работать одинаково, имхо.
  
Наверх
ICQ  
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: SQL для DBF - возможно ли ?
Ответ #8 - 22. Мая 2006 :: 08:11
Печать  
Может и утопия Улыбка
Но может есть смысл хотя бы в том чтобы использовать все функции SQL Улыбка))
А как все таки насчет неработы с таблицами начинающимися на цифру - есть какие нибудь мысли ???
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SQL для DBF - возможно ли ?
Ответ #9 - 23. Мая 2006 :: 03:04
Печать  
Alister писал(а) 22. Мая 2006 :: 08:11:
есть какие нибудь мысли ???

В t-sql (ms) ведь тоже проблемы с объектами, начинающимися в названии с цифирек. Может этот провайдер "четко" следует семантике языка?
  
Наверх
ICQ  
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: SQL для DBF - возможно ли ?
Ответ #10 - 23. Мая 2006 :: 16:50
Печать  
Ясно - спасибо. Можно тогда вопрос немного в сторону типизации ?
В запросе не работает (выдает пусто)
COALESCE($ВидСправочника36.МестаХранения + $ДокТребованиеНакладная.МестоХранения,$ВидСправочника36.Контрагенты + $ДокПоступлениеМатериалов.Контрагент) as [Объект $Справочник],
причем если ставить конкретный справочник
ов.МестоХранения) as [Объект $Справочник.МестаХранения], то работает.
Если через VFP то для одного документа
$ВидСправочника36.МестаХранения + $ДокТребованиеНакладная. МестоХранения as [Объект $Справочник]
не работает, а
$ДокТребованиеНакладная. МестоХранения as [Объект $Справочник.МестаХранения] работает.
Что я делаю не так ? Улыбка
  
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: SQL для DBF - возможно ли ?
Ответ #11 - 27. Мая 2006 :: 18:04
Печать  
Уважаемый spock ! Почитайте (если еще не видели ветку) http://www.1cpp.ru/forum/YaBB.pl?num=1148577369;start=all
Спасибо.
« Последняя редакция: 28. Мая 2006 :: 12:32 - Alister »  
Наверх
 
IP записан
 
sd
1c++ power user
Отсутствует



Сообщений: 30
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SQL для DBF - возможно ли ?
Ответ #12 - 30. Мая 2006 :: 04:57
Печать  
Alister писал(а) 21. Мая 2006 :: 18:42:
Для тех кому интересно: дело оказалось в том , что данный провайдер почему-то не воспринимает названия файлов начинающиеся на 1s*. Вообщем если искуственно скопировать файл 1sjourn в любой начинающийся на букву ( journ.dbf например) и в from подставить его то запрос работает.


в MS SQL эта бяка обходилась бы так:

Код
Выбрать все
select * from [1sjourn]
 

  
Наверх
ICQ  
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: SQL для DBF - возможно ли ?
Ответ #13 - 30. Мая 2006 :: 09:01
Печать  
sd писал(а) 30. Мая 2006 :: 04:57:
Alister писал(а) 21. Мая 2006 :: 18:42:
Для тех кому интересно: дело оказалось в том , что данный провайдер почему-то не воспринимает названия файлов начинающиеся на 1s*. Вообщем если искуственно скопировать файл 1sjourn в любой начинающийся на букву ( journ.dbf например) и в from подставить его то запрос работает.


в MS SQL эта бяка обходилась бы так:

Код
Выбрать все
select * from [1sjourn]
 


Огромное спасибо знающему человеку !!!
Действительно после замены все заработало !!!!
Ну кроме бага с отображением справочников Печаль

SELECT
Жур.IDDoc as [Документ $Документ],
Жур.IDDocDef as Документ_вид,
Жур.DATE as ДатаДок,
Жур.DOCNO as НомерДок,
     бованиеНакладная.Сумма,$ДокПоступлениеМатериалов.Всего) as SQL_MONEY) as [Сумма],      COALESCE($ВидСправочника36.МестаХранения + анения + $ДокПереводМатериаловВТовар.МестоХранения,$ВидСправочника36.МестаХранения + $ДокГотоваяПродукция.Склад,$ВидСправочника36.МестаХранения + $ДокТребованиеНакладная.МестоХранения,$ВидСправочника36.Контрагенты + $ДокОтпускМатериаловНаСторону.Контрагент,$ВидСправочника36.Контрагенты + $ДокПоступлениеМатериалов.Контрагент) as [Объект $Справочник],
CASE
 WHEN Жур.IsMark =  '*' THEN 6
 WHEN Жур.Closed = 5 THEN 1
 ELSE 0
END as Картинка
FROM
     [1sjourn] as Жур          

LEFT JOIN $Документ.ВедомостьВыдачи as ДокВедомостьВыдачи ON
   Жур.IDDoc = ДокВедомостьВыдачи.IDDoc          
LEFT JOIN $Документ.ВнутреннееПеремещениеМатериалов as ДокВнутреннееПеремещениеМатериалов ON
   Жур.IDDoc = ДокВнутреннееПеремещениеМатериалов.IDDoc          
LEFT JOIN $Документ.ОтпускМатериаловНаСторону as ДокОтпускМатериаловНаСторону ON
   Жур.IDDoc = ДокОтпускМатериаловНаСторону.IDDoc          
LEFT JOIN $Документ.ПереводМатериаловВТовар as ДокПереводМатериаловВТовар ON
   Жур.IDDoc = ДокПереводМатериаловВТовар.IDDoc          
LEFT JOIN $Документ.ГотоваяПродукция as ДокГотоваяПродукция ON
   Жур.IDDoc = ДокГотоваяПродукция.IDDoc          
LEFT JOIN $Документ.ТребованиеНакладная as ДокТребованиеНакладная ON
   Жур.IDDoc = ДокТребованиеНакладная.IDDoc          
LEFT JOIN $Документ.ПоступлениеМатериалов as ДокПоступлениеМатериалов ON
   Жур.IDDoc = ДокПоступлениеМатериалов.IDDoc          
LEFT JOIN $Документ.ГСМ as ДокГСМ ON
   Жур.IDDoc = ДокГСМ.IDDoc

WHERE
  Жур.IDJournal = $ЖурналДокументов.Материалы AND
     (Жур.DATE BETWEEN :Дата1~~ AND :Дата2~~)
order by
     Жур.date,Жур.time

После метапарсера :

SELECT
Жур.IDDoc as [Документ_1c_type_Документ],
Жур.IDDocDef as Документ_вид,
Жур.DATE as ДатаДок,
Жур.DOCNO as НомерДок,
     ебованиеНакладная.sp2879,ДокПоступлениеМатериалов.sp2853) as SQL_MONEY) as [Сумма],
     COALESCE('  BY' + ДокВнутреннееПеремещениеМатериалов.sp39361,'  BY' + ДокПереводМатериаловВТовар.sp21045,'  BY' + ДокГотоваяПродукция.sp1914,'  BY' + ДокТребованиеНакладная.sp2872,'  DK' + ДокОтпускМатериаловНаСторону.sp2885,'  DK' + ДокПоступлениеМатериалов.sp2835) as [Объект_1c_type_Справочник],
CASE
 WHEN Жур.IsMark =  '*' THEN 6
 WHEN Жур.Closed = 5 THEN 1
 ELSE 0
END as Картинка
FROM
     [1sjourn] as Жур          

LEFT JOIN dh15791 as ДокВедомостьВыдачи ON
   Жур.IDDoc = ДокВедомостьВыдачи.IDDoc          
LEFT JOIN dh39366 as ДокВнутреннееПеремещениеМатериалов ON
   Жур.IDDoc = ДокВнутреннееПеремещениеМатериалов.IDDoc          
LEFT JOIN dh2882 as ДокОтпускМатериаловНаСторону ON
   Жур.IDDoc = ДокОтпускМатериаловНаСторону.IDDoc          
LEFT JOIN dh21051 as ДокПереводМатериаловВТовар ON
   Жур.IDDoc = ДокПереводМатериаловВТовар.IDDoc          
LEFT JOIN dh1911 as ДокГотоваяПродукция ON
   Жур.IDDoc = ДокГотоваяПродукция.IDDoc          
LEFT JOIN dh2870 as ДокТребованиеНакладная ON
   Жур.IDDoc = ДокТребованиеНакладная.IDDoc          
LEFT JOIN dh2833 as ДокПоступлениеМатериалов ON
   Жур.IDDoc = ДокПоступлениеМатериалов.IDDoc          
LEFT JOIN dh5655 as ДокГСМ ON
   Жур.IDDoc = ДокГСМ.IDDoc

WHERE
  Жур.IDJournal = ' 2C9' AND
     (Жур.DATE BETWEEN {d '2004-01-01'} AND {d '2005-12-31'})
order by
     Жур.date,Жур.time

Все без ошибок Улыбка))
  
Наверх
 
IP записан
 
jbond
Full Member
***
Отсутствует


1С++ Programmer

Сообщений: 140
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SQL для DBF - возможно ли ?
Ответ #14 - 31. Мая 2006 :: 04:18
Печать  
А сколько он весит метрах?
Качать Advantage OLE DB Provider 8.0? Это не демо-версия?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать