|
v7: 1с++ Прямой запрос. Передача условий в подзапрос | ☑ | ||
---|---|---|---|---|
0
aass
21.11.11
✎
11:28
|
|SELECT
| Журнал.Date | ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура] | ,SUM($ДокОКС.Количество) as Количество | ,SUM($ДокОКС.Сумма) as Сумма | ,SUM(Cena.Цена)*SUM($ДокОКС.Количество) as СуммаЗакуп |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc | |LEFT JOIN | (SELECT | СпрЦены.PARENTEXT as Владелец | ,date as Дата | ,cast(value as numeric(15,2)) as Цена |FROM | 1sconst as Константа |INNER JOIN | $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid |INNER JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID |INNER JOIN | $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = СпрЦены.PARENTEXT |WHERE | СпрКатЦен.DESCR = 'Закупочная' | AND | cast(value as numeric(15,2))>0 | AND | Константа.id = :id |ORDER BY | date desc |) | as Cena ON Cena.Владелец =$ДокОКС.Товар //| AND Cena.Дата = Журнал.Date // здесь нужно выбрать все значения переодические до даты и взять из него только последние | |INNER JOIN | $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc |WHERE | Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND | Жур.Closed = 1 |GROUP BY | $ДокОКС.Товар | ,Журнал.Date |"; запрос выдает сумму цен (SUM(Cena.Цена)*SUM($ДокОКС.Количество)) но соотвественно выдает не то что надо, как добиться от left join что бы выбирал последнюю цену для нужного товара или есть в природе возможность передать дату и товар из первого запроса в условие для подзапроса ? |
|||
12
Кириллка
21.11.11
✎
11:53
|
еси запрос через vfpoledb, то коррелированный в селект-листе будет ой (если память не изменяет).
|
|||
13
aass
21.11.11
✎
11:54
|
(10) СпрКатЦен.DESCR = 'Закупочная' это принципиально, так как запрос пишеться под "чужую базу, шаримся из родной в соседней"
|
|||
14
aass
21.11.11
✎
11:55
|
(12) да еще - Provider=VFPOLEDB.1
|
|||
15
aass
21.11.11
✎
11:57
|
(11) тут документ продаж и цена тама продажи, а нам нужен закуп,есть вариант брать из партии цену, но в нашем случаи справочник отработает точней (нет последовательности)
|
|||
16
aass
21.11.11
✎
11:59
|
(10) наверно все таки будет правильно, бум пробывать
|
|||
17
Ёпрст
21.11.11
✎
12:02
|
(12) да не, работать будет нормально.
Токма вот для скорости один хрен нужно всё переписывать |
|||
18
orefkov
21.11.11
✎
12:08
|
(13)
И чего? Так же сначала делаешь запрос в соседнюю базу, получаешь id. Подставляешь его в текст запроса. |
|||
19
Кириллка
21.11.11
✎
12:08
|
(17)ну я упираться не буду, конечно, но точно помню, что была засада какая-то, что толи TOP не разрешен был, толи ORDER BY в коррелированном подзапросе в селект-листе.
|
|||
20
aass
21.11.11
✎
12:09
|
(17) к этому варианту и пришел то что скорость на уровне около минуты движения за месяц , до этого еще два варианта было один до 30 минут второй до 8 если получиться с топ, отпишусь по времени
|
|||
21
aass
21.11.11
✎
12:11
|
(18) если в соседнию базу кидаешь несколько запросов времени уходит намного больше когда один большой запрос
|
|||
22
Ёпрст
21.11.11
✎
12:12
|
||||
23
orefkov
21.11.11
✎
12:18
|
(21)
Замер времени - истина в последней инстанции. Кстати, еще вариант - OLE + 1sqlite в той базе. Вобщем, мерять надо. |
|||
24
ЧеловекДуши
21.11.11
✎
12:23
|
В DBF лучше пиши без изысков :)
Быстрее напишешь. |
|||
25
aass
21.11.11
✎
13:18
|
ругается
ТекстЗапроса = " |SELECT | Журнал.Date | ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура] | ,SUM($ДокОКС.Количество) as Количество | ,SUM($ДокОКС.Сумма) as Сумма //| ,SUM($ДокОКС.Количество)* | , |( |SELECT | top 1 | cast(value as numeric(15,2)) |FROM | 1sconst as Константа |INNER JOIN | $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid |INNER JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID |INNER JOIN | $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = СпрЦены.PARENTEXT |WHERE | СпрКатЦен.DESCR = 'Закупочная' | AND | cast(value as numeric(15,2))>0 | AND | Константа.id = :id | AND | СпрЦены.PARENTEXT = $ДокОКС.Товар //| AND //| Константа.date <= Журнал.Date |ORDER BY | date desc |) as СуммаЗакуп |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc |INNER JOIN | $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc |WHERE | Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND | Жур.Closed = 1 |GROUP BY | $ДокОКС.Товар | ,Журнал.Date |"; SELECT Журнал.Date ,ДокОКС.sp3499 as [Товар_1c_type_Справочник_1c_dot_Номенклатура] ,SUM(ДокОКС.sp3500) as Количество ,SUM(ДокОКС.sp3504) as Сумма , ( SELECT top 1 cast(value as numeric(15,2)) FROM 1sconst as Константа INNER JOIN sc3772 as СпрЦены ON СпрЦены.ID = Константа.objid INNER JOIN sc3769 as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID INNER JOIN sc33 as СпрНоменк ON СпрНоменк.ID = СпрЦены.PARENTEXT WHERE СпрКатЦен.DESCR = 'Закупочная' AND cast(value as numeric(15,2))>0 AND Константа.id = ' 2WV' AND СпрЦены.PARENTEXT = ДокОКС.sp3499 ORDER BY date desc ) as СуммаЗакуп FROM dt3487 as ДокОКС JOIN 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc INNER JOIN dh3487 as Док ON Док.IDDoc = ДокОКС.IDDoc INNER JOIN 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc WHERE Жур.Date BETWEEN {d '2011-05-01'} AND {d '2011-05-01'} AND Жур.Closed = 1 GROUP BY ДокОКС.sp3499 ,Журнал.Date тзВыбНомеклатура = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); {E:\1C_DB\EXTFORMS\W_VFPOLEDB_4.ERT(336)}: FAILED! ICommandText::Execute(): SQL: Queries of this type are not supported. |
|||
26
aass
21.11.11
✎
13:46
|
без INNER JOIN работает
|
|||
27
aass
21.11.11
✎
13:48
|
да и по времени довольно шустро
|
|||
28
Кириллка
21.11.11
✎
14:49
|
(26)в каком из запросов смотреть? Без какого INNER JOIN работает?
|
|||
29
Ёпрст
21.11.11
✎
14:57
|
А нахрена вот так делать ?!
JOIN 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc INNER JOIN 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc |
|||
30
aass
21.11.11
✎
15:00
|
ТекстЗапроса = "
|SELECT | Журнал.Date | ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура] | ,SUM($ДокОКС.Количество) as Количество | ,SUM($ДокОКС.Сумма) as Сумма //| ,SUM($ДокОКС.Количество)* | , |( |SELECT | top 1 | cast(value as numeric(15,2)) |FROM | 1sconst as Константа |INNER JOIN | $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid |WHERE | Константа.objid = :ТекЦена | AND | Константа.id =' 2WV' //$ИсторияРеквизита.Цены.Цена | AND | Константа.date <= :НачДата ~~ //| AND //| СпрЦены.PARENTEXT = $ДокОКС.Товар |ORDER BY | Константа.date desc //|FROM //| 1sconst as Константа //|INNER JOIN //| $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid //|INNER JOIN //| $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID //|INNER JOIN //| $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = СпрЦены.PARENTEXT //|WHERE //| СпрКатЦен.DESCR = 'Закупочная' //| AND //| cast(value as numeric(15,2))>0 //| AND //| Константа.id = :id //| AND //| СпрЦены.PARENTEXT = $ДокОКС.Товар //| AND //| Константа.date <= Журнал.Date //|ORDER BY //| date desc |) as СуммаЗакуп |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc |INNER JOIN | $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc |WHERE | Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND | Жур.Closed = 1 |GROUP BY | $ДокОКС.Товар | , |Журнал.Date |"; вот так работает |
|||
31
aass
21.11.11
✎
15:01
|
| AND
| СпрЦены.PARENTEXT = $ДокОКС.Товар с этой байдой тоже не работает, надо с мыслями собрать че то запутался слегка я |
|||
32
aass
21.11.11
✎
15:11
|
(29) дата документа нужна для цены
|
|||
33
aass
21.11.11
✎
15:44
|
|INNER JOIN
| $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid |WHERE | СпрЦены.SP3787 = :ТекЦена вообщем эта сцепка не хочет работать |
|||
34
aass
21.11.11
✎
15:44
|
в условие добавляещь СпрЦены.SP3787 = :ТекЦена и ругаться на чинает
|
|||
35
Ёпрст
21.11.11
✎
15:51
|
(34) используй метапарсер и $ и не пиши имена полей руками.
|
|||
36
aass
21.11.11
✎
17:26
|
(35) $СпрЦены.Владелец а так он ругается
Meta name parser error: поле таблицы не найдено "$СпрЦены.Владелец" |
|||
37
aass
21.11.11
✎
19:19
|
вообщем не получились у меня JOIN в подзапросе для DBF. единсвенный вариант вычислять в основном запросе параметры для 1sconst id, objid и передавать их в условие подзапроса, как нарисую , результаты, по времени выполнения, напишу.
|
|||
38
Ёпрст
21.11.11
✎
19:39
|
(36) :)))
Вообще то речь за все поля, типа SP3787 , а Владелец, это ежели чего, PARENTEXT |
|||
39
Ёпрст
21.11.11
✎
19:40
|
(37) пиши текс запроса, который не получился, целиком.
|
|||
40
aass
21.11.11
✎
20:05
|
|SELECT
| Журнал.Date | ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура] | ,SUM($ДокОКС.Количество) as Количество | ,SUM($ДокОКС.Сумма) as Сумма //| ,SUM($ДокОКС.Количество)* | , |( |SELECT | top 1 | cast(value as numeric(15,2)) |FROM | 1sconst as Константа |LEFT JOIN | $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid |WHERE | Константа.objid = СпрЦены.ID | AND | Константа.id =' 2WV' | AND | Константа.date <= :НачДата ~~ |ORDER BY | Константа.date desc |) as СуммаЗакуп |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc |INNER JOIN | $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc |INNER JOIN | $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар |INNER JOIN | $Справочник.Цены as СпрЦены ON СпрНоменк.ID = СпрЦены.PARENTEXT |INNER JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID |WHERE | Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND | Жур.Closed = 1 |GROUP BY | $ДокОКС.Товар | , |Журнал.Date вообщем вот так работает |
|||
41
aass
21.11.11
✎
20:06
|
(40) тока теперь подшаманить надо под задачу
|
|||
42
aass
21.11.11
✎
20:16
|
|SELECT
| Журнал.Date | ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура] | ,SUM($ДокОКС.Количество) as Количество | ,SUM($ДокОКС.Сумма) as Сумма //| ,SUM($ДокОКС.Количество)* | , |( |SELECT | top 1 | cast(value as numeric(15,2)) |FROM | 1sconst as Константа |LEFT JOIN | $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid |WHERE | Константа.objid = СпрЦены.ID | AND | Константа.id =' 2WV' | AND | Константа.date <= :НачДата ~~ |ORDER BY | Константа.date desc |) as СуммаЗакуп |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc |INNER JOIN | $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc //|INNER JOIN //| $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар //|INNER JOIN //| $Справочник.Цены as СпрЦены ON СпрНоменк.ID = СпрЦены.PARENTEXT //|INNER JOIN //| $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID |WHERE | Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND | Жур.Closed = 1 |GROUP BY | $ДокОКС.Товар | , |Журнал.Date так тоже работает |
|||
43
aass
21.11.11
✎
20:17
|
скорость минута 23, тока цена одна и таже для всех вылазит
|
|||
44
Кириллка
21.11.11
✎
20:19
|
прикольный коррелированный запрос получился.
|
|||
45
Кириллка
21.11.11
✎
20:20
|
+44 а зачем тебе эта громоздкая конструкция в скобках? Пиши вместо скобок всегда 1234.56
|
|||
46
aass
21.11.11
✎
20:23
|
|SELECT
| Журнал.Date | ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура] | ,SUM($ДокОКС.Количество) as Количество | ,SUM($ДокОКС.Сумма) as Сумма //| ,SUM($ДокОКС.Количество)* | , |( |SELECT | top 1 | cast(value as numeric(15,2)) |FROM | 1sconst as Константа |LEFT JOIN | $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid |LEFT JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID |WHERE | Константа.objid = СпрЦены.ID | AND | Константа.id =:id | AND | Константа.date <= :НачДата ~~ | AND | Константа.id = $ДокОКС.Товар |ORDER BY | Константа.date desc |) as СуммаЗакуп |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc |INNER JOIN | $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc //|INNER JOIN //| $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар //|INNER JOIN //| $Справочник.Цены as СпрЦены ON СпрНоменк.ID = СпрЦены.PARENTEXT //|INNER JOIN //| $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID |WHERE | Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND | Жур.Closed = 1 |GROUP BY | $ДокОКС.Товар | , |Журнал.Date а вот так не работает |
|||
47
Кириллка
21.11.11
✎
20:25
|
(46)см. выше (12)
|
|||
48
aass
21.11.11
✎
20:26
|
(46) это хрень не берите во внимание ошибочку не заметил поторопился
|
|||
49
aass
21.11.11
✎
20:35
|
|SELECT
| Журнал.Date | ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура] | ,SUM($ДокОКС.Количество) as Количество | ,SUM($ДокОКС.Сумма) as Сумма //| ,SUM($ДокОКС.Количество)* | , |( |SELECT | top 1 | cast(value as numeric(15,2)) |FROM | 1sconst as Константа |LEFT JOIN | $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid |LEFT JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID //|LEFT JOIN //| $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар //тут теперь как нибудь надо связать с товаром из основной таблицы |WHERE | Константа.objid = СпрЦены.ID | AND | Константа.id =:id | AND | Константа.date <= :НачДата ~~ |ORDER BY | Константа.date desc |) as СуммаЗакуп |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc |INNER JOIN | $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc |WHERE | Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND | Жур.Closed = 1 |GROUP BY | $ДокОКС.Товар | , |Журнал.Date вот так работает, теперь не знаю как связать товар из подзапроса с товарам в основном запросе |
|||
50
aass
21.11.11
✎
20:38
|
и по времени получается период что за один день что за месяц, выполнение запроса разница 20-30 секунд
|
|||
51
Ёпрст
21.11.11
✎
20:44
|
Еще раз, нафига вот этот бред всё время пишешь ???
|JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc |
|||
52
Ёпрст
21.11.11
✎
20:48
|
(50) Для начала, весь запрос в топку.
|
|||
53
aass
21.11.11
✎
20:54
|
База = СоздатьОбъект("OLEDBData");
ПутьКБазе = "E:\DB_MGZ\mgz04\"; Соединение="Provider=VFPOLEDB.1;Data Source="+ПутьКБазе+";Mode=Share Deny None;Extended Properties="""";User ID="""";Mask Password=False;Cache Authentication=False;Encrypt Password=False;Collating Sequence=RUSSIAN;DSN="""""; Рез = База.Соединение(Соединение); Запрос = База.СоздатьКоманду(); НачДата=ВыбНачПериода; КонДата=ВыбКонПериода; ТекстЗапроса = " |SELECT | Журнал.Date | ,$ДокОКС.Товар as [Товар $Справочник.Номенклатура] | ,SUM($ДокОКС.Количество) as Количество | ,SUM($ДокОКС.Сумма) as Сумма //| ,SUM($ДокОКС.Количество)* | , |( |SELECT | top 1 | cast(value as numeric(15,2)) |FROM | 1sconst as Константа |LEFT JOIN | $Справочник.Цены as СпрЦены ON СпрЦены.ID = Константа.objid |LEFT JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID //|LEFT JOIN //| $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар |WHERE | Константа.objid = СпрЦены.ID | AND | Константа.id =:id | AND | Константа.date <= :НачДата ~~ |ORDER BY | Константа.date desc |) as СуммаЗакуп |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc |INNER JOIN | $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc //|INNER JOIN //| $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = $ДокОКС.Товар //|INNER JOIN //| $Справочник.Цены as СпрЦены ON СпрНоменк.ID = СпрЦены.PARENTEXT //|INNER JOIN //| $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID |WHERE | Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ AND | Жур.Closed = 1 |GROUP BY | $ДокОКС.Товар | , |Журнал.Date |"; МД = СоздатьОбъект("MetaDataWork"); id = Прав(_idtostr(МД.ИДРеквизитаСправочника("Цены","Цена")),4); Запрос.Отладка(1); Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата); Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата); Запрос.УстановитьТекстовыйПараметр("id",id); тзВыбНомеклатура = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); тзВыбНомеклатура.Выгрузить(ТаблЗнач); тут все |
|||
54
aass
21.11.11
✎
20:57
|
(51) я с тобой согласен, ну бывает, че пристал )) поправил работает
|
|||
55
aass
21.11.11
✎
21:00
|
(53) тут получается две фишки надо сделать
1. это соедbнить товары из подзапроса с оcновным запросом 2. в подзапросе наложить фильтр на 1sconst.Date <= Журнал.Date(из основного) |
|||
56
aass
21.11.11
✎
21:01
|
(51) я те даже скажу без этого быстрее работает ))
|
|||
57
Ёпрст
21.11.11
✎
21:07
|
(53) даже строка подключения устаревшая
|
|||
58
aass
22.11.11
✎
04:00
|
(57) ну так помоги мил человек наведи на путь истинный
|
|||
59
Ёпрст
22.11.11
✎
09:06
|
Ну, тип того, для начала:
Процедура Сформировать() Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Mode=ReadWrite;Collating Sequence=MACHINE"; ОлеДБ = СоздатьОбъект("OLEDBData"); Рез = ОлеДБ.Соединение(Соединение); Запрос = ОлеДБ.СоздатьКоманду(); Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')"); Запрос.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')"); Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')"); Запрос.Выполнить("Exec('SET TABLEVALIDATE TO 0')"); НачДата=ВыбНачПериода; КонДата=ВыбКонПериода; ТекстЗапроса = " |select | Журнал.Date | ,$Док.Товар as [Товар $Справочник.Номенклатура] | ,SUM($Док.Количество) as Количество | ,SUM($Док.Сумма) as Сумма //| ,SUM($Док.Количество)* | ,( | select | max(Периодика.value) | from | 1sconst as Периодика | inner join $Справочник.Цены as Цены on Цены.parentext = $Док.Товар | where | $Цены.КатегорияЦен = :ВыбКатегорияЦен | and Периодика.objid = Цены.id | and Периодика.id = $ИсторияРеквизита.Цены.Цена | and Периодика.date = | (select max(Конст.date) | from 1sconst as Конст | where Конст.objid = Периодика.objid | and Конст.id = $ИсторияРеквизита.Цены.Цена | and Конст.date<=:КонДата~~ | ) | ) as ЦенаИзСправочника |from | $ДокументСтроки.ОтчетКассовойСмены as Док |inner join | 1sjourn Жур ON Док.iddoc = Жур.iddoc | and dtos(Жур.date)+Жур.time+Жур.iddoc BETWEEN dtos(:НачДата~~)+' '+' ' and dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ' | and Жур.closed >0 |group by | $Док.Товар | ,Жур.date |"; // Запрос.Отладка(1); Запрос.УстановитьТекстовыйПараметр("ВыбКатегорияЦен", ВыбКатегорияЦен);//ВыбКатегорияЦен - реквизит диалога на форме с нужным типом цен Запрос.УстановитьТекстовыйПараметр("НачДата", ВыбНачПериода); Запрос.УстановитьТекстовыйПараметр("КонДата", ВыбКонПериода); ВремяНачалоЗапроса=_GetPerformanceCounter(); ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса); Сообщить("выполнен за : "+(_GetPerformanceCounter()-ВремяНачалоЗапроса)+" мс"); ТЗ.ВыбратьСтроку(); КонецПроцедуры |
|||
60
aass
22.11.11
✎
09:49
|
(59) запрос отработал
тока | Журнал.Date - ругается, но тут понятно теперь есть загвоздка документы у нас на разную дату и цена тоже на разную дату условие в даннном случаи нас не устраивает and Конст.date<=:КонДата~~ надо что типо and Конст.date<=Журнал.Date решения два либо сюда запихивать дату документа, либо формировать на каждую дату свой запрос есть возможность запихнуть дату ? |
|||
61
aass
22.11.11
✎
09:49
|
+(60)
выполнен за : 20583 мс Время выполнения: 1 мин. 6 сек. |
|||
62
Ёпрст
22.11.11
✎
10:00
|
(60) есть
(61) запрос надо переписывать, чтоб коррелированный подзапрос тоже бегал по индексу, т.е необходимо переделать условие подзапроса на индексное выражение. |
|||
63
Ёпрст
22.11.11
✎
10:03
|
+62 Если не хочешь составлять правильное индексное выражение для фоксового запроса, пиши запрос с помощью 1sqlite - там оно само подбирает подходящий индекс.
+синтаксис попроще. |
|||
64
aass
22.11.11
✎
10:24
|
скорость существенно изменилась с индексами
за день выполнен за : 20555 мс Время выполнения: 21 сек. за месяц выполнен за : 21947 мс Время выполнения: 22 сек. |
|||
65
Ёпрст
22.11.11
✎
10:31
|
(64) это п..ц как долго.
Как будет ~2-3 мс, вот тогда "попадаешь". Смотри план выполнения запроса. На 1cpp есть ветка как смотреть его для фоксового провайдера. |
|||
66
aass
22.11.11
✎
13:55
|
ДатаЗначения ="
|( |SELECT | max(Конст.date) |FROM | 1sconst as Конст |WHERE | Конст.objid = Периодика.objid | and Конст.id = $ИсторияРеквизита.Цены.Цена //| and Конст.date<=:КонДата~~ //| ID+OBJID+DTOS(DATE)+TIME+DOCID+STR(PARTNO,3) //| DTOS(DATE)+TIME+IDDOC | and Конст.ID + Конст.OBJID + dtos(Конст.date)+Конст.time + Конст.DOCID+ STR(Конст.PARTNO,3) BETWEEN | ' '+ ' '+dtos(:НачДатаПериод~~)+' '+' '+' ' and 'ZZZZ'+ 'ZZZZZZZZZ'+dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZ' | ) |"; про индексы тут есть кусочек истины или лажа ? |
|||
67
Ёпрст
22.11.11
✎
16:27
|
(66) с виду норм.
|
|||
68
Ёпрст
22.11.11
✎
16:28
|
+67 а не, лажа :))
Надо не between, а просто меньше или равно даты.. |
|||
69
aass
23.11.11
✎
04:49
|
(67) че то у меня , на "просто меньше или равно даты", после сообщения - "невозможно обработать та-та-та .tmp по причине превышения допустимых объемов" винт отвалился (у меня базы на отдельном винте) это совпадение или последствия "кривых рук" ? ))
|
|||
70
aass
24.11.11
✎
05:07
|
|(
|SELECT | max(Конст.date) |FROM | 1sconst as Конст |WHERE | Конст.ID + Конст.OBJID + dtos(Конст.date) + Конст.time + Конст.DOCID + STR(Конст.PARTNO,3) <= | $ИсторияРеквизита.Цены.Цена + 'ZZZZZZZZZ' + dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ' + '999' | and | Конст.objid = Периодика.objid //| Конст.id = $ИсторияРеквизита.Цены.Цена //| and Конст.date<=:КонДата~~ //| ID+OBJID(C9)+DTOS(DATE)+TIME(C6)+DOCID(C9)+STR(PARTNO,3)(N3) //| DTOS(DATE)+TIME+IDDOC |) |"; в общем с такой то матери( пришлось мать менять на компе на старой похоже с контролером че то не так, отваливался винт) заработало но прироста скорости обработки не увидел, и значение берет не на ту дату которою указываешь а последнюю, не могу попасть в индекс, индексы вверху посмотрите плиз, че нетак опять ? |
|||
71
Ёпрст
24.11.11
✎
09:25
|
|WHERE
//| ID+OBJID+DTOS(DATE)+TIME+DOCID+STR(PARTNO,3) | Конст.ID + Конст.OBJID + dtos(Конст.date)+Конст.time + Конст.DOCID+STR(Конст.PARTNO,3) BETWEEN |$ИсторияРеквизита.Цены.Цена + Периодика.objid +dtos(:НачДатаПериод~~)+' '+' '+' ' |and $ИсторияРеквизита.Цены.Цена + Периодика.objid +dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZ' ) где НачДатаПериод = '01.01.1980' |
|||
72
aass
24.11.11
✎
09:40
|
|WHERE
|Конст.ID + Конст.OBJID + dtos(Конст.date)+Конст.time + Конст.DOCID+STR(Конст.PARTNO,3) BETWEEN |$ИсторияРеквизита.Цены.Цена + ' ' +dtos(:НачДатаПериод~~)+' '+' '+' ' |and $ИсторияРеквизита.Цены.Цена + 'ZZZZZZZZZ' +dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ'+'ZZZ' | AND | Конст.objid = Периодика.objid вот так отрабатывает а если Периодика.objid вставлять то ругается FAILED! ICommandText::Execute(): SQL: Error correlating fields. и время выполнения - выполнен за : 5 мс так быстрее: | Конст.ID + Конст.OBJID + dtos(Конст.date) + Конст.time + Конст.DOCID + STR(Конст.PARTNO,3) <= | $ИсторияРеквизита.Цены.Цена + 'ZZZZZZZZZ' + dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ' + '999' | and | Конст.objid = Периодика.objid выполнен за : 2 мс но пять что то ч этот вариант цену дает последнюю а не на заданную дату, как быть ? |
|||
73
aass
24.11.11
✎
09:41
|
вот мой случай http://www.1cpp.ru/forum/YaBB.pl?num=1235246392
|
|||
74
aass
24.11.11
✎
09:42
|
+(73) похожая ситуация и те же проблемы
|
|||
75
Ёпрст
24.11.11
✎
09:44
|
(72) передавать дату из журнала вестимо.
Если болт в коррелированном селект листе, то делать лефт джоин с подзапросом, в котором получать нужную периодику. или использовать 1sqlite |
|||
76
aass
24.11.11
✎
09:49
|
|WHERE
| Конст.id+Конст.objid+DTOS(Конст.date)+Конст.time+Конст.docid+STR(Конст.partno,3) <= | $ИсторияРеквизита.Цены.Цена | AND | Конст.date<=:КонДата~~ | AND | Конст.objid = Периодика.objid выполнен за : 2 мс вот так выдает дату которая нужна |
|||
77
aass
24.11.11
✎
09:54
|
(75)
| Конст.id+Конст.objid+DTOS(Конст.date)+Конст.time+Конст.docid+STR(Конст.partno,3) <= | $ИсторияРеквизита.Цены.Цена | AND | Конст.date<=Жур.Date | AND | Конст.objid = Периодика.objid FAILED! ICommandText::Execute(): SQL: Error correlating fields. |
|||
78
Ёпрст
24.11.11
✎
10:01
|
(76) выдает мусор, ибо написано невесь что..
(77) читай (75.2) |
|||
79
aass
24.11.11
✎
10:14
|
(78) (75.2) это понял буду пробывать
|
|||
80
aass
24.11.11
✎
10:41
|
со временем в 2мс 5мс я на хлюздел. не туда замер вставил
|
|||
81
aass
24.11.11
✎
12:27
|
вот разные запросы, разные показатели
|SELECT | Журнал.Date, | $ДокОКС.Товар as [Товар $Справочник.Номенклатура], | SUM($ДокОКС.Количество) as Количество, | SUM($ДокОКС.Сумма) as Сумма |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc |INNER JOIN | $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc |WHERE | Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ | AND | Жур.Closed = 1 |GROUP BY | Журнал.Date, | $ДокОКС.Товар |"; выполнен за : 29028 мс Время выполнения: 29 сек. |SELECT | Журнал.Date, | $ДокОКС.Товар as [Товар $Справочник.Номенклатура], | SUM($ДокОКС.Количество) as Количество, | SUM($ДокОКС.Сумма) as Сумма |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |JOIN | 1sjourn as Журнал on Журнал.iddoc = ДокОКС.iddoc |INNER JOIN | $Документ.ОтчетКассовойСмены as Док ON Док.IDDoc = ДокОКС.IDDoc |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc |WHERE //| Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ | dtos(Жур.date)+Жур.time+Жур.iddoc BETWEEN dtos(:НачДата~~)+' '+' ' AND dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ' | AND | Жур.Closed = 1 |GROUP BY | Журнал.Date, | $ДокОКС.Товар |"; выполнен за : 4936 мс Время выполнения: 5 сек. есть еще варианты ускорить ? |
|||
82
Ёпрст
24.11.11
✎
13:03
|
(81) есть.
Выкинуть соединение с табличкой шапки документа |
|||
83
aass
24.11.11
✎
13:13
|
совсем все уже убрал
|SELECT | $ДокОКС.Товар as [Товар $Справочник.Номенклатура], | SUM($ДокОКС.Количество) as Количество, | SUM($ДокОКС.Сумма) as Сумма |FROM | $ДокументСтроки.ОтчетКассовойСмены as ДокОКС |INNER JOIN | 1SJourn as Жур ON Жур.IDDoc = ДокОКС.IDDoc |WHERE | dtos(Жур.date)+Жур.time+Жур.iddoc BETWEEN dtos(:НачДата~~)+' '+' ' AND dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ' |GROUP BY | $ДокОКС.Товар |"; выполнен за : 4978 мс Время выполнения: 5 сек. это все возможное ? |
|||
84
Ёпрст
24.11.11
✎
13:58
|
(83)
Строка подключения из (59) ? + Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')"); Это в коде есть ? второй раз запускаешь на выполнение, время какое ? |
|||
85
aass
24.11.11
✎
14:05
|
(84)
1. есть 2. выполнен за : 5057 мс Время выполнения: 5 сек. выполнен за : 4956 мс Время выполнения: 5 сек. выполнен за : 4933 мс Время выполнения: 5 сек. |
|||
86
aass
24.11.11
✎
14:11
|
че то уменя какой не делаю один хрен время около примерно
|SELECT | TabMaxIndex.ID as [Товар $Справочник.Цены] | ,Цены.value as [ЦенаБазовая $Число] | |FROM | |(SELECT | Спр.ID as ID, | MAX(Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) ) as IndexMax | |FROM | $Справочник.Цены as Спр | |LEFT JOIN 1sconst as Период | |ON | Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) = | $ИсторияРеквизита.Цены.Цена+Спр.id | | GROUP BY Спр.ID | | ) TabMaxIndex | |LEFT JOIN 1sconst as Цены | |ON | Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) = TabMaxIndex.IndexMax |"; выполнен за : 6629 мс Время выполнения: 7 сек. выполнен за : 3885 мс Время выполнения: 4 сек. выполнен за : 3864 мс Время выполнения: 4 сек. |
|||
87
Ёпрст
24.11.11
✎
14:21
|
(86) какой то нелепый код..
|
|||
88
aass
25.11.11
✎
03:41
|
(87) в (86) я пытался реализовать ваши рекомендации (62) (75)
я не правильно что то понял, поправте плиз ? |
|||
89
aass
25.11.11
✎
04:41
|
вот рабочий вариант получения закупочной цены на нужную дату, теперь бы все это сцепить с (83) при условии дата цены на дату документы
ТекстПериодика = " |(SELECT | Спр.ID as ID, | MAX(Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) ) as IndexMax | |FROM | $Справочник.Цены as Спр |LEFT JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON Спр.SP3787 = СпрКатЦен.ID | |LEFT JOIN 1sconst as Период | |ON | Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) = | $ИсторияРеквизита.Цены.Цена+Спр.id | |WHERE | Период.date <= :ДатаЦены ~~ | AND | СпрКатЦен.DESCR = 'Закупочная' | GROUP BY Спр.ID | | ) TabMaxIndex |"; ТекстЗапроса = " |SELECT | TabMaxIndex.ID as [КатегорияЦены $Справочник.Цены] |,TabMaxIndex.* | ,Цены.value as [ЦенаБазовая $Число] | |FROM |"+ТекстПериодика+" | |LEFT JOIN | 1sconst as Цены | |ON | Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) = TabMaxIndex.IndexMax |"; выполнен за : 2061 мс Время выполнения: 2 сек. |
|||
90
Ёпрст
25.11.11
✎
08:54
|
(89) ну, на счет рабочего я бы поспорил, в особенности в соединении ON
|
|||
91
aass
25.11.11
✎
09:00
|
(90) работает, зуб даю ))
|
|||
92
aass
25.11.11
✎
09:02
|
(90) и так тоже работет
ТекстПериодика = " |(SELECT | Спр.ID as ID, | MAX(Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3)) as IndexMax | |FROM | $Справочник.Цены as Спр |LEFT JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON Спр.SP3787 = СпрКатЦен.ID |LEFT JOIN | $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = Спр.PARENTEXT |LEFT JOIN | 1sconst as Период |ON | Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) = | $ИсторияРеквизита.Цены.Цена+Спр.id |WHERE | Период.date <= :ДатаЦены ~~ | AND | СпрКатЦен.DESCR = 'Закупочная' | AND | cast(Период.value as numeric(15,2))>0 | GROUP BY Спр.ID | | ) TabMaxIndex |"; ТекстЦены = " |SELECT | СпрНоменк.ID as [Товар $Справочник.Номенклатура] | ,:ДатаЦены ~~ | ,Цены.value as [ЦенаБазовая $Число] | |FROM |"+ТекстПериодика+" | |LEFT JOIN | 1sconst as Цены |LEFT JOIN | $Справочник.Цены as СпрЦены ON СпрЦены.ID = Цены.objid |LEFT JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID |LEFT JOIN | $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = СпрЦены.PARENTEXT | |ON | Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) = TabMaxIndex.IndexMax |"; |
|||
93
aass
25.11.11
✎
09:34
|
а вот так скорость выполнения самая масимальная из всех остальных
ТекстПериодика = " |(SELECT | Спр.ID as ID, | MAX(Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3)) as IndexMax | |FROM | $Справочник.Цены as Спр |LEFT JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON Спр.SP3787 = СпрКатЦен.ID |LEFT JOIN | $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = Спр.PARENTEXT |LEFT JOIN | 1sconst as Период |ON | Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) = | $ИсторияРеквизита.Цены.Цена+Спр.id |WHERE | СпрНоменк.ID = :ВыбТовар | AND | Период.date <= :ДатаЦены ~~ | AND | СпрКатЦен.DESCR = 'Закупочная' | AND | cast(Период.value as numeric(15,2))>0 | GROUP BY Спр.ID | | ) TabMaxIndex |"; ТекстЦены = " |SELECT | Цены.value as [ЦенаБазовая $Число] | |FROM |"+ТекстПериодика+" | |LEFT JOIN | 1sconst as Цены | |ON | Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) = TabMaxIndex.IndexMax |"; выполнен за : 310 мс |
|||
94
aass
25.11.11
✎
09:50
|
щас попробую циклом формировать текст запроса на каждую дату а потом UNION соединить
|
|||
95
Ёпрст
25.11.11
✎
09:55
|
ага.. а потом плюнешь на фокс и напишешь на 1sqlite
|
|||
96
Ёпрст
25.11.11
✎
10:32
|
Тип того, примерно:
Процедура Сформировать() ТекстЗапроса=" |Select | Док.Номенклатура [Номенклатура :Справочник.Номенклатура] | ,Док.Количество Количество | ,( | select | Периодика.value | from __1S_Const Периодика | inner join [Справочник.Цены] as Цены on Цены.parentext = Док.Номенклатура and $Цены.ТипЦен = :ТипЦен | where Периодика.objid = Цены.id and Периодика.id = :ИсторияРеквизита.Цены.Цена | and ((Периодика.date < Жур.date) OR (Периодика.date = Жур.date)) | order by Периодика.date desc | limit 1 | | ) Цена |From [ДокументСтроки.ПоступлениеТМЦ] Док |inner join | [Журнал] Жур ON Док.iddoc = Жур.iddoc and Жур.date between :НачДата and:КонДата |"; Попытка база = СоздатьОбъект("SQLiteBase"); Исключение ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); база = СоздатьОбъект("SQLiteBase"); КонецПопытки; // Откроем пустую базу данных в памяти база.Открыть(":memory:"); запрос = база.НовыйЗапрос(); Запрос.Подставлять("ТипЦен",ТипЦен); Запрос.Подставлять("НачДата",НачДата); Запрос.Подставлять("КонДата",КонДата); ВремяНачалоЗапроса=_GetPerformanceCounter(); ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса); Сообщить((_GetPerformanceCounter()-ВремяНачалоЗапроса)); ТЗ.ВыбратьСтроку(); КонецПроцедуры |
|||
97
aass
25.11.11
✎
13:43
|
(96) да отработало, как то все просто )) спасибо тебе милый человек что вразумил ))
|
|||
98
aass
25.11.11
✎
14:12
|
+(97) за месяц
ТЗ колво строк 30195 Время выполнения: 41 сек. |
|||
99
Ёпрст
25.11.11
✎
14:30
|
(97) не за что, но ты фоксовый запрос тоже добей..
На операциях с group by фокс обгоняет 1sqlite в скорости |
|||
100
hatsher
25.11.11
✎
14:30
|
сотка
|
|||
101
aass
26.11.11
✎
05:23
|
(99) да к этому тоже интерес есть , в плане обработка большого кол-ва данных из десятка баз поэтому 41 секунда меня не совсем устраивает ))
|
|||
102
aass
28.11.11
✎
00:30
|
1sqlite есть возможность для подключения к другой(не текущей) базе ?
|
|||
103
orefkov
28.11.11
✎
06:47
|
(101), (96)
Вот это что такое: and ((Периодика.date < Жур.date) OR (Периодика.date = Жур.date)) Пишите and (Периодика.date <= Жур.date) иначе в индекс не попадаете. (102) Нет. Только подключится к другой базе по оле и там запустить 1sqlite. |
|||
104
aass
28.11.11
✎
10:06
|
(103) 2
а нету ссылочки под рукой на примерчик, а то что то внятного не могу ни че найти. |
|||
105
aass
28.11.11
✎
10:10
|
(103) 1
да так намного быстрей )) |
|||
106
Ёпрст
28.11.11
✎
11:12
|
(103) это, на сколько я помню, именно твой совет делать так, а не <=
:))) |
|||
107
Ёпрст
28.11.11
✎
11:23
|
+106 не найду так сразу ту ветку, но вот , к примеру, трабл:
http://www.1cpp.ru/forum/YaBB.pl?num=1216729138/37#37 |
|||
108
aass
28.11.11
✎
11:32
|
вот примерно код через UNION, но тут унас ограничение на длину строки
и скорость выполнения не фонтан есть ли вариант собрать одну таблицу что бы выводил дату на каждый, типа большая такая таблица где будудт храниться цены на каждый день ТекстЗапрос = ""; Для текРасчДата = ВыбНачПериода По ВыбКонПериода Цикл Сообщить(СтрЗаменить(Строка(текРасчДата),".","")); текЗначение = "Дата"+СтрЗаменить(Строка(текРасчДата),".",""); ТекстПериодика = " |(SELECT | Спр.ID as ID, | MAX(Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3)) as IndexMax |FROM | $Справочник.Цены as Спр |LEFT JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON Спр.SP3787 = СпрКатЦен.ID |LEFT JOIN | $Справочник.Номенклатура as СпрНоменк ON СпрНоменк.ID = Спр.PARENTEXT |LEFT JOIN | 1sconst as Период |ON | Период.id+Период.objid+DTOS(Период.date)+Период.time+Период.docid+STR(Период.partno,3) = | $ИсторияРеквизита.Цены.Цена+Спр.id |WHERE | Период.date <= :"+текЗначение+" ~~ | AND | СпрКатЦен.DESCR = 'Закупочная' | AND | cast(Период.value as numeric(15,2))>0 | GROUP BY Спр.ID | ) TabMaxIndex |"; ТекстЦены = " |SELECT | (DTOS(:"+ текЗначение +" ~~) + СпрЦены.PARENTEXT), | Цены.value as [ЦенаБазовая $Число] |FROM |"+ТекстПериодика+" |LEFT JOIN | 1sconst as Цены |LEFT JOIN | $Справочник.Цены as СпрЦены ON СпрЦены.ID = Цены.objid |LEFT JOIN | $Справочник.КатегорииЦен as СпрКатЦен ON СпрЦены.SP3787 = СпрКатЦен.ID |ON | Цены.id+Цены.objid+DTOS(Цены.date)+Цены.time+Цены.docid+STR(Цены.partno,3) = TabMaxIndex.IndexMax |"; ТекстЗапрос = ТекстЗапрос + ?(СтрДлина(ТекстЗапрос) = 0, "", " |UNION ALL |"); ТекстЗапрос = ТекстЗапрос + ТекстЦены; Запрос.УстановитьТекстовыйПараметр(текЗначение,текРасчДата); КонецЦикла; |
|||
109
Ёпрст
28.11.11
✎
11:48
|
(108) :)))
изврат какой. |
|||
110
aass
28.11.11
✎
12:03
|
(109) )) вот думаю как это все в человеский вид привести
|
|||
111
Ёпрст
28.11.11
✎
12:05
|
(110) Хранить цену в реквизите регистра или документа.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |