среда, 24 августа 2011 г.

Урок 17. Что должна "уметь" программа "Расходы" или ТЗ на разработку



На одном из предыдущих уроков я уже затрагивал вопрос о подготовке технического задания на разработку программы.
- Но, о каком техническом задании может идти речь, если разрабатывается программа для собственного использования? - справедливо возмутятся нетерпеливые, к числу которых я отнесу и Вашего покорного слугу ;-)  Собственно, мы не конструкторское бюро, что захотим, то и наворотим. В принципе - правильно. Вся будущая прелесть (или гадость?) нашей разработки целиком и полностью в наших собственных руках.
И все же, чтобы мой уважаемый читатель имел представление о том, что его ждет впереди, я предлагаю своеобразный способ постановки технического задания - скриншоты меню с учетом изложенной ранее формулы.
Напомню, что о том, как создать и наполнить пунктами главное меню приложения, я уже рассказывал в уроке №2.
Итак, как и любая другая программа, работающая с цифрами, программа "Расходы" должна позволять оператору выполнять стандартный набор функций:
  • ввод данных,
  • изменение данных,
  • получение отчетности (вывод результатов на печать или экспорт в общепринятый формат электронной таблицы).
Кроме того, программа должна предоставлять оператору возможность наполнения и поддержания в актуальном состоянии различных кодификаторов (справочников), к примеру: плана счетов, списка мемориальных ордеров и перечня валют.
И было бы совсем не плохо, если ли бы программа поддерживала многоязыковый интерфейс и имела бы контекстно зависимую справочную систему.






Если воспринимать данный рисунок как техническое задание на разработку программы, то становится примерно понятно: как много нужно всего сделать, чтобы программа стала полноценным инструментом.
Я уверен, что, используя навыки, полученные на уроке 4, Вы легко создадите ActionList и оформите пункт меню "Файл - Выход" :-)
На этом можно было бы и закончить, предоставив Вам время на создание заготовки будущего приложения.
Но! На самом первом уроке! я рассказывал о том, как исключить запуск второй копии программы. Здесь уместно будет добавить пару  проверок в код проекта.
Первая из новых функций будет предназначена для проверки формата системной даты. Обусловлено это тем, что хранилищем для данных, с которыми будет работать программа, я выбрал базу данных Access, о создании которой мы поговорим чуть позже. Access - самая подходящая для подобных разработок среда. Имея ввиду простоту ее использования, ее даже называют "средой для домашних хозяек". Однако, многолетняя практика использования СУБД Access дает мне все основания утверждать, что встроенные возможности SQL, путаясь в неоднозначностях форматов даты заокеанского и прочих, использующих в качестве разделителя точку, нередко приводят к ошибкам при обращении к таблицам базы данных посредством SQL запросов, содержащих поля типа "дата". Я нашел "средство борьбы" с особенностями национальных настроек. Access перестает пугать корявыми результатами запросов, если в системной дате вместо разделителя "." использовать допустимый разделитель "/". Новая функция как раз и будет отвечать на вопрос: "Является ли разделителем разрядов в системной дате "/"?"
Вторая функция будет пытаться определить наличие файла настроек программы, т.е. файла с расширением ini, без которого работа программы также невозможна.
Итак. Вы создали новый проект, сохранили его как Rashod.bdsproj, а единственную форму в нем - как Main.pas.
Используйте меню Project - View Source:
program Rashod;
uses  Forms,  Windows,  iniFiles,  ...; // По мере создания программы список будет пополняться
{$R *.res}
// Несколько необходимых переменных
var  HM: THandle;
ini: TIniFile;                                     // Переменная, позволяющая обратиться
// к файлу ini
ConnectionString :string;          // Переменная, в которую в будущем
// будет записана строка подключения к базе данных
// Эту функцию мы уже рассматривали ранее
function Check: boolean;  {проверка на запуск второй копии программы}
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'MyOwnMutex');
Result := (HM <> 0);
if HM = 0  then    HM := CreateMutex(nil, false, 'MyOwnMutex');
end;
// Функция проверки формата даты
function CheckDate: boolean;  {проверка на Правильность системной даты (/)}
var     fStr: String;
begin
Result:=false;
fStr:=DateToStr(Date());                                        // Получение системной даты, преобразование ее в строку
If Pos('/',fStr)=0  Then    ShowMessage('Формат системной даты не верен, работа программы невозможна. ')  else  Result:=True;   // Поиск символа "/" в строке
end;

// Функция проверки наличия ini файла
Function Check_No_INI: boolean;
begin    // попытка считывания из ini файла, находящегося в текущем каталоге
ini:=TiniFile.Create(GetCurrentDir + '\Rashod.ini');
ConnectionString:=Ini.ReadString('General','ConnectionString','');
if ConnectionString='' then
begin      Result:=true;      MessageDlg('Файл Rashod.ini не определён. Обратитесь к разработчику.',mtError, [mbOk], 0);    end
else    Result:=false
end;
// Использование всех имеющихся функций перед стартом приложения
begin
if CheckDate  then
if Check    then      exit
else
if  Check_No_INI      then        exit
else
begin
Application.Initialize;
Application.Title := 'Учет доходов и расходов';
Application.HelpFile := '';
Application.CreateForm(TMainFrm, MainFrm);
Application.Run;
end;
end.


Что же дальше?
Наверное, кто-то этого ждал уже давно: в следующем уроке я буду рассказывать о создании базы данных.

четверг, 11 августа 2011 г.

Урок 16. Самые необходимые знания о бухгалтерии



