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


Вычисления в таблице


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

#1 Nik

    Участник

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

Отправлено 19 Март 2010 - 20:50

Здравствуйте.

Я не нашел информации по конкретно данной функции в Документации. У меня такой вопрос.

Когда именно выполняется код размещенный в данном месте?


					
					<br />
					
				</div>
				
<script type= ipb.global.registerReputation( 'rep_post_2849', { domLikeStripId: 'like_post_2849', app: 'forums', type: 'pid', typeid: '2849' }, parseInt('0') );

#2 Nik

    Участник

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

Отправлено 19 Март 2010 - 21:47

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

#3 CbCoder

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

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

Отправлено 20 Март 2010 - 17:17

Просмотр сообщенияNik (19.3.2010, 20:50) писал:

Когда именно выполняется код размещенный в данном месте?

Судя по моим тестам в момент добавления записи в таблицу, верно?
Не совсем. Код вычисления выполняется при любом сохранении строки (т.е. и при добавлении и при редактировании).

Просмотр сообщенияNik (19.3.2010, 20:50) писал:

Но как быть если пользователь уже создан в системе, а я хочу добавить его в таблицу "Наши сотрудники?" Если я добавляю информацию с таким же логином как в таблице USERS_TABLE он обновляет данные в ней, что не удобно. Во первых, дублируются данные которые очевидно должны храниться лишь в одном месте. Во вторых, пароль в таком случае хранится в не защищенном виде и доступен практически всем пользователям имеющим доступ к просмотру таблицы "Наши сотрудники"
А что мешает Вам просто не заполнять поля логина и пароля? если вы не хотите обновления пользователя. Выключать обновление "вообще" по моему глупо, т.к. в этом случае данные в двух таблицах просто не будут совпадать. Хотя опять же никто вам не мешает удалить код автообновления совсем. Удалять только поля Логин и Пароль для этого недостаточно.

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

Просмотр сообщенияNik (19.3.2010, 20:50) писал:

В документации про эту функцию я ничего не нашел, если бы вы могли мне прояснить всю логику я был бы вам очень благодарен.
Код вычисления очень простой и легко читается, к тому же все же шаги там прокомментированы. Не вижу особого смысла расписывать его полностью и подробно. Если у вас есть вопрос по конкретному непонятному месту - задавайте.

#4 Nik

    Участник

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

Отправлено 22 Март 2010 - 17:11

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

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

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

Со всем кодом разобрался тем же часом. Создайте пользователя и запостите на форуме сообщение. Вы получите отсутствие у сообщения ФИО, редакционных функций и битой ссылки на аватар. После того как я создаю сотрудника с пустыми полями "логин" и "пароль" связи у данного пользователя с его записью в сотрудниках не происходит (что очевидно, так как в коде представления форума проверка производится по полям логина). После того как я ввожу в сотрудниках свой логин и пароль: 1) меня выкидывает; 2) мой логин-пароль становятся достоянием общественности. Понятно, что для тех у кого права на просмотр данной таблицы и этих полей конечно, по умолчанию - все админы, а у нас с данными правами несколько человек, да и вообще, ни к чему админам знать пароль к примеру главного бухгалтера; 3) пароль записан не в защищенном виде, что является потенциальной уязвимостью, более того, даже тип поля для него обычный текстовый, что позволяет свободно его видеть.

Я удалил дублирующиеся поля (логин, пароль, уровень доступа) из сотрудников и поставил проверку по ФИО (это оказалось нужно только в представлении форума).

Конечно, удобно заводить сотрудника и тут же создавать для него учетную запись если сотрудников много, но в таком случае нужны логические поля, например:
текстовое поле: "ФИО", а напротив него галочка с лейблом: "связь с пользователем", после нажатия которой текстовое поле "ФИО" меняется на поле с типом связь и выпадающим списком пользователей. Это лишь один пример где были бы полезны поля с меняющимся типом в зависимости от выбранного условия.

#5 CbCoder

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

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

Отправлено 22 Март 2010 - 17:19

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

#6 Nik

    Участник

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

Отправлено 22 Март 2010 - 17:21

Так как я сам программист, все приемлемые изменения для себя я уже сделал, спасибо. Все-таки, больше бы хотелось подключаемых JS, остальной функционал вполне устраивает.

#7 Гарифуллин Марат

    Администратор

  • Руководитель ООО "КБ"
  • PipPipPip
  • 121 сообщений
  • Пол:Мужчина

Отправлено 24 Май 2010 - 10:00

Обновили раздел
http://www.clientbas...n_16/php-polya/

где расписали разницу между вычислениями в полях и в таблицах

#8 Alexander

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

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

Отправлено 27 Май 2010 - 12:58

В таблице Лицензионный договор есть поле "Дата" в которое вставляется дата из календаря. Каким образом сделать поле "дата в формате", в котором бы бралось значение из поля "Дата" и вставляло его в формате «День» месяц 2010.

Начал с того, что посмотрел здесь http://phpclub.ru/my...-functions.html. попробовал такую вещь - получить название месяца:
код:
$а = data_table("Лицензионный договор","id={ID}");
$result = SELECT MONTHNAME($a["Дата"]);
return $result;
Не сработало, не подскажете в чем проблема

#9 CbCoder

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

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

Отправлено 27 Май 2010 - 14:40

Вы принципиально неверно пишите код вычисления. Во-первых вычисление пишется на языке PHP, а вы пытаетесь вставить в него зачем то функцию на SQL, хотя это два абсолютно разных языка. Во-вторых никакая встроенная функция вам название месяца на русском языке не выдаст (если вас конечно не устроит дата на английском)

Код должен быть примерно такой:

