Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Remote vs Local

0 views
Skip to first unread message

Michael Filippov

unread,
Apr 11, 2003, 4:56:14 AM4/11/03
to

Hello, All!

У Key Field таблицы прописано DefaultValue.
Сделаны 2 updatable представления Local и Remote к этой таблице.
При добавлении записи в представления в первом случае Key Field
заполняется, во втором - нет.
Дак и должно быть?

With best regards, Michael Filippov.

Igor Korolyov

unread,
Apr 11, 2003, 6:25:14 AM4/11/03
to
Hi, Michael!
You wrote to All on Fri, 11 Apr 2003 08:56:14 +0000 (UTC):

MF> У Key Field таблицы прописано DefaultValue.
MF> Сделаны 2 updatable представления Local и Remote к этой таблице.

Т.е. через VFP ODBC драйвер?

MF> При добавлении записи в представления в первом случае Key Field
MF> заполняется, во втором - нет.

В самой таблице я полагаю?

MF> Дак и должно быть?

Вроде нет. Приведи свой код (и Create Table и Create SQL View - воспользуйся
GenDBC для этого.)

WBR, Igor

--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Michael Filippov

unread,
Apr 11, 2003, 8:01:34 AM4/11/03
to
Hello, Igor!
You wrote to Michael Filippov on Fri, 11 Apr 2003 10:25:14 +0000 (UTC):

IK> Hi, Michael!


IK> You wrote to All on Fri, 11 Apr 2003 08:56:14 +0000 (UTC):

MF>> У Key Field таблицы прописано DefaultValue.
MF>> Сделаны 2 updatable представления Local и Remote к этой таблице.

IK> Т.е. через VFP ODBC драйвер?
Да.

MF>> При добавлении записи в представления в первом случае Key Field
MF>> заполняется, во втором - нет.

IK> В самой таблице я полагаю?
Да.

MF>> Дак и должно быть?

IK> Вроде нет. Приведи свой код (и Create Table и Create SQL View -
IK> воспользуйся GenDBC для этого.)


DisplayStatus([Creating database...])
CLOSE DATA ALL
CREATE DATABASE 'DATA1.DBC'
DisplayStatus([Creating table TABLE1...])
MakeTable_TABLE1()
DisplayStatus([Creating connection CONNECT1...])
MakeConn_CONNECT1()
DisplayStatus([Creating view LOCAL...])
MakeView_LOCAL()
DisplayStatus([Creating view REMOTE...])
MakeView_REMOTE()
DisplayStatus([Finished.])


********* Procedure Re-Creation *********
IF !FILE([DATA1.krt])
? [Warning! No Procedure File Found!]
ELSE
CLOSE DATABASE
USE 'DATA1.DBC'
g_SetSafety = SET('SAFETY')
SET SAFETY OFF
LOCATE FOR Objectname = 'StoredProceduresSource'
IF FOUND()
APPEND MEMO Code FROM [DATA1.krt] OVERWRITE
REPLACE Code WITH SUBSTR(Code, 70, 119)
ENDIF
LOCATE FOR Objectname = 'StoredProceduresObject'
IF FOUND()
APPEND MEMO Code FROM [DATA1.krt] OVERWRITE
REPLACE Code WITH SUBSTR(Code, 189)
ENDIF
SET SAFETY &g_SetSafety
USE
OPEN DATABASE [DATA1.DBC]
ENDIF

FUNCTION MakeTable_TABLE1
***** Table setup for TABLE1 *****
CREATE TABLE 'TABLE1.DBF' NAME 'TABLE1' (KOD I NULL DEFAULT getnextkod(), ;
NAME C(10) NULL)

***** Create each index for TABLE1 *****
INDEX ON KOD TAG KOD COLLATE 'MACHINE'

***** Change properties for TABLE1 *****
ENDFUNC

FUNCTION MakeConn_CONNECT1
***************** Connection Definitions CONNECT1 ***************

