Переключение на Главную Страницу Страницы: 1 ... 5 6 [7] 8 9 10 ОтправитьПечать
Очень популярная тема (более 25 ответов) Упрощение работы с прямыми запросами (число прочтений - 32073 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #90 - 05. Мая 2008 :: 15:08
Печать  
trad писал(а) 05. Мая 2008 :: 14:58:
при таком условии dtos(date)+time+iddoc > :ДатаНачала в dbf с попаданием в индекс все ли будет хорошо?

Для таблицы движений там такой индекс есть:
Код
Выбрать все
DTOS(DATE)+TIME+IDDOC+STR(LINENO,4)+STR(ACTNO,6) 


Так что, наверное, с попаданием будет хорошо.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #91 - 05. Мая 2008 :: 15:14
Печать  
Uzhast писал(а) 05. Мая 2008 :: 15:08:
Для таблицы движений там такой индекс есть:
Код
Выбрать все
DTOS(DATE)+TIME+IDDOC+STR(LINENO,4)+STR(ACTNO,6) 


Так что, наверное, с попаданием будет хорошо.

в таком случае наверное и в таблице итогов индекс типа: DTOS(PERIOD)+...
а как с попаданием тогда тут?: Остатки.Period = :НужныйПериод~~
  

1&&2&&3
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #92 - 05. Мая 2008 :: 15:36
Печать  
trad писал(а) 05. Мая 2008 :: 15:14:
в таком случае наверное и в таблице итогов индекс типа: DTOS(PERIOD)+...
а как с попаданием тогда тут?: Остатки.Period = :НужныйПериод~~

Да, индекс такой. Насчет попадания в индекс есть только косвенные данные. В частности, при подобном индексе, выборка (непустая) по журналу документов (где тоже индекс с DTOS) с фильтром типа Date BETWEEN ... за один день занимает одинаковое время как на таблице размером 11Мб, так и на таблице 70Кб.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #93 - 05. Мая 2008 :: 15:42
Печать  
Хотя нет, похоже, все же индекс в этом случае не задействуется.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #94 - 05. Мая 2008 :: 16:07
Печать  
В общем, для ДБФ, как еще kiruha находил, в условие должны входить все поля, участвующие в построении индекса. Для таблицы движений это DATE,TIME,IDDOC,LINENO,ACTNO. При помощи имени $Позиция это разрулить, скорее всего, не получится, т.к. условие там получается не BETWEEN :ДатаНачала~~ AND :ДатаОкончания~~, а что-то вида:
Код
Выбрать все
DTOS(date)+time+iddoc BETWEEN (DTOS(:ДатаНачала~~)+'		   ') AND (DTOS(:ДатаОкончания~~)+'ZZZZZZZZZZZZZZZ') 



Спрятать такого крокодила, ИМХО, можно только внутри виртуальной таблицы. Заодно избавим людей от необходимости таких зверей набирать вручную Улыбка
  
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: Упрощение работы с прямыми запросами
Ответ #95 - 05. Мая 2008 :: 16:23
Печать  
+1000
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #96 - 06. Мая 2008 :: 04:30
Печать  
Uzhast писал(а) 05. Мая 2008 :: 16:07:
Спрятать такого крокодила, ИМХО, можно только внутри виртуальной таблицы. Заодно избавим людей от необходимости таких зверей набирать вручную Улыбка

И еще раз +1
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #97 - 06. Мая 2008 :: 04:36
Печать  
Uzhast писал(а) 05. Мая 2008 :: 16:07:
Спрятать такого крокодила, ИМХО, можно только внутри виртуальной таблицы. Заодно избавим людей от необходимости таких зверей набирать вручную Улыбка

а что такое выражение:
Код
Выбрать все
DTOS(date)+time+iddoc BETWEEN :ДатаНачала AND :ДатаОкончания~ 


разве не будет работать по индексу? Озадачен
Очень удивительно. Имхо должно обязательно.
  

1&&2&&3
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #98 - 06. Мая 2008 :: 06:58
Печать  
trad писал(а) 06. Мая 2008 :: 04:36:
Uzhast писал(а) 05. Мая 2008 :: 16:07:
Спрятать такого крокодила, ИМХО, можно только внутри виртуальной таблицы. Заодно избавим людей от необходимости таких зверей набирать вручную Улыбка

а что такое выражение:
Код
Выбрать все
DTOS(date)+time+iddoc BETWEEN :ДатаНачала AND :ДатаОкончания~ 


разве не будет работать по индексу? Озадачен
Очень удивительно. Имхо должно обязательно.

Слушай, а ведь работает! Время выборки в точности как у выражения
Код
Выбрать все
|	DTOS(date)+time+iddoc BETWEEN (DTOS(:ДатаНачала~~)+'               ') AND (DTOS(:ДатаОкончания~~)+'ZZZZZZZZZZZZZZZ')
 


Улыбка
Т.е. Фокс все же оказывается лучше, чем я думал. Ну, спасибо за наводку! Улыбка
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #99 - 06. Мая 2008 :: 07:12
Печать  
Uzhast писал(а) 06. Мая 2008 :: 06:58:
Т.е. Фокс все же оказывается лучше, чем я думал. Ну, спасибо за наводку! Улыбка

Кирюха уже говорил об этом  Подмигивание
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #100 - 06. Мая 2008 :: 09:09
Печать  
Имеем задачу:
Выбрать движения документа по регистру за период с получением реквизита ТЧ соответствующего движению.
(Регистр с быстрой обработкой движений)

На sql я эффективно напишу так:
Код
Выбрать все
select
  right(Рег.date_time_iddoc,9) as [Док $Документ.Накладная],
  Рег.lineno_ as НомерСтроки,
  $Док.Реквизит as Реквизит
from $Регистр.Остатки as Рег (nolock)
inner join $ДокументСтроки.Накладная as Док (nolock) on Док.iddoc = right(Рег.date_time_iddoc,9) and Док.lineno_ = Рег.lineno_
where Рег.date_time_iddoc between :НачДата and :КонДата~
order by Рег.date_time_iddoc, Рег.lineno_, Рег.actno
 


На dbf я наверно написал бы так:
Код
Выбрать все
select
  Рег.iddoc as [Док $Документ.Накладная],
  str(Рег.lineno_,4) as НомерСтроки,
  $Док.Реквизит as Реквизит
from $Регистр.Остатки as Рег (nolock)
inner join $ДокументСтроки.Накладная as Док (nolock) on Док.iddoc = Рег.iddoc and str(Док.lineno_,4) = str(Рег.lineno_,4)
where DTOS(Рег.date)+Рег.time+Рег.iddoc between :НачДата and :КонДата~
order by DTOS(Рег.date)+Рег.time+Рег.iddoc, str(Рег.lineno_,4), str(Рег.actno,6)
 


Получаем гипотетический универсальный запрос такого вида:
Код
Выбрать все
select
  Рег.$ИДДокИзПозиции as [Док $Документ.Накладная],
  Рег.$НомерСтроки as НомерСтроки,
  $Док.Реквизит as Реквизит
from $Регистр.Остатки as Рег ($nolock)
inner join $ДокументСтроки.Накладная as Док (nolock) on Док.iddoc = Рег.$ИДДокИзПозиции and Док.$НомерСтроки = Рег.$НомерСтроки
where Рег.$Позиция between :НачДата and :КонДата~
order by Рег.$Позиция, Рег.$НомерСтроки, Рег.$НомерДвижения
 


,где
Т.$ИДДокИзПозиции - right(T.date_time_iddoc,9) / T.iddoc
Т.$НомерСтроки - T.lineno_ / str(T.lineno_,4)
Т.$Позиция - T.date_time_iddoc / DTOS(T.date)+T.time+T.iddoc
Т.$НомерДвижения - T.actno / str(T.actno,6)

Не кисло. С учетом того, что Т.$Метаимя нужно преобразовать в Т.Поле1 а то и в f(T.Поле1, T.Поле2 ...)
Можно, например, применить такую запись $Метаимя(Т), но не понадобиться потом и $Метаимя(Т, ...). Да и что будет с читаемостью запроса.

В общем, в очередной раз могу только пожелать удачи  Подмигивание
  

1&&2&&3
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Упрощение работы с прямыми запросами
Ответ #101 - 06. Мая 2008 :: 09:27
Печать  
trad писал(а) 06. Мая 2008 :: 09:09:
Не кисло. С учетом того, что Т.$Метаимя нужно преобразовать в Т.Поле1 а то и в f(T.Поле1, T.Поле2 ...)
Можно, например, применить такую запись $Метаимя(Т), но не понадобиться потом и $Метаимя(Т, ...). Да и что будет с читаемостью запроса.

Классно, как раз то, чего не хватало. Улыбка

С читаемостью, на мой взгляд, все ОК.
Особенно при условии, что есть четкое понимание, как метаимена транслируются в запросе.
Но отлынить от изучения структур баз данных в обоих форматах, имхо все равно не удастся.

Задача становится интереснее. Подмигивание
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #102 - 06. Мая 2008 :: 10:12
Печать  
trad писал(а) 06. Мая 2008 :: 09:09:
Получаем гипотетический универсальный запрос такого вида:
Код
Выбрать все
select
  Рег.$ИДДокИзПозиции as [Док $Документ.Накладная],
  Рег.$НомерСтроки as НомерСтроки,
  $Док.Реквизит as Реквизит
from $Регистр.Остатки as Рег ($nolock)
inner join $ДокументСтроки.Накладная as Док (nolock) on Док.iddoc = Рег.$ИДДокИзПозиции and Док.$НомерСтроки = Рег.$НомерСтроки
where Рег.$Позиция between :НачДата and :КонДата~
order by Рег.$Позиция, Рег.$НомерСтроки, Рег.$НомерДвижения
 


Не. Скорее, так:
Код
Выбрать все
select
  $Рег.ИДДокИзПозиции as [Док $Документ.Накладная],
  $Рег.НомерСтроки as НомерСтроки,
  $Док.Реквизит as Реквизит
from $Регистр.Остатки as Рег ($nolock)
inner join $ДокументСтроки.Накладная as Док (nolock) on Док.iddoc = $Рег.ИДДокИзПозиции and $Док.НомерСтроки = $Рег.НомерСтроки
where $Рег.Позиция between :НачДата and :КонДата~
order by $Рег.Позиция, $Рег.НомерСтроки, $Рег.НомерДвижения
 


Т.е. доллар ставим в более другое место. Улыбка В таком случае парсеру ничего не стоит обработать такое корректно без ухудшения читабельности.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #103 - 06. Мая 2008 :: 10:15
Печать  
Кстати, такой гипотетический запрос - наглядное доказательство, что КОПом тут выкручиваться будет неудобно, мягко говоря. Улыбка А любители 15-минутных КОПов идут лесом Улыбка
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Упрощение работы с прямыми запросами
Ответ #104 - 06. Мая 2008 :: 10:23
Печать  
Кстати, а как с датами будут обстаять дела?
В SQL:
Цитата:
:НачДата и :КонДата~

в DBF:
Цитата:
:НачДата~~ и :КонДата~~
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 5 6 [7] 8 9 10
ОтправитьПечать