Как уже сейчас можно динамически формулировать оператор поиска



Posted by Аркадий Водяник on June 11, 1999 at 11:32:06:

In Reply to: Эффективное использование "быстрых фактов" posted by Бутченко Игорь on June 09, 1999 at 02:30:41:

Аркадий Водяник

Как уже сейчас можно динамически формулировать оператор поиска

Конечно, Игорь прав в том, что для N различных вариантов запроса неудобно и некрасиво
записывать N вариантов Search. И уж совсем никуда не годится использовать в шаблоне
поиска одни вопросительные знаки.

Но есть элегантный способ этого избежать и ДИНАМИЧЕСКИ сформулировать требуемый
оператор поиска. И не только оператор, а и целую программу. Для этого будем использовать
поочередную работу двух форм: формы-формулировщика и формы-искателя. Форма-формулировщик
будет спрашивать пользователя об особенностях запроса и затем генерировать текст
формы-искателя операторами >FILE и >>FILE

Пример:


* фоpма-фоpмулиpовщик запроса
X=[strip [is 'имя>',' ',10]];
Y=[strip [is 'фамилия>', ' ',10]];
Z=[strip [is 'номеp>',' ',10]]
F='F2.RPT'; U=[ch 39]
S='* Фоpма-искатель'
^^^^^^^^^^^^^^^^^^^^^S > file F
S='X='+U+X+U+';'+' Y='+U+Y+U+'; '+'Z='+U+Z+U
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^S >> file F
S=':L'
^^^^^^^S >> file F
S='search Имя '
if X > ' ' S=S+'X'; else S=S+'?X'; endif; S=S+' Фамилия '
if Y > ' ' S=S+'Y'; else S=S+'?Y'; endif; S=S+' Номеp '
if Z > ' ' S=S+'Z'; else S=S+'?Z'; endif
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^S >> file F
Запpос сфоpмулиpован: Запустите F2 (фоpму-искатель)
S='if [success]'
^^^^^^^^^^^^^^^^S >> file F
S='^^^^^^^^^^^X ^^^^^^^^^^^^^Y ^^^^^^^^^^^^Z'
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^S >> file F
S='goto L; endif'
^^^^^^^^^^^^^^^^S >> file F

Вот что сгенерировала форма-формулировщик, когда на вопрос "имя"
мы ответили "Вася", а на вопросы "фамилия" и "номер" не ответили
(просто нажали Enter):

* Фоpма-искатель
X='Вася'; Y=' '; Z=' '
:L
search Имя X Фамилия ?Y Номеp ?Z
if [success]
^^^^^^^^^^^X ^^^^^^^^^^^^^Y ^^^^^^^^^^^^Z
goto L; endif

Этот текст не содержит многочисленных if..elseif.. и использует
преимущества быстрых фактов (см 388 и 552).

Конечно, показанное выглядит вполне компактно только в однопользовательских
версиях. В сетевой же версии после выполнения формы-формулировшика надо будет
послать еще запрос "W FORM" чтобы Сервер "подхватил" (скомпилировал) новую
форму-искателя. Но форму-искатель разместить на клиентской стороне, то и там
это будет работать хорошо.

Я сделаю использование динамически создаваемых форм более удобным в будуших
модификациях Сервера.

Я не использовал массивы, for и другие приемы, чтобы не усложнять восприятие...



Пpишедшие ответы: