Переключение на Главную Страницу Страницы: [1] 2 3 4 ОтправитьПечать
Очень популярная тема (более 25 ответов) ВТ БИОстатки для 1sqlite (число прочтений - 22141 )
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
ВТ БИОстатки для 1sqlite
28. Июня 2008 :: 21:16
Печать  
Класс БухИтоги.
Методы Подставлять, Отладка, ВыполнитьЗапрос.
Синтаксис методов аналогичен одноименным методам SQLiteQuery.

Класс реализует виртуальную таблицу БИОстатки.
Синтаксис ВТ:
онто>,<Условия>)
<ГраницаРасчета> - она и есть Улыбка
<Соединение> - соединения с другими таблицами (использование соединений с текущей реализацией оптимизатора запросов движка SQLite и стандартными индексами 1С - неэффективно), сделано для использования с собственными индексами)
<Счета> - список кодов счетов, по которым получаются остатки. Обязателен.
<ТипыИтогов> - список выбираемых итогов, разделенных запятыми. 1-сумма, 2-валютная сумма, 3-количество
<Субконто> - список видов субконто, по которым получаются остатки. Виды субконто могут быть заданы в виде Субконто1 (1-е субконто счета) или наименованием.
<Условия> - условия, накладываемые на выборку.

Пример использования:
Код
Выбрать все
Запрос=СоздатьОбъект("БухЗапрос");
ТекстЗапроса="SELECT
|ОсновнойОстатки.Счет [Счет :Счет.Основной]
|, substr(ОсновнойОстатки.Субконто1,1,9) AS [Материал $Справочник.Материалы]
|, substr(ОсновнойОстатки.Субконто2,1,9) AS [Склад $Справочник.МестаХранения]
|, ОсновнойОстатки.КоличествоОстаток As [Остаток $Число.15.3]
|FROM $БИОстатки.Основной(:ВыбДата,
|,
|(10), 3,
|(Материалы, МестаХранения),
|) AS ОсновнойОстатки
|";
Запрос.Подставлять("ВыбДата",ВыбДок);
ВремяНач=_GetPerformanceCounter();
Т=Запрос.ВыполнитьЗапрос(ТекстЗапроса);
Сообщить(_GetPerformanceCounter()-ВремяНач);
Т.ВыбратьСтроку();
 


Код
Выбрать все
Запрос=СоздатьОбъект("БухЗапрос");
ТекстЗапроса="SELECT
|ОсновнойОстатки.Счет [Счет :Счет.Основной]
|, substr(ОсновнойОстатки.Субконто1,1,9) AS [Товар $Справочник.Материалы]
|, substr(ОсновнойОстатки.Субконто2,1,9) AS [Склад $Справочник.МестаХранения]
|, ОсновнойОстатки.КоличествоОстаток As [Количество $Число.15.3]
|, ОсновнойОстатки.СуммаОстаток As [Сумма $Число.15.2]
|FROM $БИОстатки.Основной(:ВыбДата,
|,
|(10.1, 10.2, 10.3), (1,3),
|(Субконто1, Субконто2),
|Субконто2 =:Склад
|) AS ОсновнойОстатки
|";
Запрос.Подставлять("ВыбДата",ВыбДок);
Запрос.Подставлять("Склад",Константа.ОсновнойСклад);
ВремяНач=_GetPerformanceCounter();
Т=Запрос.ВыполнитьЗапрос(ТекстЗапроса);
Сообщить(_GetPerformanceCounter()-ВремяНач);
Т.ВыбратьСтроку(); 

« Последняя редакция: 01. Июля 2008 :: 14:24 - steban »  

AccQuery.rar ( 14 KB | Загрузки )

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВТ БИОстатки для 1sqlite
Ответ #1 - 28. Июня 2008 :: 21:22
Печать  
Класс содержит код, который умеет разбирать ВТ вида:
$ИмяВТ.ОбъектВТ(Параметр1, Параметр2, ...)

