Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / вычисление / 25 сообщений из 27, страница 1 из 2
28.02.2013, 10:01
    #38169103
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Здравствуйте! Не знаю как решить такую задачу так как недавно совсем начал изучать фокспро.
Есть таблица "Обязанности", в ней хранятся: наименование, номер отдела, номер исполнителя. Есть другая таблица "ВСЕГООБЯЗ", в котором содержатся все обязанности, которые только могут быть для данной организации. В таблице "ВСЕГООБЯЗ" есть поля: название, колво_подобяз.(т.е. количество подобязанностей), номер отдела. И есть таблица "Исполнители", тут поля: номер, ФИО,номеротдела.

Мне нужно сделать такое: Рассчитать сколько обязанностей выполнил каждый исполнитель: алгоритм такой: нужно для выбранного отдела отфильтровать таблицу "обязанности", далее для исполнителей ищем: если для первого допустим нашли его обязанность, то эту обязанность умножаем на количество подобязанностей из таблицы "ВСЕГООБЯЗ", и так для всех исполнителей. Подскажите как начать реализацию этой задачи?
...
Рейтинг: 0 / 0
28.02.2013, 10:28
    #38169152
вычисление
Новый2013,

Это несложно...
Варианта решений два:
1. Связать необходимые таблицы (исполнители и обязанности) по SET RELATION и реализовать Ваш алгоритм просмотром всех записей (или через do while... enddo, или через scan ... endscan)

2. Написать запрос SQL, который делает то же самое...


Одно только мне не понятно: по вашей схеме получается, что Подобязанности не связаны с обязанностями, а только с отделом. Это так и должно быть?
...
Рейтинг: 0 / 0
28.02.2013, 10:51
    #38169188
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Станислав С...кий, они связаны, в обеих таблицах есть поле номер_обязанности. А вы не могли бы примерный код прописать через цикл? я плохо себе представляю как это сделать
...
Рейтинг: 0 / 0
28.02.2013, 10:54
    #38169192
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Станислав С...кий, только вот не Подобязанности таблица, а "ВСЕГООБЯЗ", оно содержит список всех обязанностей, а в таблице "Обязанности" хранится информация какою обязанность исполнитель выполнил. т.е. там хранится дата исполнения обязанности, номер исполнителя, номер обязанности из "ВСЕГООБЯЗ", цена,номеротдела и другие поля(другие поля не нужны)
...
Рейтинг: 0 / 0
28.02.2013, 11:18
    #38169235
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Новый2013,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
 p.number
 ,sum(da.subduties_count)
from performers /*исполнители*/ as p
left join duties /*обязанности*/ as d 
 on p.number=d.performer_number
left join duties_agg /*всегообяз*/ as da 
 on d.name=da.name
where p.division=123456 /*фильтр по отделу*/
group by p.number
...
Рейтинг: 0 / 0
28.02.2013, 11:25
    #38169241
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
tanglir, а на англ, какое поле что означает не могли бы вы указать? если не сложно вам
...
Рейтинг: 0 / 0
28.02.2013, 11:47
    #38169277
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
tanglir, Что-то я в вашем коде умножения не вижу. Давайте я скажу на англ. какие поля есть:

Таблица Obyaz поля: nam(название),n_otd(номер отдела),vr(номер исполнителя),dat_obs(дата обследования),n_met(номер обязанности)
Таблица VsegoObyaz поля: Namm(название),n_otd(номер отдела),n_met(номер обязанности), k_issl(количество под.обязанностей)
Таблица Ispolniteli поля: vr(номер исполнителя), fio(фио),n_otd(номер отдела).

Теперь в таблице Obyaz одна запись это одна обязанность. Надо каждую обязанность умножить на поле k_issl.

А когда уже все умножится, то для каждого исполнителя сколько обязанностей, это я сам попробую
...
Рейтинг: 0 / 0
28.02.2013, 11:57
    #38169297
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Новый2013Что-то я в вашем коде умножения не вижу.Как только вы объясните, что значитНовый2013обязанность умножить на поле k_issl, а именно, как можно сущность умножить на число и что должно быть результатом сего действия, так оно там, скорее всего, и появится :)
А ещё лучше - приведите пример - по кусочку каждой из таблиц, записей по 5-10, и желаемый результат. Использование тега [ csv ] приветствуется.
...
Рейтинг: 0 / 0
28.02.2013, 12:10
    #38169321
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
tanglir, На счет того что строку на число умножить я сам не понимаю почему так сказал мне шеф), но он сказал каждую обязанность умножить на k_issl. Может надо через цикл? в какую-то переменную заносить? одна строка из Obyaz Это есть одна обязанность.
...
Рейтинг: 0 / 0
28.02.2013, 12:18
    #38169338
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Новый2013tanglir, На счет того что строку на число умножить я сам не понимаю почему так сказал мне шеф),Тогда у шефа и уточните. Мы ведь с ним даже не знакомы, скорее всего :)
...
Рейтинг: 0 / 0
28.02.2013, 12:27
    #38169349
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
tanglir, я ему предложил заносить в новую таблицу нужные поля из Obyaz и новое поле Kol со значением 1 везде. т.к. 1 запись это одна обязанность и это поле умножать на поле k_issl, если я правильно понимаю, то что он хочет от меня, то так можно сделать мне кажется или я ошибаюсь?
...
Рейтинг: 0 / 0
28.02.2013, 12:36
    #38169363
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Новый2013какое поле что означает"number"/"performer_number" = "vr"
"name" = "n_met"
"division" = "n_otd"Новый2013если я правильно понимаю, то что он хочет от меня, то так можно сделатьда, если правильно понимаете, то можно :)Новый2013или я ошибаюсь?не знаю, вам виднее :)
...
Рейтинг: 0 / 0
28.02.2013, 12:59
    #38169411
