Имя: Пароль:
1C
 
Сумма в SQL
0 Anatolik
 
03.03.09
13:19
как проссумировать по отдельности все отрицательнае и положительные значения?
1 Нуф-Нуф
 
03.03.09
13:20
сум >0
сум <0
2 ДенисЧ
 
03.03.09
13:20
SUM(CASE WHEN S>0 THEN S ELSE 0) AS PlusSum
3 Anatolik
 
03.03.09
13:25
(2) СПАСИБО!
теперь я думаю все сойдется =)
4 ДенисЧ
 
03.03.09
13:25
(3) Воруете? :-)
5 Anatolik
 
03.03.09
13:26
(4) нет подсматриваю за 1с =)
6 Anatolik
 
03.03.09
14:22
просто несовсем понятно как приход / расход за период определяется
7 ДенисЧ
 
03.03.09
14:25
приход-расход в регистре определяется по полю debkred
8 Sadovnikov
 
03.03.09
14:25
(6) Это?
ТекстЗапроса = "
|    Select
|        Регистр.Документ КредДок,
|        Регистр.Контрагент Контрагент,
|        '' ДокДвижения,
|        Регистр.Сумма НачОстаток,
|        Cast(0 As Numeric(19, 5)) УвеличениеДолга,
|        Cast(0 As Numeric(19, 5)) УменьшениеДолга
|    From
|        регВзаиморасчетыИтоги Регистр
|    Where
|        Регистр.Period = @ДатаИтогов
|        And Регистр.Сумма <> 0" + стрВидыКредДоков;

Если фИтогиАктуальны = 0 Тогда
   ТекстЗапроса = ТекстЗапроса + "
   |
   |    Union All
   |
   |    Select
   |        Регистр.Документ КредДок,
   |        Регистр.Контрагент Контрагент,
   |        '' ДокДвижения,
   |        (Case When Регистр.DebKred = 0 Then Регистр.Сумма Else -Регистр.Сумма End) НачОстаток,
   |        Cast(0 As Numeric(19, 5)) УвеличениеДолга,
   |        Cast(0 As Numeric(19, 5)) УменьшениеДолга
   |    From
   |        регВзаиморасчеты Регистр (NoLock)
   |    Where
   |        Регистр.Date_Time_IDDOC > @Остатки_НачДатаДвижений And Регистр.Date_Time_IDDOC < @Остатки_КонДатаДвижений
   |        And Регистр.Сумма <> 0" + стрВидыКредДоков;
КонецЕсли;
9 Anatolik
 
03.03.09
14:44
как в этом запросе разбить колонку сумма на приход и расход


Select SP4322 фирма, SP4323 договор, SP4329 сумма from
(
   Select  RA.SP4322,  RA.SP4323, SP4329=CASE DEBKRED WHEN 0 THEN RA.SP4329 ELSE -RA.SP4329 END
   from RA4335 RA(NOLOCK)
   where RA.DATE_TIME_IDDOC>='20081007     0     0   ' and RA.DATE_TIME_IDDOC<'20081016     0     0   '
) AS Tmp
GROUP BY SP4322, SP4323, SP4329
10 ДенисЧ
 
03.03.09
14:48
select ...
CASE debkred WHEN 0 WHEN SP4329 ELSE 0 END AS Приход,
CASE debkred WHEN 1 WHEN SP4329 ELSE 0 END AS Расход
11 ДенисЧ
 
03.03.09
14:49
select ...
CASE debkred WHEN 0 THEN SP4329 ELSE 0 END AS Приход,
CASE debkred WHEN 1 THEN SP4329 ELSE 0 END AS Расход

так точнее
12 Anatolik
 
03.03.09
14:56
(10)(11) еще раз спасибо =)
13 Anatolik
 
03.03.09
14:59
теперь с начальными остатками буду объединять
14 Anatolik
 
