Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вставка записи в эту же таблицу / 25 сообщений из 27, страница 1 из 2
10.06.2005, 12:51:07
    #33111677
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Нужно взять запись из таблицы и вставить ее в эту же таблицу, поменяв значения 2-х полей. Как это проще сделать?
...
Рейтинг: 0 / 0
10.06.2005, 12:51:52
    #33111679
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Вставить новую запись с двумя новыми значениями.
...
Рейтинг: 0 / 0
10.06.2005, 13:01:21
    #33111714
Aries
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
LOCAL loScatter
SELECT "tTable"
SCATTER NAME loScatter
loScatter.Field1="New Value1"
loScatter.Field2="New Value2"
APPEND BLANK
GHATHER NAME loScatter

Истина где-то там...
...
Рейтинг: 0 / 0
10.06.2005, 13:04:20
    #33111727
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
ну, скажем, было: use tabl
тогда
select tabl
append from tabl for ... (какая запись)
replace pole1 with ... , pole2 with ... (новые значения).
...
Рейтинг: 0 / 0
10.06.2005, 13:22:20
    #33111786
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Если количество полей не велико, то можно так:

Код: plaintext
1.
2.
3.
4.
select MyTab
* Встаем на запись - образец
LOCATE FOR ...
INSERT INTO MyTab (Field1, Field2, Field3, Field4) ;
VALUES (MyTab.Field1, MyTab.Field2, "Новое значение", "Новейшее значение")

Идея в том, что FoxPro сначала вычислит те значения, которые надо подставить и только потом создаст новую запись.
...
Рейтинг: 0 / 0
10.06.2005, 16:09:07
    #33112324
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Hi, ВладимирМ !

Интересно! И что - это ВСЕГДА срабатывает?
...
Рейтинг: 0 / 0
10.06.2005, 16:42:31
    #33112416
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
А чем вызваны сомнения?
...
Рейтинг: 0 / 0
10.06.2005, 16:43:50
    #33112423
Alex*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
почему нельзя воспользоваться конструкцией
Код: plaintext
1.
2.
3.
INSERT INTO Syslevels (lvlId, lvlName,  lvlNamerus);
SELECT s1.lvlId +  10 , 'Это новое значение', ALLTRIM(s1.lvlNameRus);
FROM SysLevels s1;
WHERE s1.lvlId =  1 
?
...
Рейтинг: 0 / 0
10.06.2005, 16:54:39
    #33112448
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
2Alex*
сразу видно у кого девятка
...
Рейтинг: 0 / 0
10.06.2005, 17:04:53
    #33112471
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
2ВладимирМ
конечно правильно как всегда
но я бы всё это хозяйство в курсор сначала выгреб за вместо locate особенно если запись не одна, а правило изменение полей извесно
тогда размер таблицы наверно не так критичен
ну и append from бы сделал
почему курсор ? Ну просто люблю с курсорами работать. В фоксе вообще почти всё на курсорах и таблицах
...
Рейтинг: 0 / 0
10.06.2005, 18:00:43
    #33112636
Alex*
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
проверил - в 8-ке тоже работает.
...
Рейтинг: 0 / 0
11.06.2005, 06:19:23
    #33113008
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
2ВладимирМ :

Просто спросил :) (вдруг какие установки меняют это правило или есть исключения ;) А сейчас кажется что вроде где-то про это слышал или читал (но может - dejavu)

2leaf :

Курсор, по-моему, тут и не нужен. "Размер" таблицы критичен в "ширину", а не в "вышину". Видимо при большом числе полей (не записей), перебор их всех будет подтормаживать, что ли.
...
Рейтинг: 0 / 0
14.06.2005, 05:58:17
    #33114751
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Размер исходной таблицы - от 20 000 записей (и постоянно растет).
Копировать надо от 0 до 100 записей.
У всех этих записей надо будет менять одно поле на другое значение в соответствии с таблицей. Т.е. формируется таблица соответствия старый ИД -новый ИД, по старому ИД отбираются записи и копируются в эту же таблицу с новым ИД.
...
Рейтинг: 0 / 0
14.06.2005, 05:59:36
    #33114752
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Еще одно поле изменяется у всех новых записей на одинаковое значение (заранее заданное).
...
Рейтинг: 0 / 0
14.06.2005, 07:45:38
    #33114784
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Сочинил такой код:
Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
*** подпрограмма копирования деталей насоса в другой насос ***

SET DEFAULT TO 'G:\Wladimir\Себестоимость\sebest\123'
USE sp1.dbf IN 1 SHARED && таблица с деталями копируемого насоса
USE sp_zapch.dbf IN 2 SHARED 
USE normy_ogt1.dbf IN 3 SHARED 
CREATE TABLE sootv (a int, b int) && временная таблица соответсвия ID
SELECT sp1

SCAN 
id1=sp1.a && старый номер ID
SELECT sp_zapch
INSERT INTO sp_zapch (b,c,d,e,f,g,h)  VALUES (sp1.b,sp1.c,sp1.d,sp1.e,sp1.f,sp1.g,sp1.h)
id2=sp_zapch.a && новый номер ID
INSERT INTO sootv (a,b)  VALUES (id1,id2)
ENDSCAN 

* отбор деталей насоса из таблицы технологов
SELECT * FROM normy_ogt1 WHERE normy_ogt1.id_detal in (SELECT sootv.a FROM sootv) INTO CURSOR nnn readwrite

SELECT sootv
SCAN 
UPDATE sp_zapch SET sp_zapch.h=sootv.b WHERE sp_zapch.h=sootv.a 
UPDATE nnn SET nnn.id_detal=sootv.b WHERE nnn.id_detal=sootv.a
ENDSCAN 

все вроде работает... но не оставляет ощущение что делаю кучу лишних движений и все можно сделать гораздо проще...
...
Рейтинг: 0 / 0
14.06.2005, 07:48:00
    #33114786
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Сорри, коды попутал..

Сочинил такой код:
Код: 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.
*** подпрограмма копирования деталей насоса в другой насос ***

SET DEFAULT TO 'G:\Wladimir\Себестоимость\sebest\123'
USE sp1.dbf IN  1  SHARED && таблица с деталями копируемого насоса
USE sp_zapch.dbf IN  2  SHARED
USE normy_ogt1.dbf IN  3  SHARED
CREATE TABLE sootv (a int, b int) && временная таблица соответсвия ID
SELECT sp1

SCAN
id1=sp1.a && старый номер ID
SELECT sp_zapch
INSERT INTO sp_zapch (b,c,d,e,f,g,h) VALUES (sp1.b,sp1.c,sp1.d,sp1.e,sp1.f,sp1.g,sp1.h)
id2=sp_zapch.a && новый номер ID
INSERT INTO sootv (a,b) VALUES (id1,id2)
ENDSCAN

* отбор деталей насоса из таблицы технологов
SELECT * FROM normy_ogt1 WHERE normy_ogt1.id_detal in (SELECT sootv.a FROM sootv) INTO CURSOR nnn readwrite

SELECT sootv
SCAN
UPDATE sp_zapch SET sp_zapch.h=sootv.b WHERE sp_zapch.h=sootv.a
UPDATE nnn SET nnn.id_detal=sootv.b WHERE nnn.id_detal=sootv.a
ENDSCAN 
все вроде работает... но не оставляет ощущение что делаю кучу лишних движений и все можно сделать гораздо проще...
...
Рейтинг: 0 / 0
14.06.2005, 10:46:01
    #33115067
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
все вроде работает...
интересно как ?
SELECT sp1
SCAN
id1=sp1.a && старый номер ID
SELECT sp_zapch
INSERT INTO sp_zapch (b,c,d,e,f,g,h) VALUES (sp1.b,sp1.c,sp1.d,sp1.e,sp1.f,sp1.g,sp1.h)
id2=sp_zapch.a && новый номер ID
INSERT INTO sootv (a,b) VALUES (id1,id2)
ENDSCAN

USE sp1.dbf IN 1 SHARED не есть гуд
USE sp1.dbf IN 0 SHARED лучше

ну и там еще есть чего много...
...
Рейтинг: 0 / 0
14.06.2005, 11:42:06
    #33115230
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
leaf все вроде работает...
интересно как ?

ну и там еще есть чего много...

ну не знаю как, но работает... у меня VFP 9
а что еще не так?
...
Рейтинг: 0 / 0
14.06.2005, 12:19:02
    #33115355
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Возврат в начало SCAN'a сам "переключает" в исходную область... ;-)
...
Рейтинг: 0 / 0
14.06.2005, 12:37:34
    #33115428
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
2Redrik
ну может и так я не проверял
привычка всё явно указывать да в последнее время я внутри скана явно область не меняю оператором селект просто нет необходимости как-то
а вообще я бы всё это хозяйство немного по другому оформил
ну это уже личное
ну насчет областей это уж точно по крайней мере не аккуратно
...
Рейтинг: 0 / 0
14.06.2005, 12:51:52
    #33115489
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
да проверил действительно
надо же что значит к do while привыкнуть спасибо
привычка страшное дело
буду знать
правдо всё равно подход не самый лучший тем более скан по одной области с последующей вставкой а зачем запросы тода придуманы?
текст проверки
CREATE CURSOR qq1 (aa n(6))
CREATE CURSOR qq2 (aa n(6))
INSERT INTO qq1 VALUES (1)
INSERT INTO qq1 VALUES (2)
INSERT INTO qq1 VALUES (3)
INSERT INTO qq2 VALUES (11)
INSERT INTO qq2 VALUES (12)
SELECT qq1
SCAN
?aa
SELECT qq2
ENDSCAN
...
Рейтинг: 0 / 0
14.06.2005, 13:13:04
    #33115541
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
leaf2Redrik
а вообще я бы всё это хозяйство немного по другому оформил

ну так подскажите! затем и вынес на обсуждение, что делал второпях, и хочется теперь привести все в правильный вид.
...
Рейтинг: 0 / 0
14.06.2005, 15:09:57
    #33115846
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
н-да... начал поплотнее тестировать - нашел ошибки...
...
Рейтинг: 0 / 0
15.06.2005, 01:23:54
    #33116741
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Hi w3d!

INSERT INTO таблица (список_полей_в_НУЖНОМ_ПОРЯДКЕ) ;
SELECT список_полей_кроме_заменяемого, 123 ;
FROM таблица ;
WHERE условие_отбора_старых_записей

Список полей в скобках должен соответствовать тому что даёт запрос - один к
одному - ИМЕНА полей не обязательно должны соответствовать! 123 - это то
"новое значение" которое нужно проставить "всем одинаковое". Можно конечно и
переменную использовать. Поле первичного ключа проставлять НЕ НАДО - если у
тебя ещё не работает по нему AUTOINC или NewID() в DefaultValue - самое
время это сделать. Условие отбора - ну тебе виднее какие записи нужно
"сдублировать".

Всё предельно просто и логично, и тебе уже это решение подсказали!

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
15.06.2005, 05:43:07
    #33116800
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в эту же таблицу
Igor Korolyov
Всё предельно просто и логично, и тебе уже это решение подсказали!
Все немного сложнее (по крайней мере, мне так кажется )
В таблице ID, ParentID. При копировании записей нужно сохранить структуру и привести ее в соответствие с новыми ID. AutoInc сделан.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вставка записи в эту же таблицу / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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