В четвёртой части я рассказал про изменения в модуле database.lua. В него были добавлены функции для вызова часто используемых запросов базы. В результате, пришлось переписывать все исполнительные модули. Не избежал этой участи и customer.lua — он был переписан более, чем наполовину. Разберём его по функциям:

Функция добавления клиента:
function customer.add()
function customer.add()

	base = require "database"

	print("\n Введите ФИО нового клиента. \n")
	name = io.stdin:read()
	print("Введите номер телефона клиента. \n")
	phone = io.stdin:read()

	base.insert_into_values("customer", "name, phone", "'" .. tostring(name) .."'" )
	data = base.select_from_where("number", "customer", "name = '" .. tostring(name) .. "'")
	while data do
		number = data.number
		data = thread:fetch(data, "a")	
	end
	
	base.insert_into_values("feedback", "customer, phone", "" .. tostring(number) .. ", " .. tostring(phone) )

	print("\n Клиент добавлен. \n")

end


Здесь мы вставляем пользователя, получаем его индекс и добавляем телефон с этим индексом.

Функция удаления клиента:
function customer.drop()
function customer.drop()

	base = require "database"

	print("\n Будьте внимательны: при удалении клиента будут удалены связаные с ним личные данные и документы! \n")

	data = base.select_from_where( "number, name", "customer", nil )
	while data do
		print("| № " .. data.number .. " | " .. data.name .. " | ")
		data = thread:fetch(data, "a")
	end

	print("\n Выберите номер клиента:")
	number = io.stdin:read()

	base.delete_from_where("customer", "customer.number = " .. tostring(number) )
	base.delete_from_where("feedback", "feedback.customer = " .. tostring(number) )
	base.delete_from_where("document", "document.customer = " .. tostring(number) )
	
	print("\n Клиент удалён. \n")

end


Здесь мы заранее предупреждаем пользователя о последствиях: удалятся данные пользователя и связаные с ним документы. Затем идёт выбор пользователя и стирание клиента из базы.

Функция изменения имени клиента:
function customer.change()
function customer.change()

	base = require "database"

	print("\n Список клиентов для изменения: \n")

	data = base.select_from_where( "number, name", "customer", nil )
	while data do
		print("| № " .. data.number .. " | " .. data.name .. " | " )
		data = thread:fetch(data, "a")
	end

	print("\n Укажите клиента для изменения имени: \n")
	number = io.stdin:read()
	print("\n Введите новое наименование клиента: \n")
	name = io.stdin:read()

	base.update_set_where( "customer", "name = '" .. tostring(name) .."'", "number = " .. tostring(number) )

	print("\n Данные клиента изменены. \n")	

end


Здесь просто проводится обновление имени по указаному индексу.

Функция отображения списка клиентов:
function customer.show()
function customer.show()

	base = require "database"

	print("\n Список клиентов: \n")

	data = base.select_from_where( "customer.number, customer.name, feedback.phone", "customer, feedback", "feedback.customer = customer.number" )
	while data do
		print("| № " .. data.number .. " | " .. data.name .. " | " .. data.phone .. " | ")
		data = thread:fetch(data, "a")
	end

	print("\n Запрос выполнен. \n")	

end


Здесь мы просто извлекаем данные по клиенту и связаным с ним телефонам.

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

Функция изменения телефона:
function feedback.change()
function feedback.change()

	base = require "database"

	print("\n Выберите номер телефона для изменения. \n")

	data = base.select_from_where("feedback.number, feedback.phone, customer.name", "feedback, customer", "feedback.customer = customer.number")
	while data do
		print("| № " .. data.number .. " | " .. data.name .. " | " .. data.phone .. " |" )
		data = thread:fetch(data, "a")
	end

	print("\n Укажите клиента для изменения телефона: \n")
	number = io.stdin:read()

	print("\n Введите новый телефон: \n")
	phone = io.stdin:read()

	base.update_set_where( "feedback", "phone = " .. tostring(phone), "number = " .. tostring(number) )

	print("\n Данные клиента изменены. \n")	

end


Здесь мы просто меняем телефон, но при отображении пользователей в качестве опорного берётся индекс телефонного справочника, а не клиента. Внимательность в этих аспектах обязательна.