03.03.09
16:50
вообшем не получается объеденить эти два запроса =(

/* Общие расчеты с контрагентами. Начальнае остатки */
Select SC172.DESCR Контрагент, SC204.DESCR договор, SC4014.DESCR Фирма, НачОст=SUM(SP4329) from
(
.....
) AS Tmp, SC204, SC172, SC4014

Where    SC204.ID=Tmp.SP4323
   and SC172.ID=SC204.ParentExt
   and SC4014.ID=SP4322
   and SP4329 != 0

GROUP BY SC172.DESCR, SC204.DESCR , SC4014.DESCR
ORDER BY SC172.DESCR, SC204.DESCR , SC4014.DESCR


/* ***************************************************************** */
/* Движения по контрагентам*/
Select SC172.DESCR Контрагент, SC204.DESCR договор, SC4014.DESCR Фирма, Приход=sum(приход), Расход=sum(расход) from
(
...
) AS Tmp, SC204, SC172, SC4014
Where    SC204.ID=Tmp.Договор
   and SC172.ID=SC204.ParentExt
   and SC4014.ID=Tmp.Фирма
GROUP BY SC172.DESCR, SC204.DESCR , SC4014.DESCR
ORDER BY SC172.DESCR, SC204.DESCR , SC4014.DESCR
15 Sadovnikov
 
04.03.09
06:50
Ты скажи, чего сделать-то хочешь в итоге?
16 Anatolik
 
04.03.09
09:37
в итоге хочу получить общие взаиморасчетами с контрагентами

вот такой стандартный отчет

контрагет  договор  фирма  НачОст  Приход  Расход  КонОст
17 Sadovnikov
 
04.03.09
09:40
(16) А чем код из (8) не устроил? Добавив к нему:
   ТекстЗапроса = ТекстЗапроса + "
   |
   |    Union All
   |
   |    Select
   |        Регистр.Документ КредДок,
   |        Регистр.Контрагент Контрагент,
   |        '' ДокДвижения,
   |        Cast(0 As Numeric(19, 5)) НачОстаток,
   |        Регистр.СуммаПриход УвеличениеДолга,
   |        Регистр.СуммаРасход УменьшениеДолга
   |    From
   |        регВзаиморасчеты Регистр
   |    Where
   |        Регистр.Date_Time_IDDOC > @НачДата And Регистр.Date_Time_IDDOC < @КонДатаПлюс1
   |        And Регистр.Сумма != 0" + стрВидыКредДоков;
получишь обороты.
18 Anatolik
 
04.03.09
09:43
тем что я это делаю в QA а не из 1с + в (8) и (16) будут работат медленней
19 Sadovnikov
 
04.03.09
09:48
(18) Это с какого перепуга медленнее-то будет?
"тем что я это делаю в QA а не из 1с" - а этого я вообще не понял...
20 Sadovnikov
 
04.03.09
09:50
+(19) Приведенные запросы я на ура и из кверюги выполню.
21 Anatolik
 
04.03.09
10:04
(20) ну попробуй
(19) тем что там используются объекты 1с а не простые записи
22 Sadovnikov
 
04.03.09
10:06
(21) "ну попробуй" - не поверишь, каждый день пробую. И, как ни странно, все получается.
"тем что там используются объекты 1с а не простые записи" - чего-то ты с утра не того покурил...
23 Anatolik
 
04.03.09
10:47
(22) может и так.
так какой запрос в QA вставить?

зы у меня все получилось =)
24 Sadovnikov
 
04.03.09
10:50
(23) "так какой запрос в QA вставить?" - поясни вопрос?
Имхается мне, что ты просто не понял откуда в запросе регВзаиморасчеты и его поля. Это вьюшки. Сделаны для более удобного написания запросов.
25 Anatolik
 
04.03.09
10:58
(24) я понял откуда регВзаиморасчеты взялись
"ней есть метапарсер имен, который сам переведет все идентификаторы объектов в их реальные имена"

мне нужно было ИМЕННО такой запрос который можно выполить из ЛЮБОГО приложения которое подключится к бд 1с. запросы в виде (17) в этом случаии не работают. поэтому я предлагаю вам вставить его в QA и посмотреть на результат
26 Sadovnikov
 
04.03.09
10:59
(25) Блин, ты даже после (24) не понял...
Еще раз: "Это вьюшки. Сделаны для более удобного написания запросов."
27 Anatolik
 
04.03.09
11:08
(26) да понял, ключевая фраза в (25) "выполить из ЛЮБОГО приложения которое подключится к бд 1с" запрос будет приходить НЕ ИЗ 1С
28 Sadovnikov
 
04.03.09
11:23
(27) Слушай, ну глянь ты уже, наконец, что такое вьюшки. И поверь, что приведенные мною запросы можно выполнить из любого приложения. Не только из 1С...
29 Anatolik
 
04.03.09
11:38
ссылку
30 ДенисЧ
 
04.03.09
11:39
Ужо-съ... Скульщики просят ссылку на то, что такое view...

А может того, в дворники?
31 Sadovnikov
 
04.03.09
11:40
(29) У тебя BOL украли?? Ужас...
32 Sadovnikov
 
