powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с SELECT
14 сообщений из 14, страница 1 из 1
Помогите с SELECT
    #32815595
nfp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nfp
Гость
Если можно то помогите пожалуйста по 2-м вопросам
1 Можно ли использовать свои функции в SELECT ? Мне нужно выполнить примерно следующее

SELECT ostmet_cex_sql.nnkor,ostmet_cex_sql.kodc_iz,ostmet_cex_sql.kei,
osm_nm,ostmet_cex_sql.data_m,;
ostmet_cex_sql.pol_met,ostmet_cex_sql.nnkor,my_sum(tmp2.s_det) as rasx;
FROM ostmet_cex_sql;
INNER JOIN tmp2 ON ostmet_cex_sql.nnkor= tmp2.nnkor AND ostmet_cex_sql.kodc_iz= tmp2.kod_c ;
INTO CURSOR ostmet_sql
*******
FUNCTION my_sum
PARAMETERS kol_det
sumras=0
DO CASE
CASE ALLTRIM(ostmet_cex_sql.kei)='50'
sumras=ROUND(tmp2.s_det*tmp2.nras1,3)
CASE ALLTRIM(ostmet_cex_sql.kei)=ALLTRIM(tmp2.kei2)
sumras=ROUND(tmp2.s_det*tmp2.nras2,3)
ENDCASE
RETURN sumras


2 Можно ли 2 нижеследующих SELECT объединить в один
*---- объединим 1 и 2 таблицу в одну
SELECT detali_cur.mod_d, detali_cur.nd_d, detali_cur.suf_d, detali_cur.kod_c,
detali_cur.s_det, complekt_nn_sql.nnkor,complekt_nn_sql.nras1, ;
complekt_nn_sql.kei1, complekt_nn_sql.nras2,complekt_nn_sql.kei2 ;
FROM detali_cur, complekt_nn_sql ;
WHERE detali_cur.ntm=2 AND detali_cur.kod_c= complekt_nn_sql.kodc_iz AND
detali_cur.s_det#0 AND ;
detali_cur.mod_d+ detali_cur.nd_d+ detali_cur.suf_d = ;
complekt_nn_sql.mod_d+ complekt_nn_sql.nd_d+ complekt_nn_sql.suf_d ;
INTO CURSOR tmp1 READWRITE

*--- Пересчитаем общее количество изготовленных деталей по одинаковым
* nnkor,kod_c, )
SELECT tmp1.nnkor, tmp1.kod_c, sum(s_det) as s_det, tmp1.nras1, tmp1.kei1,
tmp1.nras2,tmp1.kei2;
FROM tmp1 GROUP BY tmp1.nnkor, tmp1.kod_c ;
INTO CURSOR tmp2

Заранее спасибо! И прошу не ругаться если что.
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32815647
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 можна. тока добафь еще параметры на ostmet_cex_sql.kei, tmp2.nras1 и прочие - вопщем пользовать не значения из таблиц, а чиста переменные
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32815725
nfp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nfp
Гость
to Hel!Riser
Т.е сначала сливаем все вместе а потом делаем перерасчет по REPLASE?
Я уже сделал подгругому проиндексировал tmp2 установил связь между таблицами и сделал Replase .
Просто думал что если бы можно использовать в SELECT свои функции было бы быстрее и удобнее .
Спасибо
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32815821
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не. т.е ф-ци немножка переделываем на так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
FUNCTION my_sum
PARAMETERS tcKei, tnKol_det, tcKei2, tnRas1, tnRas2
sumras= 0 
DO CASE 
CASE ALLTRIM(tcKei)='50' 
sumras=ROUND(tnKol_det*tnRas1, 3 )
CASE ALLTRIM(tcKei)=ALLTRIM(tcKei2) 
sumras=ROUND(tnKol_det*tnRas2, 3 )
ENDCASE 
RETURN sumras
а вызоф my_sum(ostmet_cex_sql.kei, tmp2.s_det, tmp2.kei2, tmp2.nras1, tmp2.nras2) AS rasx
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32815882
nfp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nfp
Гость
to Hel!Riser

Ура! Заработало! По-крайней мере возвращаются различные значения а не как было у меня- у всех записей одно значение . Значит в функцию необходимо брать все необходимое для расчета. "Все свое ношу с собой"
Большое спасибо!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32815966
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу второго вопроса, не вижу проблем

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT ;
	cmpl.nnkor, ;
	cmpl.kodc_iz, ;
	cmpl.nras1, ;
	cmpl.kei1, ;
	SUM(dtl.s_det) as s_det ;
