powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP:Выборка без sql-как грамотно организовать цикл?
18 сообщений из 18, страница 1 из 1
VFP:Выборка без sql-как грамотно организовать цикл?
    #33570812
Zverka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
prod_waste_table с полями prod_id , waste_id , prod_val , waste_per
waste_table с полями waste_id , waste_name , toxity_id связана с prod_waste_table по waste_id
prod_table с полями prod_id , prod_name связана с prod_waste_table по prod_id
надо определить prod_name, у которого sum(prod_val*waste_per) максимальна для toxity_id
всего toxity_id может быть 5(1,2,3,4,5), отходов - много-много-много...
то есть нужна таблица(курсор) maxtotal: toxity_id, prod_name, max_total_waste (для сравнения с sql)
куда надо выбрать prod_name, которое выдает максимальное sum(prod_val*waste_per) as max_total_waste
для сего надо написать sql-запрос и запрос без использования sql
sql я написала ))
без sql пока выглядит так(с помощью одного замечателнього человека с другого форума):

Select 0
Use prod_table Order Tag prod_id
Select 0
Use waste_table Order Tag waste_id
Select 0
Use prod_waste_table Order Tag prod_id
* Открываем еще раз prod_waste_table с другим тэгом так как связать
* waste_table и prod_table мы можем только через prod_waste_table можно это
* конечно делать переключая тэги у дной таблицы и запоминая найденый
* значения нужных полей но так проще
Select 0
Use prod_waste_table Order Tag waste_id ALIAS waste_id AGAIN

Create Cursor Maxtotal (toxity_id i, prod_name c(250), total_waste i)
INDEX ON total_waste TAG total_waste

Select waste_table
Scan All
* стали на нужную запись в prod_waste_table по тагу waste_id
IF Seek(waste_table.waste_id, 'waste_id')

* по prod_id из prod_waste_table нашли нужную запись в prod_table
IF Seek(waste_id.prod_id, 'prod_table')

* по prod_id из prod_table нашли нужную запись в prod_waste_table для суммирования
IF Seek(prod_table.prod_id, 'prod_waste_table')

* ВЫбрали prod_waste_table в качестве текущей
Select prod_waste_table
Sum prod_waste_table.prod_val*prod_waste_table.waste_per To m.total_waste ;
WHILE prod_waste_table.prod_id = prod_table.prod_id Rest

m.toxity_id=waste_table.toxity_id
m.prod_name=prod_table.prod_name
Insert Into Maxtotal From Memvar
ENDIF
ENDIF
ENDIF
Endscan

Select Maxtotal
Go bott
Brows

итоговая должна выглядеть так, например:
1 prod1 45454
2 prod3 44477
3 prod1 121
4 - 0
5 prod6 68

можно без четвертой..

но по вышеприведенному коду считает он неправильно, учитывая все отходы данного производства. а нужно выбирать максимальный отход данной токсичности.
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33570895
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо курсовые решать с интернетом :)
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33570907
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
w3dХорошо курсовые решать с интернетом :)
А потом все удивляются, почему программисты FoxPro мягко говоря "неадекватные"
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571002
Zverka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
w3dХорошо курсовые решать с интернетом :)
это не курсовааааяя, это задачка для студенток-второкурсниц экологического факультета... для меня, то есть....
добрые вы....
лучше б помогли...
я над ней две недели уже страдаю. сделала почти все, кроме этого вот.
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571016
Zverka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Ch w3dХорошо курсовые решать с интернетом :)
А потом все удивляются, почему программисты FoxPro мягко говоря "неадекватные"
я не программист. я эколог. будущий. если сдам вот эту вот задачу...
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571135
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
замени
Код: plaintext
1.
2.
3.
m.toxity_id=waste_table.toxity_id
m.prod_name=prod_table.prod_name
Insert Into Maxtotal From Memvar
на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
sele maxtotal
loca for Maxtotal.toxity_id = waste_table.toxity_id and Maxtotal.prod_name = prod_table.prod_name
if !found()
	append blank in Maxtotal
	repl in Maxtotal toxity_id with waste_table.toxity_id, prod_name with prod_table.prod_name
endif
repl in Maxtotal total_waste with Maxtotal.total_waste + m.total_waste
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571156
Zverka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tзамени
Код: plaintext
1.
2.
3.
m.toxity_id=waste_table.toxity_id
m.prod_name=prod_table.prod_name
Insert Into Maxtotal From Memvar
на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
sele maxtotal
loca for Maxtotal.toxity_id = waste_table.toxity_id and Maxtotal.prod_name = prod_table.prod_name
if !found()
	append blank in Maxtotal
	repl in Maxtotal toxity_id with waste_table.toxity_id, prod_name with prod_table.prod_name
