![]() |
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум | ![]() |
![]() |
Лисоводы всех стран, объединяйтесь !!! |
Re: копирование колонки | |||
---|---|---|---|
of63 Сообщений: 20503 Откуда: Н.Новгород |
> я не знаю какие поля указывать если имя поле динамические и сегодyя оно будет m000092
Открой для себя макросы, скобки... m.a = "Cur2" m.f = "Поле1" && или FIELD(1), или FILELD(1, m.a) ... Можно строить вот такие конструкции (после амперсанда и переменной и точки может потребоваться еще точка, все время путем подбора подбираю...) Select &f, &a.&f FROM cur1, (m.a) ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Crispy Сообщений: 17217 |
Чтобы не было повторяющихся, проще всего перечислить с указаниим алиаса для них.
А для подобных случаев как раз и можно использовать либо макроподстановку, либо EVALUATE(), где переменная - как раз то самое, меняющееся по условию выражение. Последняя фунция правда не во всех случаях срабатывает, просто надо проверять, если не годится где-то - делать там макроподстановку. Кстати в привведенном ранее коде вообще непонятно - зачем там-то макроподстановка?? Там вроде просто обычного присваивания хватало бы. ![]() ------------------ В действительности все иначе, чем на самом деле.
(Антуан де Сент-Экзюпери) Исправлено: Crispy, 30.07.20 12:35 ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
axeum Автор Сообщений: 48 |
если честно понятней не стало, мне кажется я вообще не понимаю что происходит в твоем select, что выбирается и зачем и как ![]() можно конкретный пример привести как объеденить такие курсоры, или как то объяснить для самых одаренных? а и еще что значит m. в m.a = "Cur2" уже не в первый раз сталкиваюсь но что такое так и не смог найти в гугле Исправлено: axeum, 30.07.20 12:58 ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Crispy Сообщений: 17217 |
Ну если под "объеденить" имеется в виду то, что выше, то просто указанием своего алиаса для каждого поля каждой таблицы. Для сокарщения записи можно назначать свое временное (оно только внутренее для запроса) имя каждому алиасу Как-то так например: 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 ------------------ В действительности все иначе, чем на самом деле.
(Антуан де Сент-Экзюпери) ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Crispy Сообщений: 17217 |
Это применяется для указания, что m.a - переменнная. Чтобы не было путаницы, если есть скажем открытая таблица с одноименным полем. Для которого обычно указывается tabl1.a, но если писать просто "а" - все равно оно будет читаться, если таблица открыта. Поэтому, скажем забыв приписать m. к имени переменной при всяких действиях с ней - можно вот так напороться, что будет считываться не она, а вместо нее - поле таблицы. Как бы для подстраховки и приписывают к ней обычно m с точкой. ------------------ В действительности все иначе, чем на самом деле.
(Антуан де Сент-Экзюпери) ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
axeum Автор Сообщений: 48 |
ну под объединить имею ввиду взять поле 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 Исправлено: axeum, 30.07.20 13:18 ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Crispy Сообщений: 17217 |
Ну дык про это же там выше уже целый лист написали! ![]() Макроподстановкой. Если имя поля неизвестно заранее, задаем его переменной. А потом через макроподстановку подставляется нужное выражение. Что-то вроде: 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 Что-то такого рода имелось в виду? Или что? ------------------ В действительности все иначе, чем на самом деле.
(Антуан де Сент-Экзюпери) Исправлено: Crispy, 30.07.20 15:01 ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
akvvohinc Сообщений: 3127 Откуда: Москва |
Когда-то это, действительно, было так, но уже давно, еще с Доса, появились некоторые отличия: при любом выходе из SCAN-цикла, куда бы вас не забросила судьба внутри цикла, вы гарантированно находитесь в той же рабочей области, что и сканируемая таблица, а при выходе из любого обычного цикла такой гарантии нет. Например: SELECT c1 SCAN SELECT c2 EXIT ENDSCAN ?ALIAS() && C1 SCAN существенно быстрее, но заметно (в секундах) это будет лишь при количестве записей порядка 10^8 (на обычном компе и диске). Еще в чем разница - я написал выше. Сюда же можно еще добавить про отсутствие необходимости следить за рабочей областью и перед LOOP. SELECT c1 SCAN SELECT c2 IF <условие> LOOP && автоматом переключит область на C1 ENDIF ... ENDSCAN ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
axeum Автор Сообщений: 48 |
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+',itog N(10,2))' str2 = str2+',itog N(10,2))' Исправлено: axeum, 31.07.20 07:54 ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
of63 Сообщений: 20503 Откуда: Н.Новгород |
> 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) ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Simple777 Сообщений: 29473 |
То есть при 100 млн. записей разница во времени будет заметна. Например, у меня "за всё время" лишь в одном проекте была таблица под 2 млн. записей. Да и то не было необходимости сканировать её - только индексный поиск. Думается, что разница между SCAN и DO WHILE не только в том, что было написано выше. В DO WHILE по сути невозможно "отработать" сложное условие FOR при перемещении по таблице. SCAN же отработает сложные условия FOR без проблем. ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
of63 Сообщений: 20503 Откуда: Н.Новгород |
В до вхиле не надо встраивать другие условия кроме !EOF(), вместо SCAN FOR перед до вхиле надо поставить SET FILTER условие
Естественно, в SCAN есть типовые фильтры и фишки (как и в REPORT FORM например) - REST, WHILE, еще чего-то - это все "обвязка" вокруг DO WHILE, реализуется тривиально (например, REST - значит не надо делать GO TOP, и т.п.) ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Simple777 Сообщений: 29473 |
Ставить фильтр перед DO WHILE совсем не комильфо. Так думаю, что условие FOR в SCAN будет исполняться быстрее, нежели команда SET FILTER TO <условие> Хотя не уверен,есть ли разница по скорости...
![]() ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
akvvohinc Сообщений: 3127 Откуда: Москва |
Все верно. Я успел поработать на версиях, в которых скана еще не было - глобальных проблем не было, все решалось. Но со сканом стало гораздо удобнее и "прозрачнее". ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Igor Korolyov Сообщений: 34002 |
SET FILTER работает мгновенно, т.к. он ничего "тяжёлого" не делает - просто запоминает условие, которое ПОТОМ будет применяться при GO/SKIP (кстати, и при SCAN тоже). Является ли SCAN FOR более быстрым чем аналогичная комбинация из SET FILTER/DO WHILE/SKIP - при том ещё и для различных условий (с активным индексом, с фильтрованным индексом, с разной степени селективности условиями) - это надо тестировать - если кому-то это реально интересно ![]() ------------------ WBR, Igor ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Simple777 Сообщений: 29473 |
Однако я припоминаю, что команда SKIP (после SET FILTER) очень медленно работает на "границах", где начинается первая запись по условию или заканчивается последняя запись по условию. Исправлено: Simple777, 31.07.20 16:19 ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Igor Korolyov Сообщений: 34002 |
Зависит от множества факторов - в частности от наличия активного индексного тега, оптимизированности условия, совпадения активного индексного тега с тем индексом, который используется для оптимизации. Учитывая, для лучшего понимания "нюансов", что SET DELETED ON тоже является своего рода фильтром, тоже может иметь оптимизирующий индексный тег и соответственно оптимизироваться, и что в некоторых случаях это условие создаёт "перекосы" в распределении подходящих/неподходящих записей в порядке выбора - ну если очень грубо, то вынуждает пропустить миллион записей, прежде чем будет достигнута искомая.
Хелп вообще недвусмысленно советует отключать индексный тег перед использованием любых команд с FOR/WHILE условием. ------------------ WBR, Igor ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Simple777 Сообщений: 29473 |
Реально ли учесть это множество факторов? - вот в чем вопрос. ![]() ![]() |
||
Re: копирование колонки | |||
---|---|---|---|
of63 Сообщений: 20503 Откуда: Н.Новгород |
Реально ли написать идеальную программу? - это не вопрос.
![]() |
||
Re: копирование колонки | |||
---|---|---|---|
Igor Korolyov Сообщений: 34002 |
Да. Тем более что провести тестирование на репрезентативой модели реальных данных и выбрать наилучший вариант не так то и сложно. Другое дело, что до вопросов оптимизации доходят лишь в немногих случаях - это и правильно, зачем тратить дорогое время разработчика на приближение к идеалу, если и так всё приемлемо быстро работает. ------------------ WBR, Igor ![]() |
||
© 2000-2021 Fox Club  |