FROM complekt_nn_sql cmpl ;
INNER JOIN detali_cur dtl ON dtl.kod_c = cmpl.kodc_iz ;
			 AND dtl.mod_d = cmpl.mod_d ;
			 AND dtl.nd_d  = cmpl.nd_d ;
			 AND dtl.suf_d = cmpl.suf_d ;
INTO CURSOR tmp2 NOFILTER ;
WHERE ;
	dtl.ntm= 2  ;
	AND dtl.s_det<> 0  ;
GROUP BY ;
	cmpl.nnkor, ;
	cmpl.kodc_iz, ;
	cmpl.nras1, ;
	cmpl.kei1
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32815997
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не стоит использовать в селектах собственные функции, которые сами читают из таблиц и/или передергивают указатели записи в таблицах.

Правильно:
Код: plaintext
1.
2.
3.
4.
select myfunc(myfield) as mynewvar from mytable

function myfunc
lparameter pfield
return pfield* 2 


Неправильно:
Код: plaintext
1.
2.
3.
select myfunc() as mynewvar from mytable

function myfunc
return mytable.myfield* 2 
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32816086
nfp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nfp
Гость
to ВладимирМ
Спасибо! Все нормально.
И попутно еще вопрос: можно ли чтобы в SELECTе результат выводился в курсор, который участвует в построени текущего запроса (например для первого вопроса результат выводился в курсор ostmet_cex_sql ). У меня выдается ошибка.
Спасибо!
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32816163
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nfp можно ли чтобы в SELECTе результат выводился в курсор, который участвует в построени текущего запроса (например для первого вопроса результат выводился в курсор ostmet_cex_sql ). У меня выдается ошибка.
Спасибо!
В Фоксе под ДОС такое было возможно (Select * from Query where... into cursor Query). А вот в Visual Фоксе эту возможность, похоже, убрали. А жаль... Хотя, с другой стороны, ошибок должно стать меньше...
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32816185
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Станислав С.

Ну до VFP7 тоже можно, выше не знаю.
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32816447
nfp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
nfp
Гость
Попробовал для другого курсора все сработало! А в данном случае причина наверно следующая : Я сначала сделал курсор, а затем выполнил
ALTER TABLE ostmet_cex_sql ADD COLUMN !!!!!! (не получился а меня код с SELECT )
и у меня курсор превратился в таблицу, а с таблицами такое видимо не катит!
Большое всем спасибо!!
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32818007
Фотография MaestroEv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to: Urri.

"Не стоит использовать в селектах собственные функции, которые сами читают из таблиц и/или передергивают указатели записи в таблицах."

Ну не знаю... Всегда их использую.

Select padr(naimtow(kodtow),200) as naim,;
padr(naimediz(kodediz),10) as edizm,;
Round(Ostatok(kodtow),16,2) as ostatok;
from ... и все такое

Может есть более читаемое решение?
На скорости <=100000 записей - особо не отражается, а программа читается куда лучше чем с JOIN ...(Вообще JOIN не пользуюсь...)

ИМХО.

Или я сильно ошибаюсь?
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32818596
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажем, это общее пожелание. При невыполнении которого запрос может работать правильно, а может и глючить. В случае, подобном Вашему, я бы не стал использовать функции, а либо за join ил справочник товаров и таблицу остатков, единиц измерения и остатков. Хотя бы потому, что работать должно намного быстрее.
...
Рейтинг: 0 / 0
Помогите с SELECT
    #32831378
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Urri!

> Не стоит использовать в селектах собственные функции, которые сами читают
> из таблиц и/или передергивают указатели записи в таблицах.

Можно, если осторожно :) Главное не трогать тот(те) курсор(ы) над которым(и)
работает сам SELECT - т.е. открыть для своих целей отдельный курсор -
USE ... AGAIN ...
Ну и ессно там уже самому позиционироваться куда нужно - т.е. как минимум в
такую UDF надо передавать первичный ключ...
Работает БЕЗ проблем.

Конечно если функция тривиальная, и решается всё через JOIN или подзапрос -
то так лучше и делать, ну а уж если хитрый расчёт, или скажем надо
обработать много записей (связанных с ОДНОЙ в результате) - и НЕ по
COUNT/MIN/MAX/SUM/AVG - тогда UDF и поможет... Если не делать конечно вместо
запроса простой "SCAN с заполнением курсора"

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с SELECT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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