Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6 7 8 9   вперед  Ctrl      все
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
Sergej_S
FoXXX


я досих пор делал так

...
...

3. при добавлении записи делаю requery что равносильно select * from на скл


Тянуть всю таблицу можно только в НЕБОЛЬШИХ проектах.
В принципе, НЕТ необходимости после добавления строки тянуть таблицу назад в фокс. Я делаю так (без Identity): вычисляю значение уникального поля, прописываю в фоксе в соотв. поле курсора и делаю TableUpdate(). В фоксе у меyя строка есть. На SQL Server`е после TableUpdate() у тоже строка появилась. Зачем тянуть?
Здесь, конечно начинаются извращения, чтобы с момента вычисления уникального поля и TableUpdate() не всунулся со своим инсертом другой юзер. Тут можно много нагородить и решить эту проблему, но я так понял, что "Большой Брат" для этого и придумал Identity.


вью параметеризированный!!! вам это ни очем не говорит? это значит что вся база на фокс не тянется, а только та часть что соответствует параметру, а вместе с ней и новый id..
9 мар 06, 15:16    [2431079]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
Sergej_S
To: Pavel_t:

Судя по этому куску кода в конце примера (проверить не могу, у меня VFP8):
&& automatically refresh IDENTITY field and f2 field after Insert
InsertCmdRefreshFieldList="f_identity,f_int_unique"
&& use alternative key to refresh fields after Insert as we don't know
&& the value for f0 (IDENTITY)
InsertCmdRefreshKeyFieldList="f_int_unique"
все должно работать и поле Identity после инсерта в фоксе само обновляется. Прошу подтвердить это для Фомы неверующего. Тогда можно будет более аргументированно ставить вопрос о приобретении 9 версии. Заранее спасибо.


у меня девятка, я уже писал, все проверил, в курсоре не отражается последний id...
9 мар 06, 15:17    [2431083]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
и вообще не понятно как вы в фоксе вычисляете id если этим занимается SQL??
9 мар 06, 15:18    [2431092]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
Sergej_S
Member

Откуда: Латвия
Сообщений: 290
>и вообще не понятно как вы в фоксе вычисляете id если этим занимается SQL??
тяну SQLEXEC`ом:
select 1+MAX(поле) as id_ FROM ... (для int)
или
select newid() as id_ FROM ... (для char(36))
работает, хотя и не лучший вариант.

>вью параметеризированный!!! вам это ни очем не говорит? это значит что вся база на фокс не тянется
согласен, так получше, но мне такой вариант все-равно не нравится :)
9 мар 06, 16:20    [2431471]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
Pavel_t
Member

Откуда: МО
Сообщений: 92
Всё боится времени

to Sergej_S
из представленного примера
попробую расписать действия
---- добавляем в созданную таблицу 2 записи для того чтоб что-то было
SQLEXEC(nAutoRefreshConn ,"INSERT INTO #CAAutoRefreshDemo (f_int_unique,f_varchar) VALUES (1,'demo1')")
SQLEXEC(nAutoRefreshConn ,"INSERT INTO #CAAutoRefreshDemo (f_int_unique,f_varchar) VALUES (2,'demo1')")
SET PROCEDURE TO (PROGRAM()+".PRG")

---создаём и открываем курсор
* use this code to create the cursor
oca=CREATEOBJECT("CAAutoRefreshDemo")
IF NOT oca.AUTOOPEN()
=AERROR(AERR)
LIST MEMORY LIKE AERR *
ENDIF
--- просматриваем BROWSE
если изменяем значения в f_varchar
то припереходе на другую запись или tableupdate
автоматически изменяется поле f_timestamp
если добавляем ctrl+Y или insert в "CATest"
добавляется запись и в поле f_identity будет 0 пока
не будет перехода на другую запись или tableupdate

--- и вы работаете только с теми записями которые были первоначально(две)
--- и те которые вы добавили сами

BROWSE TITLE ' ' IN screen

-- имитация вставки записи другим пользователем
SQLEXEC(nAutoRefreshConn ,"INSERT INTO #CAAutoRefreshDemo (f_int_unique,f_varchar) VALUES (3,'demo3')")
-- у себя в "CATest" вы их не видите пока не будет
=requery("CATest") перевыборка всего вашего параметриз.. запроса

--но если неперевыбирать то вновь добаленные вами записи
будут иметь identity с учётом добавленных другими юзерами

BROWSE TITLE ' ' IN screen

Это можно не использовать но знать нужно
я пока не пользую вставки в основном через процедуры
а через неё(процедуру) можно получить и id (output параметром 100% гарантия что вставил ты и это твой identity )
ещё CursorAdapter замечательно рабоает
с -параметризованными запросами
-параметризованными ХРАНИМЫМИ ПРОЦЕДУРАМИ
-может принимать параметры output хр процедур
и много другого ещё умеет .......

я не теоретик объяснить не смогу доходчиво
в Foxe ещё с Dosa
перепробовал многое
остановился на ADO CursorAdapter просто нравится





.... и только время боится пирамид!
9 мар 06, 17:43    [2431960]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
Sergej_S
Member

Откуда: Латвия
Сообщений: 290
To Pavel_t
Спасибо, я в основном понял Ваши объяснения. Только я все инсерты закидываю через tableupdate.
Подскажите, пожалуйста по вашему коду, есди сделать так: после создания таблицы, занесения в нее 2-х записей, создания адаптера запускаем такой код:
SELECT CATest
APPEND BLANK
REPLACE f_int_unique WITH 3
? f_identity  &&  Должно выдать 0
TABLEUPDATE()

? f_identity  && А ТЕПЕРЬ ВЫДАЕТ 0 ИЛИ 3 ???????
P.S. если совсем не понятно, чего я хочу- я вышлю полный листинг кода.
9 мар 06, 18:13    [2432173]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

Hi All!

Да уж, нагородили столько бреда на пустом месте, что аж жутко становится...

Любителям параметризованных View с последующим Requery()+GO BOTTOM
посвящается.

На сервере примитивная таблица с IDENTITY полем. На фоксе представление.

CREATE SQL VIEW View1 CONNECTION ... AS ;
SELECT ID, Name FROM SomeTable WHERE Name LIKE ?m.MyStencil
* Настроим также обновление поля Name? можно и Id хотя смысла в том нету.

Можно сделать?

MyStencil = "ИВАН%"
USE DB!View1

Можно сделать? Какие данные будут в курсоре?

INSERT INTO View1 (Name) VALUES ("ПЕТРОВ")

Можно? Что будет в курсоре?

? TABLEUPDATE("View1")

Можно? Что после этого будет на сервере?

? REQUERY("View1")
GO BOTTOM

Теперь смотрите на результат - если вы увидете там вашу новую запись, и
соответственно новый ID - и при этом предварительно не покушаете
галлюциногенных грибочков, то вы видимо знатный шаман :)

Чуть меняем запрос в представлении:

SELECT ID, Name FROM SomeTable ORDER BY Name

И что, вы по прежнему будете настаивать на том что REQUERY()+GO BOTTOM даст
значние "нового" ID господина "Петрова", а не того ID который был скажем у
господина "Якина" находящегося последним по алфавиту в списке?

Даже ещё проще! Возьмите вашу СУБД и проведите с ней простую работу -
вставляйте последовательно записи, РУКАМИ наращивая значение некоторого поля
(не IDENTITY конечно) - вставив несколько тысяч записей удалите из них
половину или лучше процентов 90 (желательно в случайном порядке - но можно и
большими блоками) - потом снова вставляйте и снова удаляйте - в конце концов
в результате выборки БЕЗ опции ORDER BY вы получите не "последовательно
возрастающие коды", а полную мешанину - это просто иллюстрация того простого
принципа, что в подавляющем большинстве СУБД НЕ СУЩЕСТВУЕТ понятия
"физической последовательности записей"! И уже одно это отправляет ваш
REQUERY()+GO BOTTOM на помойку.

Ну про то что "я никогда не видел как в базу параллельно вставляется
несколько записей в течении одной секунды" - уже сказано - это порочная
логика - то что девелопер не в состоянии достаточно синхронно нажать 2
кнопки на 2-х клавиатурах не означает что это невозможно в принципе.

И вообще не стоит себя вести как капризный ребёнок - если говорят что так
делать нельзя, и тем более если дают ссылки на то как НУЖНО делать - не "от
себя", а от производителя соответствующего сервера! То наверное стоит не
спорить, а читать и думать, думать и читать!

Что касается CAD - это по сути RV и есть - они работают во многом
идентично - но в отличие от RV он позволяет гораздо больше вмешиваться в
процесс запроса/сохранения - в частности в VFP9 через группу свойств
*RefreshCmd и/или методы CAD позволяет практически автоматически получать
присваиваемые сервером значения - т.е. делать тот самый мелкий Refresh (а не
полный REQUERY который к тому-же может и не те записи вернуть и не в том
порядке в каком они были).
Кстати пример с CAD был не очень удачный - он основан на идее использования
ключа-кандидата, а такового может и не быть в наличии! А вот @@IDENTITY есть
всегда - ну или SCOPE_IDENTITY() - но в одном батче с самим INSERT (а проще
видимо в ХП).

Posted via ActualForum NNTP Server 1.3

10 мар 06, 00:19    [2433013]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
to korolev

однако нервишки..

в пылу страсти мне кажется вы допускаете примитивные ошибки в своей логике рассуждений...

вот вы пишете что в базе нет порядка, но это ведь основной принцып баз, последняя запись всегда последняя..

не нужно использовать ордер, тогда последняя запись будет стоять последней.. и не важно чья она - клиента пупкина или пипкина... это можно проследить по id.

открываем хелп в фоксе и читаем:
GO BOTTOM

Positions the record pointer on the last record in the table. If the table has an ascending index in use, the last record is the record with the highest key value. If the index is in descending order, the last record is the record with the lowest key value.

кей мы не используем -> последняя является последней (физически)

итак резюме:
requery - сбрасывает запись и тут же пакетом вытаскивает ее
go bottom двигает указатель на нее...

но никто не оспаривает ваше право пользовать другие методы работы с базой, просто вы привыкли работать с базой путем функций SQLexec и т.д., я привык пользовать view.. вот теперь может быть перейду к CAD..

в нашем споре я почерпнул для себя кое что полезное, вы немного остудились увидев другие подходы, которые как ни странно работают, как бы там нибыло дискуссия была полезной, я так думаю.

с уважением FoXXX
10 мар 06, 09:51    [2433574]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
/*И вообще не стоит себя вести как капризный ребёнок - если говорят что так
делать нельзя, и тем более если дают ссылки на то как НУЖНО делать - не "от
себя", а от производителя соответствующего сервера! То наверное стоит не
спорить, а читать и думать, думать и читать!*/

слепая вера документации... так нельзя, не все знает и фирма разработчик, например читая доку по ораклу - часто находил как консультанты оракла сами делали открытия в нем запуская необычные процедуры...

или пример из фокса в моей практике - в 1992м году я активно пользовался SQL запросами, но в доке было написано: не вставляйте в поля функции, они неизвестно как будут работать и возможно не будут поддерживаться в следующих версиях... но я вставлял, пользовался и все работало..

надо ли слепо следовать инструкциям?? я предпочитаю проверять инструкции и доку на практике и не боюсь что-нибудь проверить или применить не рекомендованное или не описанное в доке.. тем более в фоксе столько глюков, что любая инструкция описанная в доке не факт будет работать как описано..
10 мар 06, 10:14    [2433693]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
Pavel_t
Member

Откуда: МО
Сообщений: 92
Всё боится времени
to foXXX
кей мы не используем -> последняя является последней (физически)

итак резюме:
requery - сбрасывает запись и тут же пакетом вытаскивает ее
go bottom двигает указатель на нее...


не согласен
если Rv параметризованный
и вновь введённая запись не удовлетворяет параметрам запроса
она и неперевыберется по =requery() хотя и добавится
с уважением павел Т
.... и только время боится пирамид!
10 мар 06, 11:39    [2434207]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
Pavel_t
Всё боится времени
to foXXX
кей мы не используем -> последняя является последней (физически)

итак резюме:
requery - сбрасывает запись и тут же пакетом вытаскивает ее
go bottom двигает указатель на нее...


не согласен
если Rv параметризованный
и вновь введённая запись не удовлетворяет параметрам запроса
она и неперевыберется по =requery() хотя и добавится
с уважением павел Т
.... и только время боится пирамид!


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

те параметр = сисдате, рекьюри го боттом...
10 мар 06, 11:58    [2434337]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
Sergej_S
Member

Откуда: Латвия
Сообщений: 290
FoXXX
поясню, параметризация применяется в основном с целью отброса ненужной информации, я например часто применяю по дате (сегодняшняя дата, или этот месяц, или этот год .. по ситуации)

Допустим, работает себе бухгалтер с док-тами текущего месяца (чтобы всю базе не тянуть). Заносит их. Вдруг ему надо занести документ за прошлый месяц. Он его заводит и документ проваливается куда-то (в базе появился, а в гриде нет). Ну это еще ладно. А вдруг он случайно пальцем не туда попал и вбил не тот месяц. "Шайтан, где мой докУмент, а жеш его завел!!!?"- скажет бухг.
10 мар 06, 13:05    [2434864]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
FoXXX
вот вы пишете что в базе нет порядка, но это ведь основной принцып баз, последняя запись всегда последняя..

