powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Объединение таблиц
7 сообщений из 7, страница 1 из 1
Объединение таблиц
    #34249670
VINNI5898
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ помогите плиз запарился ваще мозги враскарячку... :-((( Такая проблема:

есть 3 курсора. в каждом из них 2 поля, в 1 курсоре одна запись, во втором и третьем - нет записей. КАК ИХ ОБЪЕДИНИТЬ В ОДИН КУРСОР НА 6 ПОЛЕЙ (В ПОЛЯХ ОТ ВТОРОГО И ТРЕТЬЕГО КУРСОРА ДОЛЖНЫ СТОЯТЬ НУЛИ)?

делаю SELECT * FROM Q1,Q2,Q3 INTO CURSOR QQQ - он получаецца пустой, т.е. изза того, что во 2-м и 3-м курсорах нет записей вообще, теряецца запись и из 1-го.

заранее спасибо!
...
Рейтинг: 0 / 0
Объединение таблиц
    #34249803
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create cursor tt1 (a i, b i)
create cursor tt2 (a i, b i)
create cursor tt3 (a i, b i)

insert into tt1 values ( 1 , 2 )

select t1.a as f1, ;
	   t1.b as f2, ;
	   nvl(t2.a, 0 ) as f3, ;
	   nvl(t2.b, 0 ) as f4, ;
	   nvl(t3.a, 0 ) as f5, ;
	   nvl(t3.b, 0 ) as f6  ;
	from tt1 t1 ;
		left join tt2 t2 on .t. ;
		left join tt3 t3 on .t.
...
Рейтинг: 0 / 0
Объединение таблиц
    #34249957
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем тебе 2 и 3 курсор нужен, раз там нет никаких записей? Тебе же надо просто добавить пустые поля в первый курсор.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT cur1.*, ;
	 00000  as f1_cur2, ;
	 00000  as f2_cur2, ;
	 00000  as f1_cur3, ;
	 00000  as f2_cur3 ;
FROM cur1 ;
INTO CURSOR curResult NOFILTER

Несколько нулей нужны, чтобы задать определенную размерность. Если версия VFP9, то можно использовать функцию CAST() для явного указания размерности.

Можно еще пойти другим путем: создать пустой курсор нужной размерности и перелить в него данные первого курсора

Код: plaintext
1.
2.
CREATE CURSOR curResult (f1 I, f2 I, f1_cur2 I, f2_cur2 I, f1_cur3 I, f2_cur3 I)
APPEND FROM (DBF("cur1"))

Разумеется, имена полей в результирующем курсоре должны совпадать с именами полей в первом курсоре. Из тех, в которые надо будет добавлять данные.
...
Рейтинг: 0 / 0
Объединение таблиц
    #34250161
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, можно еще так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create cursor tt1 (a i, b i)
create cursor tt2 (a i, b i)
create cursor tt3 (a i, b i)

insert into tt1 values ( 1 , 2 )

SELECT ;
	tt1.a as f1, ;
	tt1.b as f2, ;
	tt2.a as f3, ;
	tt2.b as f4, ;
	tt3.a as f5, ;
	tt3.b as f6 ;
FROM tt1 ;
INTO CURSOR curResult NOFILTER

Смысл в том, что если в директиве SELECT есть ссылка на поля таблицы, которая не указана в директиве FROM, то такие поля воспринимаются просто как некие выражения (функции), которые надо вычислить при заполнении каждой строки результирующей выборки. Т.е. взять из текущей записи соответсвующей рабочей области.

А поскольку в текущей записи эти поля имеют нулевое значение, то и будет взято 0. Правда, поскольку это все-таки выражение, то его размерность не будет совпадать с размерностью соответствующих таблиц. В данном случае будет несколько больше.
...
Рейтинг: 0 / 0
Объединение таблиц
    #34250747
VINNI5898
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо. А если те же 3 курсора, но неизвестно, какой из них пустой - как быть в этом случае?
...
Рейтинг: 0 / 0
Объединение таблиц
    #34250833
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VINNI5898Хорошо. А если те же 3 курсора, но неизвестно, какой из них пустой - как быть в этом случае?
Если вариант - один заполнен, а 2 пустых, то примерно также:

1) Через CREATE CURSOR создаешь курсор нужной структуры и 3 последовательных APPEND FROM из каждого курсора

Код: plaintext
1.
2.
3.
4.
CREATE CURSOR curResult (f1 I, f2 I, f1_cur2 I, f2_cur2 I, f1_cur3 I, f2_cur3 I)
APPEND FROM (DBF("cur1"))
APPEND FROM (DBF("cur2"))
APPEND FROM (DBF("cur3"))

Правда, в этом случае желательно, чтобы имена полей в курсорах отличались, поскольку APPEND FROM делает добавление по именам полей.

2) То же, что предложил alex11100 , но слегка изменив запрос

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select ;
	nvl(t1.a, 00000 ) as f1, ;
	nvl(t1.b, 00000 ) as f2, ;
	nvl(t2.a, 00000 ) as f3, ;
	nvl(t2.b, 00000 ) as f4, ;
	nvl(t3.a, 00000 ) as f5, ;
	nvl(t3.b, 00000 ) as f6  ;
from tt1 t1 ;
FULL JOIN tt2 t2 on .t. ;
FULL JOIN tt3 t3 on .t.

3) Сначала определить в каком курсоре есть запись, а затем использовать макроподстановки
...
Рейтинг: 0 / 0
Объединение таблиц
    #34251746
VINNI5898
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все, большое спасибо, разобрался.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Объединение таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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