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


Добавление записи через вычисление


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

#41 CbCoder

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

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

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

Цитата

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

Цитата

В таблице заказы есть поле "Заказчик" (именно с этим полем связано поле "Компания" о котором речь шла чуть выше) оно является полем связи с таблицей "Контрагенты" (привязано к полю "название").
Хорошо, а в самом Журнале заказов какое поле является связью с заказчиком?

Цитата

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

#42 zizitopa

    Участник

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

Отправлено 09 Октябрь 2012 - 17:14

Просмотр сообщенияCbCoder (09 Октябрь 2012 - 14:51) писал:

Тем более, нелогично называть это поле "Компания", если по одной компании может быть несколько заказов. Это связь с заказом, а не с компанией. Логично выводить там номер заказа, к примеру.


Хорошо, а в самом Журнале заказов какое поле является связью с заказчиком?


Естественно он не будет там отображаться, если, во-первых, вы не заполнили поле связи с компанией (по крайней мере в вашем примере этого нет, я потому и спрашиваю у вас название поля связи). И во-вторых - надеюсь, в настройках самой таблицы включена опция "подчиненная"? Т.к. иначе таблица по любому там не появится (только в списке связанных справа)
В самом журнале заказов есть поле "Рабочее название" (название писал просто чтобы отличалось), оно является полем связи с таблицей контрагенты (связь с полем название). Галочка на "подчиненная" стоит и отображение таблицы идет.
В том коде нет строки заполнения поля "Рабочее поле". Пытался делать так
$line['Рабочее название'] = $id
Но это не работает. понятно почему - возвращается id записи из таблицы Заказы, а "Рабочее название" связано с таблицей контрагенты.

p.s. Название поля не отображается при просмотре в карточке, поэтому к подбору названия не особо придирчиво подходил.

p.p.s. Чтобы не было путаницы.
"Журнал отгрузок" связан с таблицей "заказы" через поле "Компания" (связь с полем Заказчик в таблице Заказы)
"Журнал отгрузок" связан с таблицей "Контрагенты" через поле "Рабочее название" (связь с полем Название в таблице Контрагенты)
"Заказы" связана с таблицей "Контрагенты" через поле "Заказчик" (связь с полем Название в таблице Контрагенты)

#43 CbCoder

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

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

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

Цитата

В том коде нет строки заполнения поля "Рабочее поле". Пытался делать так
$line['Рабочее название'] = $id
Но это не работает. понятно почему - возвращается id записи из таблицы Заказы, а "Рабочее название" связано с таблицей контрагенты.

Разумеется это не будет работать, т.к. в $ID содержится id текущей записи, т.е. в данном случае - id Заказа, а вам нужен id Контрагента. Соответственно, вы должны его взять из поля, где он лежит. В Заказах это поле связи с Контрагентом, т.е. "Заказчик". Код следующий:
$data['Рабочее название'] = $line['Заказчик']['ID'];

Или целиком:
$data['Рабочее название'] = $line['Заказчик']['ID'];
$data['Компания'] = $line['ID'];
$data['Дата отгрузки'] = date ("Y-m-d H:i:s");
$data['Тип товара'] = $line['Товар'];
$data['Водитель'] = $line['Водитель'];
$data['Объем'] = $line['Отгружать по'];
insert_query($data,"Журнал отгрузок");

Комментарии нужны, или суть понятна? Если что, это все есть в документации по вычислениям.

#44 zizitopa

    Участник

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

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

Просмотр сообщенияCbCoder (10 Октябрь 2012 - 09:43) писал:

Разумеется это не будет работать, т.к. в $ID содержится id текущей записи, т.е. в данном случае - id Заказа, а вам нужен id Контрагента. Соответственно, вы должны его взять из поля, где он лежит. В Заказах это поле связи с Контрагентом, т.е. "Заказчик". Код следующий:
$data['Рабочее название'] = $line['Заказчик']['ID'];

Или целиком:
$data['Рабочее название'] = $line['Заказчик']['ID'];
$data['Компания'] = $line['ID'];
$data['Дата отгрузки'] = date ("Y-m-d H:i:s");
$data['Тип товара'] = $line['Товар'];
$data['Водитель'] = $line['Водитель'];
$data['Объем'] = $line['Отгружать по'];
insert_query($data,"Журнал отгрузок");

Комментарии нужны, или суть понятна? Если что, это все есть в документации по вычислениям.

Супер, спасибо большое!
Суть ясна.
$data['Рабочее название'] = $line['Заказчик']['ID'];
Хитрая получилась конструкция. Сам это не смог сделать, т.к. я до конца не понимаю как работает ['ID']. По примеру просто поля связи им забиваю, толком не понимая как он работает. В документации про это к сожалению мало информации.
А так все супер, большое спасибо)

#45 Nikoff

    Новичок

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

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

