Имя: Пароль:
1C
1C 7.7
v7: Класс. Прямой запрос. ВЫРАЗИТЬ в секции ГДЕ
,
0 Asakra
 
23.10.13
13:16
подскажите, пж. есть такой запрос:
          "ВЫБРАТЬ
           |      ЗП.Контрагент      КАК [Контрагент      :Справочник.Контрагенты],
           |      ЗП.Сотрудник      КАК [Сотрудник            :Справочник.ФизЛица],
           |      ЗП.ВидСтавкиЗП      КАК [ВидСтавкиЗП      :Перечисление._ВидыСтавокЗПОтПродаж],
           |      ЗП.ТОПМенеджер      КАК [ТОПМенеджер      :Справочник.ФизЛица],
           |
           |      ВЫБОР
           |            КОГДА ЗП.ТОПМенеджер = :ПустойИД
           |                  ТОГДА 0
           |            ИНАЧЕ 1
           |      КОНЕЦ                  КАК ЭтоТОПМенеджер,
           |
           |      ЗП.СуммаПродажиОстаток            КАК [СуммаПродажи :Число.15.2],
           |      ЗП.СуммаЗПОтПродажиОстаток      КАК [СуммаЗП :Число.15.2]
           |
           |ИЗ
           |      $РегистрОстатки.ЗарплатаОтПродаж(:Документ,
           |                  Контрагент В (ВЫБРАТЬ val ИЗ #СписокКонтрагентов),
           |                  (Контрагент,Сотрудник,ВидСтавкиЗП,ТОПМенеджер), (СуммаПродажи,СуммаЗПОтПродажи)) КАК ЗП
           |
           |ГДЕ
           |      ВЫРАЗИТЬ(ЗП.СуммаПродажиОстаток КАК NUMERIC(15,2)) <> 0
           |";

хочется откинуть СуммаПродажиОстаток = 0. если использую ROUND, то все гуд, а если CAST, то условие не отрабатывает. я как понимаю ROUND округляет, а типизация [Сумма :Число.15.2] просто откидывает лишнее (опасаюсь, что при условии с ROUND в результате Сумма будет = 0, т.к. при проверке округлится до 0.01). или я не прав и можно смело использовать ROUND? или как правильно написать условие с CAST? совсем уж не хочется при обходе результата проверять на равенство нулю :)
База: DBF
1 Asakra
 
23.10.13
15:10
ап
2 Asakra
 
24.10.13
08:51
ап
3 ЧеловекДуши
 
24.10.13
09:08
(2) Что АП?
Извращенец... Пиши лучше запрос на SQL, куда приятней :)
4 Asakra
 
24.10.13
11:32
(3) обоснуй
5 ЧеловекДуши
 
24.10.13
11:39
(4) Я к тому, что ненужно себя ограничивать в запросах на МС-СКЛ, как это сделало 1С :)
В Прямых запросах под 1С 7.7, нужно жить свободней :)

Select
  ЗП.Контрагент [Клиент $Справочник.Контрагент]

From
  $РегистрОстатки.ЗарплатаОтПродаж(:Документ,
           |                  Контрагент  IN (SELECT VAL FROM #СписокКонтрагентов),
           |                  (Контрагент,Сотрудник,ВидСтавкиЗП,ТОПМенеджер), (СуммаПродажи,СуммаЗПОтПродажи)) КАК ЗП
6 ЧеловекДуши
 
24.10.13
11:43
+ >>> КАК ЗП

AS ЗП --Сори описалси

+ Люди советуют в начало запросов, под 1С++, вставлять строчку "SET NOCOUNT ON"
Бывает можно добавлять "set LANGUAGE russian"
7 Asakra
 
24.10.13
11:49
(6) дык 1SQLite используется... или это тонкий намек перейти на 1С++ или вообще на SQL? мая твоя не понимать :)
8 ЧеловекДуши
 
24.10.13
11:49
+(0) База: DBF

Сори, не дочитал :)
Тогда тебе нужно спрашивать про прямые запросы под 1SQLite :)
Может подскажут.
9 Asakra
 
24.10.13
11:50
(8) гы... дык я этим и занимаюсь
10 ЧеловекДуши
 
24.10.13
11:50
(7) Да, я уже увидел :)
Просто обычно на DBF я не лукавлю с прямыми запросами, нужды не было :)
11 ЧеловекДуши
 
