:: Visual Foxpro, Foxpro for DOS
Re: копирование колонки
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> я не знаю какие поля указывать если имя поле динамические и сегодyя оно будет m000092
Открой для себя макросы, скобки...

m.a = "Cur2"
m.f = "Поле1" && или FIELD(1), или FILELD(1, m.a) ...

Можно строить вот такие конструкции (после амперсанда и переменной и точки может потребоваться еще точка, все время путем подбора подбираю...)
Select &f, &a.&f FROM cur1, (m.a)
Ratings: 0 negative/0 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
как объединить 2 курсора и объединить так чтобы не было повторяющишься полей? типа fio_a и fio_b, я пытался через left join соединить курсоры но хорошего ничего не вышло

Чтобы не было повторяющихся, проще всего перечислить с указаниим алиаса для них.

axeum
я не знаю какие поля указывать если имя поле динамические и сегодyя оно будет m000092 а завтра я уже буду выдавать на M000080

А для подобных случаев как раз и можно использовать либо макроподстановку, либо EVALUATE(), где переменная - как раз то самое, меняющееся по условию выражение. Последняя фунция правда не во всех случаях срабатывает, просто надо проверять, если не годится где-то - делать там макроподстановку.
Кстати в привведенном ранее коде вообще непонятно - зачем там-то макроподстановка?? Там вроде просто обычного присваивания хватало бы.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 2 раз(а). Последнее : Crispy, 30.07.20 12:35
Ratings: 0 negative/0 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
of63
> я не знаю какие поля указывать если имя поле динамические и сегодyя оно будет m000092
Открой для себя макросы, скобки...

m.a = "Cur2."
m.f = "Поле1" && или FIELD(1), или FILELD(1, m.a) ...

Можно строить вот такие конструкции (после амперсанда и переменной и точки может потребоваться еще точка, все время путем подбора подбираю...)
Select &f, &a.&f FROM cur1, (m.a)
если честно понятней не стало, мне кажется я вообще не понимаю что происходит в твоем select, что выбирается и зачем и как


Crispy
axeum
как объединить 2 курсора и объединить так чтобы не было повторяющишься полей? типа fio_a и fio_b, я пытался через left join соединить курсоры но хорошего ничего не вышло

Чтобы не было повторяющихся, проще всего перечислить с указаниим алиаса для них.

axeum
я не знаю какие поля указывать если имя поле динамические и сегодyя оно будет m000092 а завтра я уже буду выдавать на M000080

А для подобных случаев как раз и можно использовать либо макроподстановку, либо EVALUATE(), где переменная - как раз то самое, меняющееся по условию выражение. Последняя фунция правда не во всех случаях срабатывает, просто надо проверять, если не годится где-то - делать там макроподстановку.
Кстати в привведенном ранее коде вообще непонятно - зачем там-то макроподстановка?? Там вроде просто обычного присваивания хватало бы.
можно конкретный пример привести как объеденить такие курсоры, или как то объяснить для самых одаренных?
а и еще что значит m. в m.a = "Cur2" уже не в первый раз сталкиваюсь но что такое так и не смог найти в гугле



Исправлено 2 раз(а). Последнее : axeum, 30.07.20 12:58
Ratings: 0 negative/0 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
можно конкретный пример привести как объеденить такие курсоры, или как то объяснить для самых одаренных?

Ну если под "объеденить" имеется в виду то, что выше, то просто указанием своего алиаса для каждого поля каждой таблицы. Для сокарщения записи можно назначать свое временное (оно только внутренее для запроса) имя каждому алиасу
Как-то так например:
SELECT ;
a.pole1 as pole1, ;
b.pole2 as pole2 ;
FROM tabl1 a, tabl2 b ;
WHERE a.pole1=b.pole1 AND a.pole2=b.pole2 ;
INTO CURSOR curOut
Т.е. при наличии одинаковых полей в итоговом курсоре pole1 будет из первой таблицы, pole2 из второй.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
что значит m. в m.a = "Cur2" уже не в первый раз сталкиваюсь но что такое так и не смог найти в гугле

Это применяется для указания, что m.a - переменнная. Чтобы не было путаницы, если есть скажем открытая таблица с одноименным полем. Для которого обычно указывается tabl1.a, но если писать просто "а" - все равно оно будет читаться, если таблица открыта. Поэтому, скажем забыв приписать m. к имени переменной при всяких действиях с ней - можно вот так напороться, что будет считываться не она, а вместо нее - поле таблицы. Как бы для подстраховки и приписывают к ней обычно m с точкой.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/2 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
Crispy
axeum
можно конкретный пример привести как объеденить такие курсоры, или как то объяснить для самых одаренных?

Ну если под "объеденить" имеется в виду то, что выше, то просто указанием своего алиаса для каждого поля каждой таблицы. Для сокарщения записи можно назначать свое временное (оно только внутренее для запроса) имя каждому алиасу
Как-то так например:
SELECT ;
a.pole1 as pole1, ;
b.pole2 as pole2 ;
FROM tabl1 a, tabl2 b ;
WHERE a.pole1=b.pole1 AND a.pole2=b.pole2 ;
INTO CURSOR curOut
Т.е. при наличии одинаковых полей в итоговом курсоре pole1 будет из первой таблицы, pole2 из второй.

ну под объединить имею ввиду взять поле cur1.M000092 и вставить его в cur1

SELECT ;
a.kkd as kkd, ;
b.fio as fio ;
from cur1 a, cur2 b ;
where a.kkd=b.kkd AND a.fio=b.fio ;
INTO CURSOR curOut
browse
и что я этим получил? объединенный курсор cur1 и cur2, хорошо если даже добавлю adres это всеровно же ничего не изменит? если я не знаю как будет называться поле как я его вытащу в курсор?



Исправлено 1 раз(а). Последнее : axeum, 30.07.20 13:18
Ratings: 0 negative/0 positive
Re: копирование колонки
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
если я не знаю как будет называться поле как я его вытащу в курсор?

Ну дык про это же там выше уже целый лист написали!
Макроподстановкой.
Если имя поля неизвестно заранее, задаем его переменной.
А потом через макроподстановку подставляется нужное выражение.
Что-то вроде:
poleCurOut = "adres"
poleCur1 = "a."+poleCurOut
SELECT ;
&poleCur1 as &poleCurOut , ;
a.kkd as kkd, ;
b.fio as fio ;
from cur1 a, cur2 b ;
where a.kkd=b.kkd AND a.fio=b.fio ;
INTO CURSOR curOut

Что-то такого рода имелось в виду? Или что?


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 30.07.20 15:01
Ratings: 0 negative/0 positive
Re: копирование колонки
akvvohinc

Сообщений: 4202
Откуда: Москва
Дата регистрации: 11.11.2008
of63
SCAN работает просто - это эквивалент вот такой конструкции
Когда-то это, действительно, было так, но уже давно, еще с Доса, появились некоторые отличия:
при любом выходе из SCAN-цикла, куда бы вас не забросила судьба внутри цикла, вы гарантированно находитесь в той же рабочей области, что и сканируемая таблица, а при выходе из любого обычного цикла такой гарантии нет.

Например:
SELECT c1
SCAN
SELECT c2
EXIT
ENDSCAN
?ALIAS() && C1

Simple777
Вааще-та есть какая-то разница по скорости выполнения (или ещё по чему-то) между SCAN и DO WHILE в паре со SKIP?
SCAN существенно быстрее, но заметно (в секундах) это будет лишь при количестве записей порядка 10^8 (на обычном компе и диске).

Еще в чем разница - я написал выше.
Сюда же можно еще добавить про отсутствие необходимости следить за рабочей областью и перед LOOP.
SELECT c1
SCAN
SELECT c2
IF <условие>
LOOP && автоматом переключит область на C1
ENDIF
...
ENDSCAN
Ratings: 0 negative/0 positive
Re: копирование колонки
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
str1 = 'create cursor cur1 (kkd N(10),fio C(60),adres C(100)'
str2 = 'create cursor cur2 (kkd N(10),fio C(60),adres C(100)'
SELECT c2
scan
str1 = str1 + ',N' + PADL(ALLTRIM(STR(c2.kop,6)),6,'0') + ' N(10,2)'
str2 = str2 + ',M' + PADL(ALLTRIM(STR(c2.kop,6)),6,'0') + ' N(10,2)'
ENDSCAN
*!* str1 = str1+',itog N(10,2))'
&str1
*!* str2 = str2+',itog N(10,2))'
&str2
&str1 и &str2 куда бы я не ставил их будет ошибка syntax error, проблема в том что мне надо убрать itog, я пробовал их в скан поставить но ошибка та же, я не понимаю почему ошибка выходит но если раскомментить то проблема уйдет но колонка останется
str1 = str2+',itog N(10,2))'
str2 = str2+',itog N(10,2))'



Исправлено 2 раз(а). Последнее : axeum, 31.07.20 07:54
Ratings: 0 negative/0 positive
Re: копирование колонки
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> str1 = 'create cursor cur1 (kkd N(10),fio C(60),adres C(100)'
нет закрывающей скобки

нужно так
str1 = 'create cursor cur1 (kkd N(10),fio C(60),adres C(100))'
&str1

или так
str1 = 'create cursor cur1 (kkd N(10),fio C(60),adres C(100)'
&str1)
Ratings: 0 negative/0 positive
Re: копирование колонки
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
akvvohinc
SCAN существенно быстрее, но заметно (в секундах) это будет лишь при количестве записей порядка 10^8 (на обычном компе и диске).

То есть при 100 млн. записей разница во времени будет заметна. Например, у меня "за всё время" лишь в одном проекте была таблица под 2 млн. записей. Да и то не было необходимости сканировать её - только индексный поиск.

Думается, что разница между SCAN и DO WHILE не только в том, что было написано выше.

В DO WHILE по сути невозможно "отработать" сложное условие FOR при перемещении по таблице. SCAN же отработает сложные условия FOR без проблем.
Ratings: 0 negative/0 positive
Re: копирование колонки
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
В до вхиле не надо встраивать другие условия кроме !EOF(), вместо SCAN FOR перед до вхиле надо поставить SET FILTER условие
Естественно, в SCAN есть типовые фильтры и фишки (как и в REPORT FORM например) - REST, WHILE, еще чего-то - это все "обвязка" вокруг DO WHILE, реализуется тривиально (например, REST - значит не надо делать GO TOP, и т.п.)
Ratings: 0 negative/0 positive
Re: копирование колонки
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Ставить фильтр перед DO WHILE совсем не комильфо. Так думаю, что условие FOR в SCAN будет исполняться быстрее, нежели команда SET FILTER TO <условие> Хотя не уверен,есть ли разница по скорости...
Ratings: 0 negative/0 positive
Re: копирование колонки
akvvohinc

Сообщений: 4202
Откуда: Москва
Дата регистрации: 11.11.2008
of63
В до вхиле не надо встраивать другие условия кроме !EOF(), вместо SCAN FOR перед до вхиле надо поставить SET FILTER условие
Естественно, в SCAN есть типовые фильтры и фишки (как и в REPORT FORM например) - REST, WHILE, еще чего-то - это все "обвязка" вокруг DO WHILE, реализуется тривиально (например, REST - значит не надо делать GO TOP, и т.п.)

Все верно.
Я успел поработать на версиях, в которых скана еще не было - глобальных проблем не было, все решалось.
Но со сканом стало гораздо удобнее и "прозрачнее".
Ratings: 0 negative/0 positive
Re: копирование колонки
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Simple777
Ставить фильтр перед DO WHILE совсем не комильфо. Так думаю, что условие FOR в SCAN будет исполняться быстрее, нежели команда SET FILTER TO <условие> Хотя не уверен,есть ли разница по скорости...
SET FILTER работает мгновенно, т.к. он ничего "тяжёлого" не делает - просто запоминает условие, которое ПОТОМ будет применяться при GO/SKIP (кстати, и при SCAN тоже).
Является ли SCAN FOR более быстрым чем аналогичная комбинация из SET FILTER/DO WHILE/SKIP - при том ещё и для различных условий (с активным индексом, с фильтрованным индексом, с разной степени селективности условиями) - это надо тестировать - если кому-то это реально интересно


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: копирование колонки
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Igor Korolyov
SET FILTER работает мгновенно, т.к. он ничего "тяжёлого" не делает - просто запоминает условие

Однако я припоминаю, что команда SKIP (после SET FILTER) очень медленно работает на "границах", где начинается первая запись по условию или заканчивается последняя запись по условию.



Исправлено 1 раз(а). Последнее : Simple777, 31.07.20 16:19
Ratings: 0 negative/0 positive
Re: копирование колонки
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Зависит от множества факторов - в частности от наличия активного индексного тега, оптимизированности условия, совпадения активного индексного тега с тем индексом, который используется для оптимизации. Учитывая, для лучшего понимания "нюансов", что SET DELETED ON тоже является своего рода фильтром, тоже может иметь оптимизирующий индексный тег и соответственно оптимизироваться, и что в некоторых случаях это условие создаёт "перекосы" в распределении подходящих/неподходящих записей в порядке выбора - ну если очень грубо, то вынуждает пропустить миллион записей, прежде чем будет достигнута искомая.

Хелп вообще недвусмысленно советует отключать индексный тег перед использованием любых команд с FOR/WHILE условием.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: копирование колонки
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Igor Korolyov
Зависит от множества факторов

Реально ли учесть это множество факторов? - вот в чем вопрос.
Ratings: 0 negative/0 positive
Re: копирование колонки
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Реально ли написать идеальную программу? - это не вопрос.
Ratings: 0 negative/0 positive
Re: копирование колонки
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Simple777
Реально ли учесть это множество факторов?
Да. Тем более что провести тестирование на репрезентативой модели реальных данных и выбрать наилучший вариант не так то и сложно. Другое дело, что до вопросов оптимизации доходят лишь в немногих случаях - это и правильно, зачем тратить дорогое время разработчика на приближение к идеалу, если и так всё приемлемо быстро работает.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


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

On-line: 17 akvvohinc  (Гостей: 16)

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