Функция добавления телефона:
function feedback.add()
function feedback.add()

	base = require "database"

	print("\n Список клиентов для добавления телефона: \n")

	data = base.select_from_where( "number, name", "customer", nil )
	while data do
		print("| № " .. data.number .. " | " .. data.name .. " | ")
		data = thread:fetch(data, "a")
	end

	print("\n Укажите номер клиента для добавления телефона: \n")
	number = io.stdin:read()
	print("\n Укажите новый номер телефона: \n")
	phone = io.stdin:read()

	base.insert_into_values( "feedback", "customer, phone", tostring(number) .. ", " .. tostring(phone) )

	print("\n Телефон добавлен. \n")		

end


Идёт добавление телефона через привязку к клиенту. Не иначе!

Функция удаления телефона:
function feedback.drop()
function feedback.drop()

	base = require "database"

	print("\n Выберите номер телефона для удаления: \n")

	data = base.select_from_where( "feedback.number, customer.name, feedback.phone", "feedback, customer", "feedback.customer = customer.number" )
	while data do
		print("| № " .. data.number .. " | " .. data.name .. " | " .. data.phone .. " |" )
		data = thread:fetch(data, "a")
	end

	print("\n Укажите номер телефона для удаления: \n")
	number = io.stdin:read()

	base.delete_from_where( "feedback", "number = " .. tostring(number) )

	print("\n Телефон удалён. \n")		

end


Просто удаляется телефон по индексу.

Функции модуля управления позициями. При разработке этого модуля пришлось внимательно работать с базой. Многие детали запроса здесь неочевидны, но пропустить их не составит труда.

Функция добавления позиции:
function position.add()
function position.add()

	base = require "database"
	
	print("\n Введите наименование операции.")
	nominal = io.stdin:read()
	print("\n Введите стоимость операции.")
	price = io.stdin:read()

	base.insert_into_values( "position", "nominal, price", "'" .. tostring(nominal) .. "'" .. tostring(price) )

	print("\n Наименование добавленно. \n")

end


Данные просто добавляются в таблицу.

Функции изменения данных:
function position.change_nominal(); function position.change_price();
function position.change_nominal()

	base = require "database"

	data = base.select_from_where( "number, nominal, price", "position", nil )
	while data do
		print("| № " .. data.number .. " | " .. data.nominal .. " | " .. data.price .. " руб. |" )
		data = thread:fetch(data, "a")
	end	
	
	print("\n Укажите номер для изменения наименования позиции: \n")
	number = io.stdin:read()
	print("\n Укажите новое наименование: \n")
	nominal = io.stdin:read()

	base.update_set_where( "position", "nominal = " .. tostring(nominal), "number = " .. tostring(number) )

	print("\n Наименование изменено. \n")

end


function position.change_price()

	base = require "database"

	data = base.select_from_where( "number, nominal, price", "position", nil )
	while data do
		print("| № " .. data.number .. " | " .. data.nominal .. " | " .. data.price .. " руб. |" )
		data = thread:fetch(data, "a")
	end	
	
	print("\n Укажите номер для изменения цены: \n")
	number = io.stdin:read()
	print("\n Укажите новую цену: \n")
	price = io.stdin:read()

	base.update_set_where( "position", "price = " .. tostring(price), "number = " .. tostring(number) )

	print("\n Телефон изменён. \n")

end


Здесь происходит изменение данных через разные отображения.

Функция удаления позиции:
function position.drop()
function position.drop()

	base = require "database"

	print("\n Внимание! После удаления позиции будут удалены все документы с этой позицией. \n")
	
	data = base.select_from_where( "number, nominal, price", "position", nil )
	while data do
		print("| № " .. data.number .. " | " .. data.nominal .. " | " .. data.price .. " руб. |" )
		data = thread:fetch(data, "a")
	end	

	print("\n Укажите номер удаляемой позиции \n")
	number = io.stdin:read()

	base.delete_from_where( "position", "position.number = " .. tostring(number) )
	base.delete_from_where( "document", "document.position = " .. tostring(number) )

	thread = io.stdin:read()
	print("\n Позиция удалена. \n")

end


По запросу удаляются данные позиции и документы, с ней связаные.

Функция отображения списка позиций:
function position.show()
function position.show()

	base = require "database"

	print("Список позиций: \n")

	data = base.select_from_where( "number, nominal, price", "position", nil )
	while data do
		print("| № " .. data.number .. " | " .. data.nominal .. " | " .. data.price .. " руб. |" )
		data = thread:fetch(data, "a")
	end

	print("\n Запрос выполнен. \n")		