04.03.09
11:40
(30) Так ведь еще и не просят. А практически требуют...
33 ДенисЧ
 
04.03.09
11:41
(32) Да, в дворники не годится...
34 Anatolik
 
04.03.09
11:49
пля скульщик со стажем 2 дня
35 Sadovnikov
 
04.03.09
11:53
(34) Тогда просто поверь, что выполнятся мои запросы у меня в базе из любого приложения, умеющего выполнять запросы в скуле.
36 Anatolik
 
04.03.09
11:59
(35) просто хочу увидеть пример (возможно ссылку)
как я понял вьюшки нужно предварительно создать или они где уже есть?
37 Sadovnikov
 
04.03.09
12:02
(36) Создавать надо. Вот пример для регистров:
Функция СоздатьПредставление_Регистр(МетаРег)
   фОшибокНет = 1;
   ИмяТаблицыДвижений = РадугаМД.ИмяТаблицыДвижений(МетаРег.Идентификатор);
   ИмяТаблицыИтогов = РадугаМД.ИмяТаблицыИтогов(МетаРег.Идентификатор);
   
   сзКолонки = СоздатьОбъект("СписокЗначений");
   сзДопКолонкиДвижений = СоздатьОбъект("СписокЗначений");

   Для н = 1 По МетаРег.Измерение() Цикл
       МетаИзм = МетаРег.Измерение(н);
       Колонка = "SP"+РадугаМД.ИДИзмеренияРегистра(МетаРег.Идентификатор, МетаИзм.Идентификатор) + " as "+МетаИзм.Идентификатор;
       сзКолонки.ДобавитьЗначение(Колонка);
   КонецЦикла;
   
   стрРесурсыДвижений = ""; ЗптРД = "";
   Для н = 1 По МетаРег.Ресурс() Цикл
       МетаРес = МетаРег.Ресурс(н);
       ИмяРесурса = МетаРес.Идентификатор;
       Колонка = "SP"+РадугаМД.ИДРесурсаРегистра(МетаРег.Идентификатор, ИмяРесурса);

       сзКолонки.ДобавитьЗначение(Колонка + " as "+ИмяРесурса);
       
       сзДопКолонкиДвижений.ДобавитьЗначение("CASE DebKred WHEN 0 THEN "+Колонка+" ELSE 0 END "+ИмяРесурса+"Приход");
       сзДопКолонкиДвижений.ДобавитьЗначение("CASE DebKred WHEN 1 THEN "+Колонка+" ELSE 0 END "+ИмяРесурса+"Расход");
   КонецЦикла;
   
   сзДопКолонкиДвижений.ДобавитьЗначение("DebKred");
   сзДопКолонкиДвижений.ДобавитьЗначение("CASE DebKred WHEN 0 THEN 1 ELSE -1 END ЗнакДвижения");
   сзДопКолонкиДвижений.ДобавитьЗначение("LineNo_ LineNo_");
   сзДопКолонкиДвижений.ДобавитьЗначение("LineNo_ НомерСтроки");
   сзДопКолонкиДвижений.ДобавитьЗначение("ActNo ActNo");
   сзДопКолонкиДвижений.ДобавитьЗначение("ActNo НомерДвижения");
   
   Если МетаРег.БыстраяОбработкаДвижений = 1 Тогда
       сзДопКолонкиДвижений.ДобавитьЗначение("IDDoc IDDoc");
       сзДопКолонкиДвижений.ДобавитьЗначение("IDDoc идДокДвижения9");
       сзДопКолонкиДвижений.ДобавитьЗначение("Date_Time_IDDoc Date_Time_IDDoc");
       сзДопКолонкиДвижений.ДобавитьЗначение("Date_Time_IDDoc идДокДвижения23");
       сзДопКолонкиДвижений.ДобавитьЗначение("Date_Time_IDDoc ПозицияДокументаДвижения");
       сзДопКолонкиДвижений.ДобавитьЗначение("IDDocDef IDDocDef");
       сзДопКолонкиДвижений.ДобавитьЗначение("IDDocDef идВидДокДвижения10");
   КонецЕсли;


   стрКолонки = СписокВСтроку(сзКолонки, ","+РазделительСтрок+СимволТабуляции);
   //Движения
   ИмяПредставления = "рег"+МетаРег.Идентификатор;
   ТекстЗапроса = "
   |CREATE VIEW "+ИмяПредставления+" AS
   |SELECT
   |    "+стрКолонки+",
   |    "+СписокВСтроку(сзДопКолонкиДвижений, ","+РазделительСтрок+СимволТабуляции)+"
   |FROM "+ИмяТаблицыДвижений+" (NoLock)
   |";
   
   Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса) = 0 Тогда
       фОшибокНет = 0;
   КонецЕсли;

   
   //Итоги
   ИмяПредставления = "рег"+МетаРег.Идентификатор+"Итоги";
   ТекстЗапроса = "
   |CREATE VIEW "+ИмяПредставления+" AS
   |SELECT
   |    "+стрКолонки+",
   |    Period Period,
   |    Period ПериодИтогов
   |FROM "+ИмяТаблицыИтогов+" (NoLock)
   |";
   
   Если СоздатьПредставление(ИмяПредставления, ТекстЗапроса) = 0 Тогда
       фОшибокНет = 0;
   КонецЕсли;
   
   Возврат фОшибокНет;
