![](https://forum.clientbase.ru/public/style_images/master/icon_users.png)
![](https://forum.clientbase.ru/uploads/profile/photo-thumb-6064.png)
#21
Отправлено 05 Июнь 2014 - 17:24
Я то думал у вас реально проблема из-за невозможности фильтрации...
#22
Отправлено 05 Июнь 2014 - 17:35
CbCoder (05 Июнь 2014 - 17:24) писал:
Так вот с данным вычислением я и затрудняюсь) можете привести пример? Думаю, вас это не затруднит как меня)
CbCoder (05 Июнь 2014 - 17:24) писал:
У меня действительно проблема с фильтрацией по полю Карточка. Сделал еще раз так, как вы описали выше - поставил поле Карточка выше поля Город и у поля город в фильтре указал фильтр по полю Карточка. Итог тот же. Может зайдете по ссылке и посмотрите?
Вход в Клиентскую Базу
логин: admin
пароль: gkihyA4TZFYJ
Сообщение отредактировал All_ex74: 06 Июнь 2014 - 09:37
#23
Отправлено 06 Июнь 2014 - 09:33
#24
Отправлено 06 Июнь 2014 - 10:30
CbCoder (06 Июнь 2014 - 09:33) писал:
Если бы умел, то давно бы сделал) Я прошу только в крайне затруднительных для меня случаях, как этот.
Что то вроде этого запроса?:
$res = data_select(240, "status=0 AND f4690=",$line['Сфера услуг']); // где 240 - id таб. Исполнители, а f4690 - id поля Сфера услуг $row = sql_fetch_array($res); $isp = $row['id'];
Цитата
А дальше ступор... Как сделать запрос по параметрам (выбранным Городом, Типом услуги и параметром Карточка = "Свободна") ведь это же поля связи и выбрать первую запись, но следующую от предыдущей? Пипец мозгу)
Цитата
Мне нужно выбирать не просто Свободного Исполнителя, а всегда Следующего Свободного (с Карточка = Свободна) по списку...
У нас Исполнители - это исполнители бытовых услуг, организации которые платят за нахождение в базе. Им будет обидно, что заявки будут уходить не всем по очереди)
Но как запоминать, что данный Исполнитель уже брался? Наверное поле Флаг в таблице Исполнитель нужно какое то добавить и писать туда 1 при выборе Исполнителя_1, при следующем выборе искать поле Флаг = 1 и выбирать следующего за ним Исполнителя_2 с полем Флаг = 0, затем Исполнителю_1 переписывать поле Флаг в = 0, а Исполнителю_2 поле Флаг = 1, и так далее, простым перебором по циклу, по очереди подставлять значение полю Исполнитель данным запросом.
Но логику то я понять могу, а вот выразить кодом никак, нужна ваша помощь! Думаю, данная логика будет полезна многим на этом форуме. Помогите пожалуйста...
Сообщение отредактировал All_ex74: 06 Июнь 2014 - 10:54
#25
Отправлено 06 Июнь 2014 - 11:05
Цитата
Зачем вам сейчас то фильтрация по нему, если все равно выбор идет через запрос с фиксированным значением поля Карточка? Уберите это поле просто, оно лишнее в этой ситуации.
Цитата
Во-первых, раз сейчас вам фильтрация выпадающего списка Исполнителей оказалась ненужна (т.к. Исполнитель автоматом выбирается), лучше откатите все назад как было (т.е. верните полям Город и Тип услуги их изначальные связи со справочниками, поле Карточка же вообще не нужно, т.к. там значение всегда одно), иначе составить запрос действительно будет проблематично. Если же вернуть, проблемы никакой нет, добавляете просто в условие запроса эти поля, аналогично вашему же примеру выше (только не понял, почему там $line['Сфера услуг'], тогда как в заявке "Тип услуг", плюс к полям связи надо добавлять ['ID'], т.е. $line['Тип услуг']['ID'])
Цитата
Я же пояснил - для проверки делаете второй запрос уже к таблице Заявки и смотрите, используется там этот Исполнитель, или еще нет. Зачем для этого флаги городить?
#26
Отправлено 06 Июнь 2014 - 11:34
Цитата
1. Согласен, что ненужно. Когда создается Заявка, либо внешним запросом, либо оператором КБ, поля в ней уже должны быть заполнены и Исполнитель назначен - ТАК ДОЛЖНО БЫТЬ В ИДЕАЛЕ. Но пока шел к этому пониманию - понагородил лес...
Цитата
2. Получается и вычисление по созданию Заявки нужно будет подкорректировать, т.к. изменилась суть полей в ней:
if ($line['Состояние'] == "Связана") { $zvka['Заказчик'] = $line['ID']; $zvka['Город'] = $line['Город']['ID']; $zvka['Тип услуги'] = $line['Связана по услуге']['ID']; $zvka['ID'] = insert_query($zvka, "Заявки"); }
Цитата
3. Я как понял, можно в это же вычисление добавить и весь запрос и сразу же в нём скопировать в поле Исполнитель нужное значение?
Цитата
4. Получается по вашему, если Исполнитель будет успевать освобождаться от предыдущей заявки до назначения на следующую, то только он один и будет выбираться постоянно. Писал выше несколько раз, что главное условие - не ставить Исполнителя повторно НИКОГДА, даже если он уже успел освободиться от заявки, а брать ТОЛЬКО следующего по списку среди Свободных. Вот в этом то и суть проблемы. Не пойму, для чего нужен вообще запрос в таблицу Заявки, если мы выборкой из базы достанем всех Свободных на текущий момент и уже по этому массиву сделаем выбор следующего, используя Флаг? Может я что то недопонимаю, что неудивительно)
Я добавлю нужное поле в таб. Исполнители за 1 минуту, вы мне только с вычислением помогите...
Сообщение отредактировал All_ex74: 06 Июнь 2014 - 12:12
#27
Отправлено 06 Июнь 2014 - 12:08
3. Да, действительно, если сейчас выходит что никакого исполнителя в Заявке вручную выбирать не нужно, то логично его заполнять сразу в вычислении по созданию Заявки.
4. Я так и понял вас изначально, однако вы подчеркнули, что прежний исполнитель может освободится от заявки (или не от заявки?), поэтому и предложил проверять по заявкам. Теперь же вы пишите про "никогда"... В таком случае естественно остается только поле-флаг, которое нужно учитывать при запросе к Исполнителям, и заполнять после его выбора.
#28
Отправлено 06 Июнь 2014 - 12:27
CbCoder (06 Июнь 2014 - 12:08) писал:
3. Да, действительно, если сейчас выходит что никакого исполнителя в Заявке вручную выбирать не нужно, то логично его заполнять сразу в вычислении по созданию Заявки.
4. Я так и понял вас изначально, однако вы подчеркнули, что прежний исполнитель может освободится от заявки (или не от заявки?), поэтому и предложил проверять по заявкам. Теперь же вы пишите про "никогда"... В таком случае естественно остается только поле-флаг, которое нужно учитывать при запросе к Исполнителям, и заполнять после его выбора.
Вот и я про то же)
Так все же, если верну:
у т. Заказчики
поле Город связано с т. Города (Справочник)
поле Тип услуги связано с т. Виды услуг (Справочник)
а у т. Заявки
поле Город связано с т. Города (Справочник)
поле Тип услуги связано с т. Виды услуг (Справочник)
поле Исполнитель связано с т. Исполнители
и у т. Исполнители
имеется поле Флаг (текст, 0 или 1)
поле Карточка (список) - Свободна, Связана, Неактивна, Заблокирована
при условии этих двух вычислений (одно срабатывает при выборе типа услуги в поле Связана по услуге и запускает второе, которое создаёт Заявку и копирует в неё нужные поля):
if ($line['Связана по услуге']['ID']=="") $line['Состояние'] = "Свободна"; else $line['Состояние'] = "Связана";
if ($line['Состояние'] == "Связана") { $zvka['Заказчик'] = $line['ID']; $zvka['Город'] = $line['Город']['ID']; $zvka['Тип услуги'] = $line['Связана по услуге']['ID']; $zvka['ID'] = insert_query($zvka, "Заявки"); }какое будет общее вычисление, с запросом в базу и фильтрацией по значениям и флагу???
Сообщение отредактировал All_ex74: 06 Июнь 2014 - 12:33
#29
Отправлено 06 Июнь 2014 - 12:34
#30
Отправлено 06 Июнь 2014 - 12:35
CbCoder (06 Июнь 2014 - 12:34) писал:
Я заплачу, не вопрос, но только не отсылайте к менеджерам - это такое БОЛОТО! Вы в тысячу раз быстрее реагируете на вопрос.
Сообщение отредактировал All_ex74: 06 Июнь 2014 - 12:37
#31
Отправлено 06 Июнь 2014 - 12:38
#32
Отправлено 07 Июнь 2014 - 09:53
Напомню, что необходимо было сделать выборку строк из т. Исполнители по условиям (отфильтровать, согласно значениям полей при создании Заявки).
Вот что получилось:
if ($line['Состояние'] == "Связана") { $zkzch = data_table("Заказчики","id=$ID"); $zvka = data_table("Заявки","`status`<>'2' AND `Заказчик`=".$zkzch['ID']); $result = data_select(240, "`status`=0 AND `f3450`=", $line['Заказчики']['Город']['ID'], " AND `f4690`=", $line['Заказчики']['Связана по услуге']['ID'], " AND `f3530`='Свободна' AND `f3460`=", $line['ID'], " ORDER BY `f6130` ASC LIMIT 1"); $row = sql_fetch_assoc($result); // извлекаем возвращенную запросом строку в массив $row $isp = $row['f3460']; // тут присваиваем значение переменной // делаем выборку строк по условию, где 240 - ID таблицы Исполнители, status=0 - активные записи // f3450 - поле Город в т. Исполнители, связь с т. Города (Справочники) равно $line['Заказчики']['Город']['ID'] - ID поля Город т. Заказчики, связь с т. Города (Справочники) // f4690 - поле Сфера услуг в т. Исполнители, связь с т. Виды услуг (Справочники) равно $line['Заказчики']['Связана по услуге']['ID'] - ID поля Связана по услуге т. Заказчики, связь с т. Города (Справочники) // f3530 - поле Карточка в т. Исполнители, поле типа СПИСОК равно требуемому значению - Свободна // f3460 - поле ФИО т. Исполнители, тип поля ТЕКСТ - (собственно, его и нужно отфильтровывать и скопировать в поле Исполнитель т. Заявки) // f6130 - поле Флаг в т. Исполнители, поле типа текст со значениями 1 или 0 if (!$zvka) { $zvka['Город'] = $zkzch['Город']; $zvka['Заказчик'] = $zkzch['ID']; $zvka['Тип услуги'] = $zkzch['Связана по услуге']; $zvka['Исполнитель'] = $isp; $zvka['ID'] = insert_query($zvka, "Заявки"); } }
...в итоге нихрена не получилось), при выполнении данного вычисления Заявка создаётся, а Исполнитель не назначается. Что я не так сделал?
2. Чувствую, что с флагом я накосячил. Не по флагу нужно наверное сортировать, ведь значения 1 может и не быть во всей таблице. Как то нужно еще проверять, есть ли в выборке по данным условиям флаг с 1-й, если нет, то назначить его первому в списке (допустим по ID записи), а можно поставить на убывание и брать первый в выборке: ORDER BY f6130 DESC LIMIT 1, тогда выбран будет самый последний и если как то постоянно перезаписывать - 1 следующему, то всё срастается.
проверьте пожалуйста на ошибки, да буду дальше кумекать)
Сообщение отредактировал All_ex74: 07 Июнь 2014 - 13:29
#33
Отправлено 07 Июнь 2014 - 14:13
1б. Зачем вам в одном вычислении 2 разных вида функций - и data_table и data_select? Выберите один стандарт и работайте с ним. Про строку $zkzch = data_table("Заказчики","id=$ID") я уже говорил что она абсолютно лишняя, это уже 2 года как устаревшая конструкция, используйте $line везде вместо нее.
1в. Вместо data_select можно сразу использовать $row = data_select_array, тогда $row = sql_fetch_assoc($result) не нужен. Это рекомендация, по сокращению кода. Пункт 1б тоже рекомендация, но улучшит читабельность, т.к. все будет одного вида. Пункт 1а обязателен к исправлению, из-за него у вас запрос не работает.
2а. Вам не сортировка нужна, а выборка! Зачем тут сортировка, если нужны только исполнители с выключенным флагом? Так и указываете в условии: флаг = 0. Сортировку выкидываете.
2б. Не увидел у вас в коде запись в использованного исполнителя значения флага, чтобы в следующий раз он уже не вылезал.
#34
Отправлено 07 Июнь 2014 - 15:45
Цитата
1. а если не указать таблицу, то как тогда присвоить нужные значения полям для фильтрации при выборке?
2. И как назначить первую запись из выбранного массива (по значениям состояния полей) и не повторить выбор уже использованной до этого? Может всё таки нужна сортировка?
if ($line['Состояние'] == "Связана") { $row = data_select_array(240, "`status`=0 AND `f3450`=", $line['Город']['ID'], "AND `f4690`=", $line['Связана по услуге']['ID'], "AND `f3530`='Свободна' AND `f3460`=", $line['ID'], "AND `f6130`=0"); $isp = $row['f3460']; // тут присваиваем значение переменной $zvka = data_table("Заявки","`status`<>'2' AND `Заказчик`=".$line['ID']); if (!$zvka) { $zvka['Город'] = $line['Город']['ID']; $zvka['Заказчик'] = $line['ID']; $zvka['Тип услуги'] = $line['Связана по услуге']; $zvka['Исполнитель'] = $isp; // а как тут то быть? как отсортировать с массива нужного исполнителя? $zvka['ID'] = insert_query($zvka, "Заявки"); } }
Сообщение отредактировал All_ex74: 07 Июнь 2014 - 16:31
#35
Отправлено 07 Июнь 2014 - 16:10
1б. Почему у вас в условии поле ФИО исполнителя (f3460) приравнено к $line['ID']? Что вы хотели этим сказать?
1в. Сортировку удалили, но условие по флагу так и не добавили. Должно быть f6130 = 0
1г. $zvka['Город'] = $zkzch['Город'] - переменной $zkzch у вас уже нет, замените ее на $line. Не забудьте только про поля связи - там прибавляем ['ID'].
#36
Отправлено 07 Июнь 2014 - 16:12
#37
Отправлено 07 Июнь 2014 - 16:14
#38
Отправлено 07 Июнь 2014 - 16:19
Цитата
Сортировка здесь не играет никакой роли, в любом случае берется первая запись из тех что с флагом равным 0. Затем у вас должен быть запрос на обновление этой записи, с изменением значения флага на 1, и в следующий раз эта запись уже не попадет в первый запрос. Я вам об этом уже писал в предыдущем посте и в общем описании алгоритма.
#39
Отправлено 07 Июнь 2014 - 16:38
Цитата
Цитата
а как правильно будет?
Цитата
Так нам же нужно еще и имеющийся уже флаг=1 (значит нужно его как то найти до этого) перезаписать на флаг=0, а так постепенно всем флаг=1 будет присвоен и выбирать некого будет)
Сообщение отредактировал All_ex74: 07 Июнь 2014 - 16:48
#40
Отправлено 07 Июнь 2014 - 16:49
if ($line['Состояние'] == "Связана") { $row = data_select_array(240, "`status`=0 AND `f3450`=", $line['Город']['ID'], "AND `f4690`=", $line['Связана по услуге']['ID'], "AND `f3530`='Свободна' AND `f3460`=", $line['ID'], "AND `f6130`=0"); $isp = $row['f3460']; // тут присваиваем значение переменной $zvka = data_table("Заявки","`status`<>'2' AND `Заказчик`=".$line['ID']); // запрет на вторичное размещение - заявка будет размещаться, как вручную оператором, так и внешним запросом... if (!$zvka) { $zvka['Город'] = $line['Город']['ID']; $zvka['Заказчик'] = $line['ID']; $zvka['Тип услуги'] = $line['Связана по услуге']; $zvka['Исполнитель'] = $isp; // а как тут то быть? как отсортировать с массива нужного исполнителя? $zvka['ID'] = insert_query($zvka, "Заявки"); } }
Сообщение отредактировал All_ex74: 07 Июнь 2014 - 16:52
Количество пользователей, читающих эту тему: 8
0 пользователей, 8 гостей, 0 анонимных