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


Подстановка поля типа "пользователь" в другую таблицу


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

#1 aleks.goodcolor

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

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 04 Июль 2014 - 15:38

Имеется 2 таблицы - Наши сотрудники и Контрагенты.
В таблице наши сотрудники есть поле "Подменяющий менеджер". Необходимо передать это значение в таблицу контрагенты в такое же поле.

Добавляю вычисления в таблицу контрагентов:

$sqlQuery = "SELECT id FROM ".DATA_TABLE."42 WHERE status=0 AND f438='".$line['Пользователь']."'";
$res = mysql_query($sqlQuery);
$row = mysql_fetch_array($res);
$sotr = $row['id'];
$line['Подменяющий менеджер'] = $sotr;

Подскажите пожалуйста в чем может быть проблема.

#2 CbCoder

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

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

Отправлено 05 Июль 2014 - 09:40

А зачем вы обращаетесь запросом к таблице Контрагенты (id=42), если вам необходимы данные из таблицы Сотрудники? Вы все перепутали с точностью до наоборот - у вас вычисление для таблицы Сотрудники и ищет контрагента, тогда как нужно вычисление для таблицы Контрагенты, ищущее сотрудника.

И к тому же конструкция вычисления устаревшая, используйте как минимум функции sql_query и sql_fetch_array вместо mysql_query и mysql_fetch_array.

#3 aleks.goodcolor

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

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 05 Июль 2014 - 10:09

Да я напутал много, изменил код но он по прежнему не хочет работать, поле пустое. Скажите пожалуйста имеет ли значение, что в таблице контрагенты поле "замена" типа "связь" или нужно оставить тип "пользователь"?

Ниже код который я вставляю в вычисления таблицы контрагенты при отображении поля. Может быть мне нужно вставить этот код в вычисления таблицы "наши сотрудники" на изменение поля "замена"?

$sqlQuery = "SELECT id FROM ".DATA_TABLE."46 WHERE status=0 AND f438='".$line['ФИО']."'";
$res = sql_query($sqlQuery);
$row = sql_fetch_array($res);
$sotr = $row['id'];
$line['замена'] = $sotr;

f438 - поле менеджер в таблице Контрагенты

#4 CbCoder

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

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

Отправлено 05 Июль 2014 - 10:17

Сейчас вы обращаетесь к таблице Сотрудники, но почему-то в условии используете поле из таблицы Контрагенты. У вас запрос выдаст ошибку, что поля f468 нет в таблице 46.


Цитата

Скажите пожалуйста имеет ли значение, что в таблице контрагенты поле "замена" типа "связь" или нужно оставить тип "пользователь"?

Это зависит от того, что вы сами хотите в это поле разместить. Если ссылку на сотрудника - разумеется тип должен был связь с таблицей сотрудники. Если же пользователя - то и тип пользователь.

#5 aleks.goodcolor

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

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 05 Июль 2014 - 10:40

к сожалению написал сюда устаревший код(старый выдавал ошибку) - я изменил его на
$sqlQuery = "SELECT id FROM ".DATA_TABLE."46 WHERE status=0 AND f483='".$line['менеджер']."'";
$res = sql_query($sqlQuery);
$row = sql_fetch_array($res);
$sotr = $row['id'];
$line['замена'] = $sotr;
в поле "замена" в таблице контрагенты пусто.

#6 CbCoder

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

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

Отправлено 05 Июль 2014 - 12:14

Вы в условии запроса сравниваете поле с типом "текст" ФИО с полем с типом "пользователь" Менеджер, что недопустимо. Так делать нельзя, должны сравниваться поля одного типа. В данном случае, в Сотрудниках нужно брать поле Пользователь. Вторая ошибка - имя поля "менеджер" с маленькой буквы, тогда как в оригинале оно с большой. Из-за этого поле может быть не распознано системой. В итоге, после этих исправлений, код должен быть такой:

$sqlQuery = "SELECT id FROM ".DATA_TABLE."46 WHERE status=0 AND f1400='".$line['Менеджер']."'"; // f1400 - поле Пользователь в Сотрудниках
$res = sql_query($sqlQuery);
$row = sql_fetch_array($res);
$sotr = $row['id'];
$line['замена'] = $sotr;

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

#7 CbCoder

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

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

Отправлено 05 Июль 2014 - 12:43

