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


Нумерация документов


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

#1 arsenal

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

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

Отправлено 12 Апрель 2011 - 04:30

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

$sqlQuery = "SELECT f896 FROM ".DATA_TABLE."83 ORDER BY f896 desc LIMIT 0,1"; // Выбираем данные из поля f896 "Номер" таблицы 83 "Заявки", а также сортируем данные по убыванию, и берем первую запись. Таким образом получаем максимальный существующий номер.
$result = mysql_query($sqlQuery);
$row = mysql_fetch_array($result);
return $row['f896']+1;

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

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

Если вставить этот код в таблицу, то номер никак не меняются.

#2 CbCoder

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

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

Отправлено 12 Апрель 2011 - 08:42

Просмотр сообщенияarsenal (12.4.2011, 5:30) писал:

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

Вторая ошибка:

Просмотр сообщенияarsenal (12.4.2011, 5:30) писал:

Если вставить этот код в таблицу, то номер никак не меняются.
что естественно, т.к. у Вас нет проверки на новую запись.

Просмотр сообщенияarsenal (12.4.2011, 5:30) писал:

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

#3 arsenal

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

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

Отправлено 12 Апрель 2011 - 19:16

Просмотр сообщенияРазработчик (12.4.2011, 8:42) писал:

Вычисление поля срабатывает каждый раз при открытии поля (поэтому у вас и обновляется код сразу во всех записях), а вычисление в таблице - только после сохранения текущей записи.
А что является "открытием" поля - просмотр таблицы? выбор записи для просмотра? открытие записи для редактирования?

Просмотр сообщенияРазработчик (12.4.2011, 8:42) писал:

Вторая ошибка:

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

Просмотр сообщенияРазработчик (12.4.2011, 8:42) писал:

На самом деле все очень просто - т.к. Ваше вычисление должно заполнить поле Номер, то и проверять на заполнение надо именно его. Если оно пустое - значит запись новая и вычисление необходимо провести. Если уже заполнено - то и не меняете его.
Спасибо.

#4 arsenal

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

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

Отправлено 12 Апрель 2011 - 21:59

Применил следующий код
$data = data_table("Заявки","id={ID}"); // Берем данные из текущей строки
$sqlQuery = "SELECT f896 FROM ".DATA_TABLE."83 ORDER BY f896 desc LIMIT 0,1"; // Выбираем данные из поля f896 "Номер" таблицы 83 "Заявки", а также сортируем данные по убыванию, и берем первую запись.
$result = mysql_query($sqlQuery);
$row = mysql_fetch_array($result);
if ($data['Номер']=0)
   $data['Номер']=$row['f896']+1
update_query($data, "Заявки", "id={ID}");

Выдает ошибку:
Parse error: syntax error, unexpected T_STRING in C:\Program Files\MSTL\���������� ����\www\view_line.php(634) : eval()'d code on line 7

#5 arsenal

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

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

Отправлено 13 Апрель 2011 - 00:54

После "+1" поставил ";", ошибка пропала.
Но условие в таком виде (на равенство нулю) все равно не срабатывает. Хотя по умолчанию это поле равно нулю.
Попробовал переписать условие "наоборот"
if ($data['Номер'] > 0)
   $a=1;//Ничего не значащее действие
elseif 
   ($data['Номер']=$row['f896']+1);
update_query($data, "Заявки", "id={ID}");
все получилось.
Почему так?

#6 arsenal

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

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

Отправлено 13 Апрель 2011 - 01:26

Разобрался

#7 CbCoder

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

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

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

Просмотр сообщенияarsenal (12.4.2011, 20:16) писал:

А что является "открытием" поля - просмотр таблицы? выбор записи для просмотра? открытие записи для редактирования?
Любое отображение содержимого поля в программе, кроме прямого доступа через БД.

Просмотр сообщенияarsenal (12.4.2011, 20:16) писал:

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

Просмотр сообщенияarsenal (12.4.2011, 22:59) писал:

Выдает ошибку:
Parse error: syntax error
Синтаксическая ошибка, забыли поставить точку с запятой в конце строки. См. документацию по PHP





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

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