powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / преоброзовать таблицу
11 сообщений из 11, страница 1 из 1
преоброзовать таблицу
    #40127362
Arimle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,

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

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

Сейсас, sf2 точно правильно заполнена.
...
Рейтинг: 0 / 0
преоброзовать таблицу
    #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
преоброзовать таблицу
    #40127656
Arimle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Redrik
Arimle,

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

[/src]


Поздравляю.

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

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

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


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

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

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

Код: sql
1.
2.
compile textSQL.prg
do textSQL.prg
...
Рейтинг: 0 / 0
преоброзовать таблицу
    #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
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / преоброзовать таблицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (2)
Пользователи онлайн (14): Анонимы (11), Yandex Bot, Bing Bot 2 мин., Google Bot 4 мин.
x
x
Закрыть


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