endif
repl in Maxtotal total_waste with Maxtotal.total_waste + m.total_waste


заменила...
то же самое, получилось...
все равно, спасибо.
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571259
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-запрос покажи. а то плохо понятно что надо.
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571276
Zverka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема в том, как же, елки-палки, это посчитать.
то есть надо в prod_waste_table посчитать для всех строк prod_val*waste_per , заменить waste_id на соответствующий toxity_id из waste_table , сложить те строки, у которых prod_id и toxity_id одинаковый, для пяти toxity_id выбрать максимальные показания и заменить prod_id на prod_nam e из prod_table
ясно, что нужен цикл.
какой?
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571307
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
sele prod_table
scan
	sele waste_table
	scan
		sele prod_waste_table
		Sum prod_waste_table.prod_val*prod_waste_table.waste_per To m.total_waste ;
			for prod_waste_table.prod_id = prod_table.prod_id and prod_waste_table.waste_id = waste_table.waste_id
		sele maxtotal
		loca for Maxtotal.toxity_id = waste_table.toxity_id and Maxtotal.prod_name = prod_table.prod_name
		if !found()
			append blank in Maxtotal
			repl in Maxtotal toxity_id with waste_table.toxity_id, prod_name with prod_table.prod_name
		endif
		repl in Maxtotal total_waste with Maxtotal.total_waste + m.total_waste
	endscan
endscan
вместо
Код: plaintext
1.
2.
3.
scan
...
endscan

Если не то - показывай правильный SQL запрос. его кодом повторять проще не вникая в суть задачи
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571348
Zverka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TSQL-запрос покажи. а то плохо понятно что надо.

*q1*
CLOSE DATABASES
OPEN DATABASE iw_data
USE prod_table
USE waste_table
USE prod_waste_table

SELECT Prod_waste_table.prod_id, Prod_table.prod_name,;
Waste_table.toxity_id,;
SUM(Prod_waste_table.prod_val*Prod_waste_table.waste_per) as total_waste;
FROM ;
iw_data!prod_table ;
INNER JOIN iw_data!prod_waste_table ;
ON Prod_table.prod_id = Prod_waste_table.prod_id ;
INNER JOIN iw_data!waste_table ;
ON Waste_table.waste_id = Prod_waste_table.waste_id;
GROUP BY Prod_waste_table.prod_id, Prod_table.prod_name,;
Waste_table.toxity_id;
INTO CURSOR q11

*q2*

Select (Max(total_waste)) As max_total_waste, toxity_id ;
From q11 ;
Group By toxity_id;
INTO CURSOR q22

Select t1.toxity_id, t1.prod_name, t1.total_waste;
FROM q11 As t1, q22 As m;
WHERE t1.toxity_id = m.toxity_id And t1.total_waste = m.max_total_waste


таблички лежат тут:

http://coraclaire.narod.ru/vfp/waste_table.dbf
http://coraclaire.narod.ru/vfp/prod_waste_table.dbf
http://coraclaire.narod.ru/vfp/prod_table.dbf
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571484
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Держи

Код: plaintext
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.
36.
37.
38.
39.
close data all
Use prod_table in  0 
Use waste_table in  0 
Use prod_waste_table in  0 

Create Cursor Maxtotal (toxity_id i, prod_name c( 250 ), total_waste i)

sele prod_table
scan
	sele waste_table
	scan
		sele prod_waste_table
		Sum prod_waste_table.prod_val*prod_waste_table.waste_per To m.total_waste ;
			for prod_waste_table.prod_id = prod_table.prod_id and prod_waste_table.waste_id = waste_table.waste_id
		sele maxtotal
		loca for Maxtotal.toxity_id = waste_table.toxity_id and Maxtotal.prod_name = prod_table.prod_name
		if !found()
			append blank in Maxtotal
			repl in Maxtotal toxity_id with waste_table.toxity_id, prod_name with prod_table.prod_name
		endif
		repl in Maxtotal total_waste with Maxtotal.total_waste + m.total_waste
	endscan
endscan

* Убираем лишнее
Select Maxtotal
index on str(toxity_id,  10 ) + str(total_waste,  10 ) tag tt desc
m.prev_toxity_id = - 1 
scan
	if Maxtotal.toxity_id != m.prev_toxity_id
		m.prev_toxity_id = Maxtotal.toxity_id
	else
		delete in maxtotal
	endif
endscan
index on total_waste tag tw desc

Go top
Brows
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571510
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что я накорябал ;-)

Код: plaintext
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.
   prod_wst (отходы продуктов)
   ----
+--prod_id n(5)
|+-waste_id n(5)
|| prod_val n(10,2)
|| waste_per n(10,2)
||
|| waste (отход)
|| ----
|+-waste_id n(5)
|  waste_name c(32)
|  toxity_id n(1)
|
|  prod (продукт)
|  ----
+--prod_id n(5)
   prod_name c(32)

надо определить prod_name, у которого sum(prod_val*waste_per) максимальна для toxity_id
всего toxity_id может быть 5(1,2,3,4,5), отходов - много-много-много...
то есть нужна таблица(курсор)

maxtotal
----
toxity_id n(1)
prod_name c(32)
maxtot_wst n(16,4)

куда надо выбрать prod_name, которое выдает максимальное sum(prod_val*waste_per) as max_total_waste

Код: plaintext
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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
set exact off

create cursor maxtotal (toxity_id n( 1 ), prod_name c( 32 ), maxtot_wst n( 16 , 4 ))
use waste in  0  order waste_id
use prod in  0  order prod_id
use prod_wst in  0 
set relation to prod_id into prod additive
set relation to waste_id into waste additive
index on str(waste.toxity_id, 1 )+prod.prod_name to tmpidx

curtox = - 1  && явно несуществующее значение
curprod = '!@#$%^&*()!@#$%^&*()!@#$%^&*()!@#' && явно несуществующее значение
cursum =  0 

scan
 if curprod != prod.prod_name or curtox != waste.toxity_id
  * новый продукт или уровень токсичности
  select maxtotal
  * надо проверить, накопленная сумма больше ли, чем сохраненная в maxtotal
  if curtox != - 1  and curprod != '!@#$%^&*()!@#$%^&*()!@#$%^&*()!@#' and cursum > maxtot_wst
   replace prod_name with prod_name, maxtot_wst with cursum
  endif
  * если новый toxity_id, добавить в результат новую запись
  if curtox != waste.toxity_id
   append blank
   replace toxity_id with waste.toxity_id
  endif
  select prod_wst
  * сброс суммы и сохранение новых "кур"
  cursum =  0 
  curprod = prod.prod_name
  curtox = waste.toxity_id
 else
  cursum = cursum + prod_val*waste_per
 endif
endscan
* последнюю cursum надо тоже проверить
select maxtotal
if curtox != - 1  and curprod != '!@#$%^&*()!@#$%^&*()!@#$%^&*()!@#' and cursum > maxtot_wst
  replace prod_name with prod_name, maxtot_wst with cursum
endif
browse last

use in (select('waste'))
use in (select('prod'))
use in (select('prod_wst'))
use in (select('maxtotal'))

erase tmpidx.idx
Некоторые таблицы и поля переименованы, так как у меня строго: имя файла - 8 букв или <, имя поля - 10 или <.
Типы и размеры данных взяты предположительные, чтобы хоть какие-то бли.
Сразу может не заработать, так как писал "набело". ;-)
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571521
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой вариант пока самый лучший - он реализует выборку в один проход (не считая построения индекса, конечно) ;-)))
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571571
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Urri...
Сразу может не заработать, так как писал "набело". ;-)

Все сдаюсь, но за тобой исправлять ошибки не буду
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571579
Zverka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Супер!!!
чуток изменила только в конце

Go Top
SET FILTER TO !DELETED()
Brows

и все стало в шоколаде!

Большое Спасибо!!! :) будешь в Казани, буду отпаивать чаем с печенюжками! или пивом :)
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571595
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zverka...
SET FILTER TO !DELETED()
...


обычно SET DELETED ON
по умолчанию ставят чтобы помеченные на удаление не видеть.
...
Рейтинг: 0 / 0
VFP:Выборка без sql-как грамотно организовать цикл?
    #33571710
Zverka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T Zverka...
SET FILTER TO !DELETED()
...


обычно SET DELETED ON
по умолчанию ставят чтобы помеченные на удаление не видеть.

ну у меня там меню редактирования есть, где все помеченные на удаление и удаляются, если это разрешено условиями...

как-то не подумала, что где-то еще будут видны помеченные записи....
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP:Выборка без sql-как грамотно организовать цикл?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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