Переключение на Главную Страницу Страницы: 1 ... 39 40 [41] 42 43 ... 60 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" (число прочтений - 314289 )
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #600 - 28. Апреля 2010 :: 12:39
Печать  
Перезалил обновление добавив туда исправление маааааленького но крайне неприятного бага. Неправильно выполнялись запросы если имена временный таблиц совпадали с именем реальной таблицы (без учета #)
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #601 - 05. Мая 2010 :: 07:07
Печать  
Небольшое обновление старой проблемы.

1.06.003 от 05.05.10 г.
- Изменено возможное значение параметра № 2 в виртуальном значении «ПоследнееЗначение». Теперь Параметр № 2 может быть не только текстовый параметр, но и реквизит запроса (текст запроса).
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #602 - 05. Мая 2010 :: 07:22
Печать  
Собственно вот сообщение которое мне тут напомнили в связи с чем я внес небольшие корректировки Улыбка
http://www.1cpp.ru/forum/YaBB.pl?num=1246429625/439#439
С одним "но", значение получаемое в параметре № 2 (если это не текстовый параметр), должно быть - Дата. Т.е. позиция документа прокатит конечно но не будут учитываться время, и документ. Т.о. значение будет только на дату.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Igor Nikolaenko
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 47
Зарегистрирован: 01. Апреля 2010
Re: Класс "ПрямойЗапрос"
Ответ #603 - 05. Мая 2010 :: 11:47
Печать  
Вопрос по ВТ СрезПоследних.

В документации следущее:

ВЫБРАТЬ СрезОС.*
ИЗ $СрезПоследних.ОсновныеСредства(:РабочаяДата
, (Подразделение,СрокИспользования)
,($СпрОС.ПометкаУдаления = 0)
,(ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОсновныеСредства КАК СпрОС $nolock
         ПО $СпрОС.ТекущийЭлемент = ТекущийЭлемент)) КАК СрезОС

У меня заработало только так:

ВЫБРАТЬ СрезЦен.*
ИЗ $СрезПоследних.Цены(:РабочаяДата
,(Цена)
,($СпрЦ.ТипЦен = :ВыбТипЦен)
,ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Цены КАК СпрЦ $nolock
        ПО $СпрЦ.ТекущийЭлемент = tconst_1.objid) КАК СрезЦен

Отличия от документации:
1. ТекущийЭлемент заменен на tconst_1.objid
2. убраны круглые скобки у соединения, иначе добавляет с ними

Если ли возможность привести в соответствие с документацией?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #604 - 05. Мая 2010 :: 12:38
Печать  
Со скобками конечно я загнул Улыбка. надо бы их вообще убрать, их там не должно быть (в смысле в строке соединения). Документацию подправлю. Что касается "ТекущийЭлемент" проверь без скобок. Если не "родит" тогда соответственно примем меры Подмигивание.
« Последняя редакция: 05. Мая 2010 :: 17:47 - vandalsvq »  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #605 - 05. Мая 2010 :: 17:46
Печать  
Да... ошибка была. Исправил и выложил новую версию + добавил немного нового функционала.

1.06.004 от 05.05.10 г.
- Исправлена ошибка при подготовке параметров № 3 и 4 ВТ СрезПоследних и СрезПервых.
- Новый метод «УложитьСписокОбъектов». Копия метода «УложитьСписокЗначений».
- Новый метод «УложитьСписокГрупп». Укладывает значения групп во временную таблицу.
- Новый атрибут «ПараметрБлокировкиВТ». Атрибут не рекомендуется к изменению.

Пы.сы. не спрашивайте меня зачем атрибут "ПараметрБлокировкиВТ". Сам не знаю.  Смех
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #606 - 05. Мая 2010 :: 18:28
Печать  
Цитата:
Пы.сы. не спрашивайте меня зачем атрибут "ПараметрБлокировкиВТ". Сам не знаю. 

Не спрашиваем но безмерно благодарим.
  
Наверх
IP записан
 
zar
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 82
Местоположение: Киров
Зарегистрирован: 17. Августа 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #607 - 07. Мая 2010 :: 11:44
Печать  
Автору огромное спасибо за данный класс!!!

Только-только начал изучать этот класс, как столкнулся с ситуацией:
если в запросе есть ВТ, при парсинге последняя скобка выражения не попадает в обработку.
Например, выражение:
Код
Выбрать все
$РегистрОбороты.ОстаткиТоваров(,,,,,,) AS ОстаткиТоваровОбороты 


при парсинге должно заменяться на
Код
Выбрать все
(<код ВТ>) AS ОстаткиТоваровОбороты 


а фактически получается
Код
Выбрать все
(<код ВТ>)) AS ОстаткиТоваровОбороты 


