Перейти к содержимому


Доп.действия, модификация таблиц, подтаблиц


Сообщений в теме: 6

#1 baltgps

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений

Отправлено 04 Май 2015 - 14:59

Выполняется переделка структуры базы, сам не могу разобраться - прошу помощи у общественности.

Что имеем сейчас:

Таблица 1 "Компании":
поля Название (текст), Форма собственности (связь, таблица с вариантами ООО, ОАО и т.п.), Комментарий (текст) и др.

Подтаблица 1.1 "Контакты":
поля "Компании" (текст, связь с т. "Компании", по полю Название), ФИО (текст), телефон (текст) и т.п. Плюс поле "Связь с Компании-клиенты" - см.ниже

Создаётся НОВАЯ таблица 2 "Компании-клиенты", на основе таблицы "Компании" - часть полей туда копируются.
Требуется привязать к ней имеющиеся Контакты, по полю ID.
В подтаблицах у нее - "Контакты" уже указаны, отсюда и поле "связь с Комп.-клиенты"

Т.е. получается, что "Контакты" - является подтаблицей и для старой "Компании" (которая потом уберется), и для новой "Компании-клиенты"

План действий (с помощью Доп.действий таблицы "Компании"):

0) галочками/по фильтру выбирается список необходимых записей в т. Компании
1) создаём новую запись в т. "Компании-клиенты" и копируем нужные поля из текущей строки "Компании" в текущую (новую) строку "Компании-клиенты" - insert_query
2) в т. Контакты, поле "Связь с Компании-клиенты" - нужно заполнить значениями ID от свежей записи таблицы "Компании-клиенты" - для тех строк, которые относятся к текущей старой "Компании"

КАК это сделать ?
С пунктом 1) - проблем нет, как реализовать 2 ?
предполагаю, через sql запрос - но как это реализовать - в голове не складывается...

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 05 Май 2015 - 09:43

Также как вы вставляли запись через insert_query, вы можете обновить записи в т. Контакты через функцию update_query по условию "поле связи с контрагентом равно текущему контрагенту"

Если непонятно и нужен конкретный пример кода, приведите здесь код своего вычисления, я его допишу.

#3 baltgps

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений

Отправлено 05 Май 2015 - 15:28

да, помогите, пожалуйста :)

1) таблица "Компании", поля:
... (стандартные служебные)
f3851 Название компании //текст
f5380 Форма собственности //связь, указывает на одну из строк другой таблицы "форма_собств_табл" - ООО, ОАО, ИП и т.п.
f3951 Значимость //список из трех строк
f3881 Комментарий //текст
... другие поля

2) таблица "Компании-клиенты", поля:
id ID //служебное
...
f6160 Название //текст
f6170 Форма собственности //как и в т. Компании, связь
f6200 Значимость //список, как и в т. Клиенты
... другие поля

3) таблица "Контакты" (подтаблица для "Компании", и для "Компании-клиенты"
... (служебные поля)
f4001 ФИО //текст
f4061 Компания //связь, Компании.Название компании
... (другие поля)
f6260 Связь с "Компании-клиенты" //связь с новой т.Компании-клиенты, по полю ID

---------------
Доп.действия - Вычисления (для таблицы "Компании"):
$ins_data['Название'] = $line['Название компании'];
$ins_data['Форма собственности'] = $line['Форма собственности'];
$ins_data['Значимость'] = $line['Значимость'];
$ins_data['Комментарий'] = $line['Комментарий'];
insert_query($ins_data, "Компании-клиенты");
echo "<= Строки успешно добавлены";
текстовые поля копируются без проблем, списки (Значимость) - тоже.

А вот "Форма собственности" - это поле-ссылка на другую таблицу - не работает, не копируется.

И, конечно же, как в текущих записях связанной подтаблицы "контакты" правильно заполнить поле-связь значением ID - тоже не выходит..

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 05 Май 2015 - 16:11

$ins_data['Название'] = $line['Название компании'];
$ins_data['Форма собственности'] = $line['Форма собственности']['ID']; // поля связи - это массивы, для копирования нужно брать ID связанной строки
$ins_data['Значимость'] = $line['Значимость'];
$ins_data['Комментарий'] = $line['Комментарий'];
$new_id = insert_query($ins_data, "Компании-клиенты");

$upd_data['Связь с "Компании-клиенты"'] = $new_id; // заносим в поле связи id вновь добавленной записи
update_query($upd_data, "Компании-клиенты", "`Компания`=".$line['ID']); // обновляем связанные строки

echo "<= Строки успешно добавлены";


#5 baltgps

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений

Отправлено 05 Май 2015 - 16:34

Цитата

Ошибка системы.
Error generated:
/var/www/clientbase/include/functions2.php(93) : data_update()
/var/www/clientbase/include/functions1.php(537) : eval()'d code(8) : update_query()
/var/www/clientbase/include/functions1.php(537) : eval()
/var/www/clientbase/fields.php(1649) : calc_line()
Ошибка SQL запроса:
SELECT * FROM f_data470 WHERE `Компания`=455
Unknown column 'Компания' in 'where clause'


Не очень понял update
Нам же требуется заполнить поле "Связь с компании-клиенты" в таблице "Контакты"..
Может быть, так должно быть?

update_query($upd_data, "Контакты", "`Компания`=".$line['Название компании']);

только кавычки надо расставить как-то правильно. Там же хитрость есть - то ли `, то ли ', то ли "
Ошибка SQL запроса:
SELECT * FROM f_data271 WHERE f4061=ТЕСТ-Компания-1

Unknown column 'ТЕСТ' in 'where clause'

Сообщение отредактировал baltgps: 05 Май 2015 - 16:54


#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 05 Май 2015 - 16:49

Да, я перепутал имя таблицы (точнее, скопировал вашу строку и забыл поменять имя). Разумеется, обновляться должна таблица "Контакты". Но что касается поля в условии, то никакой ошибки нет, т.к. в поле связи всегда хранится ID связанной записи, а не "Название компании" или что либо еще (поле из настроек служит только для отображения, на хранение оно никак не влияет):

update_query($upd_data, "Контакты", "`Компания`=".$line['ID']);


#7 baltgps

    Новичок

  • Пользователи
  • Pip
  • 4 сообщений

Отправлено 05 Май 2015 - 17:20

Просмотр сообщенияCbCoder (05 Май 2015 - 16:49) писал:

...

РАБОТАЕТ!!!
Огромное Спасибо!

Итак, подведу итог - чтобы было всё рядом.

Имеем:
таблица Компании, и связанная подтаблица Контакты.
часть полей - текст, либо списки, часть - связи с другими (отдельными, вспомогательными) таблицами

Требуется:
перенести нужные нам данные из строки Компании в новую таблицу Компании-клиенты,
при этом привязать имеющиеся записи в Контакты к строке в новой таблице.

Решение:
посредством Дополнительных действий
//заполняем массив ins_data значениями из старой таблицы "Компания"
$ins_data['Название'] = $line['Название компании']; //простой текст
$ins_data['Форма собственности'] = $line['Форма собственности']['ID']; // поля связи - это массивы, для копирования нужно брать ID связанной строки. Здесь хранится ссылка на строку из вспомогательной таблицы.
$ins_data['Значимость'] = $line['Значимость']; //список из нескольких строк, аналогично обычному тексту
$ins_data['Комментарий'] = $line['Комментарий']; //текст, многострочный

//теперь выполняем запрос на добавление строки-массива ins_data в новую таблицу Компании-клиенты, результат функции - это ID записи, запоминаем в переменной new_id
$new_id = insert_query($ins_data, "Компании-клиенты");

//теперь обновляем записи в связанной подтаблице Контакты
$upd_data['Связь с "Компании-клиенты"'] = $new_id; // заносим в поле связи id вновь добавленной записи
update_query($upd_data, "Контакты", "`Компания`=".$line['ID']); // обновляем связанные строки. Новые_данные, таблица, условие.

//на время отладки оставляем
echo "<= Строки успешно добавлены";






Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных