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


Формула нумерации договоров

нумерация договор

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

#1 dron

    Участник

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

Отправлено 03 Сентябрь 2012 - 12:27

Хочу попросить помощи у опытных пользователей программы, суть вопроса следующая:


Вопрос 1: Есть клиент, на которого заводится договор на услугу формата 630-001 , где 630 идентификация клиента, а 001 идентификация услуги. Т.е. если этот же клиент заказывает другую услугу, мы создаем договор формата 630-002. Как долна выглядеть формула для такой нумерации договоров?

Вопрос 2: Есть договор, к договору создаются приложения формата 001, 002 и т.д. у каждого приложения свой шаблон. Нумерация приложений идет в рамках только того договора, к которому оно создается. Т.е. при формировании приложения к другому договору, оно так же пойдет начиная от 001

Пока не могу понять какую формулу под данную нумерацию запилить :( Буду признателен за помощь

#2 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 314 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 03 Сентябрь 2012 - 13:50

сделайте отдельное скрытое поле, например num, с вычислением при сохранении таблицы
if (!$line['num']) {
  $sqlQuery = "SELECT max(`fXX1`) AS maxNUM FROM `".DATA_TABLE."YY` WHERE (`status`<>'2' AND `fXX2`='" . $line['Клиент']['ID'] . "')";
  $result = mysql_query($sqlQuery) or user_error(mysql_error() . "<br>" . $sqlQuery . "<br>", E_USER_ERROR);
  $row = mysql_fetch_assoc($result);
  $line['num']=$row['maxNUM']+1;
}
, где fXX1 - внутреннее имя поля num в базе, fXX2 - внутреннее имя поля Клиент - поле связи Договора с Клиентом, YY - номер таблицы Договора
Далее в поле Номер вашего договора производите вычисления при сохранении в таблице:
$line['Номер']=$line['Клиент'] . "-" . $line['num'];
В приложении все по аналогии. Отличие будет в условии отбора записей в sql-запросе. Отбирать нужно не по клиенту, а по Договору.

Творческая группа "ТАВР".

www.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.


#3 dron

    Участник

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

Отправлено 03 Сентябрь 2012 - 17:26

А есть ли возможность написать алгоритм действий? По-шагово? Настолько сложные действия еще не приходилось настраивать :)

#4 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 314 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 04 Сентябрь 2012 - 19:13

По вопросу 1.
В таблице Договора создаете поле num, типа число. Скрываете его в настройках доступа. В вычислениях таблицы Договора создаете вычисление
if (!$line['num']) {
  $sqlQuery = "SELECT max(`fXX1`) AS maxNUM FROM `".DATA_TABLE."78` WHERE (`status`<>'2' AND `f849`='" . $line['Компания']['ID'] . "')";
  $result = mysql_query($sqlQuery) or user_error(mysql_error() . "<br>" . $sqlQuery . "<br>", E_USER_ERROR);
  $row = mysql_fetch_assoc($result);
  $line['num']=$row['maxNUM']+1;
}
Устанавливаете срабатывание вычисления - Сохранение в таблице.
Касаемо внутренних имен полей. Каждое поле помимо названия, которое Вы ему присваиваете, имеет внутреннее имя. Посмотреть его можно, например, если войти в настройки полей таблицы. При наведении обычно внизу появляется ссылка перехода. Параметр field - это номер требуемого поля, внутреннее имя соответствует ему с буквой f в начале, т.е. f492, например. В случае, если ссылка при наведении не выводится, кликните по нему - в адресной строке все будет. Т.о., Вы определите имя поля num, которое создали, и имя поля связи Таблицы Контрагенты и Договора. В стандартной конфигурации это поля называется Компания и имеет имя в базе f849.
Если хотите подойти глобально к структуре базы, посмотрите здесь.
Пояснение по вычислению.
Запросом sql из таблицы Договора выбирается запись, которая не является удаленной (`status`<>'2'), в поле связи имеет номер соответствующий номеру текущего контрагента (`f849`='" . $line['Компания']['ID'] . "') и при этом имеет максимальное значение в поле num (SELECT max(`fXX1`)). После этого номер увеличивается на единицу и заносится в текущую запись (последняя строчка вычисления).
Далее.
Меняете тип поля Номер на текстовое. И в вычислениях таблицы Договора создаете еще одно:
$line['Номер']=$line['Компания'] ['ID'] . "-" . str_pad($line['num'], 3, "0", STR_PAD_LEFT);
Настраиваете срабатывание также, как и в первом случае, при сохранении в таблице.
Для удобства пользователей в настройках доступа поля снимите галочку с опции Добавление. В этом случае при создании новой записи поле Номер появляться не будет, что исключит неправильное его заполнение. Но при повторном открытии записи будет возможность откорректировать номер, если в этом будет необходимость.

