powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Модификация таблицы FoxPro 2.6
21 сообщений из 21, страница 1 из 1
Модификация таблицы FoxPro 2.6
    #37292961
Chek_Fedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, пожалуйста, как модифицировать структуру таблицы программно. Мне нужно перебрать n-е количество файлов DBF и вставить туда новый столбец (H_DOP), при этом данные не должны потеряться.
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37292990
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Chek_Fedor, ЕМНИП, вы этот вопрос уже поднимали. Курите заново хелп по copy structure extended + create from
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37293024
Chek_Fedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Нашел тот скрипт.
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37293171
Chek_Fedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите скрипт, пожалуйста
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
set safety off
For i =  1  to ADir(arDbfs, 'E:\temp\kaf????.dbf')
	?arDbfs[i, 1 ]
USE 'E:\Temp\'+arDbfs[i, 1 ] EXCLUSIVE alias Tab1
SET DECIMALS TO  0 
select PR, GOD, FO, FAKULT, SPEC, S_FAK, SPK, KURS, KOLST, OPLP, OPLX, KOLGR, KOLPGR, SEM, PG, NED;
, PPNAME, KBLOK, NBLOK, KAF, PRED, DISZIP, NKAF, LEK, LAB, PRA, IND_RUK, EKZ, ZA, KUR, KONT, GOS;
, H_LEK, H_LAB, H_PRA, H_IND_RUK, H_ZA, H_EKZ, H_GOS, H_KONS, H_KONTR, H_KUR, H_DIPL_RUK, H_DIPL_REZ;
, H_PRA_U, H_PRA_P, H_ASP_RUK, H_SOISK_RU, H_EKZV, H_RUK, H_FDP, H_OTHER, H_VSE, H_VSEP, H_VSEX, KPBLOK;
 from Tab1  into cursor tCursor
sele Tab1
use
use TMP3
copy stru to ('E:\Temp\'+arDbfs[i, 1 ])
sele tCursor
copy to ('E:\Temp\'+arDbfs[i, 1 ])
use 
Next
пытаюсь структуру TMP3 скопировать в Tab1 в чем ошибка. Спасибо.
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37293198
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Chek_Fedor,

Новую структуру в существующий файл???
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37293203
Chek_Fedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorNGChek_Fedor,

Новую структуру в существующий файл???
Да, потом в этот файл нужно скопировать записи которые были в tab1. В общем мне нужно добавить столбец в Tab1, без потери данных.
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37293246
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой моцк был съеден...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
set safety off
For i =  1  to ADir(arDbfs, 'E:\temp\kaf????.dbf')
	?arDbfs[i, 1 ]
USE 'E:\Temp\'+arDbfs[i, 1 ] EXCLUSIVE alias Tab1
SET DECIMALS TO  0  --это зачем??
select <список_полей> from Tab1  into cursor tCursor
sele Tab1 --вместо этих 2 строк пишем
use       --use in Tab1
use TMP3 --откуда он взялся? открыт раньше?
copy stru to ('E:\Temp\'+arDbfs[i, 1 ]) --а вот это вообще нечто
sele tCursor                          --создаём файл по структуре, лежащей в файле tmp3
copy to ('E:\Temp\'+arDbfs[i, 1 ])      --после чего поверх него записываем
use                                   --НОВЫЙ файл из курсора. Ну и зачем?
Next --это откуда вообще??
пытаюсь структуру TMP3 скопировать в Tab1 в чем ошибка. Спасибо.В коде.
В общем мне нужно добавить столбец в Tab1, без потери данных.Вкратце алкоритм:
Код: plaintext
1.
2.
3.
4.
5.
юзе старая_таблица
копи стру экстендед ту арр_стру
добавляем в арр_стру записи о новых колонках
креате новая_таблица фром арр_стру (синтаксис точно не помню, ну да в хелпе есть)
всё, новая таблица готова, дальше хоть инсерт-селектом, хоть сканом перегоняете в неё данные, тут же можно и в новые колонки инфо забить (а можно и потом)
повторить для каждого файла :)
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37293915
Chek_Fedor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сделал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
set safety off
For i =  1  to ADir(arDbfs, 'E:\temp\kaf????.dbf')
	?arDbfs[i, 1 ]
USE 'E:\Temp\'+arDbfs[i, 1 ] EXCLUSIVE alias Tab1
SET DECIMALS TO  0 
select PR, GOD, FO, FAKULT, SPEC, S_FAK, SPK, KURS, KOLST, OPLP, OPLX, KOLGR, KOLPGR, SEM, PG, NED;
, PPNAME, KBLOK, NBLOK, KAF, PRED, DISZIP, NKAF, LEK, LAB, PRA, IND_RUK, EKZ, ZA, KUR, KONT, GOS;
, H_LEK, H_LAB, H_PRA, H_IND_RUK, H_ZA, H_EKZ, H_GOS, H_KONS, H_KONTR, H_KUR, H_DIPL_RUK, H_DIPL_REZ;
, H_PRA_U, H_PRA_P, H_ASP_RUK, H_SOISK_RU, H_EKZV, H_RUK, H_FDP, H_OTHER, H_VSE, H_VSEP, H_VSEX, KPBLOK;
 from Tab1  into dbf tCursor
sele Tab1
close all
use TMP3 //таблица с нужной мне структурой
copy stru to ('E:\Temp\'+arDbfs[i, 1 ])
close all
use tCursor
USE 'E:\Temp\'+arDbfs[i, 1 ]
APPEND FROM E:\Temp\tCursor.DBF
use 
Next //Перебор всех файлов с маской "kaf????"


...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37294192
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
омфг, лучники в шоке. Ещё скажите, что оно работает
особенно порадовало это
Код: plaintext
1.
sele Tab1
close all
и это
Код: plaintext
1.
2.
3.
4.
5.
use TMP3 //таблица с нужной мне структурой
copy stru to ('E:\Temp\'+arDbfs[i, 1 ]) --делаем таблицу со стру2
close all
use tCursor
USE 'E:\Temp\'+arDbfs[i, 1 ] 
APPEND FROM E:\Temp\tCursor.DBF --а теперь (о чудо!) пихаем туда данные со стру1
И где, #$%, в вашем коде copy structure EXTENDED???
ЗЫ. Чуть не пропустил:
Код: plaintext
1.
close all
use tCursor
И вы ещё будете утверждать, что ЭТО работaет? МВАХАХАХАХАХАХАХАХАХАХА!!!!!!! /*безумный демонический хохАД*/
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37294314
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirИ вы ещё будете утверждать, что ЭТО работaет? МВАХАХАХАХАХАХАХАХАХАХА!!!!!!! /*безумный демонический хохАД*/
Вообще-то, ЭТО действительно будет работать, если таблица TMP3 создана ранее. Ну, да, много лишних "телодвижений", но ничего такого, что привело бы к ошибкам в работе. Собственно, для FP2.6 принципиально улучшить код проблематично. Разве что, убрать некоторые лишние команды.

Исходим из предположения, что TMP3 - это таблица с той структурой, которая должна получиться в итоге у всех таблиц указанной папки. Тогда, если убрать лишнее, имеем

Код: 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.
* Настройка, предотвращающая возникновения запроса в случае создания таблицы с именем уже существующей таблицы
* Необходимо молча удалить ранее существующую таблицу и создать новую с тем же именем в том же месте
set safety off

* Цикл, перебирающий найденные таблицы
For i =  1  to ADir(arDbfs, 'E:\temp\kaf????.dbf')

	* Для отладки и чтобы контролировать процесс
	?arDbfs[i, 1 ]

	* Открываем очередную таблицу, задавая ей фиксированный алиас
	USE 'E:\Temp\'+arDbfs[i, 1 ] EXCLUSIVE alias Tab1

	* Копируем содержимое таблицы во временную таблицу с фиксированным именем
	* Можно было бы использовать COPY TO, но Select-SQL - более универсальное решение
	select PR, GOD, FO, FAKULT, SPEC, S_FAK, SPK, KURS, KOLST, OPLP, OPLX, KOLGR, KOLPGR, SEM, PG, NED;
	, PPNAME, KBLOK, NBLOK, KAF, PRED, DISZIP, NKAF, LEK, LAB, PRA, IND_RUK, EKZ, ZA, KUR, KONT, GOS;
	, H_LEK, H_LAB, H_PRA, H_IND_RUK, H_ZA, H_EKZ, H_GOS, H_KONS, H_KONTR, H_KUR, H_DIPL_RUK, H_DIPL_REZ;
	, H_PRA_U, H_PRA_P, H_ASP_RUK, H_SOISK_RU, H_EKZV, H_RUK, H_FDP, H_OTHER, H_VSE, H_VSEP, H_VSEX, KPBLOK;
	from Tab1  into dbf tCursor

	* Закрываем как исходную таблицу, так и ее копию
	close all

	* Открываем таблицу с образцовой структурой
	use TMP3

	* На основе образцовой таблицы создаем таблицу с именем очередной таблицы, 
	* но со структурой, совпадающей со структурой образцовой таблицы и пустую
	* При этом, ранее существовавшая таблица с тем же именем уничтожается
	copy stru to ('E:\Temp\'+arDbfs[i, 1 ])

	* Закрываем все открытые таблицы
	close all

	* Открываем только что созданную таблицу с новой структурой, но пустую
	USE 'E:\Temp\'+arDbfs[i, 1 ]

	* Копируем в нее данные из копии исходной таблицы
	APPEND FROM E:\Temp\tCursor.DBF

	* Закрываем все открытые таблицы
	close all

next

Использовать INTO CURSOR для Fp2.x - опасно. Нет гарантии, что получится именно курсор, а не исходная таблица с наложенным фильтром. В данном случае - это критически важно, поскольку исходная таблица просто удаляется.

Если структура TMP3 отличается от структуры исходных таблиц только наличием дополнительного столбца, то APPEND FROM вполне уместна. Скопирует то что нужно и куда нужно.

Здесь еще можно "пооптимизировать" с алиасами и рабочими областями, чтобы не использовать close all и закрывать таблицы "точечно" через команду USE. Но, в принципе, суть останется той же самой.
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37298039
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оператор типа:
select *, 0000.00 as H_DOP from tab1 into dbf tab2
сразу может создать dbf нужной структуры.

Останется только переименовать таблицу tab2 в tab1.
Будет работать практически в 2 раза быстрее.
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37298220
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golsaОператор типа:
select *, 0000.00 as H_DOP from tab1 into dbf tab2
сразу может создать dbf нужной структуры.
Теоретически. А практически, размерность поля H_DOP придется подбирать методом "научного тыка". Нет никакой гарантии, что размерность этого поля будет, скажем N(7,2), а не N(13,2). Т.е. числовым-то оно будет, но какая будет размерность - без гарантий.
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37608236
DoctoRJurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
table1 - table with data
htable - table with defined H_DOP column
table2 - result table

select T.*, H.H_DOP from table1 T, htable H into dbf table2
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37608515
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoctoRJurius , и вы ЭТО пробовали запустить на FPD2.6? Получилось?
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37608655
Boban5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выдрал из старинного приложения. Проверь...
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37608860
DoctoRJurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM , yes. success.

table1 - table with data (has x records)
htable - table with defined H_DOP column (has 1 record with 0.00 value)
table2 - result table (has x*1 records)


select T.*, H.H_DOP* from table1 T, htable H into dbf table table2.dbf

select * from table1, htable into table table2.dbf
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37615130
thunder2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМgolsaОператор типа:
select *, 0000.00 as H_DOP from tab1 into dbf tab2
сразу может создать dbf нужной структуры.
Теоретически. А практически, размерность поля H_DOP придется подбирать методом "научного тыка".
Не придётся. Размерность будет такая как укажите, а именно 7,2 при условии, что не будет UNION. Я этот прием регулярно использую.
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37615132
thunder2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
golsaОператор типа:
select *, 0000.00 as H_DOP from tab1 into dbf tab2
сразу может создать dbf нужной структуры.

Останется только переименовать таблицу tab2 в tab1.
Будет работать практически в 2 раза быстрее.
Правильно. Не фиг алгоритмизацией заниматься на фоксе. Не для этого он. Только пакетная обработка данных спасет мир.
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37615166
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thunder2ВладимирМпропущено...
Теоретически. А практически, размерность поля H_DOP придется подбирать методом "научного тыка".
Не придётся. Размерность будет такая как укажите, а именно 7,2 при условии, что не будет UNION. Я этот прием регулярно использую.
Это Вам просто повезло. Неявные преобразования тем и плохи, что их невозможно проконтролировать. Никогда не знаешь какая настройка или последовательность действий приведет к тому, что то, что раньше работало "вдруг" перестает работать.

Если Вам требуется точная размерность, то и инструмент для ее установки необходим точный . Вы ведь не знаете почему собственно прибавляется 2 знака к указанной размерности. А почему не 3 или 1? Вам не известны те критерии, по которым выбирается этот "довесок". То, что "я регулярно использую" - не аргумент.

Ну, например, сделайте такой тест

Код: sql
1.
2.
create table test (f1 C(10))
select f1, 0000.0 as f2 from test into table test2


Несмотря на общее правило, что размерность будет N+2, где N - количество символов в константе, но в данном случае размерность будет N(6,1). Т.е. явно не такая, как Вы надеялись. Другое правило действует. Размерность точно равна заданной константе.

Нет, можно, конечно, заняться исследованиями и вывести некое общее правило какая будет размерность в зависимости от "количества пятен на солнце", но это не имеет особого смысла, если есть возможность точного задания размерности.
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37615189
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ,
Бывает иногда пользуюсь конструкцией типа "select 000.0 as nField". Цели как правило замена NULL значений в расчетных полях запросов.
Я в хэлпе не находил, но опытным путем установлено что фокс создает поле типа нумерик размерностью такой чтобы это число нулей вошло, под точку отводится отдельный разряд (особенность хранения типа numeric). Например:
0000 - N(4)
0000.0 - N(6,1)
0000.00 - N(7,2)

На предмет точного совпадения размерности никогда не обращал внимания, но точно могу сказать что за всю мою практику не было случаев когда бы фокс создал поле меньшего размера или меньшей точности после запятой. Иначе бы были неточности в расчетах или ошибки типа Numeric overflow

Если есть уверенность что не может быть меньше, то почему бы не быть уверенным что фокс создает размер поля точно по заданной нулями маске ?
...
Рейтинг: 0 / 0
Модификация таблицы FoxPro 2.6
    #37615581
thunder2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМНу, например, сделайте такой тест

Код: sql
1.
2.
create table test (f1 C(10))
select f1, 0000.0 as f2 from test into table test2


Несмотря на общее правило, что размерность будет N+2, где N - количество символов в константе

С хрена ли валенки упали ?
, но в данном случае размерность будет N(6,1). Т.е. явно не такая, как Вы надеялись. Другое правило действует. Размерность точно равна заданной константе.

Владимир , по моему, Вы себе противоречите. Вы задали число 0000.0, т.е. 6 - общая длинна и 1 знак для дроби этот рез-тат Вы и получили. Тест Ваш я выполнил, результат ожидаемый. Вы кого и в чем пытаетесь убедить ? Может Вам освежить знания по типу NUMERIC ? Так я напомню Вам. Numeric (N,D) - хранит цело общей длиной N знаков, включая десятичный разделитель и D знаков после десятичного разделителя. Т.е. запись Numeric (10,1) хранит числа общей длинной 10 знаков и 1 знак после запятой. Физически Numeric в DBF таблице вообще строка !
Единственный случай когда такой подход даст сбои - вложенные запросы или UNION. Вот там да, можно получить и не то, что ожидается. И то, если во всех подзапросах и UNOIN'ах указаывать одинаковую размерность, будете получать ожидаемый результат.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Модификация таблицы FoxPro 2.6
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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