Еще раз. Мы говорим о СЕРВЕРНОЙ базе данных. FoxPro - это инструмент доступа к этим данным. Но сами данные хранятся вовсе не в нем, а в MS SQL. Приводить в качестве аргумента цитаты по структуре хранения в файлах DBF - весьма странно.

Так вот, ни в одной серверной базе данных НЕТ такого понятия, как порядок следования записей. Это значит, что если Вы дадите серверной базе данных запрос вида

SELECT * FROM MyTab

то, в общем случае, невозможно предсказать, в какой именно последовательности эти записи будут выведены. В этом случае, Go Bottom, конечно перейдет к последней записи ВЫБОРКИ, но это вовсе не означает, что последняя запись выборки окажется последней созданной записью.

Вот именно об этом Игорь и говорит. Нужен ORDER BY по полю Identity иначе нет никакой гарантии, что Вы прочитаете код последней созданной записи. Вы прочитаете всего-лишь код последней выбранной записи


PS: Большая просьба, прежде чем бросаться писать ответ, прочитете вызвавшее такое раздражение сообщение еще раз. Вы точно поняли О ЧЕМ идет речь? Прочитали то, что написана, а не то, что Вам показалось написанным?
10 мар 06, 13:05    [2434866]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
Sergej_S
FoXXX
поясню, параметризация применяется в основном с целью отброса ненужной информации, я например часто применяю по дате (сегодняшняя дата, или этот месяц, или этот год .. по ситуации)

Допустим, работает себе бухгалтер с док-тами текущего месяца (чтобы всю базе не тянуть). Заносит их. Вдруг ему надо занести документ за прошлый месяц. Он его заводит и документ проваливается куда-то (в базе появился, а в гриде нет). Ну это еще ладно. А вдруг он случайно пальцем не туда попал и вбил не тот месяц. "Шайтан, где мой докУмент, а жеш его завел!!!?"- скажет бухг.


ну что ж вы так непонятливы..

в параметрическом вью не обязательно вручную вбивать параметр, да и не делает этого никто никогда, параметр - это переменная, которая задается по умолчанию, например сист дата, можно использовать конструкцию битвин, тогда возможно залдание периода, переменная определяется автоматически как глобал, далее, на форме где-то должно быть окошко (информационное) в каком периоде мы работаем, если хотим прошлый месяц - пожалуйста, прошлый год - пожалуйста, кстати параметр не обязательно формата даты, может быть и просто число - № месяца например, да и странно если бухгалтер будет каждый раз не так пальчиком тыкать в период своей работы, она должна хотябы понимать квартал, месяц, год, ну если не менять то по умолчанию текущий. это только один из вариантов работы с вью..
10 мар 06, 13:51    [2435207]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
ВладимирМ
FoXXX
вот вы пишете что в базе нет порядка, но это ведь основной принцып баз, последняя запись всегда последняя..

Еще раз. Мы говорим о СЕРВЕРНОЙ базе данных. FoxPro - это инструмент доступа к этим данным. Но сами данные хранятся вовсе не в нем, а в MS SQL. Приводить в качестве аргумента цитаты по структуре хранения в файлах DBF - весьма странно.

Так вот, ни в одной серверной базе данных НЕТ такого понятия, как порядок следования записей. Это значит, что если Вы дадите серверной базе данных запрос вида

SELECT * FROM MyTab

то, в общем случае, невозможно предсказать, в какой именно последовательности эти записи будут выведены. В этом случае, Go Bottom, конечно перейдет к последней записи ВЫБОРКИ, но это вовсе не означает, что последняя запись выборки окажется последней созданной записью.

Вот именно об этом Игорь и говорит. Нужен ORDER BY по полю Identity иначе нет никакой гарантии, что Вы прочитаете код последней созданной записи. Вы прочитаете всего-лишь код последней выбранной записи


PS: Большая просьба, прежде чем бросаться писать ответ, прочитете вызвавшее такое раздражение сообщение еще раз. Вы точно поняли О ЧЕМ идет речь? Прочитали то, что написана, а не то, что Вам показалось написанным?


