Вверх ↑
Этот топик читают: Гость
Ответов: 93
Рейтинг: 2
#1381: 2015-04-03 12:45:04 ЛС | профиль | цитата
Добрый день. Создаю БД заказов с возможностью просмотра истории действий по каждому заказу. Ничего умнее, чем создавать, под каждый отдельный заказ, новую таблицу в голову не пришло. Название создаваемой таблицы задается таким образом "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".
карма: 0

0
Ответов: 3967
Рейтинг: 625
#1382: 2015-04-03 13:15:46 ЛС | профиль | цитата
Не нужно никаких таблиц на каждый заказ.
Есть таблица "Заказ"
ID|Name|

Есть таблица "История":
|ID|OrderID|Date|Action|

При добавлении в историю в OrderID проставляется номер заказа, к которому это относится. Как затем выбрать требуемую информацию - изучай SQL.

Но если оплата заказа - это "история", тогда такая структура не очень хорошая.
По хорошему должны быть таблицы "Заказы", "Оплата заказов" и др. Связь между ними - по полю OrderID.

Зачем "Создание заказа" заносить в "Историю", если можно добавить колонку "Дата заказа" в т. заказов?
Не вижу в т. заказов стоимости заказа и что было заказано. Можно добавить ещё таблицу "Позиции заказа", где перечисляется чего, сколько и по какой цене было заказано. Тогда также можно сделать таблицу "Товары", где будут названия, цены, сколько есть на складе. Тогда в позициях заказа будет только ссылка на нужный товар.
карма: 19

1
Голосовали:lipKAI
Ответов: 93
Рейтинг: 2
#1383: 2015-04-03 14:01:15 ЛС | профиль | цитата
Netspirit, иметь таблицу, где пишется вся история по всем заказам с ссылкой на заказ и делать последующую выборку - это шикарное решение. Сам бы не скоро к такому пришел, огромное спасибо.
По большому счету, на сегодняшний день, основная цель программы - внесение комментариев к заказу, где фиксируется ответственный за внесение. В планах: планирование доставки товара клиентам и создание заявки на склады на основании номенклатурного наполнения заказа.

[flood]По поводу остального: вообще работаем в 1С, где ведется учет всего и вся по всем регионам, но не хватает некоторых функций: планирование доставки товара, создание заявки на центральные склады и т.д.. Остальные возможности, по типу "Добавить событие" там реализованы, но не совсем удобны - много лишнего и это отвлекает.[/flood]
карма: 0

0
Ответов: 16504
Рейтинг: 1212
#1384: 2015-04-03 14:18:18 ЛС | профиль | цитата
lipKAI писал(а):
Создаю БД заказов
Каких заказов ?
а) такси
б) на выполнение работ
в) на доставку пиццы
г) на доставку товара
Во всех этих случаях без таблицы "Заказчик" с полями
id
fio
adress
tel
тебе никак.

Для нормального совета - информации недостаточно.
ИМХО.
карма: 23
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 93
Рейтинг: 2
#1385: 2015-04-03 14:41:27 ЛС | профиль | цитата
Tad, по большому счету, вопрос заключался в том, как узнать название таблицы, зная только ID заказа, но Netspirit, уже дал мне понять, что мой подход в корне не верен и предложенная структура мне вроде подходит.

Каких заказов ?

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

Так как за клиентом не закрепляется определенный менеджер и иногда приходится работать со старым заказом, который вел другой человек - нужно увидеть, что делал предыдущий менеджер. Для этого создается эта программа, которая, по сути, является дневником заказа.
В задачи менеджера входит все: согласование товара с клиентом, доставка товара из региональных складов, если требуется - вывоз товара с завода... в общем много действий. И если не знать, что уже было сделано, то можно легко запутаться. Сейчас это реализовано через Exel, но каждый новый комментарий заменяет старый, поэтому известно только последнее замечание по заказу. Так же существует проблема невозможности сортировки по конкретному клиенту, ответственному за заказ или действие над ним, актуальности заказа (актуальные заказы выводятся в конце списка).
В общем, думаю суть ясна. Вторая 1С не нужна, нужен дневник для каждого заказа.
Единственное, что меня смущает, так это скорость выполнения запроса к таблице с историей, когда таблица будет иметь 10 000 записей.

