|
|
|
| Здравствуйте! Помогите решить задачку, вот решила для своего удобства написать программу "заявки от клиентов".
Таблица zayavki: id, id_pokupatelya, data, diametr, stenka, sostoyanie, met, ton, cena, sroki
Но у клиента может в одной завке быть несколько позиций! И вот непойму как это можно реализовать. | |
|
|
|
|
|
|
|
для: margarita
(23.04.2010 в 12:36)
| | А что такое позиции в заявке? | |
|
|
|
|
|
|
|
для: margarita
(23.04.2010 в 12:36)
| | таблица заявок
id, id_pokupatelya, data, sroki, cena,
Таблица позиций
id, id_zayavki, diametr, stenka, sostoyanie, met, ton
Одной строке первой таблицы соответствуют в общем случае несколько строк второй.
Поскольку неясно, какие свойства относятся к позициям, а какие к заявке в целом, полями придется пожонглировать.
К примеру, если цена присуща каждой позиции, поле придется перенести во вторую таблицу.
Если состояние - это состояние объекта заявки, а не позиции, то поле придется перенести в первую таблицу. И т.д.
PS. Не делайте пола дата. Ставьте сразу Дата_время.
Очень много головной боли потом из-за этой никому ненужной экономии на спичках. | |
|
|
|
|
|
|
|
для: Trianon
(23.04.2010 в 12:50)
| | спасибо! все ясно.
можете еще подсказать как реализовать (у нас трое менеджеров каждый будет заходит под свои логином и паролем) чтобы на странице при входе выводились только те заявки с которыми работает данный менеджер, а остальные заявки он их мог видет, но редактировать не имеет право... | |
|
|
|
|
|
|
|
для: margarita
(24.04.2010 в 09:14)
| | Не понятно, что означает принадлежность.
Если с теми, которыми работает в настоящий момент времени, то таковая зависимость может быть только N-ый промежуток времени, и для остальных менеджеров можно указать "занятость" этих заявок.
Если же принадлежность, это поступление тех или иных заявок только определенному менеджеру, то записи заявок должны содержать поле указывающее принадлежность их определенному менеджеру, по их id. В этом случае запретить изменение "не родных" заявок труда не составит - если id заявки равна id менеджера, то выводим форму для редактирования, иначе просто текстовое содержимое заявки. | |
|
|
|
|
|
|
|
для: sim5
(24.04.2010 в 09:34)
| | для: margarita
если id заявки равна id менеджера
Хм.
Sim5 хотел сказать, если
заявка.manager_id = user.id
где manager_id - это самое дополнительное поле | |
|
|
|
|
|
|
|
для: Trianon
(24.04.2010 в 09:38)
| | Ну да, собственно хотел сказать, что "дите папино", но... )) | |
|
|
|
|
|
|
|
для: sim5
(24.04.2010 в 09:39)
| | спасибо!
еще вопросик, как реализовать: когда пользователь вбивает несколько строк в таблицу "позиций", была возможность тут же добавить еще одну строку без перезагрузки страницы, это реализуеться на аяксе, если не ошибаюсь... или есть другие варианты? | |
|
|
|
|
|
|
|
для: margarita
(24.04.2010 в 20:50)
| | а стандартный синхронный вариант Вы уже реализовали, и Вам уже успело не понравиться с ним работать? | |
|
|
|
|
 6.3 Кб |
|
|
для: Trianon
(25.04.2010 в 00:49)
| | что смогла, знания то у меня не большие. проверьте... пароль на email отправила... | |
|
|
|
|
|
|
|
для: margarita
(24.04.2010 в 20:50)
| | >когда пользователь вбивает несколько строк в таблицу "позиций", была возможность тут же добавить еще одну строку
Это как? Можно пояснить эту хиромантию? ) | |
|
|
|
|
|
|
|
для: sim5
(26.04.2010 в 12:34)
| | ну во общем наша фирма торгует трубами (стальными), и в заявке бывает несколько труб разных диаметров ("позиций") (=
а я смогла только реализовать возможность добавление одновременно только одной "позиции" в заявку... | |
|
|
|
|
|
|
|
для: margarita
(26.04.2010 в 19:06)
| | Есть списки (элемент select) с мультивыбором, есть чекбоксы... Если позиция отличается только диаметром, то что мешает использовать любой удобный из этих элементов для указания позиций? | |
|
|
|
|
|
|
|
для: sim5
(26.04.2010 в 20:06)
| | спасибо!
еще вопрос: есть форма добавление заявки, далее - передаем данные файлу к-й будет их заносить в базу, и тут как лучше получить id этой заявки, чтобы использовать его в дальнейшем для передачи другому файлу? | |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 17:26)
| | Ну об этом можно в матчасти узнать:
mysql_insert_id() - возвращает id, сгенерированный предыдущей операцией INSERT.
Мануал РНР - это настольной книгой вашей должно быть ;-) | |
|
|
|
|
|
|
|
для: sim5
(29.04.2010 в 17:40)
| | спасибо! | |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 18:10)
| | 1.php
<form name="form1" method="post" action="2.php">
<?php
$result = mysql_query("SELECT * FROM `buyers` ORDER BY `shortNameOrganization` ASC");
$myrow = mysql_fetch_array($result);
echo "<p><b>Заказчик:</b></p>";
echo "<select name=\"id_buyer\" size=\"5\" multiple align=\"center\">";
do {
printf ("<option value=\"%s\">%s</option>",$myrow["id"],$myrow["shortNameOrganization"]);
} while ($myrow = mysql_fetch_array ($result));
echo "</select>";
?>
<p>Количество позиций: <input type="text" name="kolvo"></p>
<p><input type="submit" name="submit" value="Продолжить"></p>
|
2.php
<?php
$result = mysql_query ("INSERT INTO `demand` (`id_buyer`) VALUES ('$id_buyer'");
$iii = mysql_insert_id();
$iii2 = $_POST['kolvo'];
if ($result == 'true') {echo "<p>Запись успешно добалена!</p>";}else{echo "<p>Запись не добалена!</p>";}
echo "<form name=\"form1\" method=\"post\" action=\"3.php\">";
echo "<table align=center border=1>";
for ($i=1; $i<=$_POST['kolvo']; $i++)
{
echo "<input name=id_demand type=hidden value=\"$iii\">";
echo "<input name=kolvo type=hidden value=\"$iii2\">";
echo "<tr><td>№ $i</p></td>";
echo "<td>Диаметр: <input value=\"\" type=\"text\" name=\"diameter_$i\"></p></td>";
echo "<td>Стенка: <input value=\"\" type=\"text\" name=\"wall_$i\"></p></td>";
echo "<td>Состояние: <input value=\"\" type=\"text\" name=\"condition_$i\"></p></td>";
echo "<td>Метраж: <input value=\"\" type=\"text\" name=\"metric_$i\"></p></td>";
echo "<td>Тоннаж: <input value=\"\" type=\"text\" name=\"tonnage_$i\"></p></td>";
echo "<td>Цена: <input value=\"\" type=\"text\" name=\"price_demand_$i\"></p></td>";
echo "<td>Статус: <input value=\"\" type=\"text\" name=\"status_$i\"></p></td></tr>";
}
echo "<tr><td colspan=8 align=\"center\"><p><input type=\"submit\" name=\"submit\" id=\"submit\" value=\"Добавить\"></p></td></tr>";
echo "</table></form>";
?>
|
| |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 20:06)
| | не могу сообразить как добавить их в базу =( | |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 20:06)
| | И что это означает?
Кстати multiple означает, что список позволяет выбрать в нем несколько значений, а несколько значений, это массив, и имя такого списка должно отражать это, то есть - id_buyer[]. А если пользователь выберет несколько значений (диаметров), то каким образом они вот этой операцией:
$result = mysql_query ("INSERT INTO `demand` (`id_buyer`) VALUES ('$id_buyer'");
попадут в базу? Причем записанную с ошибкой. | |
|
|
|
|
|
|
|
для: sim5
(29.04.2010 в 20:14)
| | без multiple надо) ошиблась) можно выбрать только одного заказчика. | |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 20:21)
| | ну а дальше пользователь ввел кол-во позиций и передал их файлу 2.php, допустим 4:
http://savepic.ru/1098472.png
и вот тут я не пойму как мне их добавить все в базу. | |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 20:26)
| | Прежде чем добавлять, надо знать как организована структура таблицы, которая содержит эти позиции (диаметры). А содержать можно как совокупность записей связанных по id с "трубой-родителем", как строка с разделителем, как битовая маска...
А вот просто так записать массив в одно поле таблицы нельзя. | |
|
|
|
|
|
|
|
для: sim5
(29.04.2010 в 20:36)
| |
--
-- Структура таблицы `positionsDemand`
--
CREATE TABLE `positionsDemand` (
`id` int(11) NOT NULL auto_increment,
`id_demand` text NOT NULL,
`diameter` text NOT NULL,
`wall` text NOT NULL,
`condition` text NOT NULL,
`metric` text NOT NULL,
`tonnage` text NOT NULL,
`price_demand` text NOT NULL,
`status` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=28 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=28 ;
|
| |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 20:50)
| | Думайте. В поле diameter` в вашем случае можно записать, например: 15|25|35|50. Но в случае поиска... А можно и по иному. | |
|
|
|
|
|
|
|
для: sim5
(29.04.2010 в 20:54)
| | del | |
|
|
|
|
|
|
|
для: sim5
(29.04.2010 в 20:36)
| | А вот просто так записать массив в одно поле таблицы нельзя.
нужно записать не в одно поле, а столько сколько указал пользователь в 1 форме. | |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 20:51)
| | Так вы не сможете записать в данную таблицу (вернее можно, но с дубликатами лишних данных), нужна будет отдельная таблица тогда, связанная с этой. | |
|
|
|
|
|
|
|
для: sim5
(29.04.2010 в 21:00)
| |
--
-- Структура таблицы `demand`
--
CREATE TABLE `demand` (
`id` int(11) NOT NULL auto_increment,
`id_buyer` text NOT NULL,
`id_manager` text NOT NULL,
`date_time` text NOT NULL,
`delivery` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=47 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=47 ;
|
| |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 21:07)
| |
<?php
for ($i=1; $i<=$_POST['kolvo']; $i++)
{
$id_demand = $_POST['id_demand'];
$diameter = $_POST["diameter_$i"];
$result = mysql_query ("INSERT INTO `positionsDemand` (`id_demand`, `diameter`) VALUES ('$id_demand', '$diameter')");
if ($result == 'true') {echo "<p>Запись успешно добалена!</p>";}else{echo "<p>Запись не добалена!</p>";}
}
?>
|
а если такой вариант добавления использовать? | |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 21:23)
| | Не пойдет такой вариант добавления. Да и вообще, вся логика (последовательность) заказа ни к черту. Судя по ранее представленным примерам 1.php и 2.php, у вас яйцо бежит впереди курицы.
Но это еще не все. Если таким образом формировать заказ (последовательно), то при вашем сценарии велика вероятность того, что в конечном итоге в базе могут появляться "полузаказы" - что-то добавлено от некой формы, на некотором этапе, а потом заказчик толи раздумал, толи еще чего, и закрыл браузер, и в итоге заказ оказался неполноценным. И без лишних хлопот вам уже не обойтись - нужно будет удалять такой мусор из базы.
Другими словами, если заказ формируется последовательно, то данные, полученные от форм заказа на каждом этапе, требуют временного промежуточного хранения, и только при получении всех требуемых для заказа данных производится их запись в базу.
Но совсем не обязательно разбивать заказ на этапы, тем более, если номенклатура изделий не велика. Все вполне можно сделать одной формой. Но в любом случае, формы (выбор данных в форме) должны следовать по старшинству, от первичного ко вторичному, а не наоборот, как у вас.
Если номенклатура изделий велика, то конечно лучше задействовать Ajax технологию, если же не очень, то можно обойтись и просто JS-сценарием, отдавая пользователю наборы данных, по которым на стороне клиента можно реализовать связанные списки.
Допустим, что в базе есть предложения - трубы различные по типу: пластик, стеклопластик, сталь, чугун. Каждые из этих типов могут быть различных диаметров, длиной, и иметь другие характерные параметры. Все эти параметры должны быть связаны по id своих труб-родителей, или же, таблица описывающая трубы, должна иметь поле, в котором указано наличие, например, определенных диаметров, у данного типа труб.
А в единой форме заказа, пользователь может выбирать из списков все имеющиеся характеристики товара, и эти списки обязательно должны быть связаны по id. К примеру, если трубы стальные записаны в базе под id=16, то список описыващий возможные их диаметры, должен отражать этот id, то есть: <select name="id_buyer[16]" multiple>. При этом, если диаметры, это отдельная таблица, то значением опшенов этого списка должны быть не диаметры труб, а id под которыми записаны эти диаметры в таблице.
В этой же форме должен находится и элемент <input type="text[16]" name="kolvo">, и все другие поля необходимые для заказа.
Таким образом вы получите одну форму, одну форму будете обрабатывать. А ведь возможны и ошибки ввода пользователем (кстати, проверка которых у вас не наблюдается), а это значит нужно будет возвращать форму пользователю (если не задействовать Ajax) при их наличии. В случае, если ввод параметров заказа произведен успешно, то данные этой формы записываются в базу. При этом, для параметров заказа описывающих множественный выбор, нужно сформировать строку запроса для многострочного оператора INSERT, и одним запросом к базе произвести запись, а о таком способе:
for ($i=1; $i<=$_POST['kolvo']; $i++) {
$id_demand = $_POST['id_demand'];
....
mysql_query ("INSERT INTO `positionsDemand`....
лучше забыть.
Я не специалист по трубам, не знаю досканально все их параметры, как они связаны между собой, могут ли некие из этих параметров принадлежать множеству типов труб, да и существует ли у вас это множество... Посему, чего-то конкретно верного советовать трудно. Но могу сказать уверенно - взаимосвязь всех параметров, типов, удачно описанная структурой таблиц связанных, вот она и определит и облик формы заказа, и способ выбора параметров, и способ записи их как оформленный заказ. С этого надо начинать, а у вас все как-то разрозненно получается, вы просто "приклеиваете" очередной совет вам к своей задаче. | |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 21:07)
| | Первая таблица содержит собственно заявки (я так понимаю). Эта таблица - это кому они принадлежат (менеджерам), так?
А вот таблица диаметров, и прочих возможных разновидностей труб, которые может выбрать заказчик, это должна быть отдельная таблица. Только так можно записать каждую выбранную позицию как отдельную запись.
Если разница только в диаметре, то либо вы записываете как строкой в одном ее поле выбранные позиции (как, я приводил выше), либо можно связать все диаметры с некой битовой маской, в которой лог. 1 будет означать выбранную позицию (диаметр), которую также можно хранить в отдельном поле. | |
|
|
|
|
|
|
|
для: sim5
(29.04.2010 в 21:24)
| | Первая таблица содержит собственно заявки (я так понимаю). Эта таблица - это кому они принадлежат (менеджерам), так?
да вы все правильно поняли)
А вот таблица диаметров, и прочих возможных разновидностей труб, которые может выбрать заказчик, это должна быть отдельная таблица. Только так можно записать каждую выбранную позицию как отдельную запись.
ну так у меня и есть две таблицы, как советовал Trianon еще выше...
Если разница только в диаметре
там разница не только в диаметре, но там еще стенка, цена, длина...
спасибо, что помогли;) | |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 21:38)
| | две таблицы, о которых я говорил, лишь позволяют управлять заказами с несколькими позициями.
В Вашем случае этого явно мало. То, что позиции имеют структуру четкую характеристик, эти две таблицы не передают.
Я вижу сейчас структуру примерно так. Таблица( поле, поле,.... поле)
клиент(ид, дата_время_создания, имя, адрес, банк, р_счет, т.п.)
менеджер(ид, дата_время_создания, имя, ид_поз_штатного_расписания)
заказ(ид, ид_клиента, ид_отв_менеджера, дата_время_создания, дата_время_модификации, дата_время_исполнения)
материал(ид, название)
условия(ид, название)
товар(ид, ид_материала, ид_условий,длина,тоннаж,базовая_цена)
позиция(ид,ид_заказа,порядковый_номер,ид_товара,цена,кол_во_заказанное,кол_во_отгруженное, дата_время_включения в заказ, дата_время_изготовления)
счет(ид_клиента, ид_заказа, дата_время, сумма, назначение)
оплата(ид_клиента, ид_счета, дата_время, сумма) | |
|
|
|
|
|
|
|
для: sim5
(29.04.2010 в 21:24)
| | может еще подскажиет?)
как сделать, чтобы была правильная сортировка?
<?php
$result = mysql_query ("SELECT * FROM price ORDER BY `diameter`,`wall` ASC");
?>
|
выводит: http://savepic.ru/1100512.png
а надо: 60, 320, 530, 666, 1220 | |
|
|
|
|
|
|
|
для: margarita
(29.04.2010 в 21:43)
| | Это потому, что `diameter` - совсем таки не text, а вовсе даже int | |
|
|
|
|