Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.07.2017, 19:50
СтранныйЯщер СтранныйЯщер вне форума
Прохожий
 
Регистрация: 13.07.2017
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Программа для продажи товара (Delphi 7)

Привет всем! Хочу создать программу через которую можно будет продавать товары. Уже создал базу данных в Access подключил ее в DBGrid через ADO теперь могу создавать, редактировать товар и сохранять в эту базу. Сейчас встал вопрос реализации самого момента продажи этого товара, не могу сообразить как это сделать. Вопрос такой, мне надо создать в этой БД еще одну таблицу (промежуточную), чтобы при выборе товара он заносился туда и когда чек будет закрыт все эти товары (точнее их количество) списывалось из первой таблицы? Верно я мыслю? Подскажите пожалуйста я новичок в программировании. Заранее благодарен!
Ответить с цитированием
  #2  
Старый 14.07.2017, 00:26
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 6,952
Репутация: 49086
По умолчанию

Нет, не верно.
Вообще, если поискать по форуму, то я уже давал расклад по архитектуре подобных систем. Повторю в кратце.
Подобные системы бывают 2х типов:
Первый тип - основанные на количественном учете, т.е. то, что ты пытаешься сделать. Проблемой этого типа систем является то, что все операции производятся раздельно (можно пытаться объединить в единую транзакцию, но там свои подводные камни). Т.е. у тебя фактически одно и то же число хранится в нескольких местах и требует синхронного обновления.
Второй тип - системы основанные на документах. В системах такого типа данные (ну, кроме разных справочников) хранятся в виде приходных-расходных документов. В твоем случае:
- У тебя уже есть таблица товаров. Это, фактически, твой справочник товаров.
- Теперь тебе надо сделать таблицу документов. Там будет 2 типа документов. Приходные, например, приход товара на склад от поставщика. И расходные, например, отпуск клиенту - чек. Текущее наличие товара считается как (сумма прихода) - (сумма расхода). Кстати, там есть возможность делать быстрое резервирование - созданием документа резервирования и удаления таких документов при окончании редактирования основного расходного документа.

PS. У тебя курсач или что-то серьезное?

Последний раз редактировалось lmikle, 14.07.2017 в 03:56.
Ответить с цитированием
  #3  
Старый 14.07.2017, 07:04
СтранныйЯщер СтранныйЯщер вне форума
Прохожий
 
