:: Visual Foxpro, Foxpro for DOS
SELECT по вертикали - реально ли?
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Подскажите пожалуйста.
Имеется временный курсор, имеет вид 1 строка и 35 столбцов.
Можно ли преобразовать его в 1 столбец и 35 строк(из горизонтального в вертикальный)?
пробывал сделать через union собирая по строчке курсор, может есть способ проще...
а еще интереснее если бы можно было преобразовать в 2 столбца и 35 строк, где 1-ый столбец содержал список имен полей, а во втором содержимое полей.



Исправлено 1 раз(а). Последнее : ptaxa888, 04.04.18 01:06
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
COPY STRUCTURE EXTENDED TO ?
AFIELDS() ?
Конечно полей будет поболе чем 1 или 2, но важно ли это?


------------------
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
SCATTER MEMO NAME m.o
примерно это же делает, только порядок полей теряется
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Аспид, в принципе все устраивает, единственное и самое печальное что нет столбца из того что было в строке (основная информация).
Есть поле с содержанием реквизитов, куча memo и пустых полей, все(
Хотя если открыть на просмотр курсор который сформирован через select он содержит в себе строчку с информацией.



Исправлено 1 раз(а). Последнее : ptaxa888, 04.04.18 09:20
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
В цикле можно что угодно сформировать - почему обязательно SELECT SQL?
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Аспид
COPY STRUCTURE EXTENDED TO ?
AFIELDS() ?
Конечно полей будет поболе чем 1 или 2, но важно ли это?
Самое важное это информация в курсоре, без структуры можно обойтись.
Как вывести ее в массив в один столбец?
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
krin

Сообщений: 172
Дата регистрации: 08.02.2005
CREATE CURSOR cur1 (a1 i, a2 i, a3 i, a4 i)
INSERT INTO cur1 VALUES (10, 20, 30, 40)
SELECT * FROM cur1 INTO ARRAY la
DIMENSION la[ ALEN(la), 1 ]
CREATE CURSOR cur2 (a5 i)
APPEND FROM ARRAY la
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
SCATTER TO AAA
? AAA[1]
? AAA[2]
...
? ALEN(AAA)
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Запросом это и делается через union all (т.к. запрос здоровенный, и все его куски "шаблонные", имеет смысл через макро или execscript работать - формируя текст запроса программно - заодно обходя лимиты на сложность получаемой команды - всё же и размер и "сложность" одной команды в фоксе не бесконечны ).
А так - циклом по тому же AFIELDS() - получая на каждом шагу и имя поля, и через EVAL() значение в этом поле в текущей записи. Можно и через массив, только SELECT ... INTO ARRAY ... и COPY TO ARRAY всё-же ЗАПИСИ загоняют в массив (потому он и двумерный получается, и весьма здоровый, если не дописывать дополнительных ограничений отбора в WHERE/FOR). А одну текущую запись в массив загоняет SCATTER TO имя_массива...

Вопрос в том для чего это нужно... Одно дело обработка/хранение данных, и совсем другое отображение. Для целей отображения так делать совершенно необязательно.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
krin
CREATE CURSOR cur1 (a1 i, a2 i, a3 i, a4 i)
INSERT INTO cur1 VALUES (10, 20, 30, 40)
SELECT * FROM cur1 INTO ARRAY la
DIMENSION la[ ALEN(la), 1 ]
CREATE CURSOR cur2 (a5 i)
APPEND FROM ARRAY la
Сданным вариантом возникает проблема.
Причина в поле а5 установлен ОДИН тип данных i.
А у меня в это поле летит два типа Char и Date
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
ptaxa888
krin
CREATE CURSOR cur1 (a1 i, a2 i, a3 i, a4 i)
INSERT INTO cur1 VALUES (10, 20, 30, 40)
SELECT * FROM cur1 INTO ARRAY la
DIMENSION la[ ALEN(la), 1 ]
CREATE CURSOR cur2 (a5 i)
APPEND FROM ARRAY la
Сданным вариантом возникает проблема.
Причина в поле а5 установлен ОДИН тип данных i.
А у меня в это поле летит два типа Char и Date

В явном виде в одном поле нельзя хранить данные разных типов. Можно в выходном курсора создать еще одно поле - тип данных, а поле, которое будет содержать собственно данные из входного курсора, сделать символьного типа, и помещать туда уже приведенные к символьному типу данные из входного курсора.

И самое простое решение - делать это в цикле, как и посоветовал Igor Korolyov
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Igor Korolyov
Запросом это и делается через union all (т.к. запрос здоровенный, и все его куски "шаблонные", имеет смысл через макро или execscript работать - формируя текст запроса программно - заодно обходя лимиты на сложность получаемой команды - всё же и размер и "сложность" одной команды в фоксе не бесконечны ).
А так - циклом по тому же AFIELDS() - получая на каждом шагу и имя поля, и через EVAL() значение в этом поле в текущей записи. Можно и через массив, только SELECT ... INTO ARRAY ... и COPY TO ARRAY всё-же ЗАПИСИ загоняют в массив (потому он и двумерный получается, и весьма здоровый, если не дописывать дополнительных ограничений отбора в WHERE/FOR). А одну текущую запись в массив загоняет SCATTER TO имя_массива...

Вопрос в том для чего это нужно... Одно дело обработка/хранение данных, и совсем другое отображение. Для целей отображения так делать совершенно необязательно.
Необходимо исключительно для отображения.
Изначально я формирую курсор
SELECT ... FROM ... WHERE ... INTO CURSOR qwerty
Browse
В окне курсора qwerty структура постоянная много столбцов и одна строка(инфа по человеку).
Задача состоит в том чтобы перевернуть эту инфу с горизонтального вида в вертикальный и отобразить в курсоре.
Через массив вроде работает но не полноценно-проблема описана сообщением выше
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Simple777

И самое простое решение - делать это в цикле, как и посоветовал Igor Korolyov
Научите делать в цикле
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если в ПО на VFP используется browse (что уже говорит о непрофессионализме разработчика), то с тем же успехом можно там применить и CHANGE - это тот же самый browse, но "повёрнутый на бок".
Для объекта grid такое поведение тоже доступно через свойство View. Насколько это удобно в работе и красиво выглядит - вопрос другой, зато быстро и без кучи малоочевидного кода.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: SELECT по вертикали - реально ли?
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Igor Korolyov
Если в ПО на VFP используется browse (что уже говорит о непрофессионализме разработчика), то с тем же успехом можно там применить и CHANGE - это тот же самый browse, но "повёрнутый на бок".
Для объекта grid такое поведение тоже доступно через свойство View. Насколько это удобно в работе и красиво выглядит - вопрос другой, зато быстро и без кучи малоочевидного кода.
Да какой тут профессионализм)
Спасибо - работает, часа три химичить и в итоге CHANGE все делает.
Дело в том что на форме уже есть grid из него я по клику выбираю фамилию и тогда формируется полная информация по сотруднику. Не куда ложить ещё один Grid а делать для этого ещё одну форму не вижу смысла.
Спасибо всем, а Вам в особенности.



Исправлено 1 раз(а). Последнее : ptaxa888, 04.04.18 17:13
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
ptaxa888
Simple777

И самое простое решение - делать это в цикле, как и посоветовал Igor Korolyov
Научите делать в цикле

CLOS DATABASES
set talk off
CREATE CURSOR cur1 (myfield1 N(10),Myfield2 C(30),myfield3 D(8))
APPE BLAN
REPL MYFIELD1 WITH 1001,MYFIELD2 WITH 'Иванов Иван Иванович',myfield3 with date()
sele 0
CREATE CURSOR cur2 (n_field C(10),T_field C(1),v_field C(30))
sele cur1
m.n=fcount()
m.c=1
For m.c=1 to m.n
m.n_field=field(m.c)
m.t_field=type(m.n_field)
do case
case m.t_field='N'
m.v_field=str(eval(field(m.c)),30)
case m.t_field='C'
m.v_field=eval(field(m.c))
case m.t_field='D'
m.v_field=dtoc(eval(field(m.c)))
endcase
sele cur2
appe blan
repl n_field with m.n_field,t_field with m.t_field,v_field with m.v_field
sele cur1
endfor
sele cur2
brow



Исправлено 2 раз(а). Последнее : Simple777, 04.04.18 17:15
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Именно "ещё одну форму" и стоит делать. Руками разместить там поля и надписи (и не в 1 колонку с одной шириной что для даты, что для возраста, что для ФИО), чтобы было красиво и удобно. При этом совсем не обязательно чтобы она работала с тем курсором со "списком" который в основной форме.
Передать можно id и в этой форме сделать запрос инфы (уже безо всякой динамики) в курсор. Можно, конечно, и из формы списка взять данные, скажем SCATTER NAME oData - и передав в форму "карточки" сохранить этот объект в свойстве формы и к его свойствам привязывать поля на форме - но это пойдёт если ВСЯ нужная инфа есть в курсоре - а я так понимаю это не твой случай - как раз её же до того и "выкидывали из курсора" (вместо того чтобы просто прятать ненужные колонки в гриде и в коде экспорта)...
При этом можно без проблем организовать "множественный" показ карточек - т.е. совсем не обязательно закрывать предыдущую чтобы посмотреть новую - если экран большой, то это может быть даже и полезно - поместить рядом 2-3 формы-карточки


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: SELECT по вертикали - реально ли?
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
ptaxa888
Добавьте на форму LISTBOX, в его INIT впишите примерно такой код:
LOCAL lcField,i
WITH THIS
.COLUMNCOUNT = 3
.COLUMNWIDTHS = '60,20,100'
FOR i = 1 TO FCOUNT('table1')
lcField = FIELD(i,'table1')
.ADDLISTITEM(lcField,i,1)
.ADDLISTITEM(VARTYPE(lcField),i,2)
.ADDLISTITEM(TRANSFORM(EVALUATE(lcField)),i,3)
ENDFOR
ENDWITH
Ratings: 1 negative/0 positive
Re: SELECT по вертикали - реально ли?
Foxtrot

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
browse или grid


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 14 kornienko_ru Burn  (Гостей: 12)

© 2000-2024 Fox Club 
Яндекс.Метрика