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

Скачать

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

4
Голосовали:Tad, sla8a, Poputchik, filyaxxxcom
vip
#1.1контекстная реклама от партнеров
Ответов: 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
Ответов: 2193
Рейтинг: 673
#4: 2012-06-27 20:14:52 ЛС | профиль | цитата
faramir777 писал(а):
Просто не знаю что еще можно использовать вместо него.

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

0
файлы: 3code_28330.txt [282B] [406], code_28331.txt [1.2KB] [417], code_28332.sha [1.7KB] [524]
Ответов: 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] [1147]
Голосовали: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
Ответов: 8886
Рейтинг: 823
#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
Сообщение
...
Прикрепленные файлы
(файлы не залиты)