КонецФункции
38 Кириллка
 
04.03.09
12:03
(35)Ты зачем человеку мозг сношаешь? :)
(36)предварительно созданы.
39 ДенисЧ
 
04.03.09
12:03
У нас нечто вроде

USE [Dchernyaev_Vz]
GO
/****** Object:  View [dbo].[Регистр_План_Факт_Движения]    Script Date: 03/04/2009 12:03:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create View [dbo].[Регистр_План_Факт_Движения]
As
Select
   RA16986.Date_Time_IDDoc,
   RA16986.LINENO_,
   RA16986.ACTNO,
   RA16986.IDDoc,
   RA16986.IDDocDef,
   RA16986.DebKred,
   SP16987 as Местонахождение, SP16988 as СсылкаНаОснование, SP16989 as МестоХранения, SP16990 as Товар, SP16991 as Партия, SP16992 as ПартияРодитель, SP16993 as СвойствоПартии, SP16995 as Стоимость, SP16996 as СебестоимостьСырья, SP16997 as СуммаРеализации, SP16999 as ПризнакДвижения, SP17000 as КодОперации, SP17001 as ПризнакОтгрузки, SP17002 as Основание, SP17003 as Движение, SP17069 as ЗнакДвижения, SP17456 as спрДокументДвижения,
   SP16994 as Количество
From RA16986
40 Sadovnikov
 
04.03.09
12:06
(38) Ню-ню :)
(0) Расскажи для чего ты эту возню со скулем затеял?
41 Anatolik
 
04.03.09
12:14
(40) отчетики фомируются минут по 10, а в скуле 5 секунд

всеравно то нужно знать названия таблиц для создания вьюшки
я понял что можно создать и с помощью твоего запраса, но нужно выполнить ряд предварительных действий. лично мне удобней как делаю я
42 Sadovnikov
 
04.03.09
12:21
(41) "лично мне удобней как делаю я" - рано или поздно поймешь, что нельзя так делать... Ибо чревато...
43 Mikeware
 
04.03.09
12:23
(41) "Летят переленые дятлы...."©
44 Anatolik
 
04.03.09
12:23
(42) чем? записей в бд ведь никаких не делается
45 Sadovnikov
 
04.03.09
12:25
(44) Например, тем, что в двух базах с одинаковыми МД-никами (с точки зрения 1С-ника одинаковыми), легко могут различаться названия таблиц и колонок в них.
46 Anatolik
 
04.03.09
12:25
(42) (43) вот чем пинать пояснили лутше б
47 Anatolik
 
04.03.09
12:31
(45) это я понимаю. НО в другой базе я получу ошибку в запросе и ничего не выполнится. если отойти от 1с и воспользоваться созданием вьюшки (39) то я так же получаю ошибку
48 Mikeware
 
04.03.09
12:32
(46) Внимательно читай (45).
49 Sadovnikov
 
04.03.09
12:32
(47) Имхается мне, что тебе стоит заказать эту работу на стороне... А не кидаться на нее с шашкой.
50 Mikeware
 
04.03.09
12:34
(47) Вьюха будет проецировать "внешние названия полей" на внутренние, поэтому запрос сработает.
1с++ будет работать в базе с поименоваными с точки зрения 1с полями независимо от их внутренних названий, поэтому тоже сработает
51 FAM
 
04.03.09
12:37
Объясните мне, зачем вьюху использовать, когда все то же самое можно напрямую из таблицы запросом 1С++ дернуть? Оно разве не быстрее будет?
З.Ы. единственная причина, которая на ум приходит - использование сторонних прог для вытаскивания данных из 1С...
52 ДенисЧ
 
04.03.09
12:37
(51) Затем, что из не 1с 1с++ не работате.
53 Sadovnikov
 
04.03.09
12:38
(51) Скорость одинаковая, а писать запросы удобнее.
54 Mikeware
 
04.03.09
12:38
(51) Ну, метапарсер напрягать не надо :-)
Писать удобнее...
55 Sadovnikov
 
04.03.09
12:39
(51) Пляс, хорошо помогает, когда с базой из кверюги работаешь - запросы отлаживаешь.
56 Sadovnikov
 
04.03.09
12:40
"Пляс" = "Плюс"
57 los_hooliganos
 
04.03.09
12:40
А во вьюшинах можно хранить актуальные цены и не париться с ошибкой ORDER BY И GROUP BY.
58 FAM
 
04.03.09
12:42
(57) это что за ошибка такая?
59 Anatolik
 
04.03.09
12:42
(50) допустим я буду подключаться к базе не из 1с с компанентой 1с++, а из PHP. всеравно залезать в базу и узнавать как в ней таблицы и поля называются
60 los_hooliganos
 
04.03.09
12:43
Это когда ORDER BY для получения ТОР из _1sconst самой последней цены в подзапросе, а потом ты группируешь итоговую таблицу.
61 ДенисЧ
 
04.03.09
12:44
(59) А ты хочешь залезать, не зная структуры?
А с вью можно просто написать SELECT Descr, ПолнНаименование FROM Справочник_Контрагенты , не замораиваясь на SC*, SP и проч.
62 FAM
 
04.03.09
12:44
(59) вот для ентого и надо вьюхи генерить из 1С перед тем, как РНР к базе долбиться
63 Sadovnikov
 
04.03.09
12:45
(59) Не понял. Ты собрался скуль в инет высовывать?
64 los_hooliganos
 
04.03.09
12:45
Во как меня валит:
qryConsole : State 42000, native 104, message [Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.
65 Sadovnikov
 
04.03.09
12:46
(64) А ты себе по рукам, по рукам. Что бы не делал таких ошибок.
66 los_hooliganos
 
04.03.09
12:47
(65) В подзапросе без ORDER не обойтись, а иначе такая ошибка.
67 Sadovnikov
 
04.03.09
12:48
(66) Для получения цены без ORDER BY не обойтись? Кирилл, не смеши мои тапочки...
68 los_hooliganos
 
04.03.09
12:50
(67) да не... можно конечно, но метапарсеровское $ПоследнееЗначение.Цены.Цена(Цены.ID, :ВыбДата) - не работает. Приходиться ручками править))
69 Sadovnikov
 
04.03.09
12:51
(68) Не надо пользоваться виртуальными таблицами... ИМХО.
70 Anatolik
 
04.03.09
12:52
(69) нет.
71 Sadovnikov
 
04.03.09
12:53
(70) Это ты о чем сейчас? И что?
72 los_hooliganos
 
04.03.09
12:54
(71)Ну если запрос несложный то нормально, а иначе конечно...
73 Sadovnikov
 
04.03.09
12:56
(72) Это он в начале несложный. А потом то одно к нему понадобится привинтить, то другое...
74 Anatolik
 
06.03.09
09:38
вообшем после недолгих мучений пришел к выводу, что вьюшки нужны и с ними удобней
спасибо
можно узнать что за МетаРег в (36) метаданные.регистр..... ?
75 Anatolik
 
06.03.09
09:38
сори в (37)
76 Sadovnikov
 
06.03.09
09:41
(74)
Функция СоздатьПредставленияПоМетаданным()
   Если фПересоздавать = 1 Тогда
       КомментарийДляЖурнала = "Полное пересоздание";
   Иначе
       КомментарийДляЖурнала = "Проверка наличия";
   КонецЕсли;
   ЗаписьЖурналаРегистрации(КомментарийДляЖурнала,, "СоздатьПредставленияПоМетаданным",, 3);
   
   фОшибокНет = 1;
   
   Для н = 1 По Метаданные.Регистр() Цикл
       МетаРег = Метаданные.Регистр(н);
       Если СоздатьПредставление_Регистр(МетаРег) = 0 Тогда
           фОшибокНет = 0;
       КонецЕсли;
   КонецЦикла;
77 Anatolik
 
06.03.09
11:54
а в том же (37)

идДокДвижения23
идДокДвижения9
идВидДокДвижения10

цифры в конце имеют какой то тайный смысл?
78 los_hooliganos
 
06.03.09
12:58
(77) это количество символов в строке ID.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан