powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
16 сообщений из 16, страница 1 из 1
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33223082
Alexej M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. интересуют способы создания динамических запросов.


Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33223125
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ещё

ExecScript(cExpression [, eParameter1, eParameter2, ...])

А вообще, какая цель преследуется? Что надо сделать.
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33223381
Alexej M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ExecScript!

Ситуация такая:
К примеру, есть табл. файл индексов - a _id, b _id, c _id ... и т.д.
Запрос нужен либо с 1) "m.a_id=a_id .AND. m. b _id= b _id", либо с 2) "m.a_id=a_id .AND. m. с _id= с _id".
Так вот нельзя ли так построить один-единственный запрос (без & или cExpression), что бы он учитывал, что 1) с_id - все записи 2) b_id - все записи.

И влияют ли & или cExpression на скорость выполнения запроса?
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33223410
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче говоря надо построить динамические условия выборки и/или обьединения, другие способы как склеивать условия и запихивать в макроаодстановку/ExecScript мне не известны, если только не написать все возможные варианты.

Поскольку фокс не строит эвристик, как "взрослые СУБД", то на скорость выполнения запроса макроподстановка не повлияет.
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33224202
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Alexej!

> Так вот нельзя ли так построить один-единственный запрос (без & или
> cExpression), что бы он учитывал, что 1) с_id - все записи 2) b_id - все
> записи.

Можно - просто добавь условие не напрямую, а через IIF() и используй
например "пустое" значение как признак что нужно взять "всё". Пример такого
монстроидального запроса как-то приводил Михаил Дроздов - поищи на
foxclub.ru

> И влияют ли & или cExpression на скорость выполнения запроса?

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

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33225543
Alexej M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да действительно! Большое спасибо Igor Korolyov!


Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33234676
гость1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ребята, пожалуйста, дайте пример использования ExecScript. Не найду , где почитать. Новичек в VFP 6 . Мне нужно в запрос селект в зависимости от ситуации вставлять новые условия Where. Я хотела использовать & в выражении селекта.. не понял меня фокс.а как правлильно написать?
Я пробовала так ..
st_where ='where '+st_where
st_where='SELECT distinct ccqb.nlsa,bpl.plate,ccqb.nlsb,ccqb.korr,ccqb.mfob,'+;
'ccqb.kokb,ccqb.s,ccqb.da'+;
'FROM ccqb,bpl '+;
'Into cursor temp '+st_where
execScript(st_where)

и так

SELECT distinct ccqb.nlsa,bpl.plate,ccqb.nlsb,ccqb.korr,ccqb.mfob,;
ccqb.kokb,ccqb.s,ccqb.da;
FROM ccqb,bpl;
Into cursor temp &st_where
Помогите ,пожалуйста!
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33234753
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример можно дать, но без подробного объяснения бизнес логики он безполезен:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
m.lcCommand = [SELECT UO_ID, UO_KOD, UO_NAME, Fasovka_ID, F_Obos, EI_ID, Obos, ] + ;
[SUM(Kvo) AS Kvo, SUM(KvoIn) AS KvoIn, AVG(ZenaPart) AS ZenaPart, ] + ;
[SUM(KvoP) AS KvoP, SUM(KvoR) AS KvoR, SUM(SumR) AS SumR, SUM(ZenaPart*KvoIn) AS SummPart ]
m.lcGroupBy = [ GROUP BY UO_ID, Fasovka_ID ]
IF .chkAkzis.Value
*-- Группировать по акцизу партии
m.lcCommand = m.lcCommand + [, Part_Akzis]
m.lcGroupBy = m.lcGroupBy + [, Part_Akzis]
ELSE
m.lcCommand = m.lcCommand + [,  0  AS Part_Akzis]
ENDIF
IF ListPodraz.Podr_ID =  0 	&& Все подразделения
m.lcCommand = m.lcCommand + [,  0  AS Podr_ID, 'ВСЕ' AS Podr_Name,  0  AS Mesto_ID, 'ВСЕ' AS Mesto_Name]
ELSE
*-- Не все подразделения
m.lcCommand = m.lcCommand + [, Podr_ID, Podr_Name]
IF .chkPodraz.Value
*-- Выбирать и все подчиненные подразделения. В этом случае группировка по местам
*-- хранения не выполняется
m.lcCommand = m.lcCommand + [,  0  AS Mesto_ID, 'ВСЕ' AS Mesto_Name]
m.lcOldPodrString = oApp.PodrString
*-- В курсоре tempp получаем список подразделений,
*-- подчиненных ListPodraz.Podr_ID (включительно)
GetPodraz("tempp", ListPodraz.Podr_ID)
oApp.PodrString = m.lcOldPodrString
m.lcWhere = m.lcWhere + [ AND (Podr_ID IN (SELECT Podr_ID FROM tempp))]
m.lcGroupBy = m.lcGroupBy + [, Podr_ID]
ELSE
IF ListMesto.Mesto_ID >  0 
*-- Только требуемое место хранения
m.lcCommand = m.lcCommand + [, Mesto_ID, Mesto_Name]
m.lcWhere = m.lcWhere + [ AND (Mesto_ID=] + ALLTRIM(STR(ListMesto.Mesto_ID)) + [) AND (Podr_ID=] +  ALLTRIM(STR(ListPodraz.Podr_ID)) + [)]
ELSE
*-- Все места хранения
*-- Надо разбирать по местам хранения?
IF .chkMesta.Value
m.lcCommand = m.lcCommand + [, Mesto_ID, Mesto_Name]
m.lcGroupBy = m.lcGroupBy + [, Podr_ID, Mesto_ID]
ELSE
m.lcCommand = m.lcCommand + [,  0  AS Mesto_ID, 'ВСЕ' AS Mesto_Name]
m.lcGroupBy = m.lcGroupBy + [, Podr_ID]				
ENDIF
USE IN SELECT("tempm")
CREATE CURSOR tempm (Mesto_ID I, Podr_ID I)
THISFORM.RSprav.GetMesto(ListPodraz.Podr_ID,  0 , "tempm2")
INSERT INTO tempm (Podr_ID, Mesto_ID) ;
SELECT Podr_ID, Mesto_ID FROM tempm2
USE IN tempm2
m.lcWhere = m.lcWhere + [ AND (Mesto_ID IN (SELECT Mesto_ID FROM tempm))]
ENDIF
ENDIF
ENDIF
IF .chkUpakovka.Value
m.lcCommand = m.lcCommand + [,  0  AS Upakovka_ID, 'ВСЕ' AS U_obos]
ELSE
m.lcCommand = m.lcCommand + [, Upakovka_ID, U_obos]
m.lcGroupBy = m.lcGroupBy + [, Upakovka_ID]
ENDIF
IF .chkOSN.Value
m.lcCommand = m.lcCommand + [, OSN_ID, OSN]
m.lcGroupBy = m.lcGroupBy + [, OSN_ID]
ELSE
m.lcCommand = m.lcCommand + [,  0  AS OSN_ID, 'ВСЕ СЧЕТА' AS OSN]
ENDIF
IF !(.txtSelAccountSint.Value =="*")	&& Не все счета
m.lcWhere = m.lcWhere + [ AND (] + ALLTRIM(.txtSelAccountSint.LikeMaskaSQL) + [)]
ENDIF
*-- Собираем всю команду
m.lcCommand = m.lcCommand + [ FROM lOborot INTO CURSOR temp NOFILTER READWRITE ] +m.lcWhere + m.lcGroupBy
*-- Выполняем
&lcCommand

Идея в том, что разные части команды SQLECT - SQL собираются в переменных (m.lcGroupBy, m.lcWhere, ...) на основе выбранных режимов запроса в Controls формы, а затем команда выполняется (&lcCommand).
С Уважением, Алексей.
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33234863
Alexej M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CREATE TABLE a FREE (a i)
APPEND BLANK
REPLACE a WITH 1
APPEND BLANK
REPLACE a WITH 2
APPEND BLANK
REPLACE a WITH 3
f='a=2'
SELECT * from a WHERE &f INTO CURSOR temp
BROWSE
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33235117
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi гость1!

> дайте пример использования ExecScript. Не найду , где почитать. Новичек в
> VFP 6

Нету там этого, забей.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33235340
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем вам ExecScript?
Чем не устраивает макроподстановка & ?
С уважением, Алексей.
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33235607
Alexej M.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А эта команда в VFP6 есть вообще? В HELPe например.

EXECSCRIPT( ) Function

Enables you to run multiple lines of code from variables, tables, and other text at runtime.

ExecScript(cExpression [, eParameter1, eParameter2, ...])

Parameters:
cExpression - Represents the text, a variable, type string, or memo to be executed as code.

eParameter1, eParameter2, ... - Optional. Specify parameters passed to a script that has a parameter statement in first line.

Return Values - The return value is the value returned by the script in cExpression. If the script returns no value, Visual FoxPro returns .T.

Remarks - ExecScript( ), unlike macro expansion, provides the same effect as selecting several lines of code in the command window then pressing the Enter key.

Example - This example creates a form and then shows the value of the AutoCenter property of the new Form object. Note the use of CHR(13), which is used to separate the two code lines.

?EXECSCRIPT("oForm=CREATEOBJECT('Form')"+CHR(13)+"?oForm.AutoCenter")
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33236527
Гость1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, спасибо. за ответы. Макроподстановка меня вполне устраивает. Но я ее неправильно ставила, как в примере, на который " забыть надо "
я собрала селект и с макроподстановкой работаю... Но не пойму, у меня обрезается условие where в выражении селекта. символьная строка 255 , а если длиннее? Я что -то недогоняю?
Ищу ошибку, но в принципе, я получила свой ответ Спасибо
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33236549
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собирай строку команды SELECT SQL по частям через конкатенацию.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33236591
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость1я собрала селект и с макроподстановкой работаю... Но не пойму, у меня обрезается условие where в выражении селекта. символьная строка 255 , а если длиннее? Я что -то недогоняю?

Символьные поля, переменные памяти и константы

В FoxPro существует отличия в предельно допустимой длине символьных данных в зависимости от того, о чем идет речь: поле таблицы, переменной памяти или константе

Ну, с полями таблицы все ясно. Их предельная длина определяется собственно размерностью поля. Однако размерность поля не может превышать 254 символов. Для memo-полей объем не может превышать 2ГБ (2 гигабайта - это 2 и 9 нулей символов).

Длина символьной константы не может превышать 255 символов

Длина символьной переменной теоретически не может превышать 16,777,184 символов. "Теоретически", потому, что при определенных условиях все-таки может. Просто за последствия такого превышения никто не отвечает.

Отдельно следует остановиться на отличии символьной константы от символьной переменной. Начинающие программисты очень часто получают сообщение об ошибке "Command contains unrecognized phrase/keyword (Error 36)" именно в силу непонимания этой разницы.

В FoxPro для написания символьных констант можно использовать 3 символа: одинарные кавычки, двойные кавычки, квадратные скобки. В чем отличие символьной константы от символьной переменной проще объяснить на примере. Словами получится долго и невнятно. Например:

Код: plaintext
1.
2.
LOCAL lcString
lcString = 'Начало строки' + " середина строки " + [окончание строки] 

Так вот, здесь то, что записано в кавычках и квадратных скобках - это 3 символьные константы, а lcString - это одна символьная переменная

Вообще-то, лично мне трудно представить, как можно написать одну символьную константу длиной больше 255 символов. Точнее написать-то такое можно, но как потом это можно редактировать! Получится совершенно не "читабельный" текст. Я рекомендовал бы разбивать длинные символьные константы на небольшие фрагменты с тем, чтобы каждый отдельный фрагмент целиком помещался в окне редактирования. Примерно так:

Код: plaintext
1.
2.
3.
4.
LOCAL lcString
lcString = "Начало строки"+;
      " середина строки "+;
      "окончание строки"


В FoxPro нет специальных управляющих символов, как, например, в C используется обратный слэш. Поэтому, если Вам надо использовать кавычки не как границу символьной константы, а как собственно символ, то просто обрамляйте их кавычками другого типа:

Код: plaintext
?[ЗАО "Рога и копыта"]

Следует всегда помнить, что FoхPro отличается определенной "самостоятельностью" в конвертации данных. Применительно к символьным данным это проявляется в том, что если Вы попытаетесь записать в символьное поле больше символов, чем позволяет его размерность, то ошибки это не вызовет, просто "лишние" символы будут отброшены без каких-либо дополнительных сообщений об ошибках.

Код: plaintext
1.
2.
3.
CREATE CURSOR test (test C( 5 ))
INSERT INTO test (test) VALUES ("1234567890")
?test.test
...
Рейтинг: 0 / 0
Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
    #33237530
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Alexej!

> А эта команда в VFP6 есть вообще

Я же сказал, нету!

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Какие способы подачи SELECT SQL есть еще, кроме явной и & ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]