Но, вообще, если пойти дальше, данный код построен на устаревшем примере. На текущий момент рекомендуется использовать наши функции для запросов к БД:

$res = data_select_field(46, "id", "status=0 AND f1400=",$line['Менеджер']); // используем нашу функцию вместо громоздкого прямого запроса
$row = sql_fetch_array($res);
$sotr = $row['id'];
$line['замена'] = $sotr;

Или еще короче (в этом случае в $row будут считаны все поля, а не только id):

$row = data_select_array(46, "status=0 AND f1400=",$line['Менеджер']); // сразу считываем результат запроса в массив
$line['замена'] = $row['id']; // сразу помещаем результат в поле, без промежуточной переменной, она тут излишня

Это всё не влияет на работку вычисления, но оптимизирует визуально код.

#8 aleks.goodcolor

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

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 05 Июль 2014 - 13:25

Попробовал сделать - теперь в поле "замена" пишет удален и при редактировании этот пункт появился в списке. Попробовал все варианты написания. "замена" с маленькой буквы как у вас в коде.

#9 CbCoder

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

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

Отправлено 05 Июль 2014 - 13:46

Так поле "замена" у вас какого типа? Код рассчитан на поле "связь", а у вас видимо "пользователь". Поменяйте его на связь с Сотрудником.

#10 aleks.goodcolor

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

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 05 Июль 2014 - 13:53

да, при смене поля на связь стало отображать в виде ссылок, но правило на это поле не работает - если поле "замена" равно текущему пользователю то разрешить доступ если нет то ограничить доступ. Это видимо происходит из-за того, что я сравниваю разные по типу поля.

#11 CbCoder

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

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

Отправлено 05 Июль 2014 - 14:25

Цитата

но правило на это поле не работает - если поле "замена" равно текущему пользователю

Для правила да, нужно поле "пользователь". Но, извините, какой смысл делать его как "пользователь", если у вас уже есть в Контрагентах поле Менеджер? Если следовать логике вашего кода, поле "замена" будет просто дублировать его. Либо вы неполно сформулировали задачу, не сказав до конца что вообще хотели.

#12 aleks.goodcolor

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

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 05 Июль 2014 - 14:47

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

#13 CbCoder

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

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

Отправлено 05 Июль 2014 - 15:00

А поле "замена" в Наших сотрудниках что из себя представляет? Поле "пользователь"? Тогда нужно заменить возврат id из запроса на это поле. У вас сейчас запрос возвращает id, что актуально только для поля связи.

#14 aleks.goodcolor

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

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 05 Июль 2014 - 15:19

поле замена в сотрудниках типа "пользователь". А в таблице Контрагенты также нужно изменить тип поля "замена" на "пользователь"?

то есть вместо выбора "id" выбирать сразу поле замена?

$res = data_select_field(46, "f3710", "status=0 AND f1400=",$line['Менеджер']);
$row = sql_fetch_array($res);
$sotr = $row['замена'];
$line['замена'] = $sotr;

Сообщение отредактировал aleks.goodcolor: 05 Июль 2014 - 15:21


#15 CbCoder

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

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

Отправлено 05 Июль 2014 - 15:40

Только в $row не "замена", а "f3710", вы же его выбираете в запросе.

$res = data_select_field(46, "f3710", "status=0 AND f1400=",$line['Менеджер']);
$row = sql_fetch_array($res);
$line['замена'] = $row['f3710'];


#16 aleks.goodcolor

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

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 05 Июль 2014 - 17:44

спасибо большое за помощь. буду продолжать разбираться.

#17 CbCoder

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

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

Отправлено 06 Июль 2014 - 13:34

Вопрос по случайной строке вынес в отдельную тему, т.к. он никак не связан с этой. Создавайте новые темы для новых вопросов (или пишите в существующую, но такой же тематики), не мешайте все в одну кучу.

#18 aleks.goodcolor

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

  • Пользователи
  • PipPipPip
  • 198 сообщений
  • Пол:Мужчина
  • Город:Йошкар-ола

Отправлено 06 Июль 2014 - 13:37

Просмотр сообщенияCbCoder (06 Июль 2014 - 13:34) писал:

Вопрос по случайной строке вынес в отдельную тему, т.к. он никак не связан с этой. Создавайте новые темы для новых вопросов (или пишите в существующую, но такой же тематики), не мешайте все в одну кучу.

Буду знать.





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

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