|
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) Спасибо огромное, буду пробовать!!!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |