Имя: Пароль:
1C
1C 7.7
v7: Скрипт для обновления значения пер. реквизитов 1с++
,
0 Franchiser
 
гуру
14.04.16
13:47
Поделитесь, пожалуйста, скриптом который позволяет обновить 1 периодический реквизит справочника, если нет - добавить новый (только пер. реквизиты с ручным вводом).
Планирую сделать ВТ в которой будет 3 колонки
Элемент Спр, Дата, ЗначениеРеквизита.
1 Mikeware
 
14.04.16
13:50
(0) Планируешь - делай! :-)
2 Ёпрст
 
14.04.16
13:57
upadate
set val = 'вася'
from _1scons
where это мой периодический реквизит
3 Mikeware
 
14.04.16
13:58
(2) value :-)
4 Ёпрст
 
14.04.16
13:58
(3) ну, что я вм, все константы помнить должен ?!
:)
5 Mikeware
 
14.04.16
13:59
(4) :-))
6 Franchiser
 
гуру
14.04.16
14:07
Update можно использовать только если точно есть такой рекизит, иначе надо делать insert.
Сначала у меня будет сформирована ТЗ с помощью выполнитьsql_из ТЗ, там может появится новая номенклатура, для которой цена не была задана.
Я так думаю что нужно сначала сделать Delete по данным из ВТ, потом  insert новых значений, без использования update.
7 Franchiser
 
гуру
14.04.16
14:09
может есть такой примерчик:
можно ли сделать 2-мя скриптами без использования курсора?
8 Franchiser
 
гуру
14.04.16
14:10
первый скрипт что то вроде такого:
delete from
_1sconst
Join #TempTab as Ceny
on _1sconst.date = Ceny.date AND
_1sconst.id = Ceny.id AND
docid = '     0   '
9 Ёпрст
 
14.04.16
14:12
делаешь update, если роукоунт = 0 тогда инсерт. усё.
10 Ёпрст
 
14.04.16
14:14
|UPDATE ...
|IF @@ROWCOUNT = 0
|   INSERT ...
©trad
11 Franchiser
 
гуру
14.04.16
14:15
так мне ВТ обходить через курсор тогда?
12 Mikeware
 
14.04.16
14:18
(11)Зачем?
13 Franchiser
 
гуру
14.04.16
14:19
ну так цикл же должен быть Update/Insert
14 Mikeware
 
14.04.16
14:20
(13) что в (10) непонятно?
15 Franchiser
 
гуру
14.04.16
14:21
например у меня 100 000 цен нужно поменять, чтобы блокировки не срабатывали на _1sconst загоняю в ВТ на скуле
16 Franchiser
 
гуру
14.04.16
14:21
(14) непонятно как прикрутить туда условие на пары из ВТ и потом поставить из ВТ новую цену
17 Franchiser
 
гуру
14.04.16
14:26
@@ROWCOUNT - относится к 1-му результата запроса, а мне нужно поставить разные цены разным номенклатурам в разные даты
18 ADirks
 
14.04.16
14:29
(0) Нафиг этот гемор со штатной историей в 1sconst?!!
Сделай свою, нормальную.
19 Franchiser
 
гуру
14.04.16
14:33
какой тут гемор, цены номенклатуры - стандартный функционал?
20 Mikeware
 
14.04.16
14:38
(15) ВТ = это обычно виртуальная таблица...
21 Mikeware
 
14.04.16
14:39
(16) курсором обходи
22 Mikeware
 
14.04.16
14:39
(19) хреново он сделан в "стандарте"
23 Franchiser
 
гуру
14.04.16
14:41
(20) Delete старых  значений, insert новых без курсора не лучше с точки зрения производительности?
24 Mikeware
 
14.04.16
14:42
(23) ну разве что для самоудовлетворения...
25 Franchiser
 
гуру
14.04.16
14:43
ну вот я хочу понять что быстрее и правильнее
26 ADirks
 
14.04.16
15:13
(25) если лопатить большие объёмы, и без блокировки - однозначно отказаться от штатного механизма, как минимум. Блокировка 1sconst - это даже хуже блокировки 1sjourn

сделай свои таблички, с какими надо колонками и индексами, и молоти их как удобно. так будет быстрее и правильнее :)
27 Mikeware
 
14.04.16
15:38
(26) справочник же? Эмуляция РС, а доступ на чтение - прямыми запросами...
28 varelchik
 
15.04.16
08:06
+(26) 200% Полностью согласен!
1sconct это огромная клоака как и 1scrcdoc.
29 ADirks
 
15.04.16
08:57
(27) Обычно справочниками и делаю. Но раз уж такая потребность писать туда что-то не из 1С, то я бы и таблички свои сделал.

А так, главное не 1sconst :)
30 trad
 
15.04.16
09:10
(0) как то так:

update _1sconst
set value = Ceny.cena
from _1sconst
join #TempTab as Ceny on _1sconst.date = Ceny.date and _1sconst.id = Ceny.id and _1sconst.docid = '     0   '

insert into _1sconst
select
  .прочиеполя.
  Ceny.cena as value
  .прочиеполя.
from #TempTab as Ceny
left join _1sconst on _1sconst.date = Ceny.date and _1sconst.id = Ceny.id and _1sconst.docid = '     0   '
where _1sconst.value is null
31 trad
 
15.04.16
09:15
+ в связях, разумеется, не хватает условия по objid
а также желательно добавить условия по time и row_id
и правильно привести цену к varchar
32 Franchiser
 
гуру
16.04.16
13:15
(31) большое спасибо как раз делаю по похожему примеру:
BEGIN TRAN

UPDATE t
SET t.Col1 = s.Col1, t.Col2 = s.Col2
FROM Target AS t
INNER JOIN Source AS s ON s.pkCol = t.pkCol



INSERT Target (Col1, Col2)
SELECT s.Col1, s.Col2
FROM Source AS s
LEFT JOIN Target AS t ON t.pkCol = s.pkCol
WHERE t.pkCol IS NULL

COMMIT TRAN

Нужно ли использовать конструкцию with (tablock),слышал что с ней insert быстрее ?
33 Franchiser
 
гуру
16.04.16
13:25
time - integer и вроде всегда 0.
Не пойму как сделать чтобы rowid присваивался автоматом инкрементно, какая то хранимка?
Тогда получается все равно курсор использовать...
34 Franchiser
 
гуру
16.04.16
13:36
(31) а зачем приводить цену к varchar?
1с++ вроде бы корректно обрабатывает numeric в отличии от com
35 Franchiser
 
гуру
16.04.16
13:51
М.б. использовать хранимую процедуру _1sp__1SCONST_MaxRowID? и от нее при insert делать increment rowid?
Нужно ли вручную перестраивать потом индексы?
36 trad
 
16.04.16
19:13
(33) rowid - identity-поле его в инсерте упоминать не нужно. сервер сам его посчитает
37 trad
 
16.04.16
19:14
(34) потому что _1const.value - типа varchar
38 Franchiser
 
гуру
17.04.16
00:29
(37) Спасибо огромное, буду пробовать!!!