Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / преоброзовать таблицу / 11 сообщений из 11, страница 1 из 1
18.01.2022, 09:36
    #40127362
Arimle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
Здравствуйте,

У меня есть таблица: SF1.DBF. Как можно эту таблицу преоброзовать в виде как SF2.DBF?
...
Рейтинг: 0 / 0
18.01.2022, 11:37
    #40127387
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
Arimle,

sf2 - точно правильно заполнена?
...
Рейтинг: 0 / 0
18.01.2022, 12:10
    #40127396
Arimle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
Redrik, спасибо.

Сейсас, sf2 точно правильно заполнена.
...
Рейтинг: 0 / 0
18.01.2022, 16:02
    #40127493
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
Arimle,

Наверняка можно и попроще, но у сотрудницы сегодня ДР, поэтому получилось вот такое вот... )))
(сгодится для любого РАЗУМНОГО количества полей типа "К_*" и сохранении "смысла" последнего поля)

Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
CLOSE TABLES ALL
USE sf2
BROWSE LAST NOWAIT
SELECT 0
USE sf1
BROWSE LAST NOWAIT
KolVoPole=AFIELDS(kPole)

TEXT TO textSQL NOSHOW TEXTMERGE
SELECT ;
ENDTEXT

SCAN
	TEXT TO textSQL NOSHOW ADDITIVE TEXTMERGE FLAGS 2
a<<ALLTRIM(STR(RECNO()))>>.<<ALLTRIM(EVALUATE(kPole(KolVoPole,1)))>>, ;
	ENDTEXT
ENDSCAN
TEXT TO textSQL NOSHOW ADDITIVE TEXTMERGE FLAGS 2 PRETEXT 4
a1.<<kPole(KolVoPole,1)>> FROM ;
ENDTEXT

SCAN
	textSQL=textSQL+CHR(13)+"( ;"
	FOR i=1 TO KolVoPole-1
		TEXT TO textSQL NOSHOW ADDITIVE TEXTMERGE FLAGS 2
	SELECT CAST(<<kPole(i,1)>> AS N(10,2)) AS <<ALLTRIM(EVALUATE(kPole(KolVoPole,1)))>>, CAST("<<kPole(i,1)>>" AS C(<<kPole(KolVoPole,3)>>)) AS <<kPole(KolVoPole,1)>> FROM sf1 WHERE <<kPole(KolVoPole,1)>>="<<ALLTRIM(EVALUATE(kPole(KolVoPole,1)))>>" UNION ALL ;
		ENDTEXT
	ENDFOR
	textSQL=LEFT(textSQL,LEN(textSQL)-12)+") a"+ALLTRIM(STR(RECNO()))+", ;"
ENDSCAN
textSQL=LEFT(textSQL,LEN(textSQL)-3)+" ;"+CHR(13)+" WHERE ;"

SCAN FOR RECNO()>=2
	TEXT TO textSQL NOSHOW ADDITIVE TEXTMERGE FLAGS 2
a<<ALLTRIM(STR(RECNO()-1))>>.<<kPole(KolVoPole,1)>>=a<<ALLTRIM(STR(RECNO()))>>.<<kPole(KolVoPole,1)>> AND ;
	ENDTEXT
ENDSCAN
textSQL=LEFT(textSQL,LEN(textSQL)-6)+" ;"
textSQL=textSQL+CHR(13)+"INTO CURSOR Tmp"+CHR(13)+"BROWSE LAST NOWAIT"+CHR(13)

=STRTOFILE(textSQL,'textSQL.prg')
MODIFY COMMAND textSQL.prg nowa

=EXECSCRIPT(textSQL)
...
Рейтинг: 0 / 0
19.01.2022, 08:19
    #40127656
Arimle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
Redrik
Arimle,

Наверняка можно и попроще, но у сотрудницы сегодня ДР, поэтому получилось вот такое вот... )))

[/src]


Поздравляю.

Почему то, у меня вот такая ошибка (1.jpg) получается.
Я использую VFP6.
...
Рейтинг: 0 / 0
19.01.2022, 08:24
    #40127658
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
Arimle,

крайне странно!

втулите перед SCAN'ом
Код: plsql
1.
WAIT textSQL WINDOW


что скажет?
...
Рейтинг: 0 / 0
19.01.2022, 08:28
    #40127660
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
сам PRG
...
Рейтинг: 0 / 0
19.01.2022, 09:01
    #40127665
Arimle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
Спасибо, Redrik.
Сейчас такая ошибка (2.jpg) получается.
Может быть, VFP6 не поддерживает?
...
Рейтинг: 0 / 0
19.01.2022, 10:56
    #40127695
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
Arimle,

насчет VFP6 - не помню...

просто запустите textSQL.prg
это абсолютно то же самое!
...
Рейтинг: 0 / 0
19.01.2022, 13:37
    #40127764
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
ExcecScript() была введена в VFP7. В 6 версии ее еще не было. В младших версиях надо делать "вручную"

Код: sql
1.
2.
compile textSQL.prg
do textSQL.prg
...
Рейтинг: 0 / 0
23.01.2022, 13:41
    #40128788
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
преоброзовать таблицу
В общем случае, Вам надо сконструировать примерно такой запрос

Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
select ;
	"K_2"  as Q_n, ;
	sum(iif(Q_n = "AAA1", K_2, 0.00)) as AAA1, ;
	sum(iif(Q_n = "AAA2", K_2, 0.00)) as AAA2, ;
	sum(iif(Q_n = "AAA3", K_2, 0.00)) as AAA3, ;
	sum(iif(Q_n = "AAA4", K_2, 0.00)) as AAA4, ;
	sum(iif(Q_n = "AAA5", K_2, 0.00)) as AAA5, ;
	sum(iif(Q_n = "AAA6", K_2, 0.00)) as AAA6 ;
INTO CURSOR Sf2 NOFILTER ;
from Sf1 ;
UNION ALL ;
select ;
	"K_3"  as Q_n, ;
	sum(iif(Q_n = "AAA1", K_3, 0.00)) as AAA1, ;
	sum(iif(Q_n = "AAA2", K_3, 0.00)) as AAA2, ;
	sum(iif(Q_n = "AAA3", K_3, 0.00)) as AAA3, ;
	sum(iif(Q_n = "AAA4", K_3, 0.00)) as AAA4, ;
	sum(iif(Q_n = "AAA5", K_3, 0.00)) as AAA5, ;
	sum(iif(Q_n = "AAA6", K_3, 0.00)) as AAA6 ;
from Sf1 ;
UNION ALL ;
select ;
	"K_4"  as Q_n, ;
	sum(iif(Q_n = "AAA1", K_4, 0.00)) as AAA1, ;
	sum(iif(Q_n = "AAA2", K_4, 0.00)) as AAA2, ;
	sum(iif(Q_n = "AAA3", K_4, 0.00)) as AAA3, ;
	sum(iif(Q_n = "AAA4", K_4, 0.00)) as AAA4, ;
	sum(iif(Q_n = "AAA5", K_4, 0.00)) as AAA5, ;
	sum(iif(Q_n = "AAA6", K_4, 0.00)) as AAA6 ;
from Sf1 ;
UNION ALL ;
select ;
	"K_5"  as Q_n, ;
	sum(iif(Q_n = "AAA1", K_5, 0.00)) as AAA1, ;
	sum(iif(Q_n = "AAA2", K_5, 0.00)) as AAA2, ;
	sum(iif(Q_n = "AAA3", K_5, 0.00)) as AAA3, ;
	sum(iif(Q_n = "AAA4", K_5, 0.00)) as AAA4, ;
	sum(iif(Q_n = "AAA5", K_5, 0.00)) as AAA5, ;
	sum(iif(Q_n = "AAA6", K_5, 0.00)) as AAA6 ;
from Sf1 ;
UNION ALL ;
select ;
	"K_8"  as Q_n, ;
	sum(iif(Q_n = "AAA1", K_8, 0.00)) as AAA1, ;
	sum(iif(Q_n = "AAA2", K_8, 0.00)) as AAA2, ;
	sum(iif(Q_n = "AAA3", K_8, 0.00)) as AAA3, ;
	sum(iif(Q_n = "AAA4", K_8, 0.00)) as AAA4, ;
	sum(iif(Q_n = "AAA5", K_8, 0.00)) as AAA5, ;
	sum(iif(Q_n = "AAA6", K_8, 0.00)) as AAA6 ;
from Sf1 ;
UNION ALL ;
select ;
	"K_12"  as Q_n, ;
	sum(iif(Q_n = "AAA1", K_12, 0.00)) as AAA1, ;
	sum(iif(Q_n = "AAA2", K_12, 0.00)) as AAA2, ;
	sum(iif(Q_n = "AAA3", K_12, 0.00)) as AAA3, ;
	sum(iif(Q_n = "AAA4", K_12, 0.00)) as AAA4, ;
	sum(iif(Q_n = "AAA5", K_12, 0.00)) as AAA5, ;
	sum(iif(Q_n = "AAA6", K_12, 0.00)) as AAA6 ;
from Sf1 ;
UNION ALL ;
select ;
	"K_14"  as Q_n, ;
	sum(iif(Q_n = "AAA1", K_14, 0.00)) as AAA1, ;
	sum(iif(Q_n = "AAA2", K_14, 0.00)) as AAA2, ;
	sum(iif(Q_n = "AAA3", K_14, 0.00)) as AAA3, ;
	sum(iif(Q_n = "AAA4", K_14, 0.00)) as AAA4, ;
	sum(iif(Q_n = "AAA5", K_14, 0.00)) as AAA5, ;
	sum(iif(Q_n = "AAA6", K_14, 0.00)) as AAA6 ;
from Sf1 

* Смотрим, что получилось
BROWSE



Для версий младше VFP9 общее количество UNION не может превышать 10. Если надо больше, то это решается через цикл

Также могут быть проблемы с размерностью итоговых полей. Не случайно в запросе стоит не просто 0, а с дробной частью. Без этого поля могли бы получить тип Integer. В версии VFP9 можно использовать функцию CAST

Код: sql
1.
sum(iif(Q_n = "AAA1", K_2, CAST(0 as numeric(16,2)))) as AAA1



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


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