end


Выводим список позиций по индексам.

Функции модуля работы с документами:

Функция добавления документа:
function document.add()
function document.add()

	base = require "database"

	print("\n Текущий список клиентов: \n")

	data = base.select_from_where( "number, name", "customer", nil )
	while data do
		print("| № " .. tostring(data.number) .. " | " .. tostring(data.name) .. " | " )
		data = thread:fetch(data, "a")
	end

	print("\n Введите номер нужного Вам клиента: \n")
	customer = io.stdin:read()

	data = base.select_from_where( "number, nominal, price", "position", nil )
	while data do
		print("| № " .. data.number .. " | " .. data.nominal .. " | " .. data.price .. " руб. |" )
		data = thread:fetch(data, "a")
	end

	print("\n Выберите номер услуги из списка.")
	position = io.stdin:read()
	print("\n Укажите внесённую клиентом сумму.")
	price = io.stdin:read()

	base.insert_into_values( "document", "customer, position, income", tostring(customer) .. ', ' .. tostring(position) .. ', ' .. tostring(price) )
	data = base.select_from_where( "document.number, customer.name, position.nominal, document.income, position.price", "document, customer, position", "document.customer = customer.number AND document.position = position.number" )
	while data do
		print("\n | № " .. data.number .. " | " .. data.name .. " | " .. data.nominal .. " | " .. data.income .. " руб. | " .. data.price .. " руб. |" )
		data = thread:fetch(data, "a")
	end

	print("\n Запись добавлена. \n")

end


Здесь происходит выборка из списка клиентов и позиций. Дальше забираются данные выплат и запись фиксируется в индексной таблице.

Функция редактирования выплаты в документе:
function document.change()
function document.change()

	print("\n Список текущих документов: \n")

	base = require "database"

	data = base.select_from_where("document.number, customer.name, position.nominal, document.income, position.price", "document, customer, position", "document.customer = customer.number AND document.position = position.number")
	while data do
		print("\n | № " .. data.number .. " | " .. data.name .. " | " .. data.nominal .. " | " .. data.income .. " руб. | " .. data.price .. " руб. |" )
		data = thread:fetch(data, "a")
	end	

	print("\n Укажите номер редактируемой записи \n")
	doc = io.stdin:read()
	print("\n Укажите значение выплаты \n")
	income = io.stdin:read()

	base.update_set_where("document", "income = " .. tostring(income), "number = " .. tostring(doc))
	
	print("\n Выплата зафиксирована. \n")

end


Выбирается документ из списка и по индексу редактируется стоимость выплаты. В программе каждая из позиций представляет собой один документ. Сделано это для удобства и уменьшения управляемых сущностей.

Функция удаления документа:
function document.drop()
function document.drop()

	print("\n Список текущих документов: \n")

	base = require "database"

	data = base.select_from_where( "document.number, customer.name, position.nominal, document.income, position.price", "document, customer, position", "document.customer = customer.number AND document.position = position.number" )
	while data do
		print("\n | № " .. data.number .. " | " .. data.name .. " | " .. data.nominal .. " | " .. data.income .. " руб. | " .. data.price .. " руб. |" )
		data = thread:fetch(data, "a")
	end	

	print("\n Укажите номер удаляемой записи \n")
	doc = io.stdin:read()

	base.delete_from_where("document", "number = " .. tostring(doc))
	
	print("\n Запись удалена. \n")
	
end


Обычное удаление записи. Документ уходит безвозвратно.

Пожалуй, на этом можно завершить описание проекта. Такие вещи, как работу и описание модуля вычисления баланса, бинарной компилляции скриптов и прочие радости я оставлю на факультативное изучение. Проект выложен на GitHub по адресу: https://github.com/hantenellotf/CVS. Программа имеют лицензию GNU GPL 3.0, что отражено в репозитарии. Приятного изучения всем!

P.S. Маленькая просьба — если хотите передать замечание по этому циклу статей, прошу предварительно прочитать статью «Разработка микро-учётной системы на lua, часть вторая. Постановка задачи», в которой я указываю условия разработки программы и функции, которые на неё возлагаются. Учитывайте это.
Поделиться с друзьями
-->

Комментарии (0)