Вверх ↑
Этот топик читают: Гость
Ответов: 17
Рейтинг: 4
#1: 2012-06-27 11:21:01 ЛС | профиль | цитата
Здравствуйте!
Не так давно написал програмку для учета расходов и доходов. Писалась для себя, поэтому немного запутана (возможно есть лишние элементы)так что строго не судите. Опыта написания таких программ небыло, да и SQL я не знал, изучал по ходу.
Програмка ведет базу данных доходов и расходов.
Выводит отчеты по выбранным датам в разрезе по категориям.
Строит графики доходов и расходов за год.
Буду рад, если кто-то что-то в нее добавит или переделает в лучшую сторону.

Скачать

PS. нехватает прав чтобы прикрепить файл, скинул в "Файлообмен"
карма: 0

4
Голосовали:Tad, sla8a, Poputchik, filyaxxxcom
Ответов: 16884
Рейтинг: 1239
#2: 2012-06-27 16:38:15 ЛС | профиль | цитата
faramir777, неплохо. А вот лишнего очень много.
В SQLite вычисления тоже на уровне.
Простейший пример:
Например к запросу
SELECT MAX(№) FROM base;
тебе ещё приходится цеплять компонент Math (+1) хотя написав запрос
SELECT MAX(№)+1 FROM base;
вполне можно отказаться от применения компонента Math и сразу получить следующий номер.
А вот тебе твой график
Add(For,8351594,378,574)
{
 Start=1
 End=12
 link(onEvent,13850014:doOperation,[])
}
Add(Math,13850014,427,574)
{
 Op2=100
 ResultType=0
 link(onResult,896836:doCopy,[])
}
Add(Copy,896836,476,574)
{
 Position=2
 Count=2
 link(onCopy,17588:doString,[])
}
Add(FormatStr,17588,525,574)
{
 Mask="SELECT SUM(Сумма) FROM base WHERE Дата >='%1-%2-01' AND Дата <= '%1-%2-31'"
 link(onFString,5646826:doQuery,[])
}
Add(SQLite_Query,5646826,574,574)
{
 link(onQuery,5409768:doWork2,[(608,580)(608,587)])
}
Add(Grapher,693771,630,581)
{
 Left=151
 Top=30
 Width=695
 Height=425
 Grid=13
 MaxH=260000
 Point(doSaveToFile)
}
Add(FormatStr,1197124,378,525)
{
 Mask="0"
 link(onFString,5409768:doWork1,[(613,531)])
}
Add(HubEx,5409768,609,581)
{
 link(onEvent,693771:doAdd,[])
}
Add(Button,5059824,301,560)
{
 Left=10
 Top=80
 Width=125
 Height=40
 Caption="Выполнить"
 link(onClick,15081534:doEvent1,[])
}
Add(Hub,15081534,343,560)
{
 OutCount=4
 link(onEvent1,693771:doClear,[(621,566)(621,594)])
 link(onEvent2,1007480:doWork2,[])
 link(onEvent3,8351594:doFor,[])
 link(onEvent4,1007480:doWork3,[(368,587)])
}
Add(HubEx,1007480,364,567)
{
 Angle=3
 link(onEvent,1197124:doString,[(368,531)])
}


И т.д.

Успехов!

P.S. Да, и компонент EventFromData применяешь совсем не по его назначению.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:sla8a
Ответов: 17
Рейтинг: 4
#3: 2012-06-27 19:55:44 ЛС | профиль | цитата
Tad писал(а):
SELECT MAX(№)+1 FROM base;
вполне можно отказаться от применения компонента Math и сразу получить следующий номер.

Учту... Мне просто поглубже нужно изучить SQL. Тем более он мне очень понравился, было интересно с ним повозится.

Tad писал(а):
А вот тебе твой график

Очень понравился график. Его оказыватся можно сделать таким простым, а я не один час потратил. Наверно если пересмотреть всю програмку, большую ее часть можно выкинуть

Tad писал(а):
P.S. Да, и компонент EventFromData применяешь совсем не по его назначению

Просто не знаю что еще можно использовать вместо него...
карма: 0

