update с вложенным selectом

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Вопрос:

Делаю инсерт:
insert into gal_vek.attrval (FcAttrnam, Fcrec, Fvdouble) values ('800100000000156D', '800100000000870D', 18)

PL/SQL Developer добавляет строку в таблицу, но во внешних атрибутах МЦ не показывает значение 18, показывает пустое поле. В чем может быть проблема?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: update с вложенным selectом

Сообщение edward_K »

vstring надо тоже заполнять. По Ctrl+f4 вычислите attrval.vdouble - там то, что нужно?
да и wtable где? В сапорте посмотрите код таблицы или там же вычислите attrnam.wtable или coKatMc
И ту запись придется удалить.
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: update с вложенным selectом

Сообщение Zver »

Necrz писал(а):Вопрос:

Делаю инсерт:
insert into gal_vek.attrval (FcAttrnam, Fcrec, Fvdouble) values ('800100000000156D', '800100000000870D', 18)

PL/SQL Developer добавляет строку в таблицу, но во внешних атрибутах МЦ не показывает значение 18, показывает пустое поле. В чем может быть проблема?
Согласен с Эдвардом, надо же ещё и поле wTable заполнить. Попробуйте так:
insert into gal_vek.attrval (FcAttrnam, Fcrec, Fvdouble, wTable) values ('800100000000156D', '800100000000870D', 18, 1411)

А вообще надо будет по журналу посмотреть, какие поля заполняются.
Программист-самоучка
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Спасибо, получилось!
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Задача немного изменилась. Теперь мне нужно заполнить внешний атрибут для большого количества серий МЦ. Ясно, что в экселе сцепкой можно сделать для каждой серии свой запрос. Подскажите, как мне добраться до серий МЦ в инсерте?
insert into gal_vek.attrval (FcAttrnam, Fcrec, Fvdouble, wTable) values ('800100000000156D', '800100000000870D', 18, 1411)

Серии лежат в Каталог МЦ - Редактирование матценности - Аналитика
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: update с вложенным selectом

Сообщение Zver »

Связь с KatMC с аналитикой следующая:
KatMc.cHashAn = HashAn.nrec

В таблице есть ряд полей для хранения аналитик(CANALIT[1] - CANALIT[10])
Чтобы понять в каком именно поле хранится необходимая аналитика лучше всего для какой-нибудь МЦ значение аналитики изменить и посмотреть в журнале что произойдёт.
скорее всего создастся новая запись в таблице HashAn. В созданной записи посмотрите какие поля аналитик заполнены.
Более подробно об устройстве таблицы HAshAn можно посмотреть здесь:http://www.tyumbit.ru/gal_forum/viewtop ... =2&t=12551
Программист-самоучка
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

У меня проблема немного в другом. У меня есть список из 400 с лишним серий МЦ. Для каждой из этих серий МЦ нужно создать 3 внешних атрибута и заполнить их данными.

Три атрибута я создал, теперь мне нужно заполнить их. Понятно, что нужно вставлять строки инсертом.
insert into gal_vek.attrval (FcAttrnam, Fcrec, Fvdouble, wTable) values ('800100000000156D', '800100000000870D', 18, 1411) - для одной МЦ все хорошо.

Я не знаю, можно ли заполнить одним инсертом сразу атрибут для серии МЦ, скорее всего нет.

Поэтому я большим селектом нахожу список всех нреков для всех МЦ всех серий из списка. У каждой серии значения атрибутов разные. Т.е. делать в экселе посредством сцепки для каждой мц свой инсерт накладно, потому что у меня есть столбец со значениями атрибута для 400 серий, а не для каждой МЦ. Дублировать значение атрибута для серии для каждой МЦ накладно, потому что это нужно будет проделать 400 с лишним раз, поэтому же не вариант заполнять атрибут отдельно для каждой серии.

Есть идея заполнить атрибут для всех МЦ посредством вставки одинакового значения, например нуля, т.е. инсертом для 15000 мц заполнить атрибут одним и тем же значением. А потом сделать 400 с лишним апдэйтов этих строк с использованием условий на группу МЦ.

Т.е. делаю 15000 инсертов для каждой МЦ, заполняя нулями значения атрибута, вида:
INSERT ATTRVAL SET ATTRVAL.CATTRNAM:=comp('000100000000156Dh'), ATTRVAL.CREC:=comp('000100000001CA65h'), ATTRVAL.VDOUBLE:='0', ATTRVAL.WTABLE:=1411; - в саппорте

А затем делаю 400 апдэйтов по группам:
update gal_vek.attrval atr
set
atr.fvdouble = '21,5' --значение атрибута
where atr.fcrec in
(
select mc.fnrec
, mc.fname, atr1.fvdouble, atr1.fcattrnam
from gal_vek.katmc mc, gal_vek.Attrval atr1
where
mc.fname like '%Матрас % "Энергия Сна" Best 4 you%' - группа МЦ задается у нас и в названии МЦ негласно
and mc.fisarch=0
and mc.fnrec=atr1.fcrec
and atr1.fcattrnam = '800100000000156D'
)

Но почему то он апдэйтит 78 строк в одной группе, хотя на самом деле добавлял я для данной группы МЦ 30 строк (т.е. в группе 30 МЦ).

Может быть, из опыта, у вас есть мысли, почему неверен апдэйт и/или как сделать все это проще?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: update с вложенным selectом

Сообщение edward_K »

ну да - логику кто будет соблюдать?
с fcrec у вас будет несколько одинаковых записей.
Уж тогда fnrec in select attr1.fnrec
Любите все усложнять. Делайте проще и будет все хорошо. Зачем опять вложенный запрос?
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Согласен, что с fnrec in select attr1.fnrec все хорошо. А как можно сделать этот апдэйт без вложенного запроса?
Irina_
Местный житель
Сообщения: 551
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: update с вложенным selectом

Сообщение Irina_ »

Здравствуйте.
Насколько я понимаю, работа по заполнению внешних атрибутов по большому кол-ву МЦ – разовая. Поэтому, на мой взгляд, проще сделать ее теми средствами, которыми Вы владеете. Писать на vip для Вас скорее всего не самый лучший вариант (нет опыта). Могу предложить еще один вариант, которым сама бы воспользовалась.
1.В Support сделать экспорт в dbf таблицы ATTRNAM (достаточно nrec, name, wtable), KATMC (достаточно nrec, name, barkod). Также у Вас есть эталон – список серий со значениями атрибутов для каждой серии (если значения для серий не заполнены, то заполнить в Excel или в DBF, думаю это не проблема). Т.о. имеем три базы, информации в которых будет достаточно для создания новой базы – значений внешних атрибутов в разрезе МЦ. Это с учетом того, что по наименованию МЦ Вы действительно сопоставите ее с нужной серией (но в этом случае Вам надо анализировать в программе в п.2 много значений подстроки в наименовании МЦ, что не хорошо!), иначе надо взять еще как минимум одну таблицу (сразу не скажу какую), в которой есть нужное соответствие МЦ - Серия.
2.Написание несложной программы, например на FoxPro, в которой создать базу и заполнить ее на основе инфо в базах из п.1. Специфику заполнения ATTRVAL Вам уже описывали zver и m0p3e. По структуре, думаю достаточно полей wtable, crec, cattrnam, vdouble и/или vstring и/или vdate и/или др. (в зависимости от типа значения атрибута). Сразу можно заполнить значения трех внешних атрибутов, т.е. для каждой МЦ в этой базе будет 3 записи – по одной для каждого атрибута.
3.В Support сделать импорт в ATTRVAL данных из полученной в п.2 базы.
На мой взгляд, этот вариант намного проще того, которым пытаетесь воспользоваться Вы. И не обязательно надо работать с dbf и писать на Foxpro - используйте средства, которыми Вы владеете.
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Спасибо огромное всем! Решил вопрос как и писал ранее, добавил одинаковые значения атрибутов с целью создания строк в таблице attrval, а затем проапдэйтил нужными мне значениями.
Ответить