Добрый день. Создаю БД заказов с возможностью просмотра истории действий по каждому заказу. Ничего умнее, чем создавать, под каждый отдельный заказ, новую таблицу в голову не пришло. Название создаваемой таблицы задается таким образом "History+ID из таблицы списка заказов" (Например: название таблицы заказа №1 будет "History1").
Требуется, что-бы в общей таблице заказов, выводилось последнее совершенное действие в отдельной колонке.
Пример таблиц:
Таблица заказов (Order)
|ID|Name|LastEction|
|1|Вася|Внес оплату|
История заказа (History)
|ID|Date |Ection |
|1 |01.01.2015|Создан заказ|
|2 |03.01.2015|Внес оплату |
Реализую это таким образом:
SELECT
Order.ID AS №_30,
Contactor.Name AS Контрагент_150,
History%.Ection AS Последнее действие_300
FROM
Order
INNER JOIN
Contactor, History
AND Order.Name = Contactor.ID
AND Order.LastEction = History%.ID
Пример работать не будет из-за названий. Суть в чем: нам не известно название таблиц "History%". Я подозреваю, что его можно получить каким-то образом объединив "History + Order.ID".
Этот топик читают: Гость
Ответов: 94
Рейтинг: 2
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Не нужно никаких таблиц на каждый заказ.
Есть таблица "Заказ" ID|Name| Есть таблица "История": |ID|OrderID|Date|Action| При добавлении в историю в OrderID проставляется номер заказа, к которому это относится. Как затем выбрать требуемую информацию - изучай SQL. Но если оплата заказа - это "история", тогда такая структура не очень хорошая. По хорошему должны быть таблицы "Заказы", "Оплата заказов" и др. Связь между ними - по полю OrderID. Зачем "Создание заказа" заносить в "Историю", если можно добавить колонку "Дата заказа" в т. заказов? Не вижу в т. заказов стоимости заказа и что было заказано. Можно добавить ещё таблицу "Позиции заказа", где перечисляется чего, сколько и по какой цене было заказано. Тогда также можно сделать таблицу "Товары", где будут названия, цены, сколько есть на складе. Тогда в позициях заказа будет только ссылка на нужный товар. |
|||
карма: 26 |
| ||
Голосовали: | lipKAI |
Ответов: 94
Рейтинг: 2
|
|||
Netspirit, иметь таблицу, где пишется вся история по всем заказам с ссылкой на заказ и делать последующую выборку - это шикарное решение. Сам бы не скоро к такому пришел, огромное спасибо.
По большому счету, на сегодняшний день, основная цель программы - внесение комментариев к заказу, где фиксируется ответственный за внесение. В планах: планирование доставки товара клиентам и создание заявки на склады на основании номенклатурного наполнения заказа. [flood]По поводу остального: вообще работаем в 1С, где ведется учет всего и вся по всем регионам, но не хватает некоторых функций: планирование доставки товара, создание заявки на центральные склады и т.д.. Остальные возможности, по типу "Добавить событие" там реализованы, но не совсем удобны - много лишнего и это отвлекает.[/flood] |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
lipKAI писал(а): Создаю БД заказов а) такси б) на выполнение работ в) на доставку пиццы г) на доставку товара Во всех этих случаях без таблицы "Заказчик" с полями id fio adress tel тебе никак. Для нормального совета - информации недостаточно. ИМХО. |
|||
карма: 25 |
|
Ответов: 94
Рейтинг: 2
|
|||
Tad, по большому счету, вопрос заключался в том, как узнать название таблицы, зная только ID заказа, но Netspirit, уже дал мне понять, что мой подход в корне не верен и предложенная структура мне вроде подходит.
Каких заказов ? Продажа товаров под заказ. Клиент пришел, выбрал, заказал и через неделю получил. Так как за клиентом не закрепляется определенный менеджер и иногда приходится работать со старым заказом, который вел другой человек - нужно увидеть, что делал предыдущий менеджер. Для этого создается эта программа, которая, по сути, является дневником заказа. В задачи менеджера входит все: согласование товара с клиентом, доставка товара из региональных складов, если требуется - вывоз товара с завода... в общем много действий. И если не знать, что уже было сделано, то можно легко запутаться. Сейчас это реализовано через Exel, но каждый новый комментарий заменяет старый, поэтому известно только последнее замечание по заказу. Так же существует проблема невозможности сортировки по конкретному клиенту, ответственному за заказ или действие над ним, актуальности заказа (актуальные заказы выводятся в конце списка). В общем, думаю суть ясна. Вторая 1С не нужна, нужен дневник для каждого заказа. Единственное, что меня смущает, так это скорость выполнения запроса к таблице с историей, когда таблица будет иметь 10 000 записей. |
|||
карма: 0 |
|
Ответов: 655
Рейтинг: 18
|
|||
lipKAI, используй триггеры! BEFORE INSERT UPDATE и сможешь отслеживать изменения. Триггеры отличный механизм в SQLite.
|
|||
карма: 0 |
|
Ответов: 655
Рейтинг: 18
|
|||
Помогите пожалуйста с запросом.
есть таблица users: id, name, phone 1;Ivan;123 есть таблица work uid,data - uid связан с users.id 1;data1 1;data2 известно что в таблице work в столбце data есть значение data1, как по этому значению получить следующий результат 1&ivan&123;data1;data2 пробую так select id||'&'||name||'&'||phone from users where id=(select uid from work where data='data1') union all select data from work where uid=(select uid from work where data='data1'); получаю данные но в 3 строки, т.е. 1&ivan&123 data1 data2 а как в 1 строку собрать чтобы получилось 1&ivan&123;data1;data2 ? |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Если я правильно понял, то копай в сторону group_concat()
|
|||
карма: 25 |
|
Ответов: 655
Рейтинг: 18
|
|||
Tad, спасибо за подсказку!
решение может кому пригодится select id||'&'||name||'&'||phone,(select group_concat(data) from work where uid=(select uid from work where data='data1') from users where id=(select uid from work where data='data1'); ------------ Дoбавленo в 12.56: И еще вопрос как реализовать следующее: select case when phone=123 then (insert в 2 таблицы) else '0' end from users; если в 1 запросе нельзя сделать вставку в 2 таблицы, можно ли сделать что-то типа: select case when phone=123 then (BEGIN TRANSACTION...запрос транзакции) else '0' end from users; в общем какие варианты есть? |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
.....
|
|||
карма: 25 |
|
Ответов: 655
Рейтинг: 18
|
|||
Собственно 2 insert'a в разные таблицы в одном запросе сделать нельзя.
|
|||
карма: 0 |
|
Ответов: 655
Рейтинг: 18
|
|||
Объясните пожалуйста логику where exists.
Есть таблица data в нее должен записываться лог, лог должен записываться только если есть определенная запись в таблице data2. таблица data2 id -integer имеющиеся записи: 1 2 3 insert into data(column) select 'test' from data2 where exists(select 1 from data2 where id=1); в результате такого запроса в таблице data создается 3 записи 'test'. Почему так? Ведь в условии сказано where exists(select 1 from data2 where id=1) Запрос вида: insert into data(column) select 'test' from data2 where id=1 and exists(select 1 from data2 where id=1); работает правильно и в таблице data создается одна запись 'test'. (триггеры не предлагать потому что данные после формируются по маске) ------------ Дoбавленo в 01.32: Простите за тупой вопрос разобрался))) |
|||
карма: 0 |
|
Ответов: 9
Рейтинг: 0
|
|||
Ребята подскажите пожалуйста. Столкнулся с ошибкой library routine called out of sequence. Насколько я понял это какой то конфликт при обращении к базе данных одновременно с двух или более потоков. Но SQL она же как бы и Была создана что бы обрабатывать много потоков. что делать не знаю. (Файлы базы данных расположены в сетевых папках может в этом проблема?).
------------ Дoбавленo в 18.52: Ребята подскажите пожалуйста. Столкнулся с ошибкой library routine called out of sequence. Насколько я понял это какой то конфликт при обращении к базе данных одновременно с двух или более потоков. Но SQL она же как бы и Была создана что бы обрабатывать много потоков. что делать не знаю. (Файлы базы данных расположены в сетевых папках может в этом проблема?). |
|||
карма: 0 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Блин, умеем мы задавать вопросы.
web-beer писал(а): Столкнулся с ошибкой library routine called out of sequence. web-beer писал(а): Но SQL она же как бы и Была создана что бы обрабатывать много потоков. Так о чем говорим ? О языке или о SQLite ? web-beer писал(а): Файлы базы данных расположены в сетевых папках может в этом проблема?.Если я отвечу, что ошибка связана с указателем на БД, тебе это поможет ? |
|||
карма: 25 |
|
Ответов: 211
Рейтинг: 52
|
|||
web-beer писал(а): конфликт при обращении к базе данных одновременно с двух или более потоков.локально именно так http://www.sqlite.org/cvstrac/wiki?p=LibraryRoutineCalledOutOfSequence п.2. пробуйте вариант: новый поток - новое соединение с базой |
|||
карма: 1 |
|