вычисление
Новый2013,
По моему должно быть так:
Код: sql
1.
2.
3.
4.
5.
6.
select ispolniteli.vr, obyaz.n_met, sum(NVL(vesgoobyaz.k_issl,0)) as k_issl, min(ispolniteli.name) as name, min(NVL(obyaz.name,"")) as obyaz_name
from ispolniteli
left join obyaz on obyaz.n_otd = ispolniteli.n_otd and obyaz.vr = ispolniteli.vr
left join vsegoobyaz on vsegoobyaz.n_met = obyaz.n_met and vesgoobyaz.n_otd = obyaz.n_otd
where ispolniteli.n_otd = 5
group by 1,2



автор новое поле Kol со значением 1 везде. т.к. 1 запись это одна обязанность и это поле умножать на поле k_issl, если я правильно понимаю, то что он хочет от меня, то так можно сделать

Это совершенно не обязательно делать. И так получается нормально. Ибо 1*k_issl = k_issl...
...
Рейтинг: 0 / 0
28.02.2013, 13:04
    #38169421
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Станислав С...кий, Спасибо, я сейчас попробую ,а вы не могли бы прокомментировать что делается на каждой строке, хотелось бы понять принцип работы вашего кода.
...
Рейтинг: 0 / 0
28.02.2013, 13:42
    #38169486
вычисление
Станислав С...кийНовый2013,
По моему должно быть так:
Код: sql
1.
2.
3.
4.
5.
6.
select ispolniteli.vr, obyaz.n_met, sum(NVL(vesgoobyaz.k_issl,0)) as k_issl, min(ispolniteli.name) as name, min(NVL(obyaz.name,"")) as obyaz_name
from ispolniteli
left join obyaz on obyaz.n_otd = ispolniteli.n_otd and obyaz.vr = ispolniteli.vr
left join vsegoobyaz on vsegoobyaz.n_met = obyaz.n_met and vesgoobyaz.n_otd = obyaz.n_otd
where ispolniteli.n_otd = 5
group by 1,2




первая строка - список полей в формате имя таблицы.имя поля; sum() - функция суммирования значений, min() - функция нахождения минимума, NVL() - функция подмены значения NULL в обозначенном поле на некоторое заданное значение
вторая строка - данные берутся из таблицы исполнители
третья строка - которая связана с таблицей обязанностей по условию obyaz.n_otd = ispolniteli.n_otd and obyaz.vr = ispolniteli.vr
четвертая строка - с результатом связывается таблица всегообяз по условию vsegoobyaz.n_met = obyaz.n_met and vesgoobyaz.n_otd = obyaz.n_otd
пятая строка - указывается, что нам нужны не все данные, а толькго для отдела с номером 5
шестая строка - полученные результаты выборки группируются по первому и второму полю выборки; группировка обозначает, что по функциям, указанным в первой строке (сумма, минимум), вычисляются итоги для всех уникальных сочетаний vr + n_met

В общем, читайте книжки по SQL. Это сейчас используется почти везде.
Перефразируя классика, можно сказать: "FOXPRO ты можешь и не знать, но SQL ты знать - обязан!"
...
Рейтинг: 0 / 0
28.02.2013, 14:04
    #38169563
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Станислав С...кий, vr + n_met тут вы складываете номер исполнителя и номер обязанности. это не нужно мне. Мне нужно так,

Напишу по пунктам:
1. Занести в курсор CURS1 поля Obyaz.nam,Obyaz.n_met,Obyaz.vr,Obyaz.n_otd и VsegoObyaz.k_issl (получаем,что для каждой обязанности нашли кол-во подобязанностей)

2. В курсор CURS2 занести поля: Ispolnoteli.vr и соответствующее значение из CURS1.vr

3. В Курсорк CURS3 занести Ispolnoteli.vr и сумму sum(CURS2.vr)

помогите сделать этот алгоритм по пунктам, я бы хотел разобрать по частям как я тут указал по пунктам.
...
Рейтинг: 0 / 0
28.02.2013, 14:20
    #38169604
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
было бы хорошо если это делать в цикле потому что прежде чем выполнять это будет происходить фильтрация по начальной и конечной дате, которую пользователь может менять.
...
Рейтинг: 0 / 0
28.02.2013, 14:27
    #38169619
вычисление
Новый2013Станислав С...кий, vr + n_met тут вы складываете номер исполнителя и номер обязанности. это не нужно мне. Мне нужно так,

