В четвёртой части я рассказал про изменения в модуле database.lua. В него были добавлены функции для вызова часто используемых запросов базы. В результате, пришлось переписывать все исполнительные модули. Не избежал этой участи и customer.lua — он был переписан более, чем наполовину. Разберём его по функциям:
Функция добавления клиента:
Здесь мы вставляем пользователя, получаем его индекс и добавляем телефон с этим индексом.
Функция удаления клиента:
Здесь мы заранее предупреждаем пользователя о последствиях: удалятся данные пользователя и связаные с ним документы. Затем идёт выбор пользователя и стирание клиента из базы.
Функция изменения имени клиента:
Здесь просто проводится обновление имени по указаному индексу.
Функция отображения списка клиентов:
Здесь мы просто извлекаем данные по клиенту и связаным с ним телефонам.
Исполнительные модули мало чем различаются в плане реализации. Однако, у каждой из них есть свои особенности обработки данных. Перейдём к функциям телефонного справочника.
Функция изменения телефона:
Здесь мы просто меняем телефон, но при отображении пользователей в качестве опорного берётся индекс телефонного справочника, а не клиента. Внимательность в этих аспектах обязательна.
Функция добавления телефона:
Идёт добавление телефона через привязку к клиенту. Не иначе!
Функция удаления телефона:
Просто удаляется телефон по индексу.
Функции модуля управления позициями. При разработке этого модуля пришлось внимательно работать с базой. Многие детали запроса здесь неочевидны, но пропустить их не составит труда.
Функция добавления позиции:
Данные просто добавляются в таблицу.
Функции изменения данных:
Здесь происходит изменение данных через разные отображения.
Функция удаления позиции:
По запросу удаляются данные позиции и документы, с ней связаные.
Функция отображения списка позиций:
Выводим список позиций по индексам.
Функции модуля работы с документами:
Функция добавления документа:
Здесь происходит выборка из списка клиентов и позиций. Дальше забираются данные выплат и запись фиксируется в индексной таблице.
Функция редактирования выплаты в документе:
Выбирается документ из списка и по индексу редактируется стоимость выплаты. В программе каждая из позиций представляет собой один документ. Сделано это для удобства и уменьшения управляемых сущностей.
Функция удаления документа:
Обычное удаление записи. Документ уходит безвозвратно.
Пожалуй, на этом можно завершить описание проекта. Такие вещи, как работу и описание модуля вычисления баланса, бинарной компилляции скриптов и прочие радости я оставлю на факультативное изучение. Проект выложен на GitHub по адресу: https://github.com/hantenellotf/CVS. Программа имеют лицензию GNU GPL 3.0, что отражено в репозитарии. Приятного изучения всем!
P.S. Маленькая просьба — если хотите передать замечание по этому циклу статей, прошу предварительно прочитать статью «Разработка микро-учётной системы на 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, часть вторая. Постановка задачи», в которой я указываю условия разработки программы и функции, которые на неё возлагаются. Учитывайте это.
Поделиться с друзьями