// создаем массив русских названий месяцев
$name_month = array (
	'01'=>'января','02'=>'февраля','03'=>'марта',
	'04'=>'апреля','05'=>'мая','06'=>'июня',
	'07'=>'июля','08'=>'августа','09'=>'сентября',
	'10'=>'октября','11'=>'ноября','12'=>'декабря'
);

$а = data_table("Лицензионный договор","id={ID}");  // считываем поля текущей строки

$day = date("d", strtotime($a["Дата"]));  // достаем день
$month = date("m", strtotime($a["Дата"]));  // достаем номер месяца
$year = date("Y", strtotime($a["Дата"]));  // достаем год

$data = $day." ".$name_month[$month]." ".$year;  // формируем дату

return $data;  // выводим результат

Еще раз напоминаем, что для создания вычисляемых полей необходимо иметь знания и опыт программирования на PHP.

#10 Alexander

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

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

Отправлено 27 Май 2010 - 15:53

Большое спасибо, только почему-то выдает все время 1 января 1970 года

#11 Alexander

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

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

Отправлено 27 Май 2010 - 16:18

Скорее всего не читает правильные данные из масива

#12 CbCoder

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

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

Отправлено 27 Май 2010 - 16:32

Ну я вас предупредил что код примерный, на ошибки мной не проверялся. Более того я скопировал ваш выше для образца, а там оказывается у вас в строке "$а = data_table("Лицензионный договор","id={ID}");" буква а не английская, а зачем-то русская. Разумеется код в этом случае работать не будет. И еще если у вас есть поля с пустой датой, необходимо вводить дополнительную проверку:

// создаем массив русских названий месяцев
$name_month = array (
	'01'=>'января','02'=>'февраля','03'=>'марта',
	'04'=>'апреля','05'=>'мая','06'=>'июня',
	'07'=>'июля','08'=>'августа','09'=>'сентября',
	'10'=>'октября','11'=>'ноября','12'=>'декабря'
);

$a = data_table("Лицензионный договор","id={ID}");  // считываем поля текущей строки

if ($a["Дата"] != "0000-00-00 00:00:00") {
	
	$day = date("d", strtotime($a["Дата"]));  // достаем день
	$month = date("m", strtotime($a["Дата"]));  // достаем номер месяца
	$year = date("Y", strtotime($a["Дата"]));  // достаем год

	$data = $day." ".$name_month[$month]." ".$year;  // формируем дату

} else {
	
	$data = "";  // пустая дата

}

return $data;  // выводим результат


#13 Alexander

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

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

Отправлено 31 Май 2010 - 10:02

Доброе утро.
Есть такая задача:
В таблице "Договоры" есть:
1. поле "с:" - с какого числа договор (поле обязательное для заполнения)
2. Поле "Срок договора" - список в котором 3 значения : 3 (три) месяца, 12(двенадцать) месяцев, 10 (10) лет
3 Создаю поле "до:" (тип поля дата/время), которое по значению "Срок договора" должно прибавлять соответственно 3 или 12 месяцев или 10 лет
в таблице вычисления пишу следующий код:

$f = data_table("Договоры","id={ID}"); // берем все данные текущей строки и забиваем их массив
if ($f["Срок договора"] = "3 (три) месяца") {
$sum = strtotime(date("Y-m-d", strtotime($f["с:"])) . "+3 months");
$dateTo=date('Y-m-d',$sum);
} if ($f["Срок договора"] = "12 (двенадцать) месяцев") {
$sum = strtotime(date("Y-m-d", strtotime($f["с:"])) . "+12 months");
$dateTo=date('Y-m-d',$sum);
} if ($f["Срок договора"] = "10 (десять)лет") {
$sum = strtotime(date("Y-m-d", strtotime($f["с:"])) . "+10 years");
$dateTo=date('Y-m-d',$sum);
}
return $dateTo;

Не подскажете, где напортачил?

#14 CbCoder

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

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

Отправлено 31 Май 2010 - 10:39

Какая-то странная конструкция:
$sum = strtotime(date("Y-m-d", strtotime($f["с:"])) . "+3 months");
Откуда вы ее взяли вообще?

#15 Alexander

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

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

Отправлено 31 Май 2010 - 11:19

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

#16 CbCoder

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

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

Отправлено 31 Май 2010 - 11:26

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

Ну тогда ошибка у вас только в условии - в php одиночный знак "равно" это исключительно операция присвоения. В условии надо писать "==" (иначе будет проверяться результат присвоения, а не равенство)

#17 Alexander

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

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

Отправлено 31 Май 2010 - 11:45

Спасибо работает.
Для народа публикую код... думаю может кому понадобится
Есть такая задача:
В таблице "Договоры" есть:
1. поле "с:" - с какого числа договор (поле обязательное для заполнения)
2. Поле "Срок договора" - список в котором 3 значения : 3 (три) месяца, 12(двенадцать) месяцев, 10 (10) лет
3 Создаю поле "до:" (тип поля дата/время), которое по значению "Срок договора" должно прибавлять соответственно 3 или 12 месяцев или 10 лет
в таблице вычисления следующий код:
$f = data_table("Договоры","id={ID}");
if ($f["Срок договора"] == "3 (три) месяца") {
$sum = strtotime(date("Y-m-d", strtotime($f["с:"])) . "+3 months");
$dateTo=date('Y-m-d',$sum);
} if ($f["Срок договора"] == "12 (двенадцать) месяцев") {
$sum = strtotime(date("Y-m-d", strtotime($f["с:"])) . "+12 months");
$dateTo=date('Y-m-d',$sum);
} if ($f["Срок договора"] == "10 (десять)лет") {
$sum = strtotime(date("Y-m-d", strtotime($f["с:"])) . "+10 years");
$dateTo=date('Y-m-d',$sum);
}
return $dateTo;






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

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