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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В новой таблице код как-то не прижился - есть ведь "откуда" и "куда", соответственно понятно - где "минус". Хотя, похоже "займ/возврат" не помешают. Спрошу пользователя - надо ли ему видеть: займ это или возврат?
...
Рейтинг: 0 / 0
SQL запрос - делаю в Фоксе учет финансов
    #38225802
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
...
Рейтинг: 0 / 0
SQL запрос - делаю в Фоксе учет финансов
    #38225839
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL запрос - делаю в Фоксе учет финансов
    #38225845
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL запрос - делаю в Фоксе учет финансов
    #38226071
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
SQL запрос - делаю в Фоксе учет финансов
    #38226099
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tи скобки в and ... or
............
единственное проверить что в один день по каждому фонду одна сумма проходит один раз с плюсом и один с минусом.


Одна сумма проходит по одному фонду с минусом, а по другому с плюсом, а не 2 записи по одному фонду с "+" и "-". Но Одна и та же сумма может, в принципе, пройти за день дважды из одного фонда в другой - т.е. 2 займа за день на одинаковую сумму.
...
Рейтинг: 0 / 0
SQL запрос - делаю в Фоксе учет финансов
    #38226112
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
SQL запрос - делаю в Фоксе учет финансов
    #38226119
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
labirintНо Одна и та же сумма может, в принципе, пройти за день дважды из одного фонда в другой - т.е. 2 займа за день на одинаковую сумму.Тады ой. Ищите уник, иначе придётся делать сканами.
...
Рейтинг: 0 / 0
SQL запрос - делаю в Фоксе учет финансов
    #38226277
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сканами в принципе не сложно.
Исхожу из того что выдача и получение происходит в один день, а также при выдаче из одного фонда вся сумма попадает в другой (а не частями в несколько).
Код: 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
SQL запрос - делаю в Фоксе учет финансов
    #38226776
labirint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TСканами в принципе не сложно.
Исхожу из того что выдача и получение происходит в один день, а также при выдаче из одного фонда вся сумма попадает в другой (а не частями в несколько).


Да, так.

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


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