Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SQL запрос - делаю в Фоксе учет финансов / 25 сообщений из 40, страница 1 из 2
13.04.2013, 13:13
    #38224333
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
Добрый день, добрые люди!

Мне нужно решить следующую задачу:
Ситуация .
1) на предприятии имеется ряд фондов, которые предназначены для финансирования отдельных хозяйственных процессов
2) иногда, по решению руководства, средства из какого-либо фонда берутся в заем для финансирования процессов другого фонда и впоследствии должны быть возвращены
3) на данный период имеется только учет займов, построен он таким образом:
- в таблицу, где хранятся данные о средствах фондов и их движении, при займе заносятся 2 записи - одна для фонда, из которого берут - с минусом, 2-я для фонда, в который деньги поступают.

Анализ
Это только самый первичный учет, чтобы данные не пропали, но пользоваться ими не удобно.

Задача
- если нужно - реорганизовать данные
- иметь возможность видеть "взаимные" обязательства фондов:
- как минимум - в одной строке: из какого фонда в какой поступили средства
- лучше - если займ из одного фонда перекрывается обязательствами из другого фонда, то показать каким фондом перекрыть этот займ

Мои вопросы
1) как вы думаете - можно ли какую-то часть этой задачи решать ОДНИМ запросом?
2) возможно ли задачу минимум решать при существующей организации хранения данных?

Благодарен за все ответы, комментарии и т.п.
...
Рейтинг: 0 / 0
13.04.2013, 15:18
    #38224398
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
Храните данные об операции одной записью: Дата, ДебетФонд, КредитФонд, Сумма
Тогда и учет, и выборки упростятся...
...
Рейтинг: 0 / 0
13.04.2013, 15:18
    #38224400
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
labirintесли нужно - реорганизовать данныеlabirintкак минимум - в одной строке: из какого фонда в какой поступили средстваСлово "проводка" о чём-нибудь говорит? :)
labirint- лучше - если займ из одного фонда перекрывается обязательствами из другого фонда, то показать каким фондом перекрыть этот займНепонятно. Это что-то вроде "фонд А должен фонду Б 200, в то же время ему должны: В - 150, Г - 80, Д - 50. Вывести В и Д"? Или что? Может, пример приведёте?
labirint1) как вы думаете - можно ли какую-то часть этой задачи решать ОДНИМ запросом?Да.
labirint2) возможно ли задачу минимум решать при существующей организации хранения данных?Минимум - да.
...
Рейтинг: 0 / 0
13.04.2013, 15:24
    #38224402
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
labirint... в таблицу, где хранятся данные о средствах фондов и их движении, при займе заносятся 2 записи - одна для фонда, из которого берут - с минусом, 2-я для фонда, в который деньги поступают. Должны быть не записи, а поля. Хотя информации недостаточно.

P.S. Это что, очередной курсач? И время как-то неудобно выбрано... суббота как-никак
...
Рейтинг: 0 / 0
14.04.2013, 10:39
    #38224796
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
AndreTMХраните данные об операции одной записью: Дата, ДебетФонд, КредитФонд, Сумма
Тогда и учет, и выборки упростятся...

Я уже об этом думал, но "одна голова - хорошо...", а лучше - посоветоваться, а в данном случае одной моей - недостаточно :(
...
Рейтинг: 0 / 0
14.04.2013, 10:47
    #38224802
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
tanglirlabirintесли нужно - реорганизовать данныеlabirintкак минимум - в одной строке: из какого фонда в какой поступили средстваСлово "проводка" о чём-нибудь говорит? :)

Немного, знаю, что это из бухгалтерии, но как осуществить - еще нет.

labirint- лучше - если займ из одного фонда перекрывается обязательствами из другого фонда, то показать каким фондом перекрыть этот займНепонятно. Это что-то вроде "фонд А должен фонду Б 200, в то же время ему должны: В - 150, Г - 80, Д - 50. Вывести В и Д"? Или что? Может, пример приведёте?

В точности - как Вы написали.

labirint1) как вы думаете - можно ли какую-то часть этой задачи решать ОДНИМ запросом?Да.
labirint2) возможно ли задачу минимум решать при существующей организации хранения данных?Минимум - да.

Но, похоже, лучше сначала реорганизовать структуру данных и решить всю задачу оптимально?
...
Рейтинг: 0 / 0
14.04.2013, 10:49
    #38224807
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
Jonny540labirint... в таблицу, где хранятся данные о средствах фондов и их движении, при займе заносятся 2 записи - одна для фонда, из которого берут - с минусом, 2-я для фонда, в который деньги поступают. Должны быть не записи, а поля. Хотя информации недостаточно.

P.S. Это что, очередной курсач? И время как-то неудобно выбрано... суббота как-никак

Не курсач. Задача реальная. Стандартный бух-софт здесь не использовался изначально и пользуются этой информацией не бух-ры. Возможно поэтому "неадекват".
А суббота у меня получилась рабочая и уже не первая.
...
Рейтинг: 0 / 0
14.04.2013, 10:54
    #38224811
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
... не получилось правильно учесть цитаты и редактировать, поэтому переписываю...

tanglirСлово "проводка" о чём-нибудь говорит? :)

Немного. Знаю, что это из бухгалтерии, но как осуществить - еще нет.

tanglirНепонятно. Это что-то вроде "фонд А должен фонду Б 200, в то же время ему должны: В - 150, Г - 80, Д - 50. Вывести В и Д"? Или что? Может, пример приведёте?

В точности - как Вы написали.

tanglirМинимум - да.

Но, похоже, лучше сначала реорганизовать структуру данных и решить всю задачу оптимально?
...
Рейтинг: 0 / 0
14.04.2013, 11:08
    #38224817
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
labirintНе курсач. Задача реальная. Стандартный бух-софт здесь не использовался изначально и пользуются этой информацией не бух-ры. Возможно поэтому "неадекват".
А суббота у меня получилась рабочая и уже не первая.Да, не посмотрел профиль, сорри... Не только у тебя сб-вс рабочими бывают. :)

Насчет реорганизации данных: имно, фондов не очень много бывает - 5-10. Вполне всю инфу по движению денег можно хранить в одной строке.
Различать строки по дате, заодно потом можно "историю" показать. А насчет отображения - представляется что-то типа "таблицы чемпионата
по футболу", где в пересечениях стоит сумма (+S или -S или 0). На экран в 17" вполне влезет. Ну и общие итоги, etc.
Но это так, первое приближение, то, что первое приснилось... :)
...
Рейтинг: 0 / 0
14.04.2013, 11:19
    #38224825
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
labirinttanglirСлово "проводка" о чём-нибудь говорит? :)

Немного. Знаю, что это из бухгалтерии, но как осуществить - еще нет.
Погугли бухучет счета и двойная запись
...
Рейтинг: 0 / 0
14.04.2013, 13:07
    #38224859
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
Ну-у-уу, наро-о-од... Движемся в нужном направлении, всё же...
AndreTMХраните данные об операции одной записью: Дата, ДебетФонд, КредитФонд, Сумма tanglirСлово "проводка" о чём-нибудь говорит? :)Что ещё-то надо для учёта? Рассказать ТСу, как завести таблицу со списком фондов?
...
Рейтинг: 0 / 0
14.04.2013, 23:05
    #38225165
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
Jonny540Да, не посмотрел профиль, сорри... Не только у тебя сб-вс рабочими бывают. :)

Насчет реорганизации данных: имно, фондов не очень много бывает - 5-10. Вполне всю инфу по движению денег можно хранить в одной строке.