ну не знаю как вам это удается - получить перемешанные записи, я наблюдаю записи в самом SQL и в вью, они сохраняют порядок введения на протяжении 5 лет... ну большей базы под рукой нет... только селект простой без ордера..
10 мар 06, 13:54    [2435225]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
FoXXX
ну не знаю как вам это удается - получить перемешанные записи, я наблюдаю записи в самом SQL и в вью, они сохраняют порядок введения на протяжении 5 лет... ну большей базы под рукой нет... только селект простой без ордера..


Как-то верится с трудом, что Вы действительно это наблюдали.

Проведём тест

create table #t (ID int primary key clustered)

insert into #t (ID) values (2)
insert into #t (ID) values (1)

select * from #t


create table #tt (ID int )

insert into #tt (ID) values (2)
insert into #tt (ID) values (1)

select * from #tt

drop table #t
drop table #tt

Как видите, если есть кластерный индекс записи возвращаются в порядке индекса, а не в порядке создания записей. Вот про это Вам и рассказывают.
10 мар 06, 14:23    [2435381]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
В дополнении к замечаниям PaulWist и ВладимирМ для FoXXX:
А если нет кластерного индекса, данные лежат в HEAP - куче, т.е. страницы по 8 кб, связанные ТОЛЬКО через специальные страницы IAM (Index Allocation Map). Это означает, что при операции вставки, удалении и тем более при SHRINK (при сжатии базы данных) может происходить ФИЗИЧЕСКОЕ перемещение записей внутри страницы, что приводит к ДРУГОМУ порядку расположения и ИЗВЛЕЧЕНИЯ данных сервером с диска в кэш, ну и затем клиенту.

С уважением, Алексей
10 мар 06, 14:39    [2435470]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
да действительно если использовать индекс - порядок по индексу, в моем примере за 5 лет индекса нет, но

если говорить об ident - он является ключевым полем, потому го боттом ориентируясь по нему пойдет на последний id, а рекьюри сделает пакетом апдейт и селект, го боттом передвинет указатель на последний id, готоры к тому времени в вью появится..
10 мар 06, 14:41    [2435474]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
извиняюсь, который к тому времени в вью появится

собственно мы ведь про id говорим, который и является главным ключем..
10 мар 06, 14:43    [2435489]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
C++FoXORASQL
Member

Откуда:
Сообщений: 55
мда, а здесь битва в разгаре..

при прочих равных действительно requery и go bottom сработает, если конечно view будет по ключу id - ident, при том requery выполнится пакетом insert и select, другая запись в пакете не вставится, не так ли, и go bottom уйдет на последнюю, в смысле max.

хотя на мой взгляд у CAD есть неплохие шансы, но в предыдущих версиях VFP пройдет и предложенный пакет команд.
10 мар 06, 15:12    [2435663]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
PaulWist
FoXXX
ну не знаю как вам это удается - получить перемешанные записи, я наблюдаю записи в самом SQL и в вью, они сохраняют порядок введения на протяжении 5 лет... ну большей базы под рукой нет... только селект простой без ордера..


Как-то верится с трудом, что Вы действительно это наблюдали.

Проведём тест

create table #t (ID int primary key clustered)

insert into #t (ID) values (2)
insert into #t (ID) values (1)

select * from #t


create table #tt (ID int )

insert into #tt (ID) values (2)
insert into #tt (ID) values (1)

select * from #tt

drop table #t
drop table #tt

Как видите, если есть кластерный индекс записи возвращаются в порядке индекса, а не в порядке создания записей. Вот про это Вам и рассказывают.


тест прогнал, действительно по индексу,
в моей базе за 5 лет 50 записей :-), вроде судя по датам лежат по порядку,
наверно шринк в ней не делался...
10 мар 06, 15:16    [2435691]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
Ещё раз REQUERY() - GO BOTTOM в ОБЩЕМ случае не дадут требуемый результат последней тобой добавленной записи, если сейчас не можешь этого понять, то прими на веру - это в дальнейшем избавит от множества ошибок.
10 мар 06, 15:21    [2435737]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
FoXXX
Guest
PaulWist
Ещё раз REQUERY() - GO BOTTOM в ОБЩЕМ случае не дадут требуемый результат последней тобой добавленной записи, если сейчас не можешь этого понять, то прими на веру - это в дальнейшем избавит от множества ошибок.


собственно не ставил целью навязать свое решение, у меня этот метод работает, думаю и дальше будет работать, вью конечно по ключу,
на мой взгляд две команды - лучше нескольких строк типа