CREATE CONNECTION CONNECT1 ;
CONNSTRING "Driver={Microsoft Visual FoxPro
Driver};UID=;PWD=;SourceDB=S:\TEMP\data1.dbc;SourceType=DBC;Exclusive=No;Bac
kgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"
****
DBSetProp('CONNECT1', 'Connection', 'Asynchronous', .F.)
DBSetProp('CONNECT1', 'Connection', 'BatchMode', .T.)
DBSetProp('CONNECT1', 'Connection', 'Comment', '')
DBSetProp('CONNECT1', 'Connection', 'DispLogin', 1)
DBSetProp('CONNECT1', 'Connection', 'ConnectTimeOut', 15)
DBSetProp('CONNECT1', 'Connection', 'DispWarnings', .F.)
DBSetProp('CONNECT1', 'Connection', 'IdleTimeOut', 0)
DBSetProp('CONNECT1', 'Connection', 'QueryTimeOut', 0)
DBSetProp('CONNECT1', 'Connection', 'Transactions', 1)
DBSetProp('CONNECT1', 'Connection', 'Database', '')

ENDFUNC

FUNCTION MakeView_LOCAL
***************** View setup for LOCAL ***************

CREATE SQL VIEW "LOCAL" ;
AS SELECT * FROM data1!table1

DBSetProp('LOCAL', 'View', 'UpdateType', 1)
DBSetProp('LOCAL', 'View', 'WhereType', 3)
DBSetProp('LOCAL', 'View', 'FetchMemo', .T.)
DBSetProp('LOCAL', 'View', 'SendUpdates', .T.)
DBSetProp('LOCAL', 'View', 'UseMemoSize', 255)
DBSetProp('LOCAL', 'View', 'FetchSize', 100)
DBSetProp('LOCAL', 'View', 'MaxRecords', -1)
DBSetProp('LOCAL', 'View', 'Tables', 'data1!table1')
DBSetProp('LOCAL', 'View', 'Prepared', .F.)
DBSetProp('LOCAL', 'View', 'CompareMemo', .T.)
DBSetProp('LOCAL', 'View', 'FetchAsNeeded', .F.)
DBSetProp('LOCAL', 'View', 'Comment', "")
DBSetProp('LOCAL', 'View', 'BatchUpdateCount', 1)
DBSetProp('LOCAL', 'View', 'ShareConnection', .F.)

*!* Field Level Properties for LOCAL
* Props for the LOCAL.kod field.
DBSetProp('LOCAL.kod', 'Field', 'KeyField', .T.)
DBSetProp('LOCAL.kod', 'Field', 'Updatable', .F.)
DBSetProp('LOCAL.kod', 'Field', 'UpdateName', 'data1!table1.kod')
DBSetProp('LOCAL.kod', 'Field', 'DataType', "I")
* Props for the LOCAL.name field.
DBSetProp('LOCAL.name', 'Field', 'KeyField', .F.)
DBSetProp('LOCAL.name', 'Field', 'Updatable', .T.)
DBSetProp('LOCAL.name', 'Field', 'UpdateName', 'data1!table1.name')
DBSetProp('LOCAL.name', 'Field', 'DataType', "C(10)")
ENDFUNC

FUNCTION MakeView_REMOTE
***************** View setup for REMOTE ***************

CREATE SQL VIEW "REMOTE" ;
REMOTE CONNECT "Connect1" ;
AS SELECT * FROM table1 Table1

DBSetProp('REMOTE', 'View', 'UpdateType', 1)
DBSetProp('REMOTE', 'View', 'WhereType', 3)
DBSetProp('REMOTE', 'View', 'FetchMemo', .T.)
DBSetProp('REMOTE', 'View', 'SendUpdates', .T.)
DBSetProp('REMOTE', 'View', 'UseMemoSize', 255)
DBSetProp('REMOTE', 'View', 'FetchSize', 100)
DBSetProp('REMOTE', 'View', 'MaxRecords', -1)
DBSetProp('REMOTE', 'View', 'Tables', 'table1')
DBSetProp('REMOTE', 'View', 'Prepared', .F.)
DBSetProp('REMOTE', 'View', 'CompareMemo', .T.)
DBSetProp('REMOTE', 'View', 'FetchAsNeeded', .F.)
DBSetProp('REMOTE', 'View', 'Comment', "")
DBSetProp('REMOTE', 'View', 'BatchUpdateCount', 1)
DBSetProp('REMOTE', 'View', 'ShareConnection', .F.)

