powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Написание хранимой процедуры
21 сообщений из 21, страница 1 из 1
Написание хранимой процедуры
    #32866728
Dionnis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем добрый день!
Я столкнулся с одной проблемой, мне
потребовалось написать хранимую процедуру
на Fox'е. Дело в том что в Fox'е я фактически полный ноль,
поэтому обращаюсь за помощью к вам, так как под рукой нет ни
хорошей книжки, ни статей. Вобщем сам я написал вот что:

PROCEDURE SQLproc // название процедуры

PARAM TableName CHARACTER; // Передаваемые параметры
PARAM TagName CHARACTER; //
PARAM SQLstring CHARACTER; //

SET EXCLUSIVE OFF
USE TableName IN 0
SELECT TableName
SET INDEX TO "I" + TableName + ".CDX" // Подключаем индекс
SET ORDER TO TAG TagName // Устанавливаем тэг
SQLstring // Здесь по замыслу должна передаваться в процедуру
// строка с SQL командой (на удаление, обновление, добавление или выборку)
// и выполняться.


SELECT TableName
USE
RETURN

Но такой вариант не работает 8-(

Заранее всем благодарен.
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32866767
AiSK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А запятые в перечислении параметров не забыл?
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32866781
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Если пылесос по прежнему не работает, прочтите наконец инструкцию!" (с)

HELP VFP6
PARAMETERS Command Example

The following example passes parameters to an error-handling routine.

ON ERROR DO errhand WITH ERROR( ), MESSAGE( ), ;
MESSAGE(1),PROGRAM( ),LINENO( )
USE nodatabase
ON ERROR && restores system error-handling routine

PROCEDURE errhand
PARAMETERS gnError, gcMess, gnMess1, gcProg, gnLineNo
? 'Error number: ' + LTRIM(STR(gnError))
? 'Error message: ' + gcMess
? 'Line of code with error: ' + gnMess1
? 'Line number of error: '+ LTRIM(STR(gnLineNo))
? 'Program with error: ' + gcProg
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32866815
Dionnis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> AiSK
Не много непонял: Запятые при вызове процедуры?
Если да, то конечно нет.

> ВладимирМ
Немного поясню:
Эту процедуру я пишу не в самом Fox'е.
Я пишу приложение для работы с БД на Delphi, для соединения
с БД использую драйвер Microsoft OLE DB Provider for Visual FoxPro,
который, как видно из названия, поддерживает синтаксис Fox'a.
Так вот эту процедуру, находящуюся в prg-файле (SQLproc.prg) если размстить
в директории с dbf-файлами, то этот файл из Delphi можно использовать
как хранимую процедуру, и вызывать её следующим образом: exec SQLproc <перечисление параметров>,
поэтому естественно ошибки, которые Вы перечислили я видеть не могу,
а вместо этого драйвер мне выкидывает следующее сообщение:
Function name is missing )
Причём например другая процедура
PROCEDURE GetDeloS
PARAM M.Svid

* M.Svid = VAL(M.SvidSV)

SET EXCLUSIVE OFF
USE DELO IN 0
SELE DELO
SET INDEX TO IDELO.CDX
SET ORDER TO TAG Svidet
SELECT * FROM DELO WHERE (Svidet=M.Svid) INTO CURSOR CURDELO NOFILTER

SELE DELO
USE
RETURN

работает прекрасно, но это лищь частный вариант,
а мне нужна универсальная процедура, при помощи которой
я мог бы выполнять любые SQL операции (при помощи передачи SQL команды в качестве
параметра) используя индексные файлы, но это увы, уменя не получается,
не сохдавать же мне кучу prg'эшек для каждого конкретного случая!
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32866869
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Dionnis!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
PROCEDURE SQLproc

LPARAMETERS TableName, TagName, SQLstring

>      SET EXCLUSIVE OFF
USE (m.TableName) IN  0  SHARED ALIAS TableName
>      SELECT TableName
SET INDEX TO ("I" + m.TableName + ".CDX")
SET ORDER TO TAG (m.TagName)
&SQLstring.
* строка с SQL командой (на удаление, обновление, добавление или выборку)
* и выполняться.
USE IN SELECT("TableName")
>      RETURN

А вообще мне например непонятно зачем тебе нужны неструктурные теги (когда
имя CDX отличается от имени DBF), и соответственно вся эта мутотня с
"ручным" открытием таблиц и т.п.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32867542
Dionnis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Добрый день, Igor Korolyov!
Попробовал написать процедуру как Вы посоветовали,
что то тоже не получается, та же ошибка: Function name is missing )
А в строчке > SELECT TableName разве не надо также писать
> SELECT m.TableName
И в инструкции
USE IN SELECT("TableName")
"TableName" - это же строка TableName получается, а не имя таблицы,
или я может не так чё понимаю.
Но всё равно спасибо! 8-)

Я название индексных файлов не я пидумывал.
Если бы это зависело от меня, так я бы не задумывался даже как их называть, а называл как и соответствующая ему таблица.
Просто помимо моей программы, с базой ещё и программа написанная на Clipper работает. И как мне объяснили программисты пишущие на Clipper'е, если называть индексные файлы в соответсвии с таблицей, то у них там какие-то сбои будут происходить ...
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32867862
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dionnis> Добрый день, Igor Korolyov!
Попробовал написать процедуру как Вы посоветовали,
что то тоже не получается, та же ошибка: Function name is missing )
А в строчке > SELECT TableName разве не надо также писать
> SELECT m.TableName
И в инструкции
USE IN SELECT("TableName")
"TableName" - это же строка TableName получается, а не имя таблицы,
или я может не так чё понимаю.
Но всё равно спасибо! 8-)

Я название индексных файлов не я пидумывал.
Если бы это зависело от меня, так я бы не задумывался даже как их называть, а называл как и соответствующая ему таблица.
Просто помимо моей программы, с базой ещё и программа написанная на Clipper работает. И как мне объяснили программисты пишущие на Clipper'е, если называть индексные файлы в соответсвии с таблицей, то у них там какие-то сбои будут происходить ...

1. Если Вы комментарии оформляете в стиле С/С++ (через //), то это в Фоксе недопустимо. В Фоксе комментарии оформляются в виде && (от текущего места до конца строки), в виде * (от начала строки до конца строки), TEXT...ENDTEXT (Многострочный комментарий или убрать фрагмент программы)...
Это может быть одна из причин почему ругается Ваша процедура...
2. Типы параметров и переменных в процедурах на Фоксе не указываются (т.е. в разные моменты времени переменная с одним именем может быть и строковой , и целого типа и т.д.). Поэтому надо писать: Parameters TableName,TagName,SQLstring
а не:
PARAM TableName CHARACTER; // Передаваемые параметры
PARAM TagName CHARACTER; //
PARAM SQLstring CHARACTER; //
3. ";" после строки ставятся только в том случае, если команда продолжается на следующей строке
4. Насчет Ваших Clipper-программистов. На 95% уверен в том, что они вешают Вам "лапшу" (я сам когда-то программил на Клиппере и таких ограничений не наблюдал... Правда, я работал с "родными" Клипперовскими индексами *.ntx)...
И, как говорит народный юмор, если программист говорит "Мы делаем в соответствии со стандартами", то надо понимать "Мы всегда так делаем"...
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32867899
Dionnis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Станислав С.
Комментарии это я не в программе естественно раставлял,
а только здесь, пытаясь пояснить чего имеено я хочу сделать,
а так, спасибо большое за советы, буду знать. 8-)
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32868000
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сведению:

В FoxPro команда SELECT-SQL сама открывает все необходимые таблицы (если может их найти). А в Вашем синтаксисе предполагается, что таблицы лежат в текущей директории, поэтому проблем с поиском быть не должно.

Индексы могут ускорить выполнение команды Select-SQL, но эта команда вполне может обойтись и без них. Будет медленнее (иногда в разы), но тем не менее, запрос будет выполнен.

На команду Select-SQL никак не влияет текущий главный индекс (SET ORDER TO)

Итого, всю процедуру можно оформить примерно так:

Код: plaintext
1.
2.
3.
4.
PROCEDURE SQLProc
PARAMETERS SQLString
&SQLString
CLOSE DATA
RETURN

Здесь SQLString - это сформированная в синтаксисе FoxPro строка команды Select-SQL, UPDATE-SQL или INSERT-SQL

Хотя, не совсем понятно, зачем вообще пондобилось писать процедуру. Простой запрос можно послать и напрямую через ADO. Разумеется, есть ограничения.
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32868099
Cyrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DionnisПопробовал написать процедуру как Вы посоветовали,
что то тоже не получается, та же ошибка: Function name is missing )

ИМХО откомпилировать програмку нужно, а только потом вызывать
Код: plaintext
COMPILE ProgName.prg

PS разделяю мнение Владимира М., что простых команд SQL без наворотов и затей вполне достаточно
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32868213
Dionnis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Владимир М

{Индексы могут ускорить выполнение команды Select-SQL, но эта команда вполне может обойтись и без них. Будет медленнее (иногда в разы), но тем не менее, запрос будет выполнен.}

Ну вот именно, выполнен то он будет выполнен, но вопрос за какое количество времени. Программа должна работать на приёме граждан, и не может же человек сидеть несколько минут и ждать когда выполнится один запрос, который может оказаться для него не единственным. Причём помимо моей программы, с базой работает и другая программа (на Clipper), которая использует индексы, и без индексации базы, добавленные данные через мою программу им не видны. Поэтому вопрос скорости выполнения запросов для меня очень важна.
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32868502
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос оптимизации (читай: ускорения) выполнения SQL-запросов - это вообще задача творческая. Т.е., конечно, есть некоторые формальные правила, позволяющие ускорить выполнение запросов. Но далеко не всегда они помогают.

Прежде чем пытаться писать собственный COM-сервер попробуй выполнть запросы напрямую через ADO. Возможно, полученная скорость тебя вполне удовлетворит.
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32869017
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Dionnis!

Так это значит вообще свободные файлы? Не часть БД? Тогда я думаю ты вообще
попал, и вряд-ли сможешь запустить "процедуру" через провайдер...
А по синтаксису:
TableName это во втором (и третьем) случае не переменная, а алиас таблицы -
т.е. то как к ней можно будет обращаться из процедуры - хотя конечно лучше
"развести" имена переменных и алиасов, это я зря их одинаковыми сделал :(
В общем лучше всего наверное будет создать тебе на фоксе COM-сервер, который
и будет заниматься выполнением подобных процедур (процедура = метод) - но
для этого конечно придётся и собственно фокс где-то найти, и хелп
почитать...
В принципе в фоксе (начиная с VFP7) есть мощная штука - EXECSCRIPT()
называется - так что можно сделать вот такой вот COM-сервер:

Код: plaintext
1.
2.
3.
4.
5.
DEFINE CLASS MyVFPServer AS Session OLEPUBLIC
    PROCEDURE ExecVFPScriptWith3Params
        LPARAMETERS tcScript, tcParam1, tcParam2, tcParam3
        RETURN EXECSCRIPT(m.tcScript, m.tcParam1, m.tcParam2, m.tcParam3)
    ENDPROC
ENDDEFINE

Скомпилировать его, и работать - передавая внутри первым параметром
собственно код (БЕЗ PROCEDURE, сразу начиная с LPARAMETERS tcParam1,
tcParam2, tcParam3 и заканчивая RETURN-ом)... Соответственно если надо >3
параметров, то добавить ещё методы по аналогии, хотя конечно всегда можно и
одним параметром обойтись - запихать всё в одну строку, а в скрипте
разобрать на части... Единственный минус - нельзя всё-же передать наружу
курсор (т.е. набор записей), но если фокс 7 и старше, то можно через XML всё
сделать - CURSORTOXML(...) и уже на клиенте что угодно с ним делать...

2 Владимир - если не подключать такие левые индексы, то нельзя
выполнять операции изменения данных (порушаться индексы), что как я понимаю
является одним из условий...

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32869190
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот меня всегда интересовало... ваш код:
"
PROCEDURE SQLProc
PARAMETERS SQLString
&SQLString
CLOSE DATA
RETURN
"

подскажите - как корректней делать - писать пот такие процедуры хранимые, на редактирование записей в таблице, либо просто в методе формы делать то же самое......
в смысле какой метод лучше?
1 - ХП
2 - вся обработка в формах ???
В случае ХП нужно ли делать буфферизацию и окружать ее транзакцией?
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32869406
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во вложенном файле пояснение того, что такое "Хранимые процедуры" в FoxPro и для чего они нужны.

Делать буферизацию в ХП - не имеет смысла, поскольку при открытой транзакции это попросту невозможно! У Вас есть уверенность, что вызов ХП происходит во вне транзакции? Вот и у меня нет. Хотя проверку на факт буферизации надо проводить, чтобы сбросить буфер после модификации.

А вот окружить ХП транзакцией, если ХП модифицирует данные - это надо обязательно.
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32870345
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
владимир - ваша статья как и другие, мне знакомы - читал уже...
просто как, с точки зрения программиста лучше делать модификацию - вот в чем вопрос....?
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32870946
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FM32YO aka KID
просто как, с точки зрения программиста лучше делать модификацию - вот в чем вопрос....?
Это Вы о чем? О какой модификации идет речь?
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32871175
fm32yo......
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Редактирование записи я имел в виду...
Вариант
1 - пишется метод, а-ля тот, который Вы тут неоднократно приводили. в буфферизацией и проверкой на модификацию той же записи в то же время другим юзеров.
ну вроде как кнопка СОХРАНИТЬ и под ней куча кода с проверками и так далее

2 - та же кнопка, но в ней вызов ХП с параметром cSQL = "UPDATE meTable SET MyField1 = ?ActiveFormTextBox1..... MyFieldn = ?ActiveFormTextBoxn.... WHERE....."

в том и вопрос - что есть лучше? или все едино - на усмотрение разработчика?

Я 2-й метод еще не пробовал, 1-й работает на ура, но всегда интересно поэкспериментировать....
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32871214
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такие вещи явно не для ХП. Если читали статью, то в ХП идет только то, что вызывается из различных событий таблиц. Т.е. некая "автоматика", по большому счету, не зависящая от пользователя.

А обычное сохранение модификаций записи к ХП никакого отношения не имеет. Если очень хочется, то можно оформить как методы некоего класса (если есть общая часть в коде)

Ну, например, если пользователь ввел некую сумму, то сумма баланса должна измениться "автоматически". Вот ввод собственно суммы сохраняется в методе формы, а коррекция баланса производится в ХП через триггеры. 2 разных процесса в разных местах.
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32871273
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понятно.. вопрос был навеяа копанием в корпоративнойсофтине написанной под Оракл... вот там ХП на 50-150 строк....
вот и пришла мысль "а нельзя ли..."
Я понимаю что не для этого ХП создано, но ИМХО получается как бы иллюзия того, что на клиенте минимум кода
...
Рейтинг: 0 / 0
Написание хранимой процедуры
    #32871493
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FM32YO aka KIDпонятно.. вопрос был навеяа копанием в корпоративнойсофтине написанной под Оракл... вот там ХП на 50-150 строк....
вот и пришла мысль "а нельзя ли..."
Я понимаю что не для этого ХП создано, но ИМХО получается как бы иллюзия того, что на клиенте минимум кода
На мой взгляд этот вопрос вполне имеет право на жизнь и в принципе работает очень хорошо.

Например Web магазин на ASP.NET - сами знаете, какой не очень прозрачный язык VB.NET - я использовал предложенную Вами идеологию (точнее 3-х слойный клиент) - передаешь параметрами что надо изменить в ХП а там уже дальше чистый FoxPro со всеми "наворотами" :) (транзакциями, буферизацией и необходимыми проверками) - в ответ результат...

В ХП вставил и весь сервис - от упаковки данных до создания резервных копий... Все работает прекрасно и не показывает тенденции к возникновению проблем... Да и скорость разработок в таком случае весьма высока...

Good luck!
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Написание хранимой процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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