sqlexec(;lfg;lgfh;lkgh) и т.д.

темболе что на стороне сервера все работает корректно.

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

спасибо за дискуссию, всем удачи..
10 мар 06, 15:37    [2435877]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
Sergej_S
Member

Откуда: Латвия
Сообщений: 290
Извините, если кого достал, прошу выполнить следующий код в VFP9 (+sql 2000). Какое значение возвращается в messagebox ?
CLOSE DATABASES ALL
SQLDISCONNECT(0)
CLEAR
SET MULTILOCKS ON

PUBLIC nAutoRefreshConn AS INTEGER
PUBLIC oca AS CURSORADAPTER
LOCAL lcThisDir AS STRING
lcThisDir = ADDBS(JUSTPATH(SYS(16)))
CD (lcThisDir) 

* Change connection string to connect to a different SQL Server
nAutoRefreshConn=SQLSTRINGCONNECT( "DRIVER=SQL Server;SERVER=(local);Trusted_Connection=Yes;")
IF (nAutoRefreshConn <1)
? "Failed to connect!!!"
AERROR(aerrs)
DISPLAY MEMORY LIKE aerrs
RETURN
ENDIF

TEXT TO cSQL NOSHOW
CREATE TABLE #CAAutoRefreshDemo
(
f_identity int NOT NULL IDENTITY PRIMARY KEY,
f_int_unique int NOT NULL UNIQUE,
f_varchar varchar(10) NULL DEFAULT '00000',
f_timestamp timestamp
)
ENDTEXT

IF SQLEXEC(nAutoRefreshConn ,cSQL)!=1
? "Failed to create demo table!!!"
AERROR(aerrs)
DISPLAY MEMORY LIKE aerrs
ENDIF

SQLEXEC(nAutoRefreshConn ,"INSERT INTO #CAAutoRefreshDemo (f_int_unique,f_varchar) VALUES (1,'demo1')")
SQLEXEC(nAutoRefreshConn ,"INSERT INTO #CAAutoRefreshDemo (f_int_unique,f_varchar) VALUES (2,'demo1')")
SET PROCEDURE TO (PROGRAM()+".PRG")

* use this code to create the cursor
oca=CREATEOBJECT("CAAutoRefreshDemo")
IF NOT oca.AUTOOPEN()
=AERROR(AERR)
LIST MEMORY LIKE AERR *
ENDIF 

SELECT CATest
APPEND BLANK
replace f_int_unique WITH 30
TABLEUPDATE()

****************************************************************
MESSAGEBOX('Prisvojennoje Identity: ' + ALLTRIM(TRANSFORM(CATest.f_identity))
****************************************************************


DEFINE CLASS CAAutoRefreshDemo AS CURSORADAPTER
ALIAS = "CATest"
DATASOURCE= nAutoRefreshConn
DATASOURCETYPE="ODBC"
MapBinary= .T.
MapVarchar= .T.
SELECTCMD="select * from #CAAutoRefreshDemo"
FETCHMEMO= .T.
TABLES="#CAAutoRefreshDemo"
KEYFIELDLIST="f_identity"
UPDATABLEFIELDLIST="f_int_unique,f_varchar"
UPDATENAMELIST="f_int_unique #CAAutoRefreshDemo.f_int_unique, " + ;
"f_varchar #CAAutoRefreshDemo.f_varchar, " + ;
"f_timestamp #CAAutoRefreshDemo.f_timestamp, " + ;
"f_identity #CAAutoRefreshDemo.f_identity"
TimestampFieldList="f_timestamp"
&& automatically refresh Timestamp field after each Insert/Update
RefreshTimestamp= .T.
&& automatically refresh IDENTITY field and f2 field after Insert
InsertCmdRefreshFieldList="f_identity,f_int_unique"
&& use alternative key to refresh fields after Insert as we don't know
&& the value for f0 (IDENTITY)
InsertCmdRefreshKeyFieldList="f_int_unique"
WHERETYPE=4 && DB_KEYANDTIMESTAMP
ConflictCheckType= 3
ENDDEFINE
10 мар 06, 16:15    [2436139]     Ответить | Цитировать Сообщить модератору
 Re: VFP + SQL поле IDENTITY  [new]
C++FoXORASQL
Member

Откуда:
Сообщений: 55
Prisvojennoje Identity:3
10 мар 06, 16:40    [2436282]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6 7 8 9   вперед  Ctrl      все
Все форумы / FoxPro, Visual FoxPro Ответить