Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Всем добрый день! Я столкнулся с одной проблемой, мне потребовалось написать хранимую процедуру на 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-( Заранее всем благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2005, 16:07 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
А запятые в перечислении параметров не забыл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2005, 18:26 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
"Если пылесос по прежнему не работает, прочтите наконец инструкцию!" (с) 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2005, 18:58 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
> 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'эшек для каждого конкретного случая! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2005, 21:01 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Hi Dionnis! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. А вообще мне например непонятно зачем тебе нужны неструктурные теги (когда имя CDX отличается от имени DBF), и соответственно вся эта мутотня с "ручным" открытием таблиц и т.п. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2005, 01:09 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
> Добрый день, Igor Korolyov! Попробовал написать процедуру как Вы посоветовали, что то тоже не получается, та же ошибка: Function name is missing ) А в строчке > SELECT TableName разве не надо также писать > SELECT m.TableName И в инструкции USE IN SELECT("TableName") "TableName" - это же строка TableName получается, а не имя таблицы, или я может не так чё понимаю. Но всё равно спасибо! 8-) Я название индексных файлов не я пидумывал. Если бы это зависело от меня, так я бы не задумывался даже как их называть, а называл как и соответствующая ему таблица. Просто помимо моей программы, с базой ещё и программа написанная на Clipper работает. И как мне объяснили программисты пишущие на Clipper'е, если называть индексные файлы в соответсвии с таблицей, то у них там какие-то сбои будут происходить ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2005, 12:42 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
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)... И, как говорит народный юмор, если программист говорит "Мы делаем в соответствии со стандартами", то надо понимать "Мы всегда так делаем"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2005, 14:19 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
> Станислав С. Комментарии это я не в программе естественно раставлял, а только здесь, пытаясь пояснить чего имеено я хочу сделать, а так, спасибо большое за советы, буду знать. 8-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2005, 14:30 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
К сведению: В FoxPro команда SELECT-SQL сама открывает все необходимые таблицы (если может их найти). А в Вашем синтаксисе предполагается, что таблицы лежат в текущей директории, поэтому проблем с поиском быть не должно. Индексы могут ускорить выполнение команды Select-SQL, но эта команда вполне может обойтись и без них. Будет медленнее (иногда в разы), но тем не менее, запрос будет выполнен. На команду Select-SQL никак не влияет текущий главный индекс (SET ORDER TO) Итого, всю процедуру можно оформить примерно так: Код: plaintext 1. 2. 3. 4. Здесь SQLString - это сформированная в синтаксисе FoxPro строка команды Select-SQL, UPDATE-SQL или INSERT-SQL Хотя, не совсем понятно, зачем вообще пондобилось писать процедуру. Простой запрос можно послать и напрямую через ADO. Разумеется, есть ограничения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2005, 14:53 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
DionnisПопробовал написать процедуру как Вы посоветовали, что то тоже не получается, та же ошибка: Function name is missing ) ИМХО откомпилировать програмку нужно, а только потом вызывать Код: plaintext PS разделяю мнение Владимира М., что простых команд SQL без наворотов и затей вполне достаточно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2005, 15:20 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
> Владимир М {Индексы могут ускорить выполнение команды Select-SQL, но эта команда вполне может обойтись и без них. Будет медленнее (иногда в разы), но тем не менее, запрос будет выполнен.} Ну вот именно, выполнен то он будет выполнен, но вопрос за какое количество времени. Программа должна работать на приёме граждан, и не может же человек сидеть несколько минут и ждать когда выполнится один запрос, который может оказаться для него не единственным. Причём помимо моей программы, с базой работает и другая программа (на Clipper), которая использует индексы, и без индексации базы, добавленные данные через мою программу им не видны. Поэтому вопрос скорости выполнения запросов для меня очень важна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2005, 15:55 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Вопрос оптимизации (читай: ускорения) выполнения SQL-запросов - это вообще задача творческая. Т.е., конечно, есть некоторые формальные правила, позволяющие ускорить выполнение запросов. Но далеко не всегда они помогают. Прежде чем пытаться писать собственный COM-сервер попробуй выполнть запросы напрямую через ADO. Возможно, полученная скорость тебя вполне удовлетворит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2005, 17:15 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Hi Dionnis! Так это значит вообще свободные файлы? Не часть БД? Тогда я думаю ты вообще попал, и вряд-ли сможешь запустить "процедуру" через провайдер... А по синтаксису: TableName это во втором (и третьем) случае не переменная, а алиас таблицы - т.е. то как к ней можно будет обращаться из процедуры - хотя конечно лучше "развести" имена переменных и алиасов, это я зря их одинаковыми сделал :( В общем лучше всего наверное будет создать тебе на фоксе COM-сервер, который и будет заниматься выполнением подобных процедур (процедура = метод) - но для этого конечно придётся и собственно фокс где-то найти, и хелп почитать... В принципе в фоксе (начиная с VFP7) есть мощная штука - EXECSCRIPT() называется - так что можно сделать вот такой вот COM-сервер: Код: plaintext 1. 2. 3. 4. 5. Скомпилировать его, и работать - передавая внутри первым параметром собственно код (БЕЗ PROCEDURE, сразу начиная с LPARAMETERS tcParam1, tcParam2, tcParam3 и заканчивая RETURN-ом)... Соответственно если надо >3 параметров, то добавить ещё методы по аналогии, хотя конечно всегда можно и одним параметром обойтись - запихать всё в одну строку, а в скрипте разобрать на части... Единственный минус - нельзя всё-же передать наружу курсор (т.е. набор записей), но если фокс 7 и старше, то можно через XML всё сделать - CURSORTOXML(...) и уже на клиенте что угодно с ним делать... 2 Владимир - если не подключать такие левые индексы, то нельзя выполнять операции изменения данных (порушаться индексы), что как я понимаю является одним из условий... Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2005, 05:15 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
вот меня всегда интересовало... ваш код: " PROCEDURE SQLProc PARAMETERS SQLString &SQLString CLOSE DATA RETURN " подскажите - как корректней делать - писать пот такие процедуры хранимые, на редактирование записей в таблице, либо просто в методе формы делать то же самое...... в смысле какой метод лучше? 1 - ХП 2 - вся обработка в формах ??? В случае ХП нужно ли делать буфферизацию и окружать ее транзакцией? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2005, 09:28 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Во вложенном файле пояснение того, что такое "Хранимые процедуры" в FoxPro и для чего они нужны. Делать буферизацию в ХП - не имеет смысла, поскольку при открытой транзакции это попросту невозможно! У Вас есть уверенность, что вызов ХП происходит во вне транзакции? Вот и у меня нет. Хотя проверку на факт буферизации надо проводить, чтобы сбросить буфер после модификации. А вот окружить ХП транзакцией, если ХП модифицирует данные - это надо обязательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2005, 10:46 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
владимир - ваша статья как и другие, мне знакомы - читал уже... просто как, с точки зрения программиста лучше делать модификацию - вот в чем вопрос....? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2005, 15:13 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
FM32YO aka KID просто как, с точки зрения программиста лучше делать модификацию - вот в чем вопрос....? Это Вы о чем? О какой модификации идет речь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2005, 18:26 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Редактирование записи я имел в виду... Вариант 1 - пишется метод, а-ля тот, который Вы тут неоднократно приводили. в буфферизацией и проверкой на модификацию той же записи в то же время другим юзеров. ну вроде как кнопка СОХРАНИТЬ и под ней куча кода с проверками и так далее 2 - та же кнопка, но в ней вызов ХП с параметром cSQL = "UPDATE meTable SET MyField1 = ?ActiveFormTextBox1..... MyFieldn = ?ActiveFormTextBoxn.... WHERE....." в том и вопрос - что есть лучше? или все едино - на усмотрение разработчика? Я 2-й метод еще не пробовал, 1-й работает на ура, но всегда интересно поэкспериментировать.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2005, 22:40 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
Такие вещи явно не для ХП. Если читали статью, то в ХП идет только то, что вызывается из различных событий таблиц. Т.е. некая "автоматика", по большому счету, не зависящая от пользователя. А обычное сохранение модификаций записи к ХП никакого отношения не имеет. Если очень хочется, то можно оформить как методы некоего класса (если есть общая часть в коде) Ну, например, если пользователь ввел некую сумму, то сумма баланса должна измениться "автоматически". Вот ввод собственно суммы сохраняется в методе формы, а коррекция баланса производится в ХП через триггеры. 2 разных процесса в разных местах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 00:02 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
понятно.. вопрос был навеяа копанием в корпоративнойсофтине написанной под Оракл... вот там ХП на 50-150 строк.... вот и пришла мысль "а нельзя ли..." Я понимаю что не для этого ХП создано, но ИМХО получается как бы иллюзия того, что на клиенте минимум кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 04:28 |
|
||
|
Написание хранимой процедуры
|
|||
|---|---|---|---|
|
#18+
FM32YO aka KIDпонятно.. вопрос был навеяа копанием в корпоративнойсофтине написанной под Оракл... вот там ХП на 50-150 строк.... вот и пришла мысль "а нельзя ли..." Я понимаю что не для этого ХП создано, но ИМХО получается как бы иллюзия того, что на клиенте минимум кода На мой взгляд этот вопрос вполне имеет право на жизнь и в принципе работает очень хорошо. Например Web магазин на ASP.NET - сами знаете, какой не очень прозрачный язык VB.NET - я использовал предложенную Вами идеологию (точнее 3-х слойный клиент) - передаешь параметрами что надо изменить в ХП а там уже дальше чистый FoxPro со всеми "наворотами" :) (транзакциями, буферизацией и необходимыми проверками) - в ответ результат... В ХП вставил и весь сервис - от упаковки данных до создания резервных копий... Все работает прекрасно и не показывает тенденции к возникновению проблем... Да и скорость разработок в таком случае весьма высока... Good luck! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 09:39 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32867542&tid=1595050]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 256ms |
| total: | 420ms |

| 0 / 0 |