0
Ответов: 2308
Рейтинг: 679
#4: 2012-06-27 20:14:52 ЛС | профиль | цитата
faramir777 писал(а):
Просто не знаю что еще можно использовать вместо него.

Используй Memory
Вот такие вещи точно переделывай: code_28330.txt
У тебя такое много где используется. В таких местах можно обойтись без таймера: code_28332.sha
Элемент GetData устаревший (его то и в палитре элементов нет), вместо него GetDataEx (вкладка Помощники). Или вообще используй LineBreakEx (тоже вкладка Помощники). Вот так: code_28331.txt
А вообще схема сделана аккуратно. Вот только незнание и неправильное использование элементов, но у всех так вначале и это поправимо.
карма: 11

0
файлы: 3code_28330.txt [282B] [484], code_28331.txt [1.2KB] [499], code_28332.sha [1.7KB] [580]
Ответов: 16884
Рейтинг: 1239
#5: 2012-06-27 21:42:52 ЛС | профиль | цитата
faramir777 писал(а):
большую ее часть можно выкинуть
Даже из твоих часов
clock_n.png
в % получается 25%
Да.
1. Калькулятор можно сделать, используя возможности SQLite (без компонент математики)
2. Для создания таблиц используй команду с условием:
CREATE TABLE IF NOT EXISTS base (№, Дата DATE,Сумма, Категория, Описание TEXT);
CREATE TABLE IF NOT EXISTS dohod (№, Дата DATE,Сумма, Категория, Описание TEXT);
сработает, как защита.
------------ Дoбавленo в 21.42:
Add(ChildForm,6567049,623,56)
{
}
BEGIN_SDK
  Add(EditMulti,1477762,49,21)
  {
   WorkCount=1
   Width=412
   Height=305
   link(doWork1,1812192:doVisible,[(123,27)(123,62)])
  }
  Add(MainForm,1812192,189,28)
  {
   Left=35
   Top=105
   Width=425
   Height=77
   Visible=1
   Caption="Создание резервной копии базы данных"
   BorderStyle=1
   Point(doVisible)
  }
  Add(FileTools,5565160,189,266)
  {
   link(onEnd,12449883:doMessage,[])
   link(FileName,2516802:FString,[(195,244)(160,244)])
   link(NewFileName,6135487:FString,[])
  }
  Add(Button,5558362,70,252)
  {
   Left=10
   Top=10
   Width=205
   Caption="Создать резервную копию"
   link(onClick,2233415:doEvent1,[])
  }
  Add(FormatStr,6135487,196,189)
  {
   Mask="Rezerv\%1_DB.db"
   Point(FString)
   link(Str1,5514965:Result,[])
  }
  Add(DatePicker,11849315,189,77)
  {
   Left=245
   Top=10
   Width=155
   Height=21
   Point(CurrentDateTime)
   Point(DateTime)
   link(onChange,15480530:doWork1,[(234,83)(234,119)(170,119)])
  }
  Add(DateConvertor,5514965,196,133)
  {
   Mode=9
   Format="yyyy-MM-dd"
   Point(Data)
   Point(Result)
   link(Data,11849315:DateTime,[])
  }
  Add(Timer,15622425,371,49)
  {
   Interval=10
   AutoStop=1
   link(onTimer,4410535:doEvent1,[])
  }
  Add(EventFromData,10736337,406,98)
  {
  }
  Add(EventFromData,1317161,406,147)
  {
  }
  Add(Hub,4410535,420,49)
  {
   OutCount=3
  }
  Add(Message,12449883,266,266)
  {
   Message="Резервная копия базы данных\r\n успешно создана."
   Caption="Успех"
  }
  Add(FormatStr,2516802,154,203)
  {
   Mask="DB.db"
   Point(FString)
  }
  Add(EventFromData,16416642,406,196)
  {
  }
  Add(Hub,2233415,112,252)
  {
   OutCount=4
   link(onEvent1,15480530:doWork2,[(154,258)(154,139)])
   link(onEvent2,6135487:doString,[(139,265)(139,195)])
   link(onEvent3,2516802:doString,[(147,272)(147,209)])
   link(onEvent4,5565160:doCopy,[])
  }
  Add(HubEx,15480530,166,133)
  {
   link(onEvent,5514965:doConvert,[])
  }