Регистрация: 13.07.2017
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо за ответ! Нет не курсач просто увлекся программированием и стало интересно разобраться как это работает. То есть я создаю еще таблицу с такими же столбцами как в первой? и делать в эту таблицу как бы занесение товара и убирания его от туда? то есть будет работать так: когда я выбираю товар из таблицы1 (которая уже создана и там есть товар) он переносится в таблицу2 когда я товар продаю в таблицу2 заносится еще строка этого товара но с меньшим количеством и потом это передается в таблицу1? так это работает? или я все таки не чего не понял(
Ответить с цитированием
  #4  
Старый 14.07.2017, 21:14
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 6,952
Репутация: 49086
По умолчанию

нет, не понял.
фактически, у тебя есть таблица-справочник по товарам:
- Артикул (уникальный ключ)
- Наименовани
- Цена для продажи
- др. параметры
Кол-ва нет. Кстати, тут есть нюанс, если хочется менять цену и хранить историю этого, но это отдельный вопрос.

Теперь тебе нужна таблица документов. На самом деле там 2 таблицы - заголовок документа и позиции документа. Но для простоты объяснения будем считать, что по одному документу мы получаем или отпускаем только одно наименование товара. Таблица будет выглядеть примерно так:
- номер документа (уникальный ключ)
- дата документа
- тип документа (ссылка на справочник документов, т.е. еще одна таблица, для простоты будет считать, что тут у нас хранится -1, 0 или 1)
- код товара (ссылка на 1ю таблицу)
- цена товара по документу (вот это будет копироваться со справочника, но можно править)
- кол-во единиц товара купленных/проданных по документу

Тогда текущий остаток товаров всегда можно посчитать путем сложения по всем документам с учетом типа документа. тогда резервирование товара реализуется как обычный документ.
Ответить с цитированием
  #5  
Старый 14.07.2017, 21:45
СтранныйЯщер СтранныйЯщер вне форума
Прохожий
 
Регистрация: 13.07.2017
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ясно, спасибо. Но это больше похоже будет на товара учетную систему, а мне по сути надо только забить товар в базу (и не важно от кого он пришел, куда ушел, какая там закупочная была цена и т.д. и т.п.), потом продать его и чтобы количество просто уменьшалось.

То есть такая концепция:

1. Создать Таблица1 в БД (Поля: код, наименование, цена, остаток), в программе сделать удобную форму (Форма1) для занесения товара в эту таблицу.
2. Создать Форма2 где можно было бы выбирать товар из Таблица1, потом указывать количество продаваемого товара и нажать кнопку [Продать], при нажатии указанное количество вычиталось бы из количества в Таблица1 и все, от программы больше нечего не требуется.

Такая схема не будет работать?
Ответить с цитированием
  #6  
Старый 14.07.2017, 22:55
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 6,952
Репутация: 49086
По умолчанию

Для обучения - будет.
Для курсача, а уж тем более для какой-то более серьезной цели - нет.
Ответить с цитированием
  #7  
Старый 15.07.2017, 09:32
СтранныйЯщер СтранныйЯщер вне форума
Прохожий
 
Регистрация: 13.07.2017
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А можешь подсказать как должен выглядеть код при нажатии на кнопку [Продать], чтобы допустим в Форма2 из DBGrid2 выбранный товар (точнее его выбранное количество) вычиталось из остатков в DBGrid1 на Форма1 того же товара?
Ответить с цитированием
  #8  
Старый 15.07.2017, 23:29
СтранныйЯщер СтранныйЯщер вне форума
Прохожий
 
Регистрация: 13.07.2017
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вот есть код:

Код:
procedure TForm2.Button1Click(Sender: TObject);
begin
ADOTable1.Edit;
ADOTable1['кол']:=ADOTable1['кол']-ADOTable2['кол2'];
ADOTable1.Post;
end; 

При нажатии кнопки он берет запись в DBGrid2 (ADOTable2) и вычитает из записи в DBGrid1 (ADOTable1) то количество которое указано в колонке (кол2) DBGrid2 (ADOTable2). [Работает на строчку в DBGrid2 на которой стоит маркер, если щелкну на след. строчку то код будет работать на нее.]

Вопрос как сделать так чтобы этот код вычитал из нескольких записей одновременно, то есть чтобы при нажатии кнопки он брал запись 2ух строчек в DBGrid2 (ADOTable2) и вычитал из записей 2ух строчек в DBGrid1 (ADOTable1) то количество которое указано в колонке (кол2) DBGrid2 (ADOTable2) каждой строчки? [Вообщем надо чтобы код захватывал все строчки в DBGrid2 сразу а не по одной как сейчас.]

Эти две таблицы находятся в одной БД access подключены через ADO.
Ответить с цитированием
  #9  
Старый 16.07.2017, 01:09
СтранныйЯщер СтранныйЯщер вне форума
Прохожий
 
Регистрация: 13.07.2017
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Подскажите на моем примере как будет код с Eof выглядеть?
Ответить с цитированием
  #10  
Старый 16.07.2017, 10:46
СтранныйЯщер СтранныйЯщер вне форума
Прохожий
 
Регистрация: 13.07.2017
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Обрисую ситуацию чтобы было понятнее как мне надо сделать. Есть БД access в ней есть таблица (Т1) там столбцы (код, наим1, кол1):

код | наим1 | кол1
1 | яблоко | 12
2 | груша | 27
3 | банан | 22

Так же в этой БД есть еще одна таблица (Т2) там столбцы (код, код1, наим2, кол2) она пустая.

В программе создано две формы Form1 и Form2, на Form1 располагается DBGrid1 к нему подключена таблица (Т1) через ADOTable1, на Form2 располагается поле (Edit2) для выбора товара, DBGrid2 к нему подключена таблица (Т2) через ADOTable2 и кнопка Button2, когда я ввожу в поле (Edit2 на Form2) код (1, 2 или 3) то из таблицы (Т1) берется (например если я ввел код 1) яблоко и вставляется в DBGrid2 получается так:

код | код1 | наим2 | кол2
1 | 1 | яблоко |

В столбец (код1) и (наим2) берется значение из таблицы (Т1) потом я в столбец (кол2) ввожу число получается например так:

код | код1 | наим2 | кол2
1 | 1 | яблоко | 3

И это сохраняется в таблицу (Т2).

Потом при нажатии на кнопку Button2 из таблицы (Т1) вычитается то что получилось в таблице (Т2). То есть из (яблоко 12) вычитается (яблоко 3) и в итоге в таблице (Т1) получается так:

код | наим1 | кол1
1 | яблоко | 9
2 | груша | 27
3 | банан | 22

Код кнопки:

Код:
ADOTable1.Edit;
ADOTable1['кол1']:=ADOTable1['кол1']-ADOTable2['кол2'];
ADOTable1.Post;

Вопрос как доработать код кнопки чтобы при выборе на Form2 несколько товаров в DBGrid2 вычиталось сразу несколько строчек из таблицы (Т1)? Например:

Если выберу в DBGrid2 вот так

код | код1 | наим2 | кол2
1 | 1 | яблоко | 2
2 | 3 | банан | 5

То при нажатии кнопки Button2 должно в таблице (Т1) DBGrid1 получится так:

код | наим1 | кол1
1 | яблоко | 10
2 | груша | 27
3 | банан | 17

Надеюсь все понятно объяснил) Помогите пожалуйста. Заранее очень благодарен!
Ответить с цитированием
  #11  
Старый 16.07.2017, 18:24
СтранныйЯщер СтранныйЯщер вне форума
Прохожий
 
Регистрация: 13.07.2017
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Никто не знает?
Ответить с цитированием
  #12  
Старый 16.07.2017, 20:31
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 6,952
Репутация: 49086
По умолчанию

Да глупо это на клиенте делать. Придется делать двойной цикл...
Делай запрос на Update, потом перечитывай таблицы...
А вообще вот пример (attached), только он на FireBird написан.
Вложения
Тип файла: zip PCShop.zip (1,005.9 Кбайт, 6 просмотров)
Ответить с цитированием
  #13  
Старый 13.09.2017, 23:57
Guaho Guaho вне форума
Прохожий
 
Регистрация: 27.08.2017
Сообщения: 20
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от СтранныйЯщер
А можешь подсказать как должен выглядеть код при нажатии на кнопку [Продать], чтобы допустим в Форма2 из DBGrid2 выбранный товар (точнее его выбранное количество) вычиталось из остатков в DBGrid1 на Форма1 того же товара?
На форме 2 имеем выделенный в гриде-2 товар, т.е. мы знаем код этого товара. Далее, зная этот код, методом Locate ищем в 1-й таблице товар с этим кодом. Далее, после нажатия кнопки "Продать", изменяем количество товара в 1-й таблице по данным из 2-й формы.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:03.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2017

ВКонтакте   Facebook   Twitter