По вопросу 2.
Нумерацию Вы можете создать по аналогичной схеме, выбирая из таблицы Приложения запись, связанную с текущим Договором и максимальным значением поля num. Что касается шаблона - при его формировании в теле ставите отбор по тому же полю num. Если равно 1 - формируете один шаблон печати, если 2 - второй шаблон и т.д. Вот только вопрос. У Вас поля для шаблонов одни и те же или для каждого свои? Ежели вариант 2 - тогда все намного интереснее.

Творческая группа "ТАВР".

www.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.


#5 UmaCat

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

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

Отправлено 09 Ноябрь 2012 - 08:54

2 andibrag

Вопрос
а зачем конструкция условия?
if (!$line['num']) {

подскажите, что проверяется в данном условии?
Почему спрашиваю
У меня в одной таблице вычисление подобное работает прекрасно.
А во второй все полностью аналогично, но не работает - не дает максимального числа
отключил условия - заработало.

разобрался, вроде бы - условие дает сквозной номер от максимального по всей таблице
странно почему у меня не работает :(
может подскажете (в другой таблице такое же работает)
Вычисления сделаны на условия сохранения таблицы
f1357 - это поле Номер
f1298 - это поле с компанией (внутри этой компании Номер должен быть сквозной)

if (!$line['Номер']) {
  $sqlQuery = "SELECT max(`f1357`) AS maxNUM FROM `".DATA_TABLE."100` WHERE (`status`<>'2' AND `f1298`='" . $line['Контрагент']['ID'] . "')";
  $result = mysql_query($sqlQuery) or user_error(mysql_error() . "<br>" . $sqlQuery . "<br>", E_USER_ERROR);
  $row = mysql_fetch_assoc($result);
  $line['Номер']=$row['maxNUM']+1;
}
вот не рабюотает и все :(

Сообщение отредактировал UmaCat: 09 Ноябрь 2012 - 08:59


#6 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 314 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

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

Просмотр сообщенияUmaCat (09 Ноябрь 2012 - 08:54) писал:

а зачем конструкция условия?
if (!$line['num']) {
подскажите, что проверяется в данном условии?
Условие проверяет заполнено ли поле Номер или нет? При пустом значении или если равно нулю - срабатывают вычисления. Если условие убрать - при повторном открытии и сохранении записи Вы получите текущее максимальное значение, т.е. собьете нумерацию.
Чтобы работало - поле должно быть типа номер и не должно стоять автонумерации. Проверьте, пожалуйста.
Ошибок в коде не увидел.

Творческая группа "ТАВР".

www.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.


#7 UmaCat

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

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

Отправлено 09 Ноябрь 2012 - 11:51

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

Условие проверяет заполнено ли поле Номер или нет? При пустом значении или если равно нулю - срабатывают вычисления. Если условие убрать - при повторном открытии и сохранении записи Вы получите текущее максимальное значение, т.е. собьете нумерацию.
Чтобы работало - поле должно быть типа номер и не должно стоять автонумерации. Проверьте, пожалуйста.
Ошибок в коде не увидел.

там где работало - в таблице поле было типа "число". Поставил тип "номер" - продолжает работать
там где не работает поставил тип "номер" (было тоже число), как не работало так и не работает :(

Сообщение отредактировал UmaCat: 09 Ноябрь 2012 - 12:03


#8 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 314 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 09 Ноябрь 2012 - 12:44

Просмотр сообщенияUmaCat (09 Ноябрь 2012 - 11:51) писал:

там где работало - в таблице поле было типа "число". Поставил тип "номер" - продолжает работать
там где не работает поставил тип "номер" (было тоже число), как не работало так и не работает :(
Сорри, не номер, а число должно быть. Вечно их путаю. Номер собъет Вам всю вашу нумерацию!!! Данный тип применяется только для сквозной табличной нумерации по аналогии с id и не может содержать повторяющихся значений. Измените, пока поле делов не натворило.

Творческая группа "ТАВР".

www.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.


#9 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 314 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 09 Ноябрь 2012 - 12:50

Попробуйте
if ($line['Номер']==0) {
Где-то проблема с присвоением значения полю в момент создания записи. У Вас точно автонумерация отключена? И как стоит срабатывание вычисления? При сохранении?

Творческая группа "ТАВР".

www.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.


#10 UmaCat

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

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

Отправлено 09 Ноябрь 2012 - 13:31

Просмотр сообщенияandibrag (09 Ноябрь 2012 - 12:50) писал:

Попробуйте
if ($line['Номер']==0) {
Где-то проблема с присвоением значения полю в момент создания записи. У Вас точно автонумерация отключена? И как стоит срабатывание вычисления? При сохранении?
спасибо за число, а не номер - сейчас верну назад

я нашел где проблема была

в свойствах таблицы стояла галка - сохранять при добавлении (а вычисление указано срабатывать при сохранении)
соответственно когда создавалась новая запись, то это давало в поле номер цифру 0, плюсовался 1 и все.
в общем не знаю как объяснить :)
но проблема была именно в этом - в свойствах той таблицы где работало не стояла галка "сохранять при добавлении", а там где не работало - стояла.
снял галку в свойствах таблицы и все заработало.

Спасибо за помощь

Сообщение отредактировал UmaCat: 09 Ноябрь 2012 - 13:32


#11 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 314 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 09 Ноябрь 2012 - 13:55

Просмотр сообщенияUmaCat (09 Ноябрь 2012 - 13:31) писал:

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

Творческая группа "ТАВР".

www.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.


#12 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 314 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 09 Ноябрь 2012 - 20:36

Просмотр сообщенияandibrag (09 Ноябрь 2012 - 13:55) писал:

думал, что опция сохранять при добавлении должна была вызывать вычисление при сохранении
К разработчикам: отрабатывает ли вычисление? Если нет - почему?

Творческая группа "ТАВР".

www.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.


#13 CbCoder

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

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

Отправлено 10 Ноябрь 2012 - 14:43

Разумеется отрабатывает.

#14 maksbazhin

    Участник

  • Пользователи
  • PipPip
  • 27 сообщений
  • Пол:Мужчина

Отправлено 29 Декабрь 2017 - 09:54

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

#15 CbCoder

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

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

Отправлено 29 Декабрь 2017 - 10:25

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

#16 maksbazhin

    Участник

  • Пользователи
  • PipPip
  • 27 сообщений
  • Пол:Мужчина

Отправлено 29 Декабрь 2017 - 10:36

а нельзя в значение по умолчанию вставить SQL запрос пусть даже напрямую в базу?

#17 CbCoder

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

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

Отправлено 29 Декабрь 2017 - 12:09

Нет конечно) Чтобы запрос сработал, его кто то должен выполнить. Разумеется ничего подобного там нет, иначе я бы об этом сказал.

#18 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 314 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 13 Февраль 2018 - 10:48

Просмотр сообщенияmaksbazhin (29 Декабрь 2017 - 10:36) писал:

а нельзя в значение по умолчанию вставить SQL запрос пусть даже напрямую в базу?
Что-то подобное реализовывал через аякс - выполняете запрос к базе и вставляете значение в поле средствами JS.
Но это костыль, а не стандартная функция.

Творческая группа "ТАВР".

www.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.






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

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