Вы находитесь на странице: 1из 18

Министерство образования и науки Республики Беларусь

Белорусский государственный университет


информатики и радиоэлектроники

Факультет информационных технологий и управления


Кафедра информационных технологий автоматизированных систем

РАСЧЕТНО-ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
по курсу "Базы и банки данных "
на тему "Управление складом товаров".

Выполнил студент гр. 700621с ____________ Ильюкевич В.А.


(подпись) (Ф.И.О.)

Руководитель ____________ Герман О. В.


(подпись) (Ф.И.О.)

Минск, 2011
Содержание
Содержание.............................................................................................................................................................2
Введение.................................................................................................................................................................3
Постановка задачи.................................................................................................................................................4
Руководство пользователя.....................................................................................................................................5
Основное окно программы................................................................................................................................5
Состояние склада...........................................................................................................................................6
Последние 10 операций по складу...............................................................................................................6
Добавление записи о приёме товара................................................................................................................7
Отправка товара со склада................................................................................................................................8
Управление магазинами..................................................................................................................................10
Управление поставщиками.............................................................................................................................11
Управление товарами......................................................................................................................................11
Заключение...........................................................................................................................................................13
Список использованных источников.................................................................................................................14
Приложение 1. Схема базы данных...................................................................................................................15
Приложение 2. Листинг основных классов приложения.................................................................................16

2
Введение
В нынешнее время сложно представить сферу деятельности людей, где нельзя найти применение базам
данных. Конечно это не значит, что везде где необходимо использовать базы данных они и применяются.
Нет, во многих местах по-прежнему люди пользуются картотеками и прочими бумажными «базами
данных». Но всё больше и больше предприятий внедряют в свою работу программные средства для
организации разного рода информации. Будь то данные по сотрудникам, бухгалтерский учёт или какие-либо
справочники. Одно из таких применений баз данных и будет рассматриваться в данной работе. А именно –
организация работы склада товаров.
Для реализации данной задачи я буду использовать язык программирование ruby и веб-фреймворк Ruby
On Rails. База данных – mysql.

3
Постановка задачи
Разработать программу для управления складом. Товары на склад поступают партиями от разных
поставщиков. В одном партии может присутствовать несколько наименований товаров в разных
количествах. Аналогичными партиями товары отправляются со склада в магазины.
Склад ведёт работу с несколькими поставщиками и несколькими магазинами.
Необходиа возможность отслеживать состояние склада, т.е. видеть какой товар и в каких количествах
имеется на складе.
Так же необходимо предусмотреть возможность просмотра истории операций по складу.

4
Руководство пользователя
Программа является веб-приложением. И поэтому для её использования оператору необходимо иметь
только веб-браузер на компьютере. Операционная система на компьютере оператора может быть любой.
Оператором я называю человека, который будет взаимодействовать с программой.
Интерфейс программы полностью на русском языке и в большинстве случаев не должен вызывать
трудностей. Однако приведу описание основных функций программы.

Основное окно программы

рис. 1. Основное окно программы (первый запуск приложения и поэтому )

Вверху каждой страницы можно видеть ссылки для основной навигации.

5
 Состояние склада – переход на главную страницы
 Магазины – переход в секцию по управлению списком магазинов, с которыми ведётся работа
 Поставщики товара – переход в секцию по управлению списком поставщиков товаров, с
которыми сотрудничает склад
 Товары, с которыми ведётся работа – управление товарами

Основное окно программы можно условно разделить на две части.

Состояние склада

Все товары, которые сейчас имеются на складе в количестве больше нуля будут тут отображаться.

Последние 10 операций по складу.

Тут отображаются последние 10 операций по складу в хронологическом порядке. Самая последняя


операция – вверху.
В случае необходимости просмотра всех операций можно воспользоваться соответствующими ссылками
под таблицей «10 последних операций».
6
Добавление записи о приёме товара.
Для этого необходимо нажать по ссылке «Приём товара на склад»

Откроется вот такое окно:

Тут необходимо указать поставщика из списка доступных поставщиков. Затем заполнить «примечание»
если необходимо. А так же указать ряд пар «товар - количество».
Система обладает защитой от некорректного ввода. Если что-то введено неправильно и оператор попытался
сохранить запись, то система выдаст предупреждение.

7
После исправления ошибок оператор снова нажимает «создать» и, если на этот раз всё хорошо, то запись о
поступлении товара на склад сохранится. Теперь на главной странице приложения в таблице «Состояние
склада» появятся поступившие товары (а если они были и раньше, то обновится их количество).

Отправка товара со склада


Для отправки товара в магазин необходимо на главной странице приложения нажать на ссылку «Отправка
товара в магазин».

В открывшемся окне будет необходимо указать магазин и ряд пар «товар - количество», которые мы
отправляем в данный магазин.

8
Тут так же есть защита от некорректного ввода. И в случае попытки отправить товар, которого нету на
складе или слишком большое количество товара, система выдаст предупреждение.

9
После исправления ошибок система сохранит информацию об отправке товара. И на главной странице
изменится количество товаров.

Управление магазинами
Для перехода в секцию управления магазинами надо кликнуть по ссылке «Магазины» вверху любой
страницы приложения.

На открывшемся экране мы увидим список имеющихся магазинов со ссылками для изменения, удаления или
просмотра подробных сведений о магазине.