24.10.13
11:51
(9) А все же, зачем тебе класс?
Все и так пишется без этого извращения :)
12 Asakra
 
24.10.13
11:54
(11) если переписать на 1SQLite, вопрос будет тем же
моей проблемы это не решит...
интересно на SQL тоже ВТ не используют, извращаются с доборами  движений?
13 sttt
 
24.10.13
12:28
(12) кто тебе сказал? http://msdn.microsoft.com/ru-ru/library/ms177399(v=sql.105).aspx

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
    ModifiedDate = GETDATE()
OUTPUT inserted.BusinessEntityID,
       deleted.VacationHours,
       inserted.VacationHours,
       inserted.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO
14 Asakra
 
24.10.13
12:47
(13) а при чем тут временные таблицы?
15 Asakra
 
01.11.13
10:00
вопрос еще актуален. ни кто не знает?
16 Ёпрст
 
01.11.13
10:04
>>>хочется откинуть СуммаПродажиОстаток = 0.

Делай group by + having
17 Ёпрст
 
01.11.13
10:05
а так, вообще не ясно, нафига тебе там каст или раунд вообще.
18 Asakra
 
01.11.13
10:06
(16) пасиб. попробую. в having cast использовать?
19 Asakra
 
01.11.13
10:08
(17) потом в цикле деление на 0 будет. там тока условие вешать. а в отчетах так вообще песня может быть и группировки и строки нулевые могут быть. вот и хочется разобраться есть ли какие варианты
20 Asakra
 
01.11.13
10:09
+ (19) что б при обходе результата не извращаться
21 Ёпрст
 
01.11.13
10:11
(18) нафига ?
Зачем тебе вообще кастовать результат ?
22 Asakra
 
01.11.13
10:13
(21) в результате могут быть значения = 0, после типизации [Число.15.2]
23 Asakra
 
01.11.13
10:14
+ (22) а до типизации, например, 0.00002222
24 Ёпрст
 
01.11.13
10:14
у тебя чего, 5-6 знаков дробной части что ле ?
25 Ёпрст
 
01.11.13
10:14
(23) п...ц
26 Ёпрст
 
01.11.13
10:15
Мот того, проще в ресурсах убрать к едрени фени лишние разряды дробной части ?
Вы чем торгуете то ?
:))
27 Asakra
 
01.11.13
10:16
(25) нет это 1SQLite так работает. в данном примере так и есть. дробная = 2
28 Ёпрст
 
01.11.13
10:16
(27) не замечал
29 Ёпрст
 
01.11.13
10:17
для вычисления любой функции берется точность как у первого результата.. будет у тебя сумма по количеству - будет точность как у ресурса количество.
30 Asakra
 
01.11.13
10:17
читал где-то, orefkof говорил, что из-за использования muneric, где-то там в компаненте
31 Ёпрст
 
01.11.13
10:18
ну .. round тогда воткни.
32 Ёпрст
 
01.11.13
10:18
или каст на сам аргумент функции
33 Asakra
 
01.11.13
10:19
(31) опасаюсь, что при условии с ROUND в результате Сумма будет = 0, т.к. при проверке округлится до 0.01
34 Asakra
 
01.11.13
10:20
точнее проверено, из-за этого на форум и обратился. начались ошибки с делением на ноль
35 Asakra
 
01.11.13
10:21
(32) а это как, не совсем понял. что есть "аргумент функции"?
36 Ёпрст
 
01.11.13
10:24
ну пробуй либо
cast (sum(....) as numric(...))
либо
sum(argument as numric(....))
37 Asakra
 
01.11.13
10:27
(36) а group by при этом нужен?
38 Asakra
 
01.11.13
11:26
(36) не помогло. при ROUND результат - пустая таблица. с (36) в результате строка с 0
39 Asakra
 
01.11.13
11:54
а почему CAST(0.000009, NUMERIC(15,2)), возвращает 0.000009?
40 Asakra
 
01.11.13
11:55
так и должно быть? или я че-то ни то делаю?
41 Asakra
 
01.11.13
12:02
интересно:
cast(0.000009 as [Число.15.2]) отрабатывает, но возвращает 0.000009. ерундень какая-то
42 Asakra
 
01.11.13
12:28
помогло только:
ГДЕ
ЗП.СуммаПродажиОстаток <= -0.01 ИЛИ ЗП.СуммаПродажиОстаток >= 0.01