Помогите пожалуйста сделать простое вычесление. Плохо знаком с php и самому сделать не получается.
Аналог расчета общей суммы счета в стандартном вычеслении.

Есть таблица "Заявка на производство" и подчиненная ей таблица "Описание фасада" (аналог стандартной таблицы Позиции счета).
В таблице "Описание фасада" есть поле "Площадь, м2" которые высчитывается простым умножением полей высота и ширина из этой же таблицы.

Мне нужно вывести сумму полей "Площадь, м2" из таблицы "Описание фасада" в поле "Общая площадь, м2" в таблице "Заявка на производство".

На основе примера из мануала на сайте я взял код:

// Получаем сумму содержимого полей "Сумма" таблицы "Позиции счета", где поле "Счет" равно номеру счета.
$sqlQuery = "SELECT sum(f810) as summa FROM ".DATA_TABLE."74
WHERE status=0 AND f807='".$line['Счет']['id']."'";

$res = mysql_query($sqlQuery);
$row = mysql_fetch_array($res);
$line['Счет']['Сумма'] = $row['summa'];

И переделал его под свой:

// Получаем сумму содержимого полей "Сумма" таблицы "Позиции счета", где поле "Счет" равно номеру счета.
$sqlQuery = "SELECT sum(f1197) as summa FROM ".DATA_TABLE."95
WHERE status=0 AND f1203='".$line['Позиции заявки']['id']."'";

$res = mysql_query($sqlQuery);
$row = mysql_fetch_array($res);
$line['Заявка на производство']['Общая площадь, м2'] = $row['summa'];

Где,
f1197 - "Площадь, м2" таблицы "Описание фасада"
95 - таблица "Описание фасада"
f1203 - "Позиции заявки" таблицы "Описание фасада", поле связь с полем "Номер заявки" таблицы "Заявка на производство" (тип поля Номер)

При включение вычисления, выдает ошибку. Скриншоты в приложении.

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

  • Прикрепленное изображение: screen1.jpg
  • Прикрепленное изображение: screen2.jpg


#46 Гость_Roman_*

  • Гости

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

В последней строке кода у Вас содержится название таблицы, а не название поля связи. Скорее всего, строка должна выглядеть так
$line['Позиции заявки']['Общая площадь, м2'] = $row['summa'];


#47 Nikoff

    Новичок

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

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

Просмотр сообщенияRoman (13 Ноябрь 2012 - 07:56) писал:

В последней строке кода у Вас содержится название таблицы, а не название поля связи. Скорее всего, строка должна выглядеть так
$line['Позиции заявки']['Общая площадь, м2'] = $row['summa'];

Попрежнему ошибка.

А ничего что ['Позиции заявки'] и ['Общая площадь, м2'] из разных таблиц? Их можно писать в один $line?

#48 Гость_Roman_*

  • Гости

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

Проверьте наименования полей. В $line с вложенностью больше одного всегда попадают поля из разных таблиц. Названия таблиц в $line не участвуют, только поля.

#49 Nikoff

    Новичок

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

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

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

// Получаем сумму содержимого полей "Сумма" таблицы "Позиции счета", где поле "Счет" равно номеру счета.
$sqlQuery = "SELECT sum(f810) as summa FROM ".DATA_TABLE."74
WHERE status=0 AND f807='".$line['Счет']['id']."'";

$res = mysql_query($sqlQuery);
$row = mysql_fetch_array($res);
$line['Счет']['Сумма'] = $row['summa'];

В реальности сейчас вот такой, по нему все работает.

$sqlQuery = "SELECT sum(f812) as summa FROM ".DATA_TABLE."74 WHERE status=0 AND f807=$ID";
$res = mysql_query($sqlQuery);
$row = mysql_fetch_array($res);
$line['Сумма'] = $row['summa'];


#50 Nikoff

    Новичок

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

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

Подскажите есть возможность при помощи Вычислений при создании пользователем новой строки в таблице 1 автоматически создавать строку в таблице 2 с копированием данных из нескольких полей строки в таблице 1 в поля строки таблицы 2.
Если да, то каким способом.

#51 CbCoder

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

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

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

Вычислением при сохранении. Берете данные текущей строки и записываете в другую таблицу.

#52 Nikoff

    Новичок

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

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

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

Вычислением при сохранении. Берете данные текущей строки и записываете в другую таблицу.

Спасибо, сейчас попробую.

Скажите, а за что отвечает $data?
$line - это как я уже понял "поле". А что такое дата?

#53 CbCoder

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

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

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

$line - это текущая строка, точнее переменная-массив с данными текущей строки. Например, $line['Сумма'] вернет значение из поля Сумма текущей строки. $line является зарезервированной переменной, создается программой и менять ее нельзя.

Переменная $data не является зарезервированной, поэтому в ней может быть что угодно, в зависимости от того что вы сами в нее занесете в своем вычислении.

#54 Nikoff

    Новичок

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

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

Просмотр сообщенияCbCoder (15 Ноябрь 2012 - 13:57) писал:

$line - это текущая строка, точнее переменная-массив с данными текущей строки. Например, $line['Сумма'] вернет значение из поля Сумма текущей строки. $line является зарезервированной переменной, создается программой и менять ее нельзя.

Переменная $data не является зарезервированной, поэтому в ней может быть что угодно, в зависимости от того что вы сами в нее занесете в своем вычислении.

Спасибо, быстрый ответ.

Вернемся к моему первому вопросу:

Цитата

Подскажите есть возможность при помощи Вычислений при создании пользователем новой строки в таблице 1 автоматически создавать строку в таблице 2 с копированием данных из нескольких полей строки в таблице 1 в поля строки таблицы 2.
Если да, то каким способом.

И Вашему ответу:

Цитата

Вычислением при сохранении. Берете данные текущей строки и записываете в другую таблицу.

В документации я нашел пункт: 3. Использование данных из другой таблицы
Где приводится следующий пример:

$line['Телефон'] = $line['Компания']['Телефон'];

Я так понимаю это как раз для меня. Но мне кажется или в примере описано обновление уже существующей строки? Какой командой мне создать новую строку в другой таблице?

#55 CbCoder

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

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

Отправлено 15 Ноябрь 2012 - 16:16

Нет, это пример не для вас. Ваш пример выглядит так:

$ins_data['ПолеБ1'] = $line['ПолеА1'];
$ins_data['ПолеБ2'] = $line['ПолеА2'];
$ins_data['ПолеБ3'] = $line['ПолеА3'];
.........
insert_query("Вторая таблица", $ins_data)

Поясняю:
1) заполняете массив $ins_data (это произвольное имя переменной) значениями полей из текущей строки. "ПолеБ1", "ПолеБ2" и т.д. - это поля второй таблицы, "ПолеА1", "ПолеА2" - из текущей.
2) добавляете новую строку во вторую таблицу через функцию insert_query, со значениями полей из массива $ins_data

#56 Nikoff

    Новичок

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

Отправлено 15 Ноябрь 2012 - 19:06

Просмотр сообщенияCbCoder (15 Ноябрь 2012 - 16:16) писал:

Нет, это пример не для вас. Ваш пример выглядит так:

$ins_data['ПолеБ1'] = $line['ПолеА1'];
$ins_data['ПолеБ2'] = $line['ПолеА2'];
$ins_data['ПолеБ3'] = $line['ПолеА3'];
.........
insert_query("Вторая таблица", $ins_data)

Поясняю:
1) заполняете массив $ins_data (это произвольное имя переменной) значениями полей из текущей строки. "ПолеБ1", "ПолеБ2" и т.д. - это поля второй таблицы, "ПолеА1", "ПолеА2" - из текущей.
2) добавляете новую строку во вторую таблицу через функцию insert_query, со значениями полей из массива $ins_data

Таблица 2 должна быть подчиненной таблице 1? Или это не принципиально?

И сразу в догонку вопрос: как сделать так что бы после первого создания строки в таблице 2, при последующем сохронении строки в таблице 1 система обновляла строку в таблице 2, а не создавала новую. Проще говоря как привязать строки друг к другу?

Сообщение отредактировал Nikoff: 15 Ноябрь 2012 - 19:09


#57 CbCoder

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

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

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

Разумный вопрос. Действительно, необходимо предусмотреть какой-то флаг в первой таблице, например поле "Копия создана". При сохранении записи это поле можно заполнять словом "Да". Соответственно, перед копированием проверять, заполнено поле, или нет.

if ($line['Копия создана'] != 'Да')
{
  $ins_data['ПолеБ1'] = $line['ПолеА1'];
  $ins_data['ПолеБ2'] = $line['ПолеА2'];
  $ins_data['ПолеБ3'] = $line['ПолеА3'];
  .........
  insert_query("Вторая таблица", $ins_data);
  $line['Копия создана'] = 'Да';
}


#58 CbCoder

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

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

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

Цитата

Таблица 2 должна быть подчиненной таблице 1? Или это не принципиально?

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

#59 Oleg_

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

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

Отправлено 02 Декабрь 2012 - 00:20

Подскажите, как сделать что бы цикл не просматривал записи со status 2

Цитата

$po= data_table("Позиции заказа","`Номер заказа`=".$ID,"all");
foreach ($po as $pz)

Сообщение отредактировал Oleg_: 02 Декабрь 2012 - 00:22


#60 Oleg_

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

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

Отправлено 02 Декабрь 2012 - 10:48

может кому понадобится
("Позиции заказа","`Статус записи`=0 AND `Номер заказа`=".$ID,"all")






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

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