END_SDK
А для таких случаев
SELECT SUM(Сумма)FROM base WHERE Дата >='%1' AND Дата <= '%2' AND Категория = 'Продукты'
WHERE Дата >='%1' AND Дата <= '%2' есть волшебное слово BETWEEN
А вот так примерно, одним запросом, формируется вся справка за период по категориям:
SELECT Категория||': '||SUM(Сумма)FROM base WHERE Дата BETWEEN '%1' AND '%2' GROUP BY Категория;
Т.е. из используемых тобой ~170 компонент останется всего ~20.
А если-бы дату в таблицах хранил в формате INTEGER, то всего 4 компонента.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
файлы: 1clock_n.png [4.8KB] [1226]
Голосовали:Konst
Ответов: 17
Рейтинг: 4
#6: 2012-06-29 19:32:33 ЛС | профиль | цитата
Tad писал(а):
Т.е. из используемых тобой ~170 компонент останется всего ~20.

Мда... Конечно до идеального варианта программы мне еще долго изучать HiAsm...
Tad писал(а):
2. Для создания таблиц используй команду с условием:
CREATE TABLE IF NOT EXISTS base (№, Дата DATE,Сумма, Категория, Описание TEXT);
CREATE TABLE IF NOT EXISTS dohod (№, Дата DATE,Сумма, Категория, Описание TEXT);
Tad писал(а):
А если-бы дату в таблицах хранил в формате INTEGER, то всего 4 компонента.

У меня уже очень много записей в базе данных, удалять ее не хочу чтобы создать новую. Есть ли способ переделать таблицу не удаляя данные в базе?
карма: 0

0
Ответов: 5446
Рейтинг: 323
#7: 2012-06-29 19:35:22 ЛС | профиль | цитата
faramir777, только с помощью временной таблицы.
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#8: 2012-06-29 20:46:39 ЛС | профиль | цитата
faramir777 писал(а):
У меня уже очень много записей в базе данных, удалять ее не хочу чтобы создать новую
Как правильно сказал
iarspider писал(а):
с помощью временной таблицы.
а удалять ничего не надо.

У тебя очень "жёсткая схема программы".
Вопрос 1: Если надо будет добавить новую категорию, что будешь делать ? Искать исходник, добавлять, компилировать и т.д.
Вопрос 2: Чем отличется работа с таблицами прихода и расхода ? Только именами таблиц БД. Значит число компонент в твоей программе можно считать раздутыми примерно в ~2 раза.

Ничего не удаляй. Просто попробуй начать по новой с 0.
Быть патриотом - похвально. Но давать русские имена колонкам таблиц - извини...
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 8937
Рейтинг: 824
#9: 2012-06-29 21:13:31 ЛС | профиль | цитата
Эх, блин, были БЫ доходы такую БЫ таблицу нарисовал БЫ Даже с русскими именами!
карма: 19

0
Ответов: 16884
Рейтинг: 1239
#10: 2012-06-29 21:28:17 ЛС | профиль | цитата
Примерная схема БД:
CREATE TABLE IF NOT EXISTS rashod(id INTEGER PRIMARY KEY, Data INTEGER,Summa REAL, Kat INTEGER,vid INTEGER, rem TEXT);
CREATE TABLE IF NOT EXISTS dohod(id INTEGER PRIMARY KEY, Data INTEGER,Summa REAL, Kat INTEGER,vid INTEGER, rem TEXT);
CREATE TABLE IF NOT EXISTS kat(id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE IF NOT EXISTS vid(id INTEGER PRIMARY KEY, name TEXT, idkat INTEGER);
Если дата нужна с часами:минутами:секундами, то тип REAL.но думай сам.
------------ Дoбавленo в 21.28:
Леонид писал(а):
Даже с русскими именами!
и "Медмидь" рядом.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:faramir777
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)