10
Управление поставщиками
Аналогично, как и в случае с магазинами, необходимо в верхнем блоке навигации кликнуть на ссылку
«Поставщики товара»

Управление товарами
Аналогично, как и в случае с магазинами, необходимо в верхнем блоке навигации кликнуть на ссылку
«Товары, с которыми ведётся работа».

11
Тут можно отредактировать, удалить имеющиеся товары или добавить новые.

12
Заключение
Я изучил и на практике закрепил работу с базами данных, написав приложение по управлению работой
склада. Если бы это приложение делалось не в учебных целях, а в практических, то можно было бы
добавить ещё ряд функций. Например, вести учёт денежных расчетов за товар. Можно было бы сразу и
вычислять прибыль склада. И даже зарплату сотрудникам склада. К слову, на работе мне довелось
поработать, а сейчас и поддерживать, приложение которое организует работу юридической компании с
клиентами. А так же ведёт полный финансовый учёт и расчет зарплаты сотрудникам на основе проделанной
ими работы. Это один из тех примеров, когда ведение бухгалтерии организовано не через бумажную
волокиту, а напрямую через взаимодействие приложения с базой данных.

13
Список использованных источников
1. Agile Web Development with Rails, 3rd edition, Sam Ruby, Dave Thomas, David Heinemeier
Hansson, 2009, 792 c
2. Programming Ruby 1.9 (3rd edition), Dave Thomas, with Chad Fowler and Andy Hunt, 2009, 944с
3. http://guides.rubyonrails.com
4. http://apidock.com

14
Приложение 1. Схема базы данных
Приложение 2. Листинг основных классов приложения
class Product < ActiveRecord::Base
  attr_accessible :sku, :name, :description

  has_many :line_items, :dependent => :destroy

  validates_presence_of :sku, :name


  validates_uniqueness_of :sku
  validates_numericality_of :quantity, :greater_than_or_equal_to => 0
end

class Order < ActiveRecord::Base


  attr_accessible :store_id, :line_items_attributes

  belongs_to :store
  has_many :line_items, :as => :object, :dependent => :destroy
  accepts_nested_attributes_for :line_items, :reject_if => proc {|attrs|
attrs['product_id'].blank?}
  has_many :products, :through => :line_items

  validates_presence_of :store
end

class Store < ActiveRecord::Base


  attr_accessible :name, :address, :description

  has_many :orders, :dependent => :nullify

  validates_presence_of :name
end

class Supply < ActiveRecord::Base


  attr_accessible :supplier_id, :description, :line_items_attributes

  belongs_to :supplier
  has_many :line_items, :as => :object, :dependent => :destroy
  accepts_nested_attributes_for :line_items, :reject_if => proc {|attrs|
attrs['product_id'].blank?}
  has_many :products, :through => :line_items

  validates_presence_of :supplier
end

class Supplier < ActiveRecord::Base


  attr_accessible :name, :phone, :description

  has_many :supplies, :dependent => :nullify

  validates_presence_of :name
end

class LineItem < ActiveRecord::Base


  attr_accessible :object_id, :object_type, :product_id, :quantity

  belongs_to :product
  belongs_to :object, :polymorphic => true

  validates_presence_of :product_id
  validates_numericality_of :quantity, :greater_than => 0

  validates_each :quantity do |record, attr, value|


    if record.object_type == 'Order'
      record.errors.add attr, "не должно превышать общее количество продукта на складе
(#{record.product.quantity})" if value > record.product.quantity
    end
  end

  after_create :update_product_quantity

  def update_product_quantity
    case object.class.name
    when 'Supply'
      product.update_attribute(:quantity, product.quantity + quantity)
    when 'Order'
      product.update_attribute(:quantity, product.quantity - quantity)
    end
  end
end

class WelcomeController < ApplicationController


  def index
    @products_in_stock = Product.where("quantity > 0").order(:name)

    last_orders = Order.order('created_at DESC').limit(10)


    last_supplies = Supply.order('created_at DESC').limit(10)

    @last_operations = (last_orders + last_supplies).sort {|a, b| b.created_at <=>


a.created_at}.shift(10)
  end
end

class OrdersController < ApplicationController


  def index
    @orders = Order.order('created_at DESC')
  end

  def show
    @order = Order.find(params[:id])
  end

  def new
    @order = Order.new
  end

  def create
    @order = Order.new(params[:order])
    if @order.save
      flash[:notice] = "Запись об отправке товара сохранена"
      redirect_to root_path
    else
      render :action => 'new'
    end
  end
end

class ProductsController < ApplicationController


  def index
    @products = Product.order(:name)
  end

  def show
    @product = Product.find(params[:id])
  end

  def new
    @product = Product.new
  end

  def create
    @product = Product.new(params[:product])
    if @product.save
      flash[:notice] = "Продукт добавлен"
      redirect_to @product
    else
      render :action => 'new'
    end
  end

  def edit
    @product = Product.find(params[:id])
  end

  def update
    @product = Product.find(params[:id])
    if @product.update_attributes(params[:product])
      flash[:notice] = "Продукт обновлён"
17
      redirect_to @product
    else
      render :action => 'edit'
    end
  end

  def destroy
    @product = Product.find(params[:id])
    @product.destroy
    flash[:notice] = "Продукт удалён"
    redirect_to products_url
  end
end

18