*!* Field Level Properties for REMOTE
* Props for the REMOTE.kod field.
DBSetProp('REMOTE.kod', 'Field', 'KeyField', .T.)
DBSetProp('REMOTE.kod', 'Field', 'Updatable', .F.)
DBSetProp('REMOTE.kod', 'Field', 'UpdateName', 'table1.kod')
DBSetProp('REMOTE.kod', 'Field', 'DataType', "I")
* Props for the REMOTE.name field.
DBSetProp('REMOTE.name', 'Field', 'KeyField', .F.)
DBSetProp('REMOTE.name', 'Field', 'Updatable', .T.)
DBSetProp('REMOTE.name', 'Field', 'UpdateName', 'table1.name')
DBSetProp('REMOTE.name', 'Field', 'DataType', "C(10)")
ENDFUNC


FUNCTION DisplayStatus(lcMessage)
WAIT WINDOW NOWAIT lcMessage
ENDFUNC

А вот ф-я для Default Value

FUNCTION GetNextKod
LOCAL lnMaxKod(1)
SELECT MAX(kod) FROM table1 INTO ARRAY lnMaxKod
RETURN lnMaxKod+1
ENDFUNC

Michael Filippov

unread,
Apr 11, 2003, 9:08:57 AM4/11/03
to
Hello, Michael!
You wrote to Igor Korolyov on Fri, 11 Apr 2003 12:01:34 +0000 (UTC):

[Сгрызено буквогрызом]
MF> А вот ф-я для Default Value

MF> FUNCTION GetNextKod
MF> LOCAL lnMaxKod(1)
MF> SELECT MAX(kod) FROM table1 INTO ARRAY lnMaxKod
MF> RETURN lnMaxKod+1
MF> ENDFUNC
Здесь подразумевается, что записи в Table1 уже есть. Иначе, перед
селектом lnMaxKod=0

Igor Korolyov

unread,
Apr 13, 2003, 9:31:57 AM4/13/03
to
Hi, Michael Filippov!
You wrote to Michael Filippov on Fri, 11 Apr 2003 13:08:57 +0000 (UTC):

MF> [Сгрызено буквогрызом]


MF>> А вот ф-я для Default Value

MF>> FUNCTION GetNextKod
MF>> LOCAL lnMaxKod(1)
MF>> SELECT MAX(kod) FROM table1 INTO ARRAY lnMaxKod
MF>> RETURN lnMaxKod+1
MF>> ENDFUNC

MF> Здесь подразумевается, что записи в Table1 уже есть. Иначе, перед
MF> селектом lnMaxKod=0

Вот тут то и лежит корень проблемы. Такого типа операция в хранимой процедуре, вызываемой именно как DefaulValue недопустима. Т.е. это вообще в корне неверный подход к генерации автоматических PK - нельзя полагаться в этом процессе на запрос самой обновляемой таблицы. Если замениить этот код на аналогичный NewID из сэмплов или Tastrade то всё встаёт на свои места... Вполне возможно, что если выполнить сам код этой ХП отдельно, до операции вставки, и уже явно передать новое значение PK (естественно посредством обновляемого поля PK), то всё будет работать, однако фоксовый ODBC-драйвер не позволяет вызывать свои ХП явно :(

Michael Filippov

unread,
Apr 14, 2003, 4:36:08 AM4/14/03
to
Hello, Igor!
You wrote to Michael Filippov on Sun, 13 Apr 2003 13:31:57 +0000 (UTC):

[Сгрызено буквогрызом]
IK> встаёт на свои места... Вполне возможно, что если выполнить сам код этой
IK> ХП отдельно, до операции вставки, и уже явно передать новое значение PK
IK> (естественно посредством обновляемого поля PK), то всё будет работать,
IK> однако фоксовый ODBC-драйвер не позволяет вызывать свои ХП явно :(
Погоди, или я не понимаю или...
Если использовать XP для генерации РК в самом удаленном представлении и
егоже РК потом передавать в таблицу - все работает. Или ты о чем?

Michael Filippov

unread,
Apr 14, 2003, 4:36:08 AM4/14/03
to
Hello, Igor!
You wrote to Michael Filippov on Sun, 13 Apr 2003 13:31:57 +0000 (UTC):

IK> Hi, Michael Filippov!


IK> You wrote to Michael Filippov on Fri, 11 Apr 2003 13:08:57 +0000 (UTC):

MF>> [Сгрызено буквогрызом]
MF>>> А вот ф-я для Default Value

MF>>> FUNCTION GetNextKod
MF>>> LOCAL lnMaxKod(1)
MF>>> SELECT MAX(kod) FROM table1 INTO ARRAY lnMaxKod
MF>>> RETURN lnMaxKod+1
MF>>> ENDFUNC
MF>> Здесь подразумевается, что записи в Table1 уже есть. Иначе, перед
MF>> селектом lnMaxKod=0

IK> Вот тут то и лежит корень проблемы. Такого типа операция в хранимой
IK> процедуре, вызываемой именно как DefaulValue недопустима. Т.е. это
IK> вообще в корне неверный подход к генерации автоматических PK - нельзя
IK> полагаться в этом процессе на запрос самой обновляемой таблицы. Если
IK> замениить этот код на аналогичный NewID из сэмплов или Tastrade то всё
IK> встаёт на свои места... Вполне возможно, что если выполнить сам код этой
IK> ХП отдельно, до операции вставки, и уже явно передать новое значение PK
IK> (естественно посредством обновляемого поля PK), то всё будет работать,
IK> однако фоксовый ODBC-драйвер не позволяет вызывать свои ХП явно :(
Это не важно, какова функция NewID. Заменил на

FUNCTION GetNextKod
LOCAL lnSelect
lnSelect=SELECT()
SAFEUSE('newid')
LOCAL lnMaxKod
RLOCK()
lnMaxKod=id
REPLACE id WITH id+1
unlock
SELECT (lnSelect)
RETURN lnMaxKod
ENDFUNC

Т.е. оставил самое необходимое и явное для однопользовательского режима.
В поле KOD в table1 при добавлении записей в Remote светятся .null. :(
Так что не так?
Да, и еще. Не стоит мне советовать в данном случаем формировать Id в
представлении, а не в таблице.
Id в этом, конкретном случае не суррогат, а в лучшем случае, значение из
диапазона и не логично сужать диапазон до непосредственного добавления
записи в таблицу. Ладно, отвлекся я.
Итак, используеся NewID, как DefaulValue самой таблицы. И оно не заполняется
при добавлении из Remote View. К слову сказать, не заполняются только
данные, заполняемые по UDF!!!

Michael Filippov

unread,
Apr 14, 2003, 6:08:39 AM4/14/03
to
Hello, Michael!

You wrote to Igor Korolyov on Mon, 14 Apr 2003 08:36:08 +0000 (UTC):

IK>> встаёт на свои места... Вполне возможно, что если выполнить сам код

IK>> этой ХП отдельно, до операции вставки, и уже явно передать новое
IK>> значение PK (естественно посредством обновляемого поля PK), то всё
IK>> будет работать, однако фоксовый ODBC-драйвер не позволяет вызывать свои
IK>> ХП явно :(
MF> Погоди, или я не понимаю или...
MF> Если использовать XP для генерации РК в самом удаленном представлении и
MF> егоже РК потом передавать в таблицу - все работает. Или ты о чем?
Торможу! Снимаем вопрос... но только этот.

Igor Korolyov

unread,
Apr 14, 2003, 10:59:38 AM4/14/03
to
Hi, Michael!

You wrote to Igor Korolyov on Mon, 14 Apr 2003 08:36:08 +0000 (UTC):

IK>> Вот тут то и лежит корень проблемы. Такого типа операция в хранимой
IK>> процедуре, вызываемой именно как DefaulValue недопустима. Т.е. это
IK>> вообще в корне неверный подход к генерации автоматических PK -

IK>> нельзя полагаться в этом процессе на запрос самой обновляемой
IK>> таблицы. Если замениить этот код на аналогичный NewID из сэмплов
IK>> или Tastrade то всё встаёт на свои места... Вполне возможно, что
IK>> если выполнить сам код этой


IK>> ХП отдельно, до операции вставки, и уже явно передать новое

IK>> значение PK (естественно посредством обновляемого поля PK), то всё
IK>> будет работать, однако фоксовый ODBC-драйвер не позволяет вызывать
IK>> свои ХП явно :(
MF> Это не важно, какова функция NewID. Заменил на

MF> FUNCTION GetNextKod
MF> LOCAL lnSelect lnSelect=SELECT()
MF> SAFEUSE('newid')

А там что? Где вообще эта функция? Я так понимаю, что ошибки в этом случае
не генерируются, только результат потом получается .NULL.

MF> LOCAL lnMaxKod
MF> RLOCK()

А если вернёт .F.

MF> lnMaxKod=id
MF> REPLACE id WITH id+1
MF> unlock
MF> SELECT (lnSelect)
MF> RETURN lnMaxKod
MF> ENDFUNC

MF> Т.е. оставил самое необходимое и явное для однопользовательского
MF> режима.
MF> В поле KOD в table1 при добавлении записей в Remote светятся .null.
MF> :(
MF> Так что не так?

А в таблице счётчика поле наращивается??? Думаю что нет.
Попробуй всё-же более прямой код:

=========Beginning of the citation==============
FUNCTION NewID
LPARAMETERS tcTable
* Функция генерирует уникальные последовательные номера для
* использования в качестве первичных ключей в справочниках.
* Для использования надо прописать вызов этой функции
* в качестве значения по умолчанию для поля таблицы.
* Параметры:
* 1 Наименование последовательности (имя таблицы)
* Возвращаемое значение: следующий уникальный номер
LOCAL lnCurSelect, lcOldDel, lnRetVal
m.lnCurSelect = SELECT()
m.lcOldDel = SET("DELETED")
SET DELETED OFF
IF !USED('_IncrementField')
USE Data1!_IncrementField IN 0 SHARED
ENDIF
SELECT _IncrementField
LOCATE FOR cTable = m.tcTable
IF !FOUND('_IncrementField')
INSERT INTO _IncrementField (cTable, nMax_ID);
VALUES (m.tcTable, 0)
ENDIF
m.lnRetVal = _IncrementField.nMax_ID + 1
UPDATE _IncrementField SET nMax_ID = m.lnRetVal;
WHERE cTable = m.tcTable
SELECT (m.lnCurSelect)
IF m.lcOldDel="ON"
SET DELETED ON
ENDIF
RETURN m.lnRetVal
=========The end of the citation================

Структура таблицы _IncrementField думаю очевидна...

У меня в таком виде работает.

MF> Да, и еще. Не стоит мне советовать в данном случаем формировать Id в
MF> представлении, а не в таблице.

А ты и не сможешь :) Я же говорил, что VFP ODBC драйвер не поддерживает
прямой вызов ХП...

MF> Id в этом, конкретном случае не суррогат, а в лучшем случае,
MF> значение из диапазона и не логично сужать диапазон до
MF> непосредственного добавления записи в таблицу. Ладно, отвлекся я.
MF> Итак, используеся NewID, как DefaulValue самой таблицы. И оно не
MF> заполняется при добавлении из Remote View. К слову сказать, не
MF> заполняются только данные, заполняемые по UDF!!!

Потому как в самой UDF есть у тебя проблема! Она очевидно не проявляется при
работе в самом фоксе (локальное представление), но вылазит в ODBC, а он то и
сказать по этому поводу ничего не может :(
Кстати какая у тебя версия ODBC драйвера? Может быть (хотя и очень
маловероятно :)) что проблема лежит там...

Я проверил в VFP8 (Релиз наконец-то достал :)))) и в VFP7 - всё работает :)

Igor Korolyov

unread,
Apr 14, 2003, 4:49:54 PM4/14/03
to
Hi, Michael Filippov!

You wrote to Michael Filippov on Mon, 14 Apr 2003 10:08:39 +0000 (UTC):

IK>>> встаёт на свои места... Вполне возможно, что если выполнить сам код
IK>>> этой ХП отдельно, до операции вставки, и уже явно передать новое
IK>>> значение PK (естественно посредством обновляемого поля PK), то всё
IK>>> будет работать, однако фоксовый ODBC-драйвер не позволяет вызывать

IK>>> свои ХП явно :(


MF>> Погоди, или я не понимаю или...
MF>> Если использовать XP для генерации РК в самом удаленном представлении

MF>> и егоже РК потом передавать в таблицу - все работает. Или ты о чем?
MF> Торможу! Снимаем вопрос... но только этот.

Ну для остальных поясню - речь идёт об удалённом представлении,
соответственно ХП находится в удалённой базе, а представление естественно в
нашей локальной базе, и про ХП оно ничего не знает, соответственно в её
DefaultValue поместить просто нечего :) Нужна обёртка, которая _явно_
вызовет ХП из удалённой базы и вернёт нам сгенерированный ключ.
А единственный способ её [ХП] явно вызвать - это как раз через ODBC, что и
невозможно с помощью VFP ODBC драйвера.

Sjfx

unread,
Apr 14, 2003, 8:26:07 PM4/14/03
to
Доброе утро, страна!
Hi, Michael!

"Michael Filippov" <f...@mail.ru> сообщил/сообщила в новостях следующее:
news:b7drq6$2035$2...@gavrilo.mtu.ru...


> FUNCTION GetNextKod
> LOCAL lnSelect
> lnSelect=SELECT()
> SAFEUSE('newid')
> LOCAL lnMaxKod
> RLOCK()
> lnMaxKod=id
> REPLACE id WITH id+1
> unlock
> SELECT (lnSelect)
> RETURN lnMaxKod
> ENDFUNC
>
> Т.е. оставил самое необходимое и явное для однопользовательского режима.
> В поле KOD в table1 при добавлении записей в Remote светятся .null. :(
> Так что не так?
> Да, и еще. Не стоит мне советовать в данном случаем формировать Id в
> представлении, а не в таблице.
> Id в этом, конкретном случае не суррогат, а в лучшем случае, значение из
> диапазона и не логично сужать диапазон до непосредственного добавления
> записи в таблицу. Ладно, отвлекся я.
> Итак, используеся NewID, как DefaulValue самой таблицы. И оно не
заполняется
> при добавлении из Remote View. К слову сказать, не заполняются только
> данные, заполняемые по UDF!!!
>

Что ещё не так -
дохлый ODBC выполняет сильно ограниченный набор FOX-операторов
(в ХП и триггерах), твои он точно не тянет (надеюсь, они у тебя в ХП).
Сработает:
1. Создай в data1 таблицу с ID для разных таблиц, напр tid.dbf
tblName C(10), kod N(10) или интегер. Обязательно с ПК по tblName,
сделай INSERT INTO tid (tblName, kod) VALUES ("TABLE0 ", 0)
INSERT INTO tid (tblName, kod) VALUES ("TABLE1 ", 0)
INSERT INTO tid (tblName, kod) VALUES ("TABLE2 ", 0)
2. Функцию NewId (DefaultValue для table1.kod) - положи в ХП для data1:
PROCEDURE getNextCode
UPDATE data1!tid SET kod = kod + 1 WHERE tblname = 'TABLE1 '
RETURN tid.kod
Эти операторы ODBC вынесет.
Для подч таблицы - если есть - можно тоже установить
defaultValue для поля parentId в getParentId (в ХП)
PROCEDURE getParentId
* ничего не менять, просто найти
UPDATE data1!tid SET kod = kod WHERE tblname = 'TABLE1 '
RETURN tid.kod
теперь после сохранения главной записи просто сохраняй подчинённые -
с пустым parentId, без перезапроса главной для получения id -
всё будет как надо.
3. для чистоты эксперимента положи REMOTE VIEW в другой DBC, (anoth.dbc)
чтоб фокс точно не открывал data1 и все его файлы, их будет открывать ODBC,
он же выполнит ХП-ру. Так же для подчинённой.
4 CLOSE ALL
USE anoth!remote
BROWSE
добавь запись,
TABLEUP()
REQUERY()
вуа-ля... , открыты будут только anoth.dbc и алиас remote.

С диапазонами, наверное, тоже можно что-то придумать, только
из фокса пользовать фоксовый ODBC-драйвер - баловство это..
Да и не из фокса.. уж больно он хил..
Другое дело - COM на фоксе, он и ХП и триггеры отработает
в лучшем виде.

Всех благ!


Michael Filippov

unread,
Apr 15, 2003, 5:12:44 AM4/15/03
to
Hello, Igor!

You wrote to Michael Filippov on Mon, 14 Apr 2003 14:59:38 +0000 (UTC):

MF>> Это не важно, какова функция NewID. Заменил на

MF>> FUNCTION GetNextKod
MF>> LOCAL lnSelect lnSelect=SELECT()
MF>> SAFEUSE('newid')

IK> А там что? Где вообще эта функция? Я так понимаю, что ошибки в этом
Приблизительно тоже, что и

IF !USED('_IncrementField')
USE Data1!_IncrementField IN 0 SHARED
ENDIF
SELECT _IncrementField

только посложнее немного.
IK> случае не генерируются, только результат потом получается .NULL.
да.

MF>> LOCAL lnMaxKod
MF>> RLOCK()

IK> А если вернёт .F.
Ну не копировал я эту функцию, дабы не засорять эху размерами, а написал
самое необходимое, хотя и rlock() в данном случае лишнее
(однопользовательский, монопольный режим).
В общем все решилось, только ODBC не смог:
1. Найти внешнюю процедуру SAFEUSE().
Указал где искать.
2. обработать juststem() ф-ю
пришлось обойти
3. надо было писать =SAFEUSE('newid') или do SAFEUSE with 'newid'
Т.е. работает с ф-ями, а не с процедурами.

Michael Filippov

unread,
Apr 15, 2003, 5:13:15 AM4/15/03
to
Hello, Sjfx!
You wrote to Michael Filippov on Tue, 15 Apr 2003 00:26:07 +0000 (UTC):
[Сгрызено буквогрызом]
S> Что ещё не так -
S> дохлый ODBC выполняет сильно ограниченный набор FOX-операторов
S> (в ХП и триггерах), твои он точно не тянет (надеюсь, они у тебя в ХП).
Мда... А по какому топику можно посмотреть этот набор?
[Сгрызено буквогрызом]
S> С диапазонами, наверное, тоже можно что-то придумать, только
S> из фокса пользовать фоксовый ODBC-драйвер - баловство это..
S> Да и не из фокса.. уж больно он хил..
Ну это так, баловство в качестве эксперимента.
S> Другое дело - COM на фоксе, он и ХП и триггеры отработает
S> в лучшем виде.
Если бы еще не тратилось столько времени на подключение (~1/2 мин)
удаленного COM-а.

Michael Drozdov

unread,
Apr 15, 2003, 6:38:08 AM4/15/03
to
Hi, Michael

Я относительно:

Tue Apr 15 2003 13:13, Michael Filippov wrote to Sjfx:

MF> Если бы еще не тратилось столько времени на подключение (~1/2 мин)
MF> удаленного COM-а.

Хм... видимо сервер у тебя не NT-основанный ... или ты экскримент проводил на
statefull (не stateless) компоненте... на http://vfpdev.narod.ru/ - лежит код
и какие-то слова, возможно, если попробуешь, твоё менение может измениться...
:-)

http://vfpdev.narod.ru/docs/mtscom_r.html - Как "работает" multi-threaded COM
компонента под MS MTS/Component Services? - Краткое сравнение stateless и
stateful компонент, пояснение к механизму работы stateless объекта. Приведён
код простого примера серверного MS MTS/COM+ компонента (на VFP 6.0), а также
два DCOM-клиентских приложения (на VFP/VB 6.0 SP5VS6) для его использования.
Показано обращение к этому компоненту как из-под ASP-станички на Web сервере
(предполагается MS IIS 5), так и со стороны Internet-клиента через MS
SOAP-протокол также. Все исходные коды Вы можете загрузить, чтобы
поэкспериментировать с этим в Ваших условиях.

Best regards.
Михаил Дроздов, ИВС Софт, Пермь, Россия
[Michael Drozdov, ICS Soft, Perm, Russia]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mailto:Dro...@ics.perm.su
My Page: http://vfpdev.narod.ru/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Наилучшие пожелания.

Igor Korolyov

unread,
Apr 15, 2003, 10:27:23 AM4/15/03
to
Hi, Michael Filippov!

You wrote to Igor Korolyov on Tue, 15 Apr 2003 09:12:44 +0000 (UTC):

MF>>> Это не важно, какова функция NewID. Заменил на

Очень важно :)))

MF> Ну не копировал я эту функцию, дабы не засорять эху размерами, а
MF> написал самое необходимое, хотя и rlock() в данном случае лишнее
MF> (однопользовательский, монопольный режим).
MF> В общем все решилось, только ODBC не смог:
MF> 1. Найти внешнюю процедуру SAFEUSE().

Он и не должен - это механизм доступа к данным, а не фоксовый интерпретатор
:) Если это ХП содержащаяся в самой базе, то тут другое дело, а если
внешняя... Это IMHO совершенно неверное использование ODBC.

MF> Указал где искать.
MF> 2. обработать juststem() ф-ю
MF> пришлось обойти

Да, вроде эта функция не разрешена... Да и не дело это ХП обращаться к
файловой системе (хотя строго говоря juststem это и не файловая функция, но
вроде как относится к ним...)

MF> 3. надо было писать =SAFEUSE('newid') или do SAFEUSE with 'newid'
MF> Т.е. работает с ф-ями, а не с процедурами.

Работать можно только с ХП...

Почитай drvvfp.hlp в WinNT\System32 или где там у тебя ЩВИС драйвер живёт...
Там всё расписано что можно, а чего нельзя...

0 new messages