карма: 0

0
Ответов: 648
Рейтинг: 18
#1386: 2015-04-03 16:02:33 ЛС | профиль | цитата
lipKAI, используй триггеры! BEFORE INSERT UPDATE и сможешь отслеживать изменения. Триггеры отличный механизм в SQLite.
карма: 0

0
Ответов: 648
Рейтинг: 18
#1387: 2015-05-25 01:32:39 ЛС | профиль | цитата
Помогите пожалуйста с запросом.

есть таблица 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

0
Ответов: 16504
Рейтинг: 1212
#1388: 2015-05-25 06:20:15 ЛС | профиль | цитата
Если я правильно понял, то копай в сторону group_concat()
карма: 23
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 648
Рейтинг: 18
#1389: 2015-05-25 12:56:02 ЛС | профиль | цитата
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

0
Ответов: 16504
Рейтинг: 1212
#1390: 2015-05-25 19:35:42 ЛС | профиль | цитата
.....
карма: 23
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 648
Рейтинг: 18
#1391: 2015-05-25 23:23:32 ЛС | профиль | цитата
Собственно 2 insert'a в разные таблицы в одном запросе сделать нельзя.
карма: 0

0
Ответов: 648
Рейтинг: 18
#1392: 2015-05-30 01:32:40 ЛС | профиль | цитата
Объясните пожалуйста логику 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

0
Ответов: 8
Рейтинг: 0
#1393: 2015-06-13 18:52:39 ЛС | профиль | цитата
Ребята подскажите пожалуйста. Столкнулся с ошибкой library routine called out of sequence. Насколько я понял это какой то конфликт при обращении к базе данных одновременно с двух или более потоков. Но SQL она же как бы и Была создана что бы обрабатывать много потоков. что делать не знаю. (Файлы базы данных расположены в сетевых папках может в этом проблема?).
------------ Дoбавленo в 18.52:
Ребята подскажите пожалуйста. Столкнулся с ошибкой library routine called out of sequence. Насколько я понял это какой то конфликт при обращении к базе данных одновременно с двух или более потоков. Но SQL она же как бы и Была создана что бы обрабатывать много потоков. что делать не знаю. (Файлы базы данных расположены в сетевых папках может в этом проблема?).
карма: 0

0
Ответов: 16504
Рейтинг: 1212
#1394: 2015-06-13 20:24:41 ЛС | профиль | цитата
Блин, умеем мы задавать вопросы.
web-beer писал(а):
Столкнулся с ошибкой library routine called out of sequence.
Когда столкнулся, где столкнулся, какой компилятор применяешь?
web-beer писал(а):
Но SQL она же как бы и Была создана что бы обрабатывать много потоков.
SQL (Structured Query Language — Структурированный язык запросов) — язык управления базами данных для реляционных баз данных.
Так о чем говорим ? О языке или о SQLite ?
web-beer писал(а):
Файлы базы данных расположены в сетевых папках может в этом проблема?.
И в скольких же сетевых папках и сколько этих файлов?
Если я отвечу, что ошибка связана с указателем на БД, тебе это поможет ?
карма: 23
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 210
Рейтинг: 52
#1395: 2015-06-14 01:55:26 ЛС | профиль | цитата
web-beer писал(а):
конфликт при обращении к базе данных одновременно с двух или более потоков.

локально именно так http://www.sqlite.org/cvstrac/wiki?p=LibraryRoutineCalledOutOfSequence п.2.
пробуйте вариант: новый поток - новое соединение с базой
карма: 1
слтв
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)