т.к. в модуле
Код
Выбрать все
ВекторВыражения = Вектор.Получить(НомерЗначения) 


в вектор выражения возвращается
Код
Выбрать все
$РегистрОбороты.ОстаткиТоваров(,,,,,, 


т.е. на замену попадает выражение без завершающей скобки
  
Наверх
 
IP записан
 
zar
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 82
Местоположение: Киров
Зарегистрирован: 17. Августа 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #608 - 07. Мая 2010 :: 15:00
Печать  
вопрос снимается... Улыбка
все дело было в разном количестве параметров ВТ для ПрямогоЗапроса и 1С++

Разница в параметрах ВТ в классе "ПрямойЗапрос" - нет параметра "Соединение". Может быть имеет смысл добавить в класс данный параметр (пксть он будет пустой) - для совместимости со старыми запросами 1С++?

И еще для пущей совместимости может быть стоит Предопределенные текстовые параметры описывать и через "$". В случае когда описание их происходит через ":" - их можно визуально спутать с обычными тестовыми параметрами - имхо не очень удобно (где то об этом уже писали)....
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #609 - 07. Мая 2010 :: 16:11
Печать  
Добавлять новый параметр к ВТ = фактически получить потерю обратной совместимости. Пока я на это пойти к сожалению не могу. Просто нет времени переписывать старые разработки.

Что касается предопределенных текстовых параметров, хм... а не возникнут проблемы в связи с тем что парсинг начнет путать реквизиты ($ИмяТаблицы.ИмяРеквизита) с параметрами? В общем может оставить как есть, не вижу большой проблемы.

Пы.сы. я на самом деле немного позиционирую разработку не как "продолжение" или "доработку" ODBC или 1sqlite, а как стороннюю разработку с отдельным синтаксисом и идеологией. Хотя многое взял от них, и их же использую.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
zar
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 82
Местоположение: Киров
Зарегистрирован: 17. Августа 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #610 - 08. Мая 2010 :: 09:01
Печать  
Согласен про потерю обратной совместимости там, где уже используется "ПрямойЗапрос".
Однако, имхо, было бы очень удобно для людей, использующих "ODBCRecordSet" в 1С++, "полная" совместимость с классом "ПрямойЗапрос" хотя бы на уровне парсинга (а она сейчас почти полная). При переводе части функционала с SQL на DBF не пришлось бы переписывать запросы. И что немаловажно - на DBF версиях - стало бы возможно пользоваться "конструктором запросов" от berezdetsky! Улыбка

Кстати, про обратную совместимость... можно веть обработать данную ситуацию. На примере функции "ПарсингВТРегистрОстатки":
Код
Выбрать все
Функция ПарсингВТРегистрОстатки(ТекстДляОбработки)
	ТекстЗапроса = ТекстДляОбработки;

	Параметры = СтрЗаменить(Формат(0,"Ч04")," ",ШаблонПараметр);
	Паттерн = "\$РегистрОстатки\.([\wа-яё]+[^\wа-яё\(]*)\("+Параметры;
	Вектор = ПолучитьПараметрыВыражения(Паттерн,ТекстЗапроса);

	//zar begin
	ЕстьВариант1СПП = 0;
	//zar end

	Смещение = 0;
	Для НомерЗначения = 0 По Вектор.Количество()-1 Цикл
		ВекторВыражения = Вектор.Получить(НомерЗначения);
		Значение = ВекторВыражения.Значение;
		Длина = ВекторВыражения.Длина;
		Позиция = ВекторВыражения.Вхождение;

		//zar begin
		Если Прав(Значение,1) <> ")" Тогда
		    ЕстьВариант1СПП = 1;
			Прервать;
		КонецЕсли;
		//zar end

		Если ЭтоSQL = 1 Тогда
			ТекстПодстановки = РегистрОстатки_SQL(ВекторВыражения);
		Иначе
			ТекстПодстановки = РегистрОстатки_DBF(ВекторВыражения);
		КонецЕсли;

		ТекстЗапроса = Лев(ТекстЗапроса,Позиция+Смещение) + ТекстПодстановки + Сред(ТекстЗапроса,Позиция+СтрДлина(Значение)+Смещение+1);
		Смещение = Смещение + СтрДлина(ТекстПодстановки)-СтрДлина(Значение);
	КонецЦикла;

	//zar begin
	Если ЕстьВариант1СПП = 1 Тогда
		Параметры = СтрЗаменить(Формат(0,"Ч05")," ",ШаблонПараметр);
		Паттерн = "\$РегистрОстатки\.([\wа-яё]+[^\wа-яё\(]*)\("+Параметры;
		Вектор = ПолучитьПараметрыВыражения(Паттерн,ТекстЗапроса);

		Смещение = 0;
		Для НомерЗначения = 0 По Вектор.Количество()-1 Цикл
			ВекторВыражения = Вектор.Получить(НомерЗначения);
			Значение = ВекторВыражения.Значение;
			Длина = ВекторВыражения.Длина;
			Позиция = ВекторВыражения.Вхождение;

			//удалим параметр "Соединение" из выражения
			ВекторВыражения.Подвыражения.Удалить(2);

			Если ЭтоSQL = 1 Тогда
				ТекстПодстановки = РегистрОстатки_SQL(ВекторВыражения);
			Иначе
				ТекстПодстановки = РегистрОстатки_DBF(ВекторВыражения);
			КонецЕсли;

			ТекстЗапроса = Лев(ТекстЗапроса,Позиция+Смещение) + ТекстПодстановки + Сред(ТекстЗапроса,Позиция+СтрДлина(Значение)+Смещение+1);
			Смещение = Смещение + СтрДлина(ТекстПодстановки)-СтрДлина(Значение);
		КонецЦикла;

	КонецЕсли;
	//zar end

	Если ПустоеЗначение(ТекстЗапроса) = 1 Тогда
		ТекстЗапроса = ТекстДляОбработки;
	КонецЕсли;
	Возврат ТекстЗапроса;
КонецФункции
 


В этом случае корректно отработаются обе ситуации с разными входыми параметрами для 1С++ и ПрямойЗапрос.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #611 - 09. Мая 2010 :: 05:55
Печать  
Постой, в данном случае получается что если параметр с соединениями у тебя прописан тогда он прото будет обрезан и никакого удовольствия. Все равно переписывать. Ведь будь там inner join, или например left join, а в условиях использованы поля из данных таблиц, ты получишь два разных результата.

А конструктор Ивана можно переделать силами тех у кого они есть. Я думаю что он пойдет на встречу. У меня сил так и не нашлось до сих пор.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
zar
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 82
Местоположение: Киров
Зарегистрирован: 17. Августа 2009
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #612 - 10. Мая 2010 :: 13:16
Печать  
Так веть у тебя и раньше "Соединение" обрезалось! Улыбка
Набросал код с учетом соединения (для DBF не делал... только для SQL, но думаю доделать недолго Улыбка)
сделал только для Остатки_РегистрОстатки_SQL, но для остальных - по аналогии...
э... не нашел как файл вставлять... потому ссылкой....
http://narod.ru/disk/20577214000/ИзмененияПрямойЗапрос.txt.html
по идее - должно работать Улыбка
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #613 - 10. Мая 2010 :: 13:34
Печать  
Давай по-порядку.

На текущий момент если я добавлю 5-й параметр (не важно каким образом, путем сдвига на 2-м или добавлением нового) предыдущие ВТ у меня работать перестанут сразу же. И прийдется переписывать все старые разработки. Что весьма для меня на текущий момент затратно. А перестанут работать, потому что он (КОП) перестанет их правильно парсить. Вот и все.
Повторюсь: изменение количества параметров в ВТ = потеря обратной совместимости. А кроме этого класса есть еще класс "ПоставщикДанных" где это тоже может привести к неприятностям.

Теперь что касается твоего кода, у тебя проверка на "= Реквизит" (ну или без пробела), что нифига не универсально. Реквизит может быть в функции, или с кучей пробелов, как до "=" так и после. В общем по хорошему надо нормально разбирать этот кусок чтобы было универсально. Можно посмотреть у меня в ВТ "СрезПоследних". И сделать по аналогии.

Пы.сы. если меня спросят, "а не жалею ли я что ранее не сделал соединения?", я скажу - жалею. Но что ж поделать, исходники открыты, разработка бесплатна, меняйте сколько хотите.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #614 - 10. Мая 2010 :: 19:01
Печать  
Выложено обновление. Исправлена одна весьма неприятная ошибка.

1.06.005 от 11.05.10 г.
- Исправлена ошибка подготовки ВТ по регистрам если при перечислении измерений фигурировали пробелы.
- Новый публичный атрибут – Версия.

Кто ответственный за баг, прошу проверить и подтвердить или опровергнуть заявку на результат.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 39 40 [41] 42 43 ... 60
ОтправитьПечать