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


Автонумерация связанной таблицы


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

#1 etpu

    Участник

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

Отправлено 09 Апрель 2012 - 17:43

Имеется таблица Договора к ней привязана таблица Приложения договора. (По аналогии с таблицей Счета и Позиции счета).
В "Приложении договора" есть поле "Номер приложения" - тут должна быть автонумерация. И у каждого договора этот список должен начинатся с ссамого начала (с 1).
Сейчас авто нумерация работает по всей таблице "Приложения договора", а нужно только к той части которая связана с конкретным договором.
Пробовал через вычисления. Никак не получается заставить работать.

#2 Гость_Roman_*

  • Гости

Отправлено 09 Апрель 2012 - 20:48

if (!$line['Номер приложения']) // Если поле номер не заполнено...
  { // Выбираем максимальный номер из подтаблицы по полю связи.
    $sqlQuery = "SELECT MAX(`f222`) AS `max_num` FROM `".DATA_TABLE."333` WHERE `f444`='".$line['Договор']['Номер']."'";
    $result = mysql_query($sqlQuery);
    $row = mysql_fetch_assoc($result);
    $line['Номер приложения'] = $row['max_num'] + 1;
  }
Примерно так.

#3 etpu

    Участник

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

Отправлено 10 Апрель 2012 - 03:57

Пробовал несколько сложнее с помощью COUNT()
Сейчас протестирую данный вариант. Спасибо!

#4 etpu

    Участник

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

Отправлено 10 Апрель 2012 - 04:29

Не работает.

if (!$line['Номер приложения'])
  {
	$sqlQuery = "SELECT MAX(`f1212`) AS `max_num` FROM `".DATA_TABLE."93` WHERE `f1211`='".$line['Договор']['Номер']."'";
	$result = mysql_query($sqlQuery);
	$row = mysql_fetch_assoc($result);
	$line['Номер приложения'] = $row['max_num'] + 1;
  }
и так тоже:
if (!$line['Номер приложения']) // Если поле номер не заполнено...
  { // Выбираем максимальный номер из подтаблицы по полю связи.
	$sqlQuery = "SELECT MAX(`f1212`) AS `max_num` FROM `".DATA_TABLE."93` WHERE `f1211`='".$line['Номер договора']."'";
	$result = mysql_query($sqlQuery);
	$row = mysql_fetch_assoc($result);
	$line['Номер приложения'] = $row['max_num'] + 1;
  }