В коде класса присутствует примитивный токенайзер и некоторый набор функций, облегчающий разбор текста
очень хотелось написать это все на perl, но очень не хотелось ставить perl на каждую тачку Подмигивание
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: ВТ БИОстатки для 1sqlite
Ответ #2 - 29. Июня 2008 :: 06:21
Печать  
Немного не въехал, а где сам класс скачать ?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВТ БИОстатки для 1sqlite
Ответ #3 - 29. Июня 2008 :: 06:35
Печать  
в первом посте.
вложение было временно удалено до исправления ошибки.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: ВТ БИОстатки для 1sqlite
Ответ #4 - 29. Июня 2008 :: 06:37
Печать  
Теперь вижу, скачал, буду пробовать  Улыбка
  
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: ВТ БИОстатки для 1sqlite
Ответ #5 - 29. Июня 2008 :: 07:19
Печать  
Описал класс
класс БухЗапрос = Classes\БухЗапрос.ert
{
};
Ввел код:
Код
Выбрать все
ТекстЗапроса="SELECT
|ОсновнойОстатки.Счет [Счет :Счет.Основной]
|, substr(ОсновнойОстатки.Субконто1,1,9) AS [Материал $Справочник.Материалы]
|, substr(ОсновнойОстатки.Субконто2,1,9) AS [Склад $Справочник.МестаХранения]
|, ОсновнойОстатки.КоличествоОстаток As [Остаток $Число.15.3]
|FROM $БИОстатки.Основной(
|:ВыбДата,
|,
|(10),
|3,
|(Материалы, МестаХранения),
|) AS ОсновнойОстатки
|";
Запрос.Подставлять("ВыбДата",РабочаяДата());
ВремяНач=_GetPerformanceCounter();
Т=Запрос.ВыполнитьЗапрос(ТекстЗапроса);
 


Ошибка:
Т=Запрос.ВыполнитьЗапрос(ТекстЗапроса);
{D:\TEMP\MN+\BU\CLASSES\ПРОВЕРКАБУХЗАПРОСА.ERT(35)}: Недостаточное число параметров передано при вызове функции/процедуры объекта
,а если
Код
Выбрать все
Т=Запрос.ВыполнитьЗапрос(ТекстЗапроса,,); 


все нормально.
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВТ БИОстатки для 1sqlite
Ответ #6 - 29. Июня 2008 :: 07:28
Печать  
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: ВТ БИОстатки для 1sqlite
Ответ #7 - 29. Июня 2008 :: 07:31
Печать  
1cpp.dll 2.5.0.4 от 25,10,2007
Понятно  Улыбка
Вечером продолжу.
  
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: ВТ БИОстатки для 1sqlite
Ответ #8 - 29. Июня 2008 :: 13:00
Печать  
А можно еще вопрос, как задать два условия
Код
Выбрать все
|(Субконто1, Субконто2),
|(Субконто1 = :Материал, Субконто2 =:Склад) 


так вываливается с ошибкой
near ",": syntax error

И еще учитывается ли, если у счета стоит галка "Учет по сумме" у субконто "МестаХранения" ? У нас в конфе при внутреннем перемещении материалов перемещается не только количество, но и сумма.

И еще можно поподробнее про границу расчета, правильно ли я понимаю, что получаются отстатки на указанную ВыбДату, на ее конец ?
« Последняя редакция: 29. Июня 2008 :: 14:30 - Alister »  
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: ВТ БИОстатки для 1sqlite
Ответ #9 - 29. Июня 2008 :: 15:17
Печать  
Простой пример:
30.06.2008 поступление 10 шт
01.07.2008 отгрузка 2 шт
склад - Основной
Код
Выбрать все
"SELECT
|ОсновнойОстатки.Счет [Счет :Счет.Основной]
|, substr(ОсновнойОстатки.Субконто1,1,9) AS [Материал $Справочник.Материалы]
|, substr(ОсновнойОстатки.Субконто2,1,9) AS [Склад $Справочник.МестаХранения]
|, ОсновнойОстатки.КоличествоОстаток As [Количество $Число.15.3]
|, ОсновнойОстатки.СуммаОстаток As [Сумма $Число.15.2]
|FROM $БИОстатки.Основной(:ВыбДата,
|,
|(10.1, 10.2, 10.3, 10.5, 10.8, 10.9, 10.10), (1,3),
|(Субконто1, Субконто2),
|(Субконто1 =:Материал)
|) AS ОсновнойОстатки
|";
:Материал подставляю свой материал 


Если ВыбДата с 01.06 по 15.06 ничего
---------------------
С 16.06 по 30.06
таблица результатов запроса  - 2 строки
-2 шт
10 шт
----------------------
Если ВыбДата = 01.07
таблица результатов - 1 строка
10 шт
----------------------
С 02.07 по 15.07
таблица результатов запроса  - 2 строки
-2 шт
10 шт
----------------------
С 16.07 уже опять 1 строка - 8 шт (правильно)

У нас на 10 счетах учет по сумме по местам хранения.
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВТ БИОстатки для 1sqlite
Ответ #10 - 29. Июня 2008 :: 22:22
Печать  
Класс обновлен.
Качать в первом посте.
Исправлено некоторое количество косяков и оптимизированы запросы.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВТ БИОстатки для 1sqlite
Ответ #11 - 29. Июня 2008 :: 22:29
Печать  
Alister писал(а) 29. Июня 2008 :: 13:00:
А можно еще вопрос, как задать два условия
Код
Выбрать все
|(Субконто1, Субконто2),
|(Субконто1 = :Материал, Субконто2 =:Склад) 


так вываливается с ошибкой
near ",": syntax error
Код
Выбрать все
|(Субконто1, Субконто2),
|(Субконто1 = :Материал) AND (Субконто2 =:Склад) 


Alister писал(а) 29. Июня 2008 :: 13:00:
И еще учитывается ли, если у счета стоит галка "Учет по сумме" у субконто "МестаХранения" ?
никак не учитывается
Alister писал(а) 29. Июня 2008 :: 13:00:
У нас в конфе при внутреннем перемещении материалов перемещается не только количество, но и сумма.

Вот как раз в таком случае суммы по складам будут возвращены правильные.
Alister писал(а) 29. Июня 2008 :: 13:00:
И еще можно поподробнее про границу расчета, правильно ли я понимаю, что получаются отстатки на указанную ВыбДату, на ее конец ?

на ее начало
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: ВТ БИОстатки для 1sqlite
Ответ #12 - 30. Июня 2008 :: 05:34
Печать  
steban, на инфостарте некто сказал, что "никак не получается использовать типизацию Субконто Печаль"
Можешь ли проверить - кто из нас дурак?
Или действительно не работает, или чел пользоваться не умеет.
  
Наверх
 
IP записан
 
Alister
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 123
Зарегистрирован: 19. Мая 2006
Re: ВТ БИОстатки для 1sqlite
Ответ #13 - 30. Июня 2008 :: 05:45
Печать  
Спасибо  Улыбка В обновленном классе приведенный мной пример теперь работает правильно  Улыбка С условиями тоже все ОК
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВТ БИОстатки для 1sqlite
Ответ #14 - 30. Июня 2008 :: 07:17
Печать  
steban писал(а) 28. Июня 2008 :: 21:22:
В коде класса присутствует примитивный токенайзер и некоторый набор функций, облегчающий разбор текста

Эту часть дорабатывать будешь?  Улыбка Я сломал свой мозг на конструкциях вроде
Код
Выбрать все
ТекстЗапроса = "
	|$БИОстатки.Основной(п1, п2, п3, п4, п5, п6 = ""п7(п8,"")
	|";
Сообщить(БИ.ОбработатьМетаЗапрос(ТекстЗапроса)); 


Этот крэштестик вешает 1С. Ужас
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 4
ОтправитьПечать