for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

Re: копирование колонки
of63

Сообщений: 20503
Откуда: Н.Новгород
Дата: 30.07.20 12:26:46
> я не знаю какие поля указывать если имя поле динамические и сегод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

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

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

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

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


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




Исправлено: Crispy, 30.07.20 12:35
Ratings: 0 negative/0 positive

Re: копирование колонки
axeum
Автор

Сообщений: 48
Дата: 30.07.20 12:50:55
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" уже не в первый раз сталкиваюсь но что такое так и не смог найти в гугле



Исправлено: axeum, 30.07.20 12:58
Ratings: 0 negative/0 positive

Re: копирование колонки
Crispy

Сообщений: 17217
Дата: 30.07.20 12:59:56
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

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

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


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

Re: копирование колонки
axeum
Автор

Сообщений: 48
Дата: 30.07.20 13:13:16
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 это всеровно же ничего не изменит? если я не знаю как будет называться поле как я его вытащу в курсор?



Исправлено: axeum, 30.07.20 13:18
Ratings: 0 negative/0 positive

Re: копирование колонки
Crispy

Сообщений: 17217
Дата: 30.07.20 15:00:15
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

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


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




Исправлено: Crispy, 30.07.20 15:01
Ratings: 0 negative/0 positive

Re: копирование колонки
akvvohinc

Сообщений: 3127
Откуда: Москва
Дата: 31.07.20 03:01:08
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
Автор

Сообщений: 48
Дата: 31.07.20 07:53:02
  
  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))'



Исправлено: axeum, 31.07.20 07:54
Ratings: 0 negative/0 positive

Re: копирование колонки
of63

Сообщений: 20503
Откуда: Н.Новгород
Дата: 31.07.20 08:32:16
> 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

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

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

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

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

Re: копирование колонки
of63

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

Re: копирование колонки
Simple777

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

Re: копирование колонки
akvvohinc

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

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

Re: копирование колонки
Igor Korolyov

Сообщений: 34002
Дата: 31.07.20 16:11:36
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

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

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



Исправлено: Simple777, 31.07.20 16:19
Ratings: 0 negative/0 positive

Re: копирование колонки
Igor Korolyov

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

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


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

Re: копирование колонки
Simple777

Сообщений: 29473
Дата: 31.07.20 16:45:20
Igor Korolyov
Зависит от множества факторов

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

Re: копирование колонки
of63

Сообщений: 20503
Откуда: Н.Новгород
Дата: 31.07.20 17:29:57
Реально ли написать идеальную программу? - это не вопрос.
Ratings: 0 negative/0 positive

Re: копирование колонки
Igor Korolyov

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


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



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

On-line: 21 fvi vasili_u lulgu  (Гостей: 18)

21.01.2021 17:27:36 exec: 0.17
Mem: 1.517 Mb

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