где:
f1211 - Поле "Номер договора" (связанное с таблицей "Договор", по полю "Номер")
f1212 - поле "Номер приложения" (тип поля Номер, с пустым значением по умолчанию)
93 - таблица "Приложения к договору" (таблица связанная с договором (договор - номер) по полю "номер договора".

При добавлении новой строки "Номер приложения" всегда равен 1.


Update: max_num почему то всегда равен 0

Сообщение отредактировал etpu: 10 Апрель 2012 - 05:25


#5 Гость_Roman_*

  • Гости

Отправлено 10 Апрель 2012 - 07:12

Проверьте ещё раз запрос. Скорее всего, в условии надо использовать переменную
$line['Договор']['raw']


#6 etpu

    Участник

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

Отправлено 10 Апрель 2012 - 08:04

Роман, не совсем понятно что за переменная и где её использовать?

#7 Гость_Roman_*

  • Гости

Отправлено 10 Апрель 2012 - 08:09

В условии запроса. В этой переменной содержится идентификатор строки из таблицы с договорами.

$sqlQuery = "SELECT MAX(`f1212`) AS `max_num` FROM `".DATA_TABLE."93` WHERE `f1211`='".$line['Договор']['raw']."'";


#8 etpu

    Участник

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

Отправлено 10 Апрель 2012 - 08:58

Попробовал - все тоже самое.

Я ведь правильно понимаю что в MAX(`f1212`) должно быть поле "Номер приложения" . Но тут вроде бы все правильно, ведь если я удалю


WHERE `f1211`='".$line['Договор']['raw']."'


То значение будет появляться правильное (26.... 27....28... и тд)
То есть по всей таблице.

Значит проблема как раз в коде указанном выше.
	$sqlQuery = "SELECT MAX(`f1212`) AS `max_num` FROM `".DATA_TABLE."93` WHERE status=0 and `f1211`=1";

Прописываю так то в договоре под номером 1 все работает как надо.

А если прописываю так:
	$sqlQuery = "SELECT MAX(`f1212`) AS `max_num` FROM `".DATA_TABLE."93` WHERE status=0 and `f1211`='".$line['Номер договора']."'";
То все перестает работать и выдает только 1.


Update
Вычисление работает в подтаблице "Приложения к договору".
И что странно, когда я задал
    $line['Номер приложения'] = $line['Договор']['Номер'];
или
    $line['Номер приложения'] = $line['Номер договора'];
в Поле "Номер приложения" ничего не добавлялось.

Сообщение отредактировал etpu: 10 Апрель 2012 - 09:06


#9 Гость_Roman_*

  • Гости

Отправлено 10 Апрель 2012 - 09:05

Выведите в вычислении переменную $line, тогда вы однозначно найдёте идентификатор договора.
print_r($line);
Я ещё не совсем понял как у Вас называется поле, по которому идёт связь с договором. В одном вычислении Вы пишите 'Номер договора', в другом - используете то название, которое я написал для примера. Если поле называется "Номер договора", возможно, стоит использовать $line['Номер договора']['raw'] в качестве условия запроса.

#10 etpu

    Участник

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

Отправлено 10 Апрель 2012 - 09:09

Если честно я немного далек от программирования (в далеком прошлом немного увлекался). Так что прошу прощения за мою глупость.
Не совсем понятно куда вставить print_r($line);

#11 Гость_Roman_*

  • Гости

Отправлено 10 Апрель 2012 - 09:13

Просмотр сообщенияetpu (10 Апрель 2012 - 09:09) писал:

Если честно я немного далек от программирования (в далеком прошлом немного увлекался). Так что прошу прощения за мою глупость.
Не совсем понятно куда вставить print_r($line);
Ничего страшного, форум существует именно для помощи. Вставьте эту строчку первой строкой. Будет выведет весь массив полей, только без названий, а с идентификатором типа f1234. В связующем поле будет выведен массив полей целевой таблицы, в том числе и идентификатор строки.

#12 etpu

    Участник

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

Отправлено 10 Апрель 2012 - 09:20

Вот такие у меня таблицы.

Главная таблица "Договор" и в ней поле "Номер".
Подтаблица Приложения к договору и там поле связи "Номер договора".

Насколько я понимаю названия ведь не должны совпадать. и все равно по поводу строчка с принтом не понял. Вставил её в начало вычисления, но где посмотреть результат?

Прикрепленные изображения

  • Прикрепленное изображение: Снимок1.PNG
  • Прикрепленное изображение: Снимок2.PNG


#13 etpu

    Участник

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

Отправлено 10 Апрель 2012 - 09:25

Во! Вот такой код заработал!

if (!$line['Номер приложения']) // Если поле номер не заполнено...
  { // Выбираем максимальный номер из подтаблицы по полю связи.
	$sqlQuery = "SELECT MAX(`f1212`) AS `max_num` FROM `".DATA_TABLE."93` WHERE status=0 and `f1211`='".$line['Номер договора']['raw']."'";
	$result = mysql_query($sqlQuery);
	$row = mysql_fetch_assoc($result);
	$line['Номер приложения'] = $row['max_num'] + 1;


А что такое ['raw'] и для чего оно нужно?

Сообщение отредактировал etpu: 10 Апрель 2012 - 09:27


#14 Гость_Roman_*

  • Гости

Отправлено 10 Апрель 2012 - 09:28

В ['raw'] содержится идентификатор строки основной записи. То есть, все записи в подтаблице имеют оно и то же значение $line['Номер договора']['raw'] для одного договора.





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

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