Напишу по пунктам:
1. Занести в курсор CURS1 поля Obyaz.nam,Obyaz.n_met,Obyaz.vr,Obyaz.n_otd и VsegoObyaz.k_issl (получаем,что для каждой обязанности нашли кол-во подобязанностей)

Код: sql
1.
2.
3.
4.
select  Obyaz.nam,Obyaz.n_met,Obyaz.vr,Obyaz.n_otd, VsegoObyaz.k_issl 
from obyaz 
left join vsegoobyaz on vsegoobyaz.n_met = obyaz.n_met and vesgoobyaz.n_otd = obyaz.n_otd
into cursor curs1


Новый20132. В курсор CURS2 занести поля: Ispolnoteli.vr и соответствующее значение из CURS1.vr

Код: sql
1.
2.
3.
4.
select  Curs1.vr,Curs1.n_otd,Ispolnoteli.vr
from ispolniteli
left join curs1 on curs1.n_otd = ispolniteli.n_otd and curs1.vr = ispolniteli.vr
into cursor curs2


Новый20133. В Курсорк CURS3 занести Ispolnoteli.vr и сумму sum(CURS2.vr)

Код: sql
1.
2.
3.
select  Curs2.vr, sum(Curs2.vr) as summa_vr 
from curs2
group by 1



Как-то так... каков алгоритм, таково и решение...
...
Рейтинг: 0 / 0
28.02.2013, 14:29
    #38169623
вычисление
Новый2013было бы хорошо если это делать в цикле потому что прежде чем выполнять это будет происходить фильтрация по начальной и конечной дате, которую пользователь может менять.
Какие еще дополнительные условия Вы забыли сказать? А то получится, что вместо игрушечной машинки Вы за те же деньги запросите "Феррари"...
...
Рейтинг: 0 / 0
28.02.2013, 14:42
    #38169654
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Станислав С...кий, я не забыл ничего, какое задание дали так и прописал тут. Сейчас буду разбираться и смотреть ваш код. Спасибо.
...
Рейтинг: 0 / 0
28.02.2013, 14:46
    #38169665
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Станислав С...кий, Да уж, оказалось очень легко все. Но я вначале не понял задание т.к. мне сказали есть форма, где рассчитывается нагрузка за какой-то месяц и надо делать по тому же алгоритму я открыл его и там на 7 листов код. Сегодня сказал шеф, чтобы узнать количество обязанностей нужно подобязанности умножить на каждую обязанность и сложить.
...
Рейтинг: 0 / 0
28.02.2013, 14:59
    #38169683
вычисление
Новый2013 надо делать по тому же алгоритму... я открыл его и там на 7 листов код.

Может там на 6 листах проверки различные стоят... Сначала входных параметров, затем результатов....
У меня на работе тоже много подобного кода: сам расчет занимает пару строчек, зато различные проверки - на пять страниц...
Но без этого - тоже никуда... Как говорится - "необходимое зло"...
...
Рейтинг: 0 / 0
28.02.2013, 15:14
    #38169710
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Станислав С...кий, замечу, что вы опять просуммировали поле VR. VR - это номер исполнителя, т.е. номер может быть равен даже 500, а k_issl - это количество подобязанностей. надо было его сложить. Но все равно спасибо, это мелочь
...
Рейтинг: 0 / 0
28.02.2013, 15:19
    #38169718
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
Да, там проверки, но проверки тех таблиц, которые мне не нужны. А у меня некоторые значения полей получаются NULL с чем это может быть связано?
...
Рейтинг: 0 / 0
28.02.2013, 15:35
    #38169749
Новый2013
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вычисление
У меня возник такой вопрос: В полях появляются NULL. Я написал такой код, немного добавив поля и отфильтровав по дате:

Код: 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.
select  obyaz.dat_obs,obyaz.nam,obyaz.n_met,obyaz.vr,obyaz.n_otd, vsegoobyaz.k_issl ;
from obyaz;
left join vsegoobyaz on vsegoobyaz.n_met = obyaz.n_met and vsegoobyaz.n_otd = obyaz.n_otd;
into cursor curs4

select * from curs4 where (dat_obs >= ctod('01.'+ALLTRIM(str(MONTH(DATE())))+'.'+ALLTRIM(STR(YEAR(DATE()))))) ;
					AND (dat_obs < ctod(uday+'.'+ALLTRIM(str(MONTH(DATE())))+'.'+ALLTRIM(STR(YEAR(DATE()))))) AND n_otd=votd into cursor curs1
					
select curs1
brow

select  curs1.k_issl,Curs1.vr,Curs1.n_otd,ispolniteli.vr As dvr,ispolniteli.fio;
from ispolniteli;
left join curs1 on curs1.n_otd = ispolniteli.n_otd and curs1.vr = ispolniteli.vr;
into cursor curs2

select curs2
brow

select  Curs2.fio,Curs2.dvr, sum(Curs2.k_issl) as summa_vr ;
from curs2;
group by 1 into cursor curs3

select curs3
brow



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


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