Ну, как написали выше - поля: дата, счет-дебет, счет-кредит, сумма, да? Фондов действительно не много. И записей пока не очень много. Пожалуй сделаю небольшой "парсер", и перегоню данные в новую таблицу с такой структурой. А дальше будем сохранять одновременно - как было и в новую таблицу, чтобы не переделывать то, что уже работает в других "модулях".

Jonny540Различать строки по дате, заодно потом можно "историю" показать. А насчет отображения - представляется что-то типа "таблицы чемпионата
по футболу", где в пересечениях стоит сумма (+S или -S или 0). На экран в 17" вполне влезет. Ну и общие итоги, etc.
Но это так, первое приближение, то, что первое приснилось... :)

Это надо согласовать с пользователем. Спасибо!
...
Рейтинг: 0 / 0
14.04.2013, 23:08
    #38225166
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
AndreTMНу-у-уу, наро-о-од... Движемся в нужном направлении, всё же...
AndreTMХраните данные об операции одной записью: Дата, ДебетФонд, КредитФонд, Сумма Что ещё-то надо для учёта? Рассказать ТСу, как завести таблицу со списком фондов?

Таблица со списком есть :)
Я как перенесу эти операции в таблицу с предложенной структурой, выйду дальше на обсуждение - как же выбирать данные в требуемом виде?
...
Рейтинг: 0 / 0
14.04.2013, 23:31
    #38225179
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
создал новую таблицу и задумался..........

В исходной таблице используем поля:
fmdate - дата,
fundid - фонд ИД,
fmsum - сумма,
oper_code - код операции

в которых:
в 2-х строках одинаковая дата
сумма: с минусом в фонде, откуда взято и с плюсом (т.е. без знака) - куда внесено
коды фондов
коды операции соответствующие:
займ отсюда - 3
займ сюда - 4
возврат отсюда - 6
возврат сюда - 7

Структура новой таблицы (как рекомендовали):
lod - дата операции
fromfund - из фонда (соответствует кодам 3 и 6)
tofund - в фонд (операции 4 и 7)
losum - сумма

Правильно ли сделал?

Возможно ли одним запросом это все скопировать в новую таблицу? Или придется писать что-то со сканом или do while?
...
Рейтинг: 0 / 0
15.04.2013, 05:24
    #38225260
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
AndreTMЧто ещё-то надо для учёта?Да всё уже есть, осталось только решить вот эту задачку:
labirinttanglirНепонятно. Это что-то вроде "фонд А должен фонду Б 200, в то же время ему должны: В - 150, Г - 80, Д - 50. Вывести В и Д"? Или что? Может, пример приведёте?В точности - как Вы написали.
labirintВозможно ли одним запросом это все скопировать в новую таблицу?Если на каждую дату у каждого фонда может быть не более одной операции (каждого типа, т.е. максимум 4 разных в один день), то да. Правда, он медленный будет, но всё равно это разовый запрос. Прочитал внимательно, увидел поле "код операции". Тогда ответ - можно.
labirintСтруктура новой таблицы (как рекомендовали):
lod - дата операции
fromfund - из фонда (соответствует кодам 3 и 6)
tofund - в фонд (операции 4 и 7)
losum - сумма

Правильно ли сделал?Код операции забыли :)
И если собираетесь различать займы и возвраты, то надо ещё поле добавить, с типом операции. Если оно вообще надо, конечно, ведь по сути у вас займ и возврат - одно и то же, это же не выдача кредитов какая-нибудь :)
...
Рейтинг: 0 / 0
15.04.2013, 12:35
    #38225668
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
tanglirlabirintВозможно ли одним запросом это все скопировать в новую таблицу? Прочитал внимательно, увидел поле "код операции". Тогда ответ - можно.

Уже легче. Подкиньте идею, плииз - как примерно оно может быть?
tanglirlabirintСтруктура новой таблицы (как рекомендовали):
lod - дата операции
fromfund - из фонда (соответствует кодам 3 и 6)
tofund - в фонд (операции 4 и 7)
losum - сумма

Правильно ли сделал?Код операции забыли :)
И если собираетесь различать займы и возвраты, то надо ещё поле добавить, с типом операции. Если оно вообще надо, конечно, ведь по сути у вас займ и возврат - одно и то же, это же не выдача кредитов какая-нибудь :)

В новой таблице код как-то не прижился - есть ведь "откуда" и "куда", соответственно понятно - где "минус". Хотя, похоже "займ/возврат" не помешают. Спрошу пользователя - надо ли ему видеть: займ это или возврат?
...
Рейтинг: 0 / 0
15.04.2013, 13:25
    #38225802
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
Так, стоп. Прочитал ещё внимательней .
oper_code - это 3/4/5/6, т.е. код типа операции (займ, возврат), а не уникальный код самой операции? Тогда снова встаёт вопрос - на каждую дату у каждого фонда может быть более одной операции (каждого типа, т.е. максимум 4 разных в один день) или нет?
Если не может, то вот набросок:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 
 fmdate as lod
 ,o1.fundid as fromfund
 ,o2.fondid as tofund
 ,o1.fmsum
from old_table o1
join old_table o2 on o1.fmdate=o2.fmdate
 and o1.oper_code=3 and o2.oper_code=4 
 or o1.oper_code=6 and o2.oper_code=7
...
Рейтинг: 0 / 0
15.04.2013, 13:41
    #38225839
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
tanglirна каждую дату у каждого фонда может быть более одной операции ...
ты в join фонд забыл включить :)
и скобки в and ... or

лучше по дате-сумме, если все в один день происходит и сумма только знаком отличается.
Код: sql
1.
on o1.fundid=o2.fundid and o1.fmdate=o2.fmdate and on o1.sum=-o2.sum


единственное проверить что в один день по каждому фонду одна сумма проходит один раз с плюсом и один с минусом.
Этот запрос покажет "нездоровые" комбинации :
Код: sql
1.
2.
3.
4.
select fundid, fmdate, sum(sum) as nenol, count(*) as nCnt;
    from old_table;
    group by fundid, fmdate;
    having nenol != 0 or nCnt != 2
...
Рейтинг: 0 / 0
15.04.2013, 13:46
    #38225845
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
Dima Tты в join фонд забыл включить :)
Упс, это я его зря включил

исправляюсь
Код: sql
1.
on o1.fmdate=o2.fmdate and on o1.sum=-o2.sum


проверочный
Код: sql
1.
2.
3.
4.
select fmdate, sum(sum) as nenol, count(*) as nCnt;
    from old_table;
    group by fmdate;
    having nenol != 0 or nCnt != 2
...
Рейтинг: 0 / 0
15.04.2013, 15:39
    #38226071
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
tanglirТак, стоп. Прочитал ещё внимательней .
oper_code - это 3/4/5/6, т.е. код типа операции (займ, возврат), а не уникальный код самой операции? Тогда снова встаёт вопрос - на каждую дату у каждого фонда может быть более одной операции (каждого типа, т.е. максимум 4 разных в один день) или нет?
Если не может, то вот набросок:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 
 fmdate as lod
 ,o1.fundid as fromfund
 ,o2.fondid as tofund
 ,o1.fmsum
from old_table o1
join old_table o2 on o1.fmdate=o2.fmdate
 and o1.oper_code=3 and o2.oper_code=4 
 or o1.oper_code=6 and o2.oper_code=7



Просто хочется сказать ВАУ! Спасибо!

oper_code - это код типа операции. Уникальные коды тоже есть, но они идут в общем потоке приходов/расходов фонда и как мне кажется в данном случае не помогут.
У любого фонда количество таких операций в сутки не ограничено программно. Также нет ограничений организационных, т.о. попадаются операции займа и погашения в один и тот же день и любые другие.
...
Рейтинг: 0 / 0
15.04.2013, 15:50
    #38226099
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
Dima Tи скобки в and ... or
............
единственное проверить что в один день по каждому фонду одна сумма проходит один раз с плюсом и один с минусом.


Одна сумма проходит по одному фонду с минусом, а по другому с плюсом, а не 2 записи по одному фонду с "+" и "-". Но Одна и та же сумма может, в принципе, пройти за день дважды из одного фонда в другой - т.е. 2 займа за день на одинаковую сумму.
...
Рейтинг: 0 / 0
15.04.2013, 15:57
    #38226112
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
labirintУ любого фонда количество таких операций в сутки не ограничено программноТогда благодарить ещё ой как рано. То есть постулировать уникальность (фонд-операция-дата) мы не можем. Ну а как насчёт (фонд-операция-дата-сумма)? Если оно уникально, то поможет такое (спасибо Dima T за напоминание о скобках):
Код: sql
1.
2.
3.
4.
join old_table o2 on o1.fmdate=o2.fmdate
 and (o1.oper_code=3 and o2.oper_code=4 
  or o1.oper_code=6 and o2.oper_code=7)
 and o1.fmsum=-o2.fmsum

В общем, Вам необходимо как-то найти уникальный идентификатор операции, иначе что делать вот с таким, например (всё проходит одной датой):фондтип_операциисумма1выдача займа2001выдача займа2002получение займа2003получение займа200Какая из первых двух строк связана с третьей, а какая с четвёртой?
...
Рейтинг: 0 / 0
15.04.2013, 15:58
    #38226119
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
labirintНо Одна и та же сумма может, в принципе, пройти за день дважды из одного фонда в другой - т.е. 2 займа за день на одинаковую сумму.Тады ой. Ищите уник, иначе придётся делать сканами.
...
Рейтинг: 0 / 0
15.04.2013, 16:47
    #38226277
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
Сканами в принципе не сложно.
Исхожу из того что выдача и получение происходит в один день, а также при выдаче из одного фонда вся сумма попадает в другой (а не частями в несколько).
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
* Исходные данные
create cursor oper (dDate d, nFondId i, nSum y)
insert into oper values ({^2013-01-02}, 1, 200)
insert into oper values ({^2013-01-02}, 2, -200)
insert into oper values ({^2013-01-02}, 1, 200)
insert into oper values ({^2013-01-02}, 3, -200)
insert into oper values ({^2013-01-05}, 4, 50)
insert into oper values ({^2013-01-05}, 1, -50)
insert into oper values ({^2013-01-05}, 3, 3000)
insert into oper values ({^2013-01-05}, 2, -3000)
* выборка выдач (отрицательные суммы)
select *, cast(0 as int) as nFondPolId from oper;
	where nSum < 0;
	order by dDate, nSum desc;
	into cursor tVidano readwrite

* выборка получений (положительные суммы)
select *, cast(0 as int) as nFondVidId from oper;
	where nSum > 0;
	order by dDate, nSum;
	into cursor tPolucheno readwrite

* Простановка второго фонда в каждый курсор
sele tVidano
scan
	if tVidano.dDate != tPolucheno.dDate or tVidano.nSum != -tPolucheno.nSum
		MessageBox('Косяк в исходных данных')
		exit
	endif
	repl in tVidano nFondPolId with tPolucheno.nFondId
	repl in tPolucheno nFondVidId with tVidano.nFondId
	skip in tPolucheno
endscan

brow
...
Рейтинг: 0 / 0
16.04.2013, 00:01
    #38226776
labirint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL запрос - делаю в Фоксе учет финансов
Dima TСканами в принципе не сложно.
Исхожу из того что выдача и получение происходит в один день, а также при выдаче из одного фонда вся сумма попадает в другой (а не частями в несколько).


Да, так.

вижу, что 2-мя запросами и сканом можно перенести данные.
Спасибо за код!
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SQL запрос - делаю в Фоксе учет финансов / 25 сообщений из 40, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]