Следующая программа, о разработке которой я хочу повести речь, предназначена для ведения учета домашних финансов. Я назвал ее "Расходы". Это не вполне бухгалтерская программа, хотя, уверен, что с ее помощью можно вести бухгалтерию небольшого предприятия, поскольку она использует основные принципы бухгалтерского учета. Принципы эти и просты и сложны. Но ознакомиться с ними нужно, иначе, многое в работе программы будет не понятно. Вот об этом очень коротко я и хотел бы поговорить в этом уроке.
Когда итальянский математик Лука Пачоли 500 лет назад  в  Трактате о счетах и записях систематизировал и изложил принцип двойной записи, вряд ли он подозревал, какой мощный инструмент для ведения бухгалтерского учета он оставил последующим поколениям.
Несколько основных терминов.
Не утруждая себя особо, цитирую Википедию:
"Бухгалтерский счёт представляет собой учётную позицию в бухгалтерском учёте, предназначенную для постоянного учёта в денежном выражении движения каждой однородной группы принадлежащих хозяйствующему субъекту средств и источников их образования методом двойной записи (по дебету и кредиту) в проводках."
Ой, уже, наверное, напугал. Не бойтесь, не так все страшно... Продолжаю цитирование:
"В зависимости от объекта учёта счета разделяются на активныепассивные и активно-пассивные.
По степени детализации учёта счета подразделяются на синтетическиесубсчетааналитические.
В зависимости от участия сальдо по счёту в формировании бухгалтерского баланса счета разделяются на балансовыеи забалансовые.
Для каждой группы средств и источников этих средств используется отдельный счёт, где отражается остаток (сальдо) данной группы на начало учётного периода и все изменения, вызванные произведёнными хозяйственными операциями. Каждый счёт имеет две стороны: дебет и кредит. Сумма всех операций, отражённых по дебету счёта, называется дебетовым оборотом; сумма всех операций, отражённых по кредиту, — кредитовым оборотом. Результат соизмерения дебетовых и кредитовых оборотов определяется как остаток (сальдо) по счёту.
Систематизированный перечень бухгалтерских счетов содержится в плане счетов."
Те из Вас, дорогие мои читатели и подписчики, кто более любознателен, сейчас же отправятся на поиски хорошей литературы и узнают из нее много полезного, например: что учет в нашей стране ведется в рублях и копейках (это я к тому, чт оплох тот программист, который не умеет округлять до двух знаков после запятой). Другие - поступят и окончат курсы бухгалтерского учета, потом пару лет поработают простыми бухгалтерами, наберутся опыта, и, если повезет, займут место главбуха в какой-нибудь небольшой фирме. Для полноты ощущений лучше, чтобы эта фирма была производственной, а не торговой и имела активы в виде вложений в ценные бумаги и иногда поигрывала ими на рынке. Это путь долгий. Те из Вас, кто захочет изучить эти вопросы глубже, могут делать это, пытаясь совместить оба пути. "Это возможно", - говорю я Вам, оглядываясь на собственную жизнь. А мы пойдем другой дорогой - более короткой.
Для нас, как для программистов, понятие счета сводится вот к такому короткому:
Счет - это некий признак.
Каждая сумма в учете сопровождается двумя такими признаками. Один называется "счет дебета" или "дебет", второй - "счет кредита" или просто "кредит".
Запись, содержащая сумму и пару признаков (дебет и кредит), называется проводкой.
Хозяйственная операция отражается одной проводкой и более (двумя, тремя...)
Отчетный период - интервал времени между двумя датами: датой начала отчетного периода и датой окончания отчетного периода.
Остаток (сальдо) по счету на дату окончания отчетного периода подсчитывается по следующей формуле (посмотрите еще раз конец  цитаты):
S=ОстНачД - ОстНачК + ОбД - ОбК, где
S - сальдо,
ОстНачД - остаток на начало отчетного периода по дебету счета,
ОстНачК - остаток на начало отчетного периода по кредиту счета,
ОбД - сумма, соответствующая обороту по дебету счета за отчетный период,
ОбК - сумма, соответствующая обороту по кредиту счета за отчетный период.
Если S больше или равно нулю, то:
ОстКонД = S
ОстКонК = 0,
т.е. остаток на конец отчетного периода по дебету счета принимается равным вычисленной сумме, а остаток на конец отчетного периода по кредиту счета принимается равным нулю.
Если же S < 0 (меньше нуля), то
ОстКонД = 0
ОстКонК = |S|,
т.е. остаток на конец отчетного периода по дебету счета принимается равным нулю, а остаток на конец отчетного периода по кредиту счета принимается равным модулю вычисленной суммы (другими словами - без знака минус).
Добавить к этому, собственно, больше нечего. На этой формуле построены все бухгалтерские программы. Этим воспользуемся и мы для написания программы "Расходы".
Два упрощения оговорю сразу:
1. Мы не будем стараться научить программу вести учет на забалансовых счетах.
2. Мы не будем заморачиваться с введением аналитических счетов.


Что же нас ожидает в последующей серии уроков?
Надеюсь, что научу Вас:
  • Подключаться к базам данных и работать с ними.
  • Использовать графические возможности среды разработки для иллюстрации полученных данных.
  • Использовать редактор отчетных форм для получения простых и сложных отчетов.
  • Создавать и настраивать контекстно-зависимую справочную систему.
  • Создавать, отлаживать и использовать в своем творчестве собственные компоненты.
  • Создавать полноценный инсталлятор для Ваших программ.
  • Создавать и использовать много языковую поддержку интерфейса программы.
  • что-то еще, о чем так сходу вспомнить не могу :-)
PS Любой учебник по бухучету избавит Вас от заблуждения, что учет нужен для того, чтобы знать сколько чего имеется на предприятии. Учет нужен для того, чтобы знать сколько чего имеется и где все это есть (на каком складе, у какого ответственного лица и т.п.). Не следует забывать об этом, приступая к написанию бухгалтерской программы.