powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / VFP + SQL поле IDENTITY
215 сообщений из 215, показаны все 9 страниц
VFP + SQL поле IDENTITY
    #33562930
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, коллеги.

Работаю с VFP8, база на SQL Server 2000, использую курсорадаптер для работы с таблицами, запросы апдейт данный формируем сам адаптер.

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

Updates проходят хорошо, проблема с Insert`ом: не могу получить назад в фокс значение этого поля сразу после insert`а. А Юзеру надо после инсерта сразу показать, какая id присвоилась введенной им записи.

Пробовал так: в событие курсорадаптера BeforeInsert пишу:
Код: plaintext
cInsertCmd = cInsertCmd + "SELECT SCOPE_IDENTITY() as SCOPE_IDENTITY"
но курсор на прилепленный select не создается!!! Почему?


Пробовал еще так:
Сразу после TableUpdate выполняю:
Код: plaintext
sqlexec(<номер соед.адаптера>, "SELECT SCOPE_IDENTITY() as SCOPE_IDENTITY", 'tmp')
Выдает NULL.
Если поменять SELECT SCOPE_IDENTITY() на SELECT @@identity, результат есть, но по логике это некорректно.

Возможно, дело в расшаренной коннекции и connection statements, которые я создаю для каждого курсорадаптера?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33563116
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scope_identity это то что присвоилось в одном батче. Т.е. надо вместе посылать команды, типа

sqlexec(cn,'insert into ... ;SELECT SCOPE_IDENTITY() as SCOPE_IDENTITY',crsr)
? crsr.SCOPE_IDENTITY

PS
курсорадаптер выбрось
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33564880
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
заморочки одни, работайте через ODBC, создайте курсоры (если надо - с параметрами) и тогда команда
=tableupdate(.t.,.t.,'имя курсора) сбросит из буфера в базу SQL
а команда
=requery('имя курсора') покажет что там прописалось в поле identity...
а там уже берете поле ID и делаете с ним то что вам нужно
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33564881
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати команда tableud.. не обязательна, =requery('имя курсора') тоже сбросит в базу ваш буфер..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33578634
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi FoXXX!

> кстати команда tableud.. не обязательна, =requery('имя курсора') тоже
> сбросит в базу ваш буфер..

Нет не сбросит.
При некотором стечении обстоятельств (в частности при использовании
практически неуправляемой строчной буферизации) может пройти автоматический
сброс буфера, но в нормальной ситуации мы просто получим ошибку 1545 - Table
buffer for alias "name" contains uncommitted changes.
А вообще это неправильный подход - перезапрос это перезапрос, а извлечение
Identity после вставки - это совсем другая песня...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33580736
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В смысле неправильны подход...

tableup - сбрасывает записи в базу
requer - получает их обратно уже с значениями ident - самый правильный и реальный подход. у меня req ни разу не ругнулась пока, пользую vfp9 - mssql2000, но может вы и правы.

а если вы будете гипотетически предполагать какой номер присвоит sql следующей записи, через спец функции sql например, вы попадете впросак, т.к. другой пользователь в этот момент сбросит свои записи и ваш ident будет неверен.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33582649
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi FoXXX!

> tableup - сбрасывает записи в базу
> requer - получает их обратно уже с значениями ident - самый правильный и
> реальный подход.

Конечно, если тебя не интересует возврат на "ту самую" запись которая была
активна на момент "перед сохранением" - то это вполне реально - а вот если
действительно нужно вернуться на "текущую запись" - то в общем случае это
НЕВОЗМОЖНО при использовании REQUERY(). В частных (т.е. далеко не во
всех!!!) случаях помогает поле ключа-кандидата (т.е. по сути "второй ключ"
который реально создаётся на клиенте) - но в общем случае это не выход.

> у меня req ни разу не ругнулась

Не в этом проблема. Никто ни на что не ругается - просто невозможно в НОВОМ
курсоре (а после перезапроса мы как раз получаем по сути новый курсор!
Точнее старые записи выкидываются, а курсор наполняется новыми записями)
найти нужную запись - а иногда эта "новая запись" вообще не попадает в
курсор после перезапроса! Скажем не проходит по условиям отбора (добавить то
в курсор такую запись не проблема, а вот после перезапроса её уже не
достать).

> а если вы будете гипотетически предполагать

Ни в коем случае! Никаких "гипотез" или "предположений"!

> какой номер присвоит sql следующей записи

Это для IDENTITY невозможно узнать!

> через спец функции sql например

Таких функций нет - есть функции которые вернут то значение которое УЖЕ
ПРИСВОЕНО - т.е. получить ID не ДО вставки, а ПОСЛЕ - когда оно уже реально
существует.

> вы попадете впросак, т.к. другой пользователь в этот момент сбросит свои
> записи и ваш ident будет неверен.

Ни @@IDENTITY ни SCOPE_IDENTITY() никак не могут зависеть от "других
пользователей" - поскольку они связаны с сессией - а у разных пользователей
естественно разные сессии. Можешь провести свой эксперимент если уж не
доверяешь документации.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33583346
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может мы о разных вещах говорим, на мой взгляд состояние базы, присвоение ID не зависит от сессии и пользователя, т.е. база одна для всех и распределение id едино, т.е. есть счетчик он ставит следующий номер следующей введеной записи, и не важно с какой сессии это произошло, кто первый тот и получил. может я тут немного с ораклом спутал, но помнится мне толи в оракле толи в мсскл я получал через функцию следющий номер id который будет присвоен записи, что в скл этого нет?

по поводу записи на которую не вернуться, ну наверно есть уникальное поле по которому можно сделать locate?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33583404
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXпо поводу записи на которую не вернуться, ну наверно есть уникальное поле по которому можно сделать locate?
Так это уникальное поле (первичный ключ таблицы - PK) и генерится очень часто с помощью свойства IDENTITY (не зря ведь оно может быть только одно на таблицу).
FoXXX
но помнится мне толи в оракле толи в мсскл я получал через функцию следющий номер id который будет присвоен записи, что в скл этого нет?

Пока вы раздумываете, что делать с этим новым значением ID, другой процесс может вставить эту запись.. Ну не таблицу же всю блокировать при вставке записи.
А что касается слов Igor Korolyov о том, что "....@@IDENTITY ни SCOPE_IDENTITY() никак не могут зависеть от "других
пользователей" - поскольку они связаны с сессией - а у разных пользователей
естественно разные сессии....", то он имел в виду, что эти функции работают ТОЛЬКО при вставки записи в таблицу, имеющую свойство IDENTITY.
Попробуйте SELECT @@IDENTITY или SELECT SCOPE_IDENTITY() БЕЗ вставки и получите NULL. А после вставки вернется то значение, которое попало в таблицу со свойством IDENTITY. Далее запись можете вернуть клиенту SELECT... FROM ... WHERE ID = SCOPE_IDENTITY().
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33583452
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXможет мы о разных вещах говорим, на мой взгляд состояние базы, присвоение ID не зависит от сессии и пользователя, т.е. база одна для всех и распределение id едино, т.е. есть счетчик он ставит следующий номер следующей введеной записи, и не важно с какой сессии это произошло, кто первый тот и получил.
ЧТО получил?

-) Первый пользователь создал новую запись
-) Второй пользователь создал новую запись
-) Первый пользователь запросил значение ключа ПОСЛЕДНЕЙ созданной записи. ЧТО он получил?

Понятно о чем речь? Если не делать "разграничения" по сессиям и пользователям, то получишь код ПОСЛЕДНЕЙ созданной записи. При этом далеко не факт, что эта именно та запись, которая тебе и нужна.

BOL MS SQL 2000@@IDENTITY and SCOPE_IDENTITY will return the last identity value generated in any table in the current session. However, SCOPE_IDENTITY returns the value only within the current scope; @@IDENTITY is not limited to a specific scope.

Т.е. и @@IDENTITY, и SCOPE_IDENTITY работают в пределах одной сессии. Грубо говоря, действия "другого" пользователя с точки зрения последнего присвоенного кода - игнорируются.

Однако существует другая проблема.

Создание новой записи таблицы может вызвать срабатывание триггера, внутри которого будет выполнено также создание новой записи. В этом случае @@IDENTITY вернет значение, созданное именно внутри тела триггера, а не в первой команде INSERT.

Именно для устранения подобной неоднозначности и была введена SCOPE_IDENTITY()

BOL MS SQL 2000 SCOPE_IDENTITYReturns the last IDENTITY value inserted into an IDENTITY column in the same scope. A scope is a module -- a stored procedure, trigger, function, or batch. Thus, two statements are in the same scope if they are in the same stored procedure, function, or batch.

Т.е. SCOPE_IDENTITY() вернет значение, присвоенное именно в данном программном модуле или пакете. Проигнорировав присвоения, сделанные в других модулях.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33585775
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ребята, вы конечно асы по разным заумным высказываниям, но я вам просто и доходчиво обьясняю:

=TABLEUPDATE(.t.,.t.,'x')
потом
=requery('x')
потом
go bottom
все сразу и мгновенно, а если данная запись не попадает в данный запрос, то позвольте это считать уникальным случаем имеющим право на другое решение.

по поводу получения ID я и сказал тупиковый путь.

если с моим решением не согласны по обьективным причинам - обоснуйте, а то все что-то говорят с желанием блеснуть познаниями в Fox, такое впечатление - лишбы что-нибудь ляпнуть, покрасоваться...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586310
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXребята, вы конечно асы по разным заумным высказываниям, но я вам просто и доходчиво обьясняю:

=TABLEUPDATE(.t.,.t.,'x')
потом
=requery('x')
потом
go bottom
все сразу и мгновенно, а если данная запись не попадает в данный запрос, то позвольте это считать уникальным случаем имеющим право на другое решение.

если с моим решением не согласны по обьективным причинам - обоснуйте
Обосновываю:

-) Первый пользователь добавил запись и сделал TableUpdate()
-) Второй пользователь добавил запись и сделал TableUpdate()
-) Первый пользователь сделал Requery(), перешел к последней записи и ЧТО он прочитал? ЧЕЙ код? Тот что сам добавил, или тот что добавил ДРУГОЙ пользователь.

FoXXXпо поводу получения ID я и сказал тупиковый путь.
...
, а то все что-то говорят с желанием блеснуть познаниями в Fox, такое впечатление - лишбы что-нибудь ляпнуть, покрасоваться...
Неправильно сказал. Именно получение ID и есть "генеральная линия партии". Вам разными путями пытались это объяснить. А вовсе не из желания покрасоваться.

Разъяснения сводились к тому, что именно надо делать и каким образом. А именно, использование функции SCOPE_IDENTITY() и "спасет отца русской демократии".

Так что, изначальный вопрос Sergej_S очень правильный. Он как раз и действует "как надо". Другой вопрос, как это "надо" вписать в механизм Cursor Adapter. Это надо разбираться отдельно...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586409
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ FoXXXребята, вы конечно асы по разным заумным высказываниям, но я вам просто и доходчиво обьясняю:

=TABLEUPDATE(.t.,.t.,'x')
потом
=requery('x')
потом
go bottom
все сразу и мгновенно, а если данная запись не попадает в данный запрос, то позвольте это считать уникальным случаем имеющим право на другое решение.

если с моим решением не согласны по обьективным причинам - обоснуйте
Обосновываю:

-) Первый пользователь добавил запись и сделал TableUpdate()
-) Второй пользователь добавил запись и сделал TableUpdate()
-) Первый пользователь сделал Requery(), перешел к последней записи и ЧТО он прочитал? ЧЕЙ код? Тот что сам добавил, или тот что добавил ДРУГОЙ пользователь.

FoXXXпо поводу получения ID я и сказал тупиковый путь.
...
, а то все что-то говорят с желанием блеснуть познаниями в Fox, такое впечатление - лишбы что-нибудь ляпнуть, покрасоваться...
Неправильно сказал. Именно получение ID и есть "генеральная линия партии". Вам разными путями пытались это объяснить. А вовсе не из желания покрасоваться.

Разъяснения сводились к тому, что именно надо делать и каким образом. А именно, использование функции SCOPE_IDENTITY() и "спасет отца русской демократии".

Так что, изначальный вопрос Sergej_S очень правильный. Он как раз и действует "как надо". Другой вопрос, как это "надо" вписать в механизм Cursor Adapter. Это надо разбираться отдельно...

да вы батенька - фантаст однако...

ну надо же, два одновременно добавили запись,
весь набор команд выполняется мгновенно практически пакетом, каким образом успевает второй всунуться после табле апдейт, это ж постараться надо.. ситуация блин..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586654
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C++FoXORASQL
да вы батенька - фантаст однако...

ну надо же, два одновременно добавили запись,
весь набор команд выполняется мгновенно практически пакетом, каким образом успевает второй всунуться после табле апдейт, это ж постараться надо.. ситуация блин..
Где Вы здесь увидели пакет? Это же не MS SQL. Это команды FoxPro.

Есть 2 последовательно выполняющиеся команды FoxPro

Код: plaintext
1.
2.
TableUpdate()
Requery()

MS SQL просто никак не может получить их "пакетом". Он получит две отдельные команды.

Даже если опустить тот факт, что ТАК программы никто не пишет. На практике, между TableUpdate() и Requery() будет еще много чего вставлено (сброс данных в другие таблицы, проверка ошибок, завершение транзакции и т.д. и т.п.). То КАК Вы себе представляете процесс работы?

TableUpdate() - это команда на модификацию, Requery() - команда на чтение. Две разные команды. Почему между ними не может "втиснуться" другая команда?

При этом, я не вижу причин, почему вcтавка записи другим пользователем, не может произойти в процессе выполнения Requery(). Правда, тут нужно знать, как именно происходит процесс чтения данных. Т.е. внутреннюю "механику" команды Requery()

В данном случае аргумент типа "весь набор команд выполняется мгновенно практически пакетом" ничем не отичается от аргумента "успевает второй всунуться после табле апдейт". Просто "голословные" утверждения, что с одной, что с другой стороны.

Только вот, почему-то в HELP по MS SQL нигде не говорится, что получить код последней вставленной записи можно простым вычислением максимального значение (GO BOTTOM - это и есть определение MAX). И чего они, дураки, мучаются
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586813
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чего они мучаются не знаю,

процесс работы requery можно посмотреть в SQL Profiler

go bottop, скорее не max а последняя запись, т.е. запись последняя в таблице, конечно гипотетически можно предположить что кто-то втиснет свою запись туда, ну на практике наврятли, хотя нужно попоробовать на двух компах двумя руками одновременно клацнуть клавиши... интересно произойдет то о чем вы говорите или нет? мне кажется нужно очень постараться, ну просто очень, и то сомневаюсь что у вас получится втиснуть пока отрабатывается команда одного из клиентов..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586845
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
к сожалению в данный момент по техническим причинам не могу произвести подобный эксперимент, если у вас есть такая возможность попробуйте проверте, добейтесь результата и вы меня переубедите..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586851
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C++FoXORASQLчего они мучаются не знаю,

процесс работы requery можно посмотреть в SQL Profiler

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

Вы бы прочли внимательно, что Вам отвечали, а затем подумали и потом провели бы эксперименты, а то её богу забавно читать Ваши посты.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586854
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторкурсорадаптер выбрось

изв., что встреваю
а чем курсорадаптер неугодил???

ну что-то не нравится - породите свой и допишите вкось и вкривь
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586869
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
немного возражу ВладимируМ, вот он пишет:
/*TableUpdate() - это команда на модификацию*/

на самом деле сброс буфера в базу, если используется буфер.
команда раскладывается на insert, update
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586913
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C++FoXORASQLнемного возражу ВладимируМ, вот он пишет:
/*TableUpdate() - это команда на модификацию*/

на самом деле сброс буфера в базу, если используется буфер.
команда раскладывается на insert, update
На всякий случай напомню.

В данной теме обсуждается вопрос создания новой записи в MS SQL сервере со стороны клиента FoxPro и получения значение поля со свойством Identity в этой новой записи.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586921
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ C++FoXORASQLнемного возражу ВладимируМ, вот он пишет:
/*TableUpdate() - это команда на модификацию*/

на самом деле сброс буфера в базу, если используется буфер.
команда раскладывается на insert, update
На всякий случай напомню.

В данной теме обсуждается вопрос создания новой записи в MS SQL сервере со стороны клиента FoxPro и получения значение поля со свойством Identity в этой новой записи.

не понял, извините.

а я про что??
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586931
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C++FoXORASQL
на самом деле сброс буфера в базу, если используется буфер.
команда раскладывается на insert, update

Ну вот другое дело, есть конкретный вопрос

При КС технологии всегда есть буфер клиента (промежуточный курсор) который сбрасывается на сервер.

Есть два метода модификации данных на сервере
- использование старых данных эквивалентно (UPDATE Table SET .... WHERE)
- использование новых данных эквивалентно пакету (DELETE FROM Table WHERE + INSERT INTO Table VALUES(.....))

за это отвечает установка CURSORSETPROP('UpdateType')
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33586983
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так работает (выглядит) requery() в MS SQL:

SELECT * FROM dbo.por Por

так работает tableupd():

UPDATE dbo.tablica SET rezoluc='sadsadasd' WHERE id=5318 было изменено 2 поля.
UPDATE dbo.tablica SET rezoluc='asfasdasdsad' WHERE id=5379

используется буфер Use form setting (default) и 2-Optimistic

а так создается новая запись:

exec sp_executesql N'INSERT INTO dbo.tablica (vhod_num,n_str,date_vruch,date_vozvr,ready) VALUES (@P1,@P2,@P3,@P4,@P5)', N'@P1 numeric(7,0),@P2 char(5),@P3 smalldatetime,@P4 smalldatetime,@P5 smalldatetime', 3235, '1 ', 'Mar 7 2006 12:00AM', NULL, NULL
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33587117
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C++FoXORASQLтак работает (выглядит) requery() в MS SQL:

SELECT * FROM dbo.por Por

так работает tableupd():

UPDATE dbo.tablica SET rezoluc='sadsadasd' WHERE id=5318 было изменено 2 поля.
UPDATE dbo.tablica SET rezoluc='asfasdasdsad' WHERE id=5379

используется буфер Use form setting (default) и 2-Optimistic

а так создается новая запись:

exec sp_executesql N'INSERT INTO dbo.tablica (vhod_num,n_str,date_vruch,date_vozvr,ready) VALUES (@P1,@P2,@P3,@P4,@P5)', N'@P1 numeric(7,0),@P2 char(5),@P3 smalldatetime,@P4 smalldatetime,@P5 smalldatetime', 3235, '1 ', 'Mar 7 2006 12:00AM', NULL, NULL

Что Вы хотите, что бы Вам прокоментировали?

Для команды Requery() результатом которой является
Код: plaintext
SELECT * FROM  dbo.por Por - 
почитайте SET TRANSACTION ISOLATION LEVEL и SELECT table_hint

Для команды TableUpdate результатом которой является
Код: plaintext
UPDATE dbo.tablica SET rezoluc='sadsadasd' WHERE id= 5318 
использовано значение
Код: plaintext
CURSORSETPROP('UpdateType', 1 )

При создании новой записи почитайте о
Код: plaintext
 sp_executesql
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33587152
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я нихочу коментариев, это я вам показал что происходит в сервере когда я работаю в клиенте фокса и использую вышеобозначенные команды,

вопрос был что там происходит, я дал ответ: происходит это и привел пример, вот и все...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33587184
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C++FoXORASQLя нихочу коментариев, это я вам показал что происходит в сервере когда я работаю в клиенте фокса и использую вышеобозначенные команды,

вопрос был что там происходит, я дал ответ: происходит это и привел пример, вот и все...

То что Вы привели код взятый из профайлера, думаю ни кого не удивил, теперь прокоментируйте те команды которые Вы привели и обоснуйте почему во время TableUpdate или во время Requery невозможно добавить запись удовлетворяющую условию отбора или модификации. Некоторые наводки я Вам дал в пердыдущем посте.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33587210
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в этом примере я не использовал конструкций типа sqlexec(h,'selekt kjdsfkjsdhf'),
просто обьявил ремоут вью, там и задал все настройки,
далее просто
=tableup
=requer
go bottom
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33587217
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist C++FoXORASQLя нихочу коментариев, это я вам показал что происходит в сервере когда я работаю в клиенте фокса и использую вышеобозначенные команды,

вопрос был что там происходит, я дал ответ: происходит это и привел пример, вот и все...

То что Вы привели код взятый из профайлера, думаю ни кого не удивил, теперь прокоментируйте те команды которые Вы привели и обоснуйте почему во время TableUpdate или во время Requery невозможно добавить запись удовлетворяющую условию отбора или модификации. Некоторые наводки я Вам дал в пердыдущем посте.

ну почему же нельзя, теоретически можно, но у меня не получалось на практике, с двух машин клацал, команды не перемешивались..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33587241
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C++FoXORASQLя нихочу коментариев, это я вам показал что происходит в сервере когда я работаю в клиенте фокса и использую вышеобозначенные команды,

вопрос был что там происходит, я дал ответ: происходит это и привел пример, вот и все...
Замечательно. Это значит, что когда в FoxPro даются команды:

TableUpdate()
Requery()

то на MS SQL получаем 2 (ДВА) пакета команд

INSERT INTO ...
GO
SELECT * FROM ...
GO

Напоминаю, это НЕ один пакет. Это два РАЗНЫХ пакета. Значит, втиснуться между ними другому пакету вполне под силу.

Cобственно процесс чтения данных в команде SELECT происходит постранично. Это значит, что вполне допустима ситуация, когда команда SELECT читает первую страницу, а в то же самое время другой процесс делает вставку, например, в 10 страницу. После чего, команда SELECT считывает и эти данные. Т.е. происходит вставка в процессе чтения.

Это все к тому, что вставка другим пользоваителем между вставкой первого пользователя и считыванием текущего состояния - вполне реальная возможность, которую просто необходимо учитывать.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33587272
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
убедили, возможность реальная, раньше проходило, теперь буду об этом думать..

наверно здесь критично к-во клиентов...

спасибо за приятную беседу, удачи
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33587417
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё боится времени

АВТОРЕФРЕШ КУРСОР АДАПТЕРА
ЗАМЕНИТЕ СТРОКУ СОЕДИНЕНИЯ С СЕРВЕРОМ
VFP9SP1

В BROWSE НОВАЯ ЗАПИСЬ ctrl+y

**********************************
*<> Author: a-davand
*<> Description: Demonstrate CursorAdaptor Auto-Refresh capabilities
*<>************************************************************************
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=TIT;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

BROWSE TITLE ' ' IN screen

SQLEXEC(nAutoRefreshConn ,"INSERT INTO #CAAutoRefreshDemo (f_int_unique,f_varchar) VALUES (3,'demo3')")
BROWSE TITLE ' ' IN screen
read
*CLEAR ALL


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

.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33588020
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мнда.. вот это асссс...

может прокоментируете?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33588030
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за обсуждение темы!

Не могу нормально протестировать код Pavel_t, т.к. у меня VFP8. Я смотрю, в девятой версии в курсорадаптере появилось много нового : InsertCmdRefreshKeyFieldList, InsertCmdRefreshFieldList и др.

Кто-нибудь пробовал данный пример? Расскажите! Напомню, что интересовал вопрос о том, как при добавлении новой записи получить значение присвоенного поля Identity без повторной закачки всего курсора.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33588613
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пример прогнал
в курсоре последний инсерт не отражается

так и висит два первых
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33588648
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати, команда: oca=CREATEOBJECT("CAAutoRefreshDemo1") в
SQL Profiler выглядит так: select * from #CAAutoRefreshDemo
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33588649
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извиняюсь,
команда oca=CREATEOBJECT("CAAutoRefreshDemo")
конечно..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33588716
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FoXXXпример прогнал
в курсоре последний инсерт не отражается

так и висит два первых

SQLEXEC(nAutoRefreshConn ..... это внешняя команда по отношению к курсор
адаптеру как и два первых - Это как добавление другого пользователя
по этому и не отражается в "CATest"
чтобы увидеть все изменения других пользователей
делай =requery([CATest])
если добавлять непосредственно в "CATest"
В Browse ctrl+Y
append или insert в "CATest"




.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33588844
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pavel_t FoXXXпример прогнал
в курсоре последний инсерт не отражается

так и висит два первых

SQLEXEC(nAutoRefreshConn ..... это внешняя команда по отношению к курсор
адаптеру как и два первых - Это как добавление другого пользователя
по этому и не отражается в "CATest"
чтобы увидеть все изменения других пользователей
делай =requery([CATest])
если добавлять непосредственно в "CATest"
В Browse ctrl+Y
append или insert в "CATest"
.... и только время боится пирамид!

темболее ничего не понятно, зачем нужен курсор адаптер?

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

1. есть база фокс, в которой удаленные вью, соннект ну с соответствующей настройкой

2. в датеенвир формы из этой базы вставляю нужные вью

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

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

все работает и все хокей, зачем столько огородов городить и такой флуд разводить???
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33588851
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и чем впринципе отлтчается remo view от курсорадаптера??

то же самое, что и вью, вью тоже настраивается...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33588916
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё боится времени

to foxxx
и чем впринципе отлтчается remo view от курсорадаптера??
то же самое, что и вью, вью тоже настраивается...

зря вы так ...
Всё написано в доках в чём и как ....
перечислять времени не хватит

Работаю с Sql2000 так сложилось ну нет базы Vfp нет таблиц vfp
да и не нужны (удобно,надёжно,быстро)
есть только exe и udl
ADO
cursor adapter
ADODB.Command

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

Если мы что-то не знаем, то это не значит, что этого нет.

.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33588974
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автори чем впринципе отлтчается remo view от курсорадаптера??


а чем отличается do form
от define window .... ???

вот тем и отличается, что это объект со всеми вытекающими
отсюда прелестями

настроил, поднял и живи спокойно
(да и на основе базового никто не мешает написать свой-поумнее)
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33589014
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pavel_t Всё боится времени

to foxxx
и чем впринципе отлтчается remo view от курсорадаптера??
то же самое, что и вью, вью тоже настраивается...

зря вы так ...
Всё написано в доках в чём и как ....
перечислять времени не хватит

Работаю с Sql2000 так сложилось ну нет базы Vfp нет таблиц vfp
да и не нужны (удобно,надёжно,быстро)
есть только exe и udl
ADO
cursor adapter
ADODB.Command

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

Если мы что-то не знаем, то это не значит, что этого нет.

.... и только время боится пирамид!

у меня тоже нет таблиц vfp..
база есть, это удобно, в ней все настройки коннект и т.д

прога тоже exe

просто при инсталяции создается папка а в ней exe и база (без таблиц)

это не мешает

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

если вы их знаете то озвучте, для того и идет этот разговор, форум вроде для того чтобы делиться своими достижениями в фоксе? или я заблуждаюсь?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33589030
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pavel_t FoXXXпример прогнал
в курсоре последний инсерт не отражается

так и висит два первых

SQLEXEC(nAutoRefreshConn ..... это внешняя команда по отношению к курсор
адаптеру как и два первых - Это как добавление другого пользователя
по этому и не отражается в "CATest"
чтобы увидеть все изменения других пользователей
делай =requery([CATest])
если добавлять непосредственно в "CATest"
В Browse ctrl+Y
append или insert в "CATest"
.... и только время боится пирамид!

почему добавление другого пользователя если используется один номер коннекта? т.е. и инсерт и курсорад используют один коннект..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33589032
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lnId = this.oCura.getId()

есть преимущество??

this.oCura.Update()

this.oCura.DataRefresh()

this.oCura.DataFill()

есть преимущество??

this.oCura.Revert()

this.oCura.ЧегоНибудь()
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33589119
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex11100lnId = this.oCura.getId()

есть преимущество??

this.oCura.Update()

this.oCura.DataRefresh()

this.oCura.DataFill()

есть преимущество??

this.oCura.Revert()

this.oCura.ЧегоНибудь()

не нашел этих свойств в хелпе по курсорадаптере..

и подозреваю что datarefresh() работает как рекьюри:
select * from
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33589137
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и не найдете

на основе базового класса
можно породить свой курсорадаптер и
научить его всем премудростям
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33589167
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex11100и не найдете

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

здесь долгий спор шел, о том, что происходит на скл в момент вставки и получения значения id, т.е. сможет ли в этот момент вставиться другая запись, курсорадаптер позволит другому клиенту вставиться? он ведь впринципе на скл выполняется как инсерт и селект.. значит вставиться можно..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33589232
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сложно Вас понять

чего Вы желаете
проблему получить или решить ее по-простому и без лишних проблем
вот

в моем случае новую запись в курсорадаптере я вижу
своим способом

а вот то, что с ней станет на сервере и какой у нее станет ID
я могу увидеть только после апдейта

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

и чего ?? делов та
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33589801
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX

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

...
...

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


Тянуть всю таблицу можно только в НЕБОЛЬШИХ проектах.
В принципе, НЕТ необходимости после добавления строки тянуть таблицу назад в фокс. Я делаю так (без Identity): вычисляю значение уникального поля, прописываю в фоксе в соотв. поле курсора и делаю TableUpdate(). В фоксе у меyя строка есть. На SQL Server`е после TableUpdate() у тоже строка появилась. Зачем тянуть?
Здесь, конечно начинаются извращения, чтобы с момента вычисления уникального поля и TableUpdate() не всунулся со своим инсертом другой юзер. Тут можно много нагородить и решить эту проблему, но я так понял, что "Большой Брат" для этого и придумал Identity.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33589850
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: Pavel_t:

Судя по этому куску кода в конце примера (проверить не могу, у меня VFP8):
Код: plaintext
1.
2.
3.
4.
5.
&& 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 версии. Заранее спасибо.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33590138
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergej_S FoXXX

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

...
...

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


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

вью параметеризированный!!! вам это ни очем не говорит? это значит что вся база на фокс не тянется, а только та часть что соответствует параметру, а вместе с ней и новый id..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33590140
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergej_STo: Pavel_t:

Судя по этому куску кода в конце примера (проверить не могу, у меня VFP8):
Код: plaintext
1.
2.
3.
4.
5.
&& 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...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33590147
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и вообще не понятно как вы в фоксе вычисляете id если этим занимается SQL??
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33590405
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>и вообще не понятно как вы в фоксе вычисляете id если этим занимается SQL??
тяну SQLEXEC`ом:
select 1+MAX(поле) as id_ FROM ... (для int)
или
select newid() as id_ FROM ... (для char(36))
работает, хотя и не лучший вариант.

>вью параметеризированный!!! вам это ни очем не говорит? это значит что вся база на фокс не тянется
согласен, так получше, но мне такой вариант все-равно не нравится :)
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33590700
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё боится времени

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 просто нравится





.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33590825
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Pavel_t
Спасибо, я в основном понял Ваши объяснения. Только я все инсерты закидываю через tableupdate.
Подскажите, пожалуйста по вашему коду, есди сделать так: после создания таблицы, занесения в нее 2-х записей, создания адаптера запускаем такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT CATest
APPEND BLANK
REPLACE f_int_unique WITH  3 
? f_identity  &&  Должно выдать  0 
TABLEUPDATE()

? f_identity  && А ТЕПЕРЬ ВЫДАЕТ  0  ИЛИ  3  ???????
P.S. если совсем не понятно, чего я хочу- я вышлю полный листинг кода.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33591319
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33591697
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33591786
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/*И вообще не стоит себя вести как капризный ребёнок - если говорят что так
делать нельзя, и тем более если дают ссылки на то как НУЖНО делать - не "от
себя", а от производителя соответствующего сервера! То наверное стоит не
спорить, а читать и думать, думать и читать!*/

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

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

надо ли слепо следовать инструкциям?? я предпочитаю проверять инструкции и доку на практике и не боюсь что-нибудь проверить или применить не рекомендованное или не описанное в доке.. тем более в фоксе столько глюков, что любая инструкция описанная в доке не факт будет работать как описано..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33592125
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё боится времени
to foXXX
кей мы не используем -> последняя является последней (физически)

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

не согласен
если Rv параметризованный
и вновь введённая запись не удовлетворяет параметрам запроса
она и неперевыберется по =requery() хотя и добавится
с уважением павел Т
.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33592198
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pavel_t Всё боится времени
to foXXX
кей мы не используем -> последняя является последней (физически)

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

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

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

те параметр = сисдате, рекьюри го боттом...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33592511
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXпоясню, параметризация применяется в основном с целью отброса ненужной информации, я например часто применяю по дате (сегодняшняя дата, или этот месяц, или этот год .. по ситуации)
Допустим, работает себе бухгалтер с док-тами текущего месяца (чтобы всю базе не тянуть). Заносит их. Вдруг ему надо занести документ за прошлый месяц. Он его заводит и документ проваливается куда-то (в базе появился, а в гриде нет). Ну это еще ладно. А вдруг он случайно пальцем не туда попал и вбил не тот месяц. "Шайтан, где мой докУмент, а жеш его завел!!!?"- скажет бухг.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33592512
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXвот вы пишете что в базе нет порядка, но это ведь основной принцып баз, последняя запись всегда последняя..

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

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

SELECT * FROM MyTab

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

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


PS: Большая просьба, прежде чем бросаться писать ответ, прочитете вызвавшее такое раздражение сообщение еще раз. Вы точно поняли О ЧЕМ идет речь? Прочитали то, что написана, а не то, что Вам показалось написанным?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33592703
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergej_S FoXXXпоясню, параметризация применяется в основном с целью отброса ненужной информации, я например часто применяю по дате (сегодняшняя дата, или этот месяц, или этот год .. по ситуации)
Допустим, работает себе бухгалтер с док-тами текущего месяца (чтобы всю базе не тянуть). Заносит их. Вдруг ему надо занести документ за прошлый месяц. Он его заводит и документ проваливается куда-то (в базе появился, а в гриде нет). Ну это еще ладно. А вдруг он случайно пальцем не туда попал и вбил не тот месяц. "Шайтан, где мой докУмент, а жеш его завел!!!?"- скажет бухг.

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

в параметрическом вью не обязательно вручную вбивать параметр, да и не делает этого никто никогда, параметр - это переменная, которая задается по умолчанию, например сист дата, можно использовать конструкцию битвин, тогда возможно залдание периода, переменная определяется автоматически как глобал, далее, на форме где-то должно быть окошко (информационное) в каком периоде мы работаем, если хотим прошлый месяц - пожалуйста, прошлый год - пожалуйста, кстати параметр не обязательно формата даты, может быть и просто число - № месяца например, да и странно если бухгалтер будет каждый раз не так пальчиком тыкать в период своей работы, она должна хотябы понимать квартал, месяц, год, ну если не менять то по умолчанию текущий. это только один из вариантов работы с вью..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33592714
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ FoXXXвот вы пишете что в базе нет порядка, но это ведь основной принцып баз, последняя запись всегда последняя..

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

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

SELECT * FROM MyTab

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

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


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

ну не знаю как вам это удается - получить перемешанные записи, я наблюдаю записи в самом SQL и в вью, они сохраняют порядок введения на протяжении 5 лет... ну большей базы под рукой нет... только селект простой без ордера..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33592809
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX ну не знаю как вам это удается - получить перемешанные записи, я наблюдаю записи в самом SQL и в вью, они сохраняют порядок введения на протяжении 5 лет... ну большей базы под рукой нет... только селект простой без ордера..

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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

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

С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33592873
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да действительно если использовать индекс - порядок по индексу, в моем примере за 5 лет индекса нет, но

если говорить об ident - он является ключевым полем, потому го боттом ориентируясь по нему пойдет на последний id, а рекьюри сделает пакетом апдейт и селект, го боттом передвинет указатель на последний id, готоры к тому времени в вью появится..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33592884
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извиняюсь, который к тому времени в вью появится

собственно мы ведь про id говорим, который и является главным ключем..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33592993
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мда, а здесь битва в разгаре..

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

хотя на мой взгляд у CAD есть неплохие шансы, но в предыдущих версиях VFP пройдет и предложенный пакет команд.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33593006
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist FoXXX ну не знаю как вам это удается - получить перемешанные записи, я наблюдаю записи в самом SQL и в вью, они сохраняют порядок введения на протяжении 5 лет... ну большей базы под рукой нет... только селект простой без ордера..

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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 записей :-), вроде судя по датам лежат по порядку,
наверно шринк в ней не делался...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33593037
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё раз REQUERY() - GO BOTTOM в ОБЩЕМ случае не дадут требуемый результат последней тобой добавленной записи, если сейчас не можешь этого понять, то прими на веру - это в дальнейшем избавит от множества ошибок.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33593127
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWistЕщё раз REQUERY() - GO BOTTOM в ОБЩЕМ случае не дадут требуемый результат последней тобой добавленной записи, если сейчас не можешь этого понять, то прими на веру - это в дальнейшем избавит от множества ошибок.

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

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

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

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

спасибо за дискуссию, всем удачи..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33593302
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, если кого достал, прошу выполнить следующий код в VFP9 (+sql 2000). Какое значение возвращается в messagebox ?
Код: 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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
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
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33593389
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Prisvojennoje Identity:3
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33593415
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, C++FoXORASQL ! Значит, стоит на 9 версию переходить.
Всем спасибо! Что хотел - выяснил.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33593466
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё боится времени
тотже пример почти, но через адо
и без уникального поля
создайте REMout_.udl В директории запуска
Поставщик данных MS ole db provider for sql server
.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33593631
C++FoXORASQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по первому примеру, проследил что там происходит в SQL, выяснил, что при вставке и запрпосе информации SQL ориентируется на уникальное поле.

и еще, CAD похож на вью, таким образом CAD тянет все записи на клиента? точнее все ваши записи?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594113
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi FoXXX!

PaulWist даёт дельный совет!
>> Ещё раз REQUERY() - GO BOTTOM в ОБЩЕМ случае не дадут требуемый результат
>> последней тобой добавленной записи, если сейчас не можешь этого понять,
>> то прими на веру - это в дальнейшем избавит от множества ошибок.


> собственно не ставил целью навязать свое решение, у меня этот метод
> работает, думаю и дальше будет работать

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

> вью конечно по ключу

Т.е. всегда установлен ORDER BY Id - мягко говоря это НЕтипичное решение -
упорядочивают выборку обычно по более значимому параметру нежели ID (и
опосредовано через ID - время создания записи). Конечно часто упорядочение
делают уже на клиенте (временные индексы) - НО и тогда эта схема точно
разрушается. Кроме того ДОПОЛНИТЕЛЬНО всегда в запросы добавлять Order by Id
(т.е. когда он реально нам совсем не нужен) - это намеренно снижать
производительность сервера (пусть и не существенно, т.к. объём выборки я
надеюсь не велик, но всё же это надо учитывать).

И дополнительно исходя из целой кучи предположений:
- что нагрузка на базу мизерная и событие одновременной вставки записи двумя
(или более) пользователями крайне маловероятно (давай уж тогда честно
признавайся, что у тебя обычно один пользователь и работает в базе на вводе
данных).
- что вновь добавляемая запись ВСЕГДА удовлетворяет тем условиям с которыми
выполняется перезапрос - для этого видимо надо ВООБЩЕ исключить те поля по
кторым идёт параметризация из того набора, что может редактировать
пользователь - т.е. у тебя "параметризуются" какие-то служебные,
автозаполняемые поля, а вовсе не реальные поля данных.

Т.е. общности твоё решение не имеет (слишком много всяких "если" и "но") - о
чём собственно и было сказано.

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

На мой взгляд писать надо прежде всего ПРАВИЛЬНО - а уж потом из правильных
вариантов и выбирать какой будет "короче", или какой "быстрее работает"...
Сравнивать же правильный вариант с неправильным - по меньшей мере глупо.

> я все-таки предпочитаю факты,

Для этого достаточно просто ПРОЧИТАТЬ то что я написал, и пошагово
выполнить - ничего более.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594177
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

1. про view, ну конечно тащить на клиента всю таблицу смысла нет, поэтому:

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

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

ограничение №3(параметр3) - могут быть другие параметры, зависит от типа задачи..

2.было предложенно что-то типа:
sqlexec(cn,'insert into ... ;SELECT SCOPE_IDENTITY() as SCOPE_IDENTITY',crsr)
но перед этим необходимо получить cn, значит
sqlconnect(connect) потом sqldisconnect(cn)
ну и масса других лишних обращений к серверу..
в моем случае все проще, requery - это:
sqlexec(cn,'insert into ... ;SELECT SCOPE_IDENTITY() as SCOPE_IDENTITY',crsr)
выполненое пакетом на сервере.

3. /*Конечно часто упорядочение
делают уже на клиенте (временные индексы) - НО и тогда эта схема точно
разрушается.*/ вот этим никогда не пользуюсь, есть плохой опыт..

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

С уважением, Алексей

ну чтож, проведем эксперимент:
создадим простенький view:

SELECT Proba.id, Proba.time, Proba.kod;
FROM ;
dbo.proba Proba

DBSetProp(ThisView,"View","SendUpdates",.F.)
DBSetProp(ThisView,"View","BatchUpdateCount",1)
DBSetProp(ThisView,"View","CompareMemo",.T.)
DBSetProp(ThisView,"View","FetchAsNeeded",.F.)
DBSetProp(ThisView,"View","FetchMemo",.T.)
DBSetProp(ThisView,"View","FetchSize",-1)
DBSetProp(ThisView,"View","MaxRecords",-1)
DBSetProp(ThisView,"View","Prepared",.F.)
DBSetProp(ThisView,"View","ShareConnection",.F.)
DBSetProp(ThisView,"View","AllowSimultaneousFetch",.F.)
DBSetProp(ThisView,"View","UpdateType",1)
DBSetProp(ThisView,"View","UseMemoSize",255)
DBSetProp(ThisView,"View","WhereType",1)

DBSetProp(ThisView+".id","Field","DataType","I")
DBSetProp(ThisView+".id","Field","UpdateName","dbo.proba.id")
DBSetProp(ThisView+".id","Field","KeyField",.F.)
DBSetProp(ThisView+".id","Field","Updatable",.F.)

DBSetProp(ThisView+".time","Field","DataType","T")
DBSetProp(ThisView+".time","Field","UpdateName","dbo.proba.time")
DBSetProp(ThisView+".time","Field","KeyField",.F.)
DBSetProp(ThisView+".time","Field","Updatable",.F.)

DBSetProp(ThisView+".kod","Field","DataType","I")
DBSetProp(ThisView+".kod","Field","UpdateName","dbo.proba.kod")
DBSetProp(ThisView+".kod","Field","KeyField",.F.)
DBSetProp(ThisView+".kod","Field","Updatable",.F.)

далее прогоним код:
USE proba IN 0
SELECT proba
FOR i=0 TO 1000
APPEND BLANK
REPLACE time WITH datetime(), kod WITH 1
ENDFOR
=TABLEUPDATE()
FOR i=0 TO 1000
APPEND BLANK
replace time WITH dateTIME(),kod WITH 2
ENDFOR
=TABLEUPDATE()

посмотрим что в таблице:

все лежит по-порядочку и по времени и по дате,
далее, зайдем в SQL Server Enterpris, глянем на табличку
SELECT *FROM proba - все по порядочку, далее сделаем shrink ,смотрим - все попорядочку...
открываем вью, все упорядочено..
чтобы нам еще сделать такое, чтобы нарушить порядок записей????
думаем...
не выходит, но ведь это КУЧА!!! просто КУЧА!! не так ли? интересно в этой куче поля не перемешиваются??? а буквы в словах?? страшное слово КУЧА!!!

вспомним файловую систему, как лежат байты в секторах и кластерах??? и понимаем, что любой файл есть не куча- а структура, т.е. информация структурирована, иначе это не файл а куча дйствительно... можно ли вставить запись внутрь файла? можно, но нужно пол файла переписать, так зачем это делать, ресурсов много?? потому новая запись в конец структуры, и нет никакой кучи, работает быстро, и байты не перемешиваются...
да, а как же /*специальные страницы IAM (Index Allocation Map). */??? ну здесь не мешало бы вспомнить принцып работы контроллера жесткого диска, выделение памяти... итак память выделена(создан буфер), далее головка контроллера двигается к кластеру №х и... чик, буфер полон, выделяем следующий буфер.. и чик, буфер полон, вот они страницы IAM.... и т.д.
А допустимо ли перемешивание информации????? ДА!!! Допустимо!!! Если у разработчиков системы в голове КУЧА!!! Если нет.. то не допустимо...

возможно.. возможно вы ребята правы... возможно это и правда куча байтов и бит.. но это уверяю вас не очевидно по логике вещей...

так что Алексей, ПаУль и ВладимирМ ... ваши представления нуждаются в корректировке... или не так?

Да, а если взглянуть на поднятый атором топика вопрос, важно ли это (куча)?
Не важно, потому что записи упорядочены по id, view имеет order, так зачем было нужно поднимать этот вопрос ???

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

С уважением, Алексей

ну чтож, проведем эксперимент:
создадим простенький view:

SELECT Proba.id, Proba.time, Proba.kod;
FROM ;
dbo.proba Proba

DBSetProp(ThisView,"View","SendUpdates",.F.)
DBSetProp(ThisView,"View","BatchUpdateCount",1)
DBSetProp(ThisView,"View","CompareMemo",.T.)
DBSetProp(ThisView,"View","FetchAsNeeded",.F.)
DBSetProp(ThisView,"View","FetchMemo",.T.)
DBSetProp(ThisView,"View","FetchSize",-1)
DBSetProp(ThisView,"View","MaxRecords",-1)
DBSetProp(ThisView,"View","Prepared",.F.)
DBSetProp(ThisView,"View","ShareConnection",.F.)
DBSetProp(ThisView,"View","AllowSimultaneousFetch",.F.)
DBSetProp(ThisView,"View","UpdateType",1)
DBSetProp(ThisView,"View","UseMemoSize",255)
DBSetProp(ThisView,"View","WhereType",1)

DBSetProp(ThisView+".id","Field","DataType","I")
DBSetProp(ThisView+".id","Field","UpdateName","dbo.proba.id")
DBSetProp(ThisView+".id","Field","KeyField",.F.)
DBSetProp(ThisView+".id","Field","Updatable",.F.)

DBSetProp(ThisView+".time","Field","DataType","T")
DBSetProp(ThisView+".time","Field","UpdateName","dbo.proba.time")
DBSetProp(ThisView+".time","Field","KeyField",.F.)
DBSetProp(ThisView+".time","Field","Updatable",.F.)

DBSetProp(ThisView+".kod","Field","DataType","I")
DBSetProp(ThisView+".kod","Field","UpdateName","dbo.proba.kod")
DBSetProp(ThisView+".kod","Field","KeyField",.F.)
DBSetProp(ThisView+".kod","Field","Updatable",.F.)

далее прогоним код:
USE proba IN 0
SELECT proba
FOR i=0 TO 1000
APPEND BLANK
REPLACE time WITH datetime(), kod WITH 1
ENDFOR
=TABLEUPDATE()
FOR i=0 TO 1000
APPEND BLANK
replace time WITH dateTIME(),kod WITH 2
ENDFOR
=TABLEUPDATE()

посмотрим что в таблице:

все лежит по-порядочку и по времени и по дате,
далее, зайдем в SQL Server Enterpris, глянем на табличку
SELECT *FROM proba - все по порядочку, далее сделаем shrink ,смотрим - все попорядочку...
открываем вью, все упорядочено..
чтобы нам еще сделать такое, чтобы нарушить порядок записей????
думаем...
не выходит, но ведь это КУЧА!!! просто КУЧА!! не так ли? интересно в этой куче поля не перемешиваются??? а буквы в словах?? страшное слово КУЧА!!!

вспомним файловую систему, как лежат байты в секторах и кластерах??? и понимаем, что любой файл есть не куча- а структура, т.е. информация структурирована, иначе это не файл а куча дйствительно... можно ли вставить запись внутрь файла? можно, но нужно пол файла переписать, так зачем это делать, ресурсов много?? потому новая запись в конец структуры, и нет никакой кучи, работает быстро, и байты не перемешиваются...
да, а как же /*специальные страницы IAM (Index Allocation Map). */??? ну здесь не мешало бы вспомнить принцып работы контроллера жесткого диска, выделение памяти... итак память выделена(создан буфер), далее головка контроллера двигается к кластеру №х и... чик, буфер полон, выделяем следующий буфер.. и чик, буфер полон, вот они страницы IAM.... и т.д.
А допустимо ли перемешивание информации????? ДА!!! Допустимо!!! Если у разработчиков системы в голове КУЧА!!! Если нет.. то не допустимо...

возможно.. возможно вы ребята правы... возможно это и правда куча байтов и бит.. но это уверяю вас не очевидно по логике вещей...

так что Алексей, ПаУль и ВладимирМ ... ваши представления нуждаются в корректировке... или не так?

Да, а если взглянуть на поднятый атором топика вопрос, важно ли это (куча)?
Не важно, потому что записи упорядочены по id, view имеет order, так зачем было нужно поднимать этот вопрос ???

Работайте так как привыкли, но это не значит что ваш метод единственно верный.. возможны и другие подходы, для вас не стандартные..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594204
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да.. батенька... это у вас в голове куча. Вы для начала почитайте BOL о структуре хранения данных MS SQL Server 2000 (хотя и SQL 7.0 годится).
Heap в понятии SQL Server это набор СТРАНИЦ данных, а не байт!
Да, внутри страницы данные могут при операциях перемещаться ФИЗИЧЕСКИ, но это всего-навсего 8192 байта (1 страница = 8КБ). А сами страницы данных (и индексов) связаны ТОЛЬКО через IAM и, разумеется, ни куда не перемещается физически (кроме операций типа DBCC SHRINKDATABASE и пр.).
А для того, чтобы увидеть изменения в порядки извлечения данных из таблицы в вашем примере надо заставить сервер этот порядок поменять физически, например:
Постройте кластерный индекс, скажем, по полю time DESC или, что лучше и нагляднее: добавьте поле типа VARCHAR(1000) DEFAULT '' и попробуйте заполнять это поле данными под завязку в разных строках (а не у всех и все одинаково), а потом смотрите в каком порядке будет сервер извлекать данные по сравнению с первоначальным.

С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594211
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sorry for double message, my internet connection is fucking bad...

Hi, Igor Korolev!
Even if our names are same, I have my own opinion. And I think I have this right.

Greetings to sunny Belarus! I was in Mogelev region in July 2005, visiting my relatives. I'd liked it. It is exelent in culture. Streats are clean, greenhedges and bushes are cutted.
I wish you success in learning personal computer...

8<--------------------------------------------------------------------------

Bonjour, Igor!
Je m'appele Igor et tu es appeles Igor aussi.
Mes Je voudrais parler tu mon opinion n'est pas pareil et j'ai un vraiment.
Je desire tu succes a l'etude de computer personal.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594329
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KДа.. батенька... это у вас в голове куча. Вы для начала почитайте BOL о структуре хранения данных MS SQL Server 2000 (хотя и SQL 7.0 годится).
Heap в понятии SQL Server это набор СТРАНИЦ данных, а не байт!
Да, внутри страницы данные могут при операциях перемещаться ФИЗИЧЕСКИ, но это всего-навсего 8192 байта (1 страница = 8КБ). А сами страницы данных (и индексов) связаны ТОЛЬКО через IAM и, разумеется, ни куда не перемещается физически (кроме операций типа DBCC SHRINKDATABASE и пр.).
А для того, чтобы увидеть изменения в порядки извлечения данных из таблицы в вашем примере надо заставить сервер этот порядок поменять физически, например:
Постройте кластерный индекс, скажем, по полю time DESC или, что лучше и нагляднее: добавьте поле типа VARCHAR(1000) DEFAULT '' и попробуйте заполнять это поле данными под завязку в разных строках (а не у всех и все одинаково), а потом смотрите в каком порядке будет сервер извлекать данные по сравнению с первоначальным.

С уважением, Алексей

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

с другой стороны, а зачем нам все это нужно???

мы ведь просто хотим видеть id сразу после вставки новой записи, к чему лезть в дебри??
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594340
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX
с другой стороны, а зачем нам все это нужно???
мы ведь просто хотим видеть id сразу после вставки новой записи, к чему лезть в дебри??
Точно.. не будет лезть в дебри, но для общего образования вы все-таки загляните в BOL на предмет разницы между кластерным и не кластерным индексами. И не кому не говорите,что:
FoXXX
.. получается SQL производит не индексацию таблицы, не построение индексного ключа, а осуществляет сортировку... т.е. физическую сортироку записей... но ведь это откат, может это и оправданно, но.. мы от этого в DBF отказались давно..

С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594367
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Залезть в BOL оно конечно можно, но чесслово - лень..
ну не в этом суть.. пример вам я прогнал, впринципе порядок соблюдается, зачем копать MSSQL если используется кей по id?
он используется везде по умолчанию, на мой взгляд это логично, нужен другой порядок -пжалуста ORDER.. в select..

/*И не кому не говорите,что:*/ - я не говорю, а скорее, рассуждаю о принципах организации базы данных, так сказать отвлеченно, ничего конкретно при этом не утверждая, потому и не ссылаюсь на BOL..

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

вот если бы вы раскрыли мне почему перезапрос не приемлем в данном случае, я был бы вам благодарен, но ничего конкретного небыло сказано ни игорем ни вами, так - общие слова: так не пишем, так не программируем.. вся критика свелась к промежутку tableupd() и requery(), ну убрал я, как в самом начале сказал, tableupd(), оставил requery(), и что? шквал критики не прекратился - усилися но не по существу к сожалению..

в ваших рядах убыло сегодня, однако, суббота, вы по выходным трудитесь?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594388
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да.., приходится и по выходным работать, но из дома.
А насчет вашего вопроса, то я в своих разработках при работе с SQL Server НЕ использую технологию RemoteView (RV) и CursorAdapter (CA) - только pass-through (PH). Почему - я подробно рассмотрел на своем сайте (http://www.caws.atnet.ru/vfox/sql.html). Вот если бы вы тоже использовали PH, то я бы мог вам чем-нибудь помочь, наверное, а в RV и CA я не силен, извините.
С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594442
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вашим сайт иногда, по мере необходимости использую, спасибо.


С уважением FoXXX.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594447
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FoXXXвашим сайт иногда, по мере необходимости использую, спасибо.


С уважением FoXXX.

извиняюсь, очепятка, ваш сайт разумеется..

С уважением FoXXX
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594556
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX
Здесь я вычеркнул массу слов, которые обычно заменяются звуковым сигналом или многоточием.

Прочтите, пожалуйста вот эту статью с данного сайта. Она на русском языке.

http://www.sql.ru/articles/mssql/03013101Indexes.shtml

Там в самом начале показывается как физически хранятся данные в MS SQL.

Если Вы считаете, что ВСЕ отвечавшие Вам заблуждаются, то задайте свой вопрос в форуме по MS SQL на этом же сайте. Ведь Ваш вопрос не имеет к FoxPro никакого отношения. Это именно вопрос способа хранения в MS SQL.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594579
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ FoXXX
Здесь я вычеркнул массу слов, которые обычно заменяются звуковым сигналом или многоточием.

Прочтите, пожалуйста вот эту статью с данного сайта. Она на русском языке.

http://www.sql.ru/articles/mssql/03013101Indexes.shtml

Там в самом начале показывается как физически хранятся данные в MS SQL.

Если Вы считаете, что ВСЕ отвечавшие Вам заблуждаются, то задайте свой вопрос в форуме по MS SQL на этом же сайте. Ведь Ваш вопрос не имеет к FoxPro никакого отношения. Это именно вопрос способа хранения в MS SQL.

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

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

и что вы так нервничаете? к чему все эти многоточия?? еще раз напоминаю вам что тема топика другая, вопрос не в способе хранения данных в SQL, вопрос в получении id. Кстати вопрос по хранению данных на SQL я не поднимал, это скорее ваш вопрос (или ваших единомышленников) лень перечитывать всю дискуссию.. Именно не я начал обсуждение: как же хранятся данные на SQL, я лишь предложил использовать requery() и не более того, но как видно вас раздражает любое мнение отличное от вашего, мне жаль, что вам хочется чередовать свою речь многоточиями.. чесслово не хотел лично вас обидеть, да и вообще никого не хотел обижать. Если говорить о хранени я лишь высказал общие принципы хранения данных (любых) в файловой системе DOS или Windows, помоему ничего крамольного?

если я упомянул о последней записи, то говорил скорее о VFP, т.к. в нем я применяю те же методы обновления информации как и в SQL, что удобно, т.к. иногда мои системы работают без SQL с таблицами VFP. Практически без изменений в коде моя система может быть развернута и в SQL и в VFP.. достаточно в базе сформировать (подключить) таблицы или RV с совпадающими названиями.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594651
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
FoXXX
…еще раз напоминаю вам что тема топика другая, вопрос не в способе хранения данных в SQL, вопрос в получении id. Кстати вопрос по хранению данных на SQL я не поднимал, это скорее ваш вопрос (или ваших единомышленников) лень перечитывать всю дискуссию.. Именно не я начал обсуждение: как же хранятся данные на SQL, я лишь предложил использовать requery() и не более того, ….

М-да… Скорее всего вы, действительно не понимаете, что способ получения id с сервера, предложенный вами - очень тесно завязан на ФИЗИЧЕСКОЕ хранение этой информации на сервере (вот откуда пошел разговор о хранении данных на MSSQL). Так вот вам и пытаются показать (рассказать), что ваша методика может не сработать в некоторых (далеко не единичных) случаях. Ну а ваше дело, прислушаться к этому или нет!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594764
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот о методе как раз по подробней и хотел бы услышать критику, а по поводу физического хранения - вы не правы, мой метод никак на связан с физическим хранением информации..

я уже обьяснял, что мои программы вообще не привязанны к базе, данные можно хранить в MSSQL, ORACLE, VFP.. я добивался универсальности..
вот ваши методы действительно не могут обеспечить универсальности, т.к. коннект каждый раз прописывается и T-SQL отличается от PL-SQL..

работая напрямую с базой получаем "узкую специализацию" программы..

RV - упорядочен по id, кроме того он параметризированный, что обеспечивает всем необходимым для использование requery(), как вы привязываете эту команду к физическому хранению данных непонятно.. requery работает с любыми данными, через ODBC, это уже ODBC разбирается как там на физическом уровне..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594792
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё боится времени
to FoXXX

На счёт универсальности программ под разные базы это все гипотетически
либо вы не используете всю мощь T-sql , pl-sql ....... ,а они отличаются и мы об этом знаем. На сложных запросах просто потеряете в производительности.
Или всё сводится к SQL-92 (select .... isert ....update.... delete)?
Переписывать всё равно придётся серверные процедуры тригеры виды.... всю обработку которая на сервере
функции которые вы вставляли в оракл и многое другое работы хватит.
так что в универсальность я не верю - проходили.....

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

по поводу получения Id idetity
встака оформляется ввиде процедуры которая принимает параметры на вход
и возвращает id в виде выходного параметра есть и такие стандарты
и её (процедуру) используйте хоть в VB Delphi VFP С++
она выполнит правильно свою работу остаётся только получить параметр

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



.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594825
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/*Переписывать всё равно придётся серверные процедуры тригеры виды.... всю обработку которая на сервере
функции которые вы вставляли в оракл и многое другое работы хватит.
*/

чудес не бывает, для создания баз приходится писать скрипты, для SQL свой, для ORACLE свой... что делать, но прога остается неизменной, все в RV, скрипты пускаем при инсталляции, выбор сервера и создание таблиц, привелегии разумеется нужно иметь, иначе что вы за программист? даже если у вас безопасность на высоте..

клиент же работает только с RV.. в отличие от CAD RV создается единожды, CAD же необходимо создавать в каждой форме, а их > 50...

вот и весь фокус, но вам-то это зачем? вы привыкли писать функции - обращения к серверу, пишите.. я ведь не пытаюсь утверждать что ваш метод неправильный и не говорю что так не пишут, и так писать нельзя..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594831
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, разумеется, FoXXX ваш подход тоже имеет право на жизнь и работать с сервером ТОЛЬКО через RV можно. Но есть некоторые операции на сервере, которые просто НЕЛЬЗЯ выполнить через RV. Как вы потупаете в таком случае?
С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594880
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXотвечаю вам то же самое.. я не заблуждаюсь, точнее сказать я не разбирался с этим вопросом предметно, поэтому все мои высказывания лишь рассуждения и предположения, о чем я уже говорил..
Однако вслед за этим следует предположение, что ВСЕ кто Вам что-то советовал заблуждаются!

FoXXXпример работает, но это не факт что он будет работать в любом случае, возможно при определенной ситуации он работать не будет..
Тогда зачем его вообще приводить?

FoXXXи что вы так нервничаете? к чему все эти многоточия?? еще раз напоминаю вам что тема топика другая, вопрос не в способе хранения данных в SQL, вопрос в получении id. Кстати вопрос по хранению данных на SQL я не поднимал, это скорее ваш вопрос (или ваших единомышленников)
Да потому что вопрос получения ID тесно завязан на способ физического хранения данных.

FoXXXлень перечитывать всю дискуссию..
А вот это-то и вызывает самое большое раздражение и кучу многоточий.

Вам НЕОДНОКРАТНО, РАЗНЫМИ СПОСОБАМИ, объяснили что ТАК ДЕЛАТЬ НЕЛЬЗЯ! Более того, объянили ПОЧЕМУ нельзя.

Однако Вы с постоянным упорством ИГНОРИРУЕТЕ все то, что Вам объяснили, да еще намекаете, что никто ничего не понимает! "У меня же работает".

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

FoXXXИменно не я начал обсуждение: как же хранятся данные на SQL, я лишь предложил использовать requery() и не более того, но как видно вас раздражает любое мнение отличное от вашего, мне жаль, что вам хочется чередовать свою речь многоточиями.. чесслово не хотел лично вас обидеть, да и вообще никого не хотел обижать. Если говорить о хранени я лишь высказал общие принципы хранения данных (любых) в файловой системе DOS или Windows, помоему ничего крамольного?
Еще раз. Раздражает не другое мнение, а ИГНОРИРОВАНИЕ того, что Вам говорят. Причем не только я. Вы же игнорируете вообще ВСЕХ. "У меня же работает, значит Вы ВСЕ ничего не понимаете"

FoXXXесли я упомянул о последней записи, то говорил скорее о VFP, т.к. в нем я применяю те же методы обновления информации как и в SQL, что удобно, т.к. иногда мои системы работают без SQL с таблицами VFP. Практически без изменений в коде моя система может быть развернута и в SQL и в VFP.. достаточно в базе сформировать (подключить) таблицы или RV с совпадающими названиями.
Вот Вам и объяснили, что этот подход НЕ ПРИМЕНИМ к работе с серверными базами данных. И объяснили ПОЧЕМУ!


Еще раз. В данной теме Вам неоднократно объяснили почему Ваш метод некорректен для серверных баз данных. Неоднократно объяснили как надо получать последний ID. Пожалуйста, перечитайте все эти объяснения еще раз, прежде чем приводить свои рассуждения и примеры.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33594902
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KДа, разумеется, FoXXX ваш подход тоже имеет право на жизнь и работать с сервером ТОЛЬКО через RV можно. Но есть некоторые операции на сервере, которые просто НЕЛЬЗЯ выполнить через RV. Как вы потупаете в таком случае?
С уважением, Алексей

Hi Алексей!

с ходу не могу придумать такой ситуации, подскажите, отвечу..
о каких операциях речь?

ВладимирМ!

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

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

RV для того и создан, чтобы работать с другими базами и источниками данных кроме VFP.

Сотый раз говорю, зачем нам знать методы работы SQL со своими данными, мы знаем, что SQL или ORACLE присваивает id в соответствии со своими счетчиками, этого достаточно, далее requery() обновляет нам наш курсор, и не важно где данные лежали до этого, в VFP MSSQL ORACLE и т.д. RV упорядочен, т.е. order по ключу (по id), делаем go bottom и попадаем на новую запись с новым id.. может быть ваш метод работает быстрее (хотя я сомневаюсь в этом), но эта скорость не критична в данном случае, мы ведь просто добавили запись и работаем с ней, а не готовим отчет, не строим сложный запрос для аналитики не так ли?

Ну что вам еще сказать, если вы не можете аргументированно отказаться от RView или CAD, то можно только сожалеть об этом.

в конце концов можно ведь дискутировать придерживаясь фактов а не эмоций, иначе это не дискуссия а только показывание пальцев (веером).
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595038
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXСотый раз говорю, зачем нам знать методы работы SQL со своими данными, мы знаем, что SQL или ORACLE присваивает id в соответствии со своими счетчиками, этого достаточно, далее requery() обновляет нам наш курсор, и не важно где данные лежали до этого, в VFP MSSQL ORACLE и т.д. RV упорядочен, т.е. order по ключу (по id)
Ну, наконец-то Вы согласились с тем, что нужен ORDER BY. Хоть какой-то сдвиг. До сих пор, Вы утверждали, что ORDER BY не нужен о чем свидетельствует последний приведенный Вами пример.

В приведенном Вами примере попробуйте удалить несколько записей в середине таблицы. Потом снова создайте НОВЫЕ записи. И ГДЕ они у Вас будут отображаться? Без ORDER BY именно на месте удаленных записей.

FoXXXделаем go bottom и попадаем на новую запись с новым id.
В очередной раз повторяю. Да, мы попадем на запись с новым значение ID. Вопрос в том, что неизвестно, КТО создал эту запись. Тот, кто и делает перезапрос или другой пользователь. Т.е. непонятно ID какой записи мы прочитаем.

FoXXX. может быть ваш метод работает быстрее (хотя я сомневаюсь в этом), но эта скорость не критична в данном случае, мы ведь просто добавили запись и работаем с ней, а не готовим отчет, не строим сложный запрос для аналитики не так ли?
Да при чем здесь скорость?! Главное, что требуется, это получить ID именно той записи, которую добавил данный конкретный пользователь. Метод с GO BOTTOM - этого НЕ ОБЕСПЕЧИВАЕТ. Кстати, о каком таком "моем методе" Вы говорите?

FoXXXНу что вам еще сказать, если вы не можете аргументированно отказаться от RView или CAD, то можно только сожалеть об этом.
Это уже даже комментировать невозможно. ГДЕ Вы видели аргументы о том что надо ОТКАЗАТЬСЯ от RV или CAD. Приведите цитату. Я говорил лишь о том, что метод через GO BOTTOM - не корректен. ВСЕ. Если Вы сделали из этого какие-то свои выводы - это ВАШИ проблемы. Не надо говорить за меня.

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

Заметьте, НИКТО не сказал, что Ваш способ с Go Bottom - правильный. Тем не менее, Вы напрочь игнорируете ЧУЖИЕ аргументы. Т.е. не просто аргументировано опровергаете, а просто игнорируете. "У меня работает".

Вам аргументированно объясняют, что Вы не учли того и сего. А что в ответ: "мне лень перечитывать топики", "мне лень читать BOL", "не вижу смысла изучать BOL", "не вижу необходимости знать ...". Я ЭТО не придумал. Это именно Ваши слова. Пролистайте данную тему со своими ответами.

===========
Теперь о том, КАК можно получить ID через RV или CAD.

1) Из открытого RV можно прочитать используемый им номер соединения. CursorGetProp("ConnectHandle"). Далее по этому номеру сделать запрос через SQLExec() и прочитать @@Identity или SCOPE_IDENTITY()

2) Если у RV есть возможность ОДНОЗНАЧНО идентифицировать запись по ДРУГИМ полям, то после перезапроса надо найти запись с ранее запомненными значениями этих других полей. В найденной записи и прочитать значение ID.

3) Для CAD есть возможность "встроить" свой код для определения ID. Но здесь есть ряд проблем, решению которых и посвящена данная тема.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595080
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир, вы меня удивляете, я только что перечитал топики, именно я FoXXX и не отказывался от ордер, вам и впрямь лень разобраться в дискуссии..

/*Ну, наконец-то Вы согласились с тем, что нужен ORDER BY. Хоть какой-то сдвиг. До сих пор, Вы утверждали, что ORDER BY не нужен о чем свидетельствует последний приведенный Вами пример*/ я несколько раз говорил о упорядоченном RV!!! Вы просто игнорируете мои посты и продолжаете меня критиковать, начиная с поста 2435474 я открытым текстом пытаюсь говорить вам о ORDER RV но вы игнорируете мои слова и продолжаете мне расказывать и физическом расположении данных в таблицах SQL..

Я не соглашался с тем, что нужен ORDER т.к. RV у меня всегда ордер по id... зачем мне с этим соглашаться?? если иначе и не делаю?

/*Да при чем здесь скорость?! Главное, что требуется, это получить ID именно той записи, которую добавил данный конкретный пользователь. Метод с GO BOTTOM - этого НЕ ОБЕСПЕЧИВАЕТ. Кстати, о каком таком "моем методе" Вы говорите?*/ - ID последней записи наибольший, не вы ли утверждали что go bottom это max?
теперь о вашем методе:

/*1) Из открытого RV можно прочитать используемый им номер соединения. CursorGetProp("ConnectHandle"). Далее по этому номеру сделать запрос через SQLExec() и прочитать @@Identity или SCOPE_IDENTITY()

2) Если у RV есть возможность ОДНОЗНАЧНО идентифицировать запись по ДРУГИМ полям, то после перезапроса надо найти запись с ранее запомненными значениями этих других полей. В найденной записи и прочитать значение ID.
*/ - вот в этом ваш метод, я не делаю так, который раз вам повторяю,
зачем мне номер соединения? requery сделает вставку новой записи из буфера (сбросит ее), пакетом выполняется select c с условиями RV , я получаю новую запись в RV с заполненным ID (ident), в RV order по id, где по вашему должна быть новая (последняя) добавленная запись клиента??? вам не кажется в конце курсора RV?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595108
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ув. ВладимирМ

вот такой эксперемент:

открываем RView

use rasp
append blank
=requery()
go bottom

в поле id появляется значение, в этот момент на сервере (SQL Profiler) происходит следующее:

RPC:Completed /
exec sp_executesql N'INSERT INTO dbo.rasp (date_reg,data_ot,dsk) VALUES (@P1,@P2,@P3)', N'@P1 smalldatetime,@P2 smalldatetime,@P3 smalldatetime', NULL, NULL, NULL

SQL:BatchCompleted /
exec sp_executesql N'INSERT INTO dbo.rasp (date_reg,data_ot,dsk) VALUES (@P1,@P2,@P3)', N'@P1 smalldatetime,@P2 smalldatetime,@P3 smalldatetime', NULL, NULL, NULL

если между первой и второй командой возможна вставка... то вы меня УБЕДИЛИ!!! СДАЮСЬ!!!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595111
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ув. ВладимирМ

вот такой эксперемент:

открываем RView

use rasp
append blank
=requery()
go bottom

в поле id появляется значение, в этот момент на сервере (SQL Profiler) происходит следующее:

Извиняюсь, была допущена опечатка!

RPC:Completed /
exec sp_executesql N'INSERT INTO dbo.rasp (date_reg,data_ot,dsk) VALUES (@P1,@P2,@P3)', N'@P1 smalldatetime,@P2 smalldatetime,@P3 smalldatetime', NULL, NULL, NULL

SQL:BatchCompleted /
SELECT Rasp.vhod_num, Rasp.date_reg, Rasp.control, Rasp.otv_kontr, Rasp.n_kart, Rasp.data_ot, Rasp.isp, Rasp.type_doc, Rasp.tema_doc, Rasp.contests, Rasp.visa, Rasp.rassilka, Rasp.rez, Rasp.dsk, Rasp.pd FROM dbo.rasp Rasp ORDER BY Rasp.vhod_num

если между первой и второй командой возможна вставка... то вы меня УБЕДИЛИ!!! СДАЮСЬ!!!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595166
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi FoXXX!

Всё-же советую почитать умные книжки - в большинстве промышленных СУБД нет
никакой возможности точно предсказать где же именно окажется "новая" запись
после вставки - в начале таблицы, в конце или в середине (и не надо делать
полное очищение таблицы во время тестов - надо как раз удалять данные где-то
"в середине" - чтобы образовались пустоты в физическом пространстве хранения
данных - куда и попадут "новые" записи) - так что без указания ORDER BY ID
ваш метод работать никак не может - это факт.
Теперь насчёт "стороннего вмешательства" - разве вы указали в самом начале,
что у вас идёт строгое разделение записей по признаку "владельца"? Что у
вас в принципе невозможно чтобы для некоторого одного определённого Owner_ID
были добавлены записи с РАЗНЫХ работающих экземпляров программы? Т.е. по
сути система получается во многом однопользовательская - ибо нет
"пересечения" с конкурирующими пользователями - по сути вы вполне можете
разделить данные по разным таблицам - это ничего не изменит в работе
программы - и так и так никто не видит "чужих" записей.
Насчёт "параметр #3" к сожалению вы всё-же ничего не поняли - проведите
простейшую проверку - убедитесь, что при наличии подобного фильтра вы вполне
можете "потерять" новую запись после перезапроса. И ИМЕННО такого фильтра -
не того, который ЗАВЕДОМО будет удовлетворяться для новых записей (как то
"по дате создания", "по коду пользователя").
Насчёт того что надо снова устанавливать соединение - это вы сильно
заблуждаетесь - не то что "не надо", а просто ПРОТИВОПОКАЗАНО - ибо в
_отдельном_ соединении нет никакой возможности получить Id присвоенный
последним в ДРУГОМ соединении - нужно использовать именно "то самое"
соединение, с которым работает RV (или CAD) - как - уже было показано. А вот
мельком упомянутое "пакет на сервере" состоящий из INSERT +
SCOPE_IDENTITY() - это как раз оно и есть - то что необходимо для
однозначного (и безусловного) определения нового ID!

P.S. Не вы первый, не вы последний - довольно часто неопытные программисты
(и как ни жаль именно Fox программисты) неверно понимают принципы
физического хранения данных в "больших СУБД", и заодно принципы работы
оптимизаторов (как раз в части того в каком же порядке будут выдаваться
записи) - во многом из-за стереотипов, привитых работой с dbf-ами. Вот
совсем как и вы, считают что последовательно добавляемые записи будут так-же
последовательно храниться, и соответственно так-же последовательно
выдаваться при запросах (хотя стоит отдать вам должное - все-жё Order By ID
вы добавили - видимо когда-то "попали" на ту самую ситуацию когда позже
добавленное оказалось не в конце выданного курсора).

P.P.S. В общем, если подытожить, то ваш способ можно применять:
- если данные добавляемые разными клиентами разделены - т.е. мы ни при каких
условиях не получим "чужие" записи (в условиях отбора есть параметр
отделяющий "свои" записи от "чужих" - типа Owner_Id - и конечно под одним и
тем-же ID в системе не могут одновременно работать более 1 пользователя).
- если "прочие" условия отбора заведомо не отбросят новую запись при
перезапросе (очень сложно соблюдаемое условие кстати - по сути оно потребует
"снятия" всех дополнительных условий отбора, кроме Owner_Id и возможно
timestamp - ну или "проверки" перед сохранением - подходит ли новая запись
под текущие параметры отбора, или нет).
- если в order by указано упорядочение по требуемому полю, и, конечно, если
это поле при добавлении записей строго упорядочивается (что кстати тоже не
всегда верно - например использование GUID, или "зацикленные"
последовательности).
Так что в общем случае конечно можно и такой подход использовать - но не
вслепую, а предельно чётко понимая его ограничения и условия применимости!
Но всё-же IMHO проще использовать более "прямой" подход - требующий меньше
всяких "дополнительных условий". Кстати использование IDENTITY уже само по
себе накладывает массу ограничений - самое главное, что нет никакой
возможности получить новое значение ID до выполнения операции сохранения (ну
точнее получить то можно, вот использовать никак нельзя). Так что мне скажем
более приятна концепция Sequence в Oracle - или её фоксовый аналог NewId -
по крайней мере можно получить очередное значение, ничего на сервере не
сохраняя - и не маяться с "перекодированием" временно присвоенных значений
для полей внешних ключей (если нужно сохранять согласованно не одну запись в
одной таблице, а целый набор - типа Master-Detail или по нашему Шапка-Строки
одного документа).

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595167
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
FoXXX
…если между первой и второй командой возможна вставка... то вы меня УБЕДИЛИ!!! СДАЮСЬ!!!

ДА! И про это вам все время писали, но вы НЕ ХОТИТЕ ЧИТАТЬ !!!

Aleksey-K из [2420236]
// …Пока вы раздумываете, что делать с этим новым значением ID, другой процесс может вставить эту запись.. Ну не таблицу же всю блокировать при вставке записи.//


ВладимирМ из [2420313]
//Создание новой записи таблицы может вызвать срабатывание триггера, внутри которого будет выполнено также создание новой записи.//

ВладимирМ из [2425249]
// TableUpdate() - это команда на модификацию, Requery() - команда на чтение. Две разные команды. Почему между ними не может "втиснуться" другая команда?//

PaulWist из [2426204]
// .. обоснуйте почему во время TableUpdate или во время Requery невозможно добавить запись удовлетворяющую условию отбора или модификации.//

ВладимирМ из [2426312]
// Это все к тому, что вставка другим пользоваителем между вставкой первого пользователя и считыванием текущего состояния - вполне реальная возможность, которую просто необходимо учитывать.//

Igor Korolyov из [2433013]]
//Ну про то что "я никогда не видел как в базу параллельно вставляется
несколько записей в течении одной секунды" - уже сказано - это порочная
логика - то что девелопер не в состоянии достаточно синхронно нажать 2
кнопки на 2-х клавиатурах не означает что это невозможно в принципе.//
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595185
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор/*P.S. Не вы первый, не вы последний - довольно часто неопытные программисты
(и как ни жаль именно Fox программисты) неверно понимают принципы
физического хранения данных в "больших СУБД", и заодно принципы работы
оптимизаторов (как раз в части того в каком же порядке будут выдаваться
записи) - во многом из-за стереотипов, привитых работой с dbf-ами. Вот
совсем как и вы, считают что последовательно добавляемые записи будут так-же
последовательно храниться, и соответственно так-же последовательно
выдаваться при запросах (хотя стоит отдать вам должное - все-жё Order By ID
вы добавили - видимо когда-то "попали" на ту самую ситуацию когда позже
добавленное оказалось не в конце выданного курсора). автор*/

мнда...
1.я бы не стал называть человека заочно знакомого не опытным программистом.. по крайней мере это не вежливо.. хотя смотря что считать опытом...

2.напрасно вы думаете что это является новостью.. вставка записей на место удаленных, это на сколько я помню применялось в кларионе в 90м году.. я уже говорил и еще раз говорю, работа MSSQL в данном случае вообще не имеет значения, тем более хранение его данных, это все флуд. Ордер бай добавил по умолчанию, автоматически лет 5 назад, т.к. считал id ключевым полем

автор/*- если данные добавляемые разными клиентами разделены - т.е. мы ни при каких
условиях не получим "чужие" записи (в условиях отбора есть параметр
отделяющий "свои" записи от "чужих" - типа Owner_Id - и конечно под одним и
тем-же ID в системе не могут одновременно работать более 1 пользователя). автор*/

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


автор/*Так что мне скажем
более приятна концепция Sequence в Oracle - или её фоксовый аналог NewId -
по крайней мере можно получить очередное значение, ничего на сервере не
сохраняя - и не маяться с "перекодированием" временно присвоенных значений
для полей внешних ключей автор*/

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

мой метод работы с другими базами возник не как следствие не знания и неумения (в чем вы к сожалению убеждены), а как способ добиться универсального способа работы с данными в любых, разных базах данных, иногда приходится вытаскивать данные из оракла и мсскл, обрабатывать их в клиенте вфр и отправлять по назначению.. К сожалению ваш подход основан на тезисе: тот кто не делает как я - неопытный, молодой и глупый программист, потому что Я опытный и умный.. наверно вам очень нравится себя считать таким.. осмелюсь вам намекнуть, что это не прилично..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595187
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
? FoXXX
…если между первой и второй командой возможна вставка... то вы меня УБЕДИЛИ!!! СДАЮСЬ!!!

ДА! И про это вам все время писали, но вы НЕ ХОТИТЕ ЧИТАТЬ !!!

Aleksey-K из [2420236]
// …Пока вы раздумываете, что делать с этим новым значением ID, другой процесс может вставить эту запись.. Ну не таблицу же всю блокировать при вставке записи.//


ВладимирМ из [2420313]
//Создание новой записи таблицы может вызвать срабатывание триггера, внутри которого будет выполнено также создание новой записи.//

ВладимирМ из [2425249]
// TableUpdate() - это команда на модификацию, Requery() - команда на чтение. Две разные команды. Почему между ними не может "втиснуться" другая команда?//

PaulWist из [2426204]
// .. обоснуйте почему во время TableUpdate или во время Requery невозможно добавить запись удовлетворяющую условию отбора или модификации.//

ВладимирМ из [2426312]
// Это все к тому, что вставка другим пользоваителем между вставкой первого пользователя и считыванием текущего состояния - вполне реальная возможность, которую просто необходимо учитывать.//

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

уважаемый ?

все приведенные вами ответы относились к конструкции tableupd() requery(), если вы посмотрите внимательно - во втором сообщении я поправился и отказался от tableupd() ... потому что между этими командами действительно возможна вставка..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595194
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot FoXXXHi Алексей!
с ходу не могу придумать такой ситуации, подскажите, отвечу..
о каких операциях речь?
[/quot]
Да сколько угодно. Напишите с помощью RV например:
1. Корреляционный запрос
2. Запрос с подзапросами
3. Запрос с UNION
4. Запрос с использование UDF сервера.
...
...
Или вы можете обойтись без всех этих возможностей сервера? Я, например, нет.
А как, например, с помощью RV выполнять сложные расчеты в базе данных? Переводить их на клиента!? Увольте. В этих процедурах бывает у меня до несколько тысяч строк, задействовано до 20-30 таблиц и все это гнать на клиента!?
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595200
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-K[quot FoXXXHi Алексей!
с ходу не могу придумать такой ситуации, подскажите, отвечу..
о каких операциях речь?

Да сколько угодно. Напишите с помощью RV например:
1. Корреляционный запрос
2. Запрос с подзапросами
3. Запрос с UNION
4. Запрос с использование UDF сервера.
...
...
Или вы можете обойтись без всех этих возможностей сервера? Я, например, нет.
А как, например, с помощью RV выполнять сложные расчеты в базе данных? Переводить их на клиента!? Увольте. В этих процедурах бывает у меня до несколько тысяч строк, задействовано до 20-30 таблиц и все это гнать на клиента!?
С уважением, Алексей.[/quot]

вы правы Алексей, какой смысл тащить это на клиента, всему этому место на сервере, там создаю необходимые view и все что вы спрашивали, базу ведь на SQL всеравно создавать нужно, вот и пусть там это все лежит и работает, RV позволяет обращаться ко всем обьектам MSSQL. Также использую на сервере тригеры и т.д. Это впринципе можно сделать в любой базе, хоть ORACLE хоть MSSQL..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595205
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и еще Игорь,

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

кроме того мы иногда ведем журнал изменений и удалений вносимых пользователем используем для этого тригеры.. вызванно опять же безопасностью..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595245
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
FoXXX
все приведенные вами ответы относились к конструкции tableupd() requery(), если вы посмотрите внимательно - во втором сообщении я поправился и отказался от tableupd() ... потому что между этими командами действительно возможна вставка..


А здесь,
Код: plaintext
1.
2.
3.
4.
use rasp
append blank
=requery()
go bottom
вы предполагаете, что между командами append blank и =requery() вставка другой строки чем-то (кем-то) – не возможна ? Я правильно вас понял?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595265
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
FoXXX
кстати команда tableud.. не обязательна, =requery('имя курсора') тоже сбросит в базу ваш буфер..

Написанное выше, тоже для меня не совсем понятно.

Вот из Hepl, что делает REQUERY( ) Function:
Retrieves data again for a SQL view.
REQUERY( ) is typically used to refresh a SQL view when data has changed on the data source.


Про то, что REQUERY( ) сбрасывает в базу – буфер нет ни слова. Не для этого она предназначена!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595339
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXя несколько раз говорил о упорядоченном RV!!! Вы просто игнорируете мои посты и продолжаете меня критиковать, начиная с поста 2435474 я открытым текстом пытаюсь говорить вам о ORDER RV но вы игнорируете мои слова и продолжаете мне расказывать и физическом расположении данных в таблицах SQL..
ГДЕ? Приведите цитату? Смотрим Ваши сообщения

FoXXX 2435474если говорить об ident - он является ключевым полем, потому го боттом ориентируясь по нему пойдет на последний id, а рекьюри сделает пакетом апдейт и селект, го боттом передвинет указатель на последний id, готоры к тому времени в вью появится..
ГДЕ здесь "открытый текст" про то, что Вы используете конструкцию ORDER BY? Вы делаете ПРЕДПОЛОЖЕНИЕ, что "поскольку поле ключевое, то..."

Чуть раньше
FoXXX 2433574не нужно использовать ордер, тогда последняя запись будет стоять последней.. и не важно чья она - клиента пупкина или пипкина... это можно проследить по id.
Самый последний Ваш пример, где Вы приводили тест по вставке кучи записей через RV, начинается с собственно запроса

FoXXX 2437855ну чтож, проведем эксперимент:
создадим простенький view:

SELECT Proba.id, Proba.time, Proba.kod;
FROM ;
dbo.proba Proba
ГДЕ здесь ORDER BY?

FoXXX 2438093Залезть в BOL оно конечно можно, но чесслово - лень..
ну не в этом суть.. пример вам я прогнал, впринципе порядок соблюдается, зачем копать MSSQL если используется кей по id?
он используется везде по умолчанию, на мой взгляд это логично, нужен другой порядок -пжалуста ORDER.. в select..
ЭТО заявление сделано на основании приведенного примера БЕЗ ORDER BY

Какие-то у Вас слишком тонкие намеки, если НИГДЕ Вы ЯВНО не сказали, что используете ORDER BY именно в RV. Более того, Вы просто НАСТАИВАЛИ на том, что ORDER BY использовать не надо .


FoXXXпоследней записи наибольший, не вы ли утверждали что go bottom это max?
Да. И не отказываюсь от этого. Это один из способов получить максимальное значение. Разве нет? Еще один способ из того же набора

Код: plaintext
SELECT TOP  1  ID FROM MyTab ORDER BY ID DESC

Это все тот же MAX() но "вид сбоку". Вы ведь в результате получаете максимальное значение. Чем это отличается от определения MAX()? Другим синтаксисом?

НО! Большое НО! Go Bottom будет аналогом MAX() только если использовать ORDER BY по ключевому полю.


FoXXXrequery сделает вставку новой записи из буфера (сбросит ее),
Это произойдет только в случае СТРОКОВОЙ буферизации (3). Переведите свой RV в режим табличной буферизации (5). Интересно будет посмотреть как Requery() что-то там "сбросит". Не предназначена она для этого. Цель Requery() - это ЧТЕНИЕ данных.

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

Кроме того, при такой работе Вы вполне можете получить сообщение об ошибке если вставить новую запись не удалось. Причем это будет СИСТЕМНОЕ сообщение об ошибке. Вы никак не обрабатываете системные ошибки? Впрочем, это другой разговор...

FoXXXУв. ВладимирМ

вот такой эксперемент:

открываем RView

use rasp
append blank
=requery()
go bottom

в поле id появляется значение, в этот момент на сервере (SQL Profiler) происходит следующее:

RPC:Completed /
exec sp_executesql N'INSERT INTO dbo.rasp (date_reg,data_ot,dsk) VALUES (@P1,@P2,@P3)', N'@P1 smalldatetime,@P2 smalldatetime,@P3 smalldatetime', NULL, NULL, NULL

SQL:BatchCompleted /
SELECT Rasp.vhod_num, Rasp.date_reg, Rasp.control, Rasp.otv_kontr, Rasp.n_kart, Rasp.data_ot, Rasp.isp, Rasp.type_doc, Rasp.tema_doc, Rasp.contests, Rasp.visa, Rasp.rassilka, Rasp.rez, Rasp.dsk, Rasp.pd FROM dbo.rasp Rasp ORDER BY Rasp.vhod_num

если между первой и второй командой возможна вставка... то вы меня УБЕДИЛИ!!! СДАЮСЬ!!!
Да сколько можно повторять! ДА! ВОЗМОЖНА! Это основа основ ЛЮБОЙ серверной базы данных. Как раз то, что Вы так упорно НЕ ЖЕЛАЕТЕ ЗНАТЬ!

Более того, возможна вставка В ПРОЦЕССЕ выполнения команды SELECT. Т.е. на момент начала выполнения SELECT новой записи еще не существует, но в процессе выполнения Select произошла вставка другим пользователем и эта новая запись попала в результат работы SELECT.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595412
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ребята, убедили! Вы правы! Мой метод работы с базой вами не применим!!!

У вас это работать не будет!!! Потому что вы нарушаете основы построения систем, не используете идентификацию, не ведете журналов безопасности, и не делаете всего того что надо бы делать... Время экономите? Упрощаете процесс создания программ? Удешевляете продукт путем выхолащивания?
И что? Ни один клиент не спросил: А кто и когда перекинул наши деньги в офшор??? Кто почистил мой счет? Кто удалил накладную?? Да и вообще, кто печатал документ?
Везет... блин, здесь без этого шагу не ступить.. а они шлепают и продаю, шлепают и продают.. мечта..
Убедили.. ваши методы наиболее правильные.. наиболее применяемые..

Тут порой не знаешь, пока идешь к клиенту, на чем у него база будет лежать, какой у него сервак.. а у вас все под T-SQL заточено и отлажено..

Ну нет, я не оспариваю ваше право делать так как вы делаете, не говорю что вы неопытные, малограмотные программисты.. Программисты вы грамотные, вот BOL например знаете.. Но с ситемным анализом у вас того.. всмысле метод другой :-)

Можно конечно и по-вашему писать проги, да большинство так и делает скорее всего.. Но мои решения вам точно не годятся.. точно не годятся.. Зачем вам все эти заморочки - как то универсальность, основы безопасности и прочая мура..

Удачи в освоении PC..!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595458
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
FoXXX
Да ребята, убедили! Вы правы! Мой метод работы с базой вами не применим!!!

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

Вы конечно, извините, но на основании каких постов , вами был сделаны эти бредовые выводы ?

FoXXX
..И что? Ни один клиент не спросил: А кто и когда перекинул наши деньги в офшор??? Кто почистил мой счет? Кто удалил накладную?? Да и вообще, кто печатал документ?...

Вот вам и пытались показать (к сожаленью, я понял - безуспешно), что ваша методика получения ID как раз и может привести к таким вопросам! И если их еще вам не задавали, то это - только вопрос времени….

FoXXX
Тут порой не знаешь, пока идешь к клиенту, на чем у него база будет лежать, какой у него сервак.. а у вас все под T-SQL заточено и отлажено..

А какое это имеет отношение к выбору правильной методики получения ID?

FoXXX
Удачи в освоении PC..!

Ну, вам - аналогично, хочется пожелать удачи в освоении – BOL!

З.Ы. Всех людей условно можно разделить на 3 категории:
- учатся на своих ошибках;
- учатся на ошибках других;
- не учатся, ни на своих, ни на чужих ошибках.
К какой категории вы бы отнесли себя?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33595635
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый господин ?

Вы не участвовали в дискуссии, подключились только что и не вникая в суть вопроса делаете свои оскорбительные заявления..

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

1. авторвы предполагаете, что между командами append blank и =requery() вставка другой строки чем-то (кем-то) – не возможна ? Я правильно вас понял? сообщение №2439783

отвечаю: предполагаю, полагаю и знаю.. обьяснять нужно? обьясняю append работает с буфером, на сервере ничего не происходит, запустите SQL Profiler и убедитесь!

2. авторПро то, что REQUERY( ) сбрасывает в базу – буфер нет ни слова. Не для этого она предназначена! №2439870

отвечаю: не предназначена! но она не может выдать новые данные без новых данных находящихся в буфере, она сбрасывает буфер на сервер, запустите SQL Profiler и убедитесь!


3. авторВы конечно, извините, но на основании каких постов, вами был сделаны эти бредовые выводы ?
№2440230

эти по вашему мнению бредовые выводы были сделаны на основании сообщения №2439646 где было сказано следующее: авторразве вы указали в самом начале,
что у вас идёт строгое разделение записей по признаку "владельца"? Что у
вас в принципе невозможно чтобы для некоторого одного определённого Owner_ID
были добавлены записи с РАЗНЫХ работающих экземпляров программы? Т.е. по
сути система получается во многом однопользовательская - ибо нет
"пересечения" с конкурирующими пользователями - по сути вы вполне можете
разделить данные по разным таблицам - это ничего не изменит в работе
программы - и так и так никто не видит "чужих" записей.

следовательно owner_ID не применяется, следовательно он и у остальных не используется.. если бы он использовался, то не возникало бы столько вопросов о том как это не вставляется в RV после requery() записи других клиентов???? Вот и у вас такой же бредовый вопрос.. Я вам отвечаю: НЕ ВСТАВЛЯЮТСЯ!!!!

4. автор..И что? Ни один клиент не спросил: А кто и когда перекинул наши деньги в офшор??? Кто почистил мой счет? Кто удалил накладную?? Да и вообще, кто печатал документ?...

Вот вам и пытались показать (к сожаленью, я понял - безуспешно), что ваша методика получения ID как раз и может привести к таким вопросам! И если их еще вам не задавали, то это - только вопрос времени…. №2440230

каким образом вы связывает ID ident и owner_ID???

5. авторТут порой не знаешь, пока идешь к клиенту, на чем у него база будет лежать, какой у него сервак.. а у вас все под T-SQL заточено и отлажено..

А какое это имеет отношение к выбору правильной методики получения ID?


отношение описано в сообщении №2439062, 2438557 и др.



Теперь ВладимирМ

1.В вашем сообщении №2440006 вы сказали:
авторесли говорить об ident - он является ключевым полем, потому го боттом ориентируясь по нему пойдет на последний id, а рекьюри сделает пакетом апдейт и селект, го боттом передвинет указатель на последний id, готоры к тому времени в вью появится..

ГДЕ здесь "открытый текст" про то, что Вы используете конструкцию ORDER BY? Вы делаете ПРЕДПОЛОЖЕНИЕ, что "поскольку поле ключевое, то..."


вы не замечаете расхождения текстов, дословно мной сказано:
если говорить об ident - он является ключевым полем, потому го боттом ориентируясь по нему пойдет на последний id

вами сказано:
ПРЕДПОЛОЖЕНИЕ, что "поскольку поле ключевое, то..." в моем тексте слова "поскольку" - нет.. и предположения нет, текст - утверждение..

2. авторСамый последний Ваш пример, где Вы приводили тест по вставке кучи записей через RV, начинается с собственно запроса

в примере речь шла о принцыпах хранения данных, т.е. это уход от основной темы - флуд, поэтому там нет order.

3. авторFoXXX 2438093
Залезть в BOL оно конечно можно, но чесслово - лень..
ну не в этом суть.. пример вам я прогнал, впринципе порядок соблюдается, зачем копать MSSQL если используется кей по id?
он используется везде по умолчанию, на мой взгляд это логично, нужен другой порядок -пжалуста ORDER.. в select..

ЭТО заявление сделано на основании приведенного примера БЕЗ ORDER BY


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

4. авторДа сколько можно повторять! ДА! ВОЗМОЖНА! Это основа основ ЛЮБОЙ серверной базы данных. Как раз то, что Вы так упорно НЕ ЖЕЛАЕТЕ ЗНАТЬ!

Более того, возможна вставка В ПРОЦЕССЕ выполнения команды SELECT. Т.е. на момент начала выполнения SELECT новой записи еще не существует, но в процессе выполнения Select произошла вставка другим пользователем и эта новая запись попала в результат работы SELECT

пусть вставят запись!, пусть, для нас это не критично, потому что при вставке новой записи мы используем параметры, другие записи нам не страшны... вот если вы не имеете owner_id, параметров в RV , то да, так работать нельзя!!! Но мы то все это имеем! Зачем был нужен весь этот крик с многоточиями.. хотя вы знаете, кое что полезное в нашей дискусии есть, некоторые вопросы обсудили.. BOL например..

удачи в освоении pc!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33596703
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX
Вообще-то, Вам уже объяснили, что Ваш подход - неправильный. Возникновение в нем ошибок - это всего-лишь вопрос времени.

Просто, я почему-то считал, что для программиста важно понять что и как делает его код, чтобы не допускать ошибок. Оказывается, для Вас это не имеет значения. Вы даже не понимаете, что именно делает Ваш код.

В общем, учту на будущее...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33597152
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ FoXXX
Вообще-то, Вам уже объяснили, что Ваш подход - неправильный. Возникновение в нем ошибок - это всего-лишь вопрос времени.

Просто, я почему-то считал, что для программиста важно понять что и как делает его код, чтобы не допускать ошибок. Оказывается, для Вас это не имеет значения. Вы даже не понимаете, что именно делает Ваш код.

В общем, учту на будущее...


Резюме:

имею RV order id , параметр по owner_id;RV2 order id , параметр по id

открываю форму
select RV
append blank
repl owner_id with m.owner, data with date()
requery()
thisform.(grid1)refresh
работаю с новой записью,
добавляю запись в зависимую таблицу (RV2)
sele RV2
append blank
repl rv2.id with rv.id,owner with m.owner,date with date()
requery()
thisform.(grid2)refresh
работаю с записью

ухожу из формы
tableupd(rv)
tableupd(rv2)
thisform.release

выигрыш:
RV - к любой базе, нигде нет привязки к серверу, ведется протокол работы клиента

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

на сервере для ведения отдельного проткола использую тригеры типа таких:

CREATE TRIGGER [ind] ON dbo.rabota
FOR insert
AS
insert protokol (log,app,host,nt,op) values(suser_sname(),app_name(),host_name(),'rabota','ins')

CREATE TRIGGER [rd] ON dbo.rabota
FOR DELETE
AS
insert protokol (log,app,host,nt,op) values(suser_sname(),app_name(),host_name(),'rabota','del')

CREATE TRIGGER [ins] ON [dbo].[zadan]
FOR INSERT
AS
insert protokol (log,app,host,nt,op,nz) select suser_sname(),app_name(),host_name(),'zadan','ins',inserted.name from inserted

CREATE TRIGGER updet ON [dbo].[zadan]
FOR UPDATE
AS
IF update ( gob ) insert into updat (iid,pole,tab,npole,spole) select inserted.id,'gob','zadan',inserted.gob,deleted.gob from inserted,deleted
IF update ( zak ) insert into updat (iid,pole,tab,npole,spole) select inserted.id,'zak','zadan',inserted.zak,deleted.zak from inserted,deleted
IF update ( zz ) insert into updat (iid,pole,tab,npole,spole,nn) select inserted.id,'zz','zadan',inserted.zz,deleted.zz,inserted.name from inserted,deleted

if update(zz) update zadan
set datz=getdate()
from deleted
where zadan.id=deleted.id

CREATE TRIGGER [zd] ON [dbo].[zadan]
FOR DELETE
AS
insert protokol (log,app,host,nt,op,nz) select suser_sname(),app_name(),host_name(),'zadan','del',deleted.name from deleted


по поводу - понимаю, непонимаю.. особенно заниматься теорией некогда.. там где нужно читаем, обьем работ большой, много предметной информации приходится изучать, да и серверов разных полно, MSSQL, ORACLE9i, INFORMIX, PROGRESS, как вы думаете, если бы я разбирался дотошно с каждым сервером, много бы програм написал? Нужен был универсальный подход, я его достиг избежав прямого обращения к серверам, работаю с RV.

Без притензий и обид. FoXXX
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33597385
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это просто скучно. Вы даже не слушаете что Вам говорят.

Я постоянно перехожу дорогу на красный свет светофора, правда, у меня светофор нарисованный и машины ездят раз в год по большим праздникам. Но ведь перехожу! Не сбили!

Да кто спорит. Переходите, пожалуйста. Только не надо учить делать то же самое жителей мегаполисов. В лучшем случае, попадут в больницу после первой же попытки.

Несколько контрольных вопросов:

-) Что произойдет, если в Вашу программу войдут 2 пользователя с разных машин, но с одним owner_id и попытаются одновременно создать новую запись?

-) Если RV будет проиндексирован (локальный индекс на машине клиента), то где окажется новая запись после Requery()?

-) Если RV будет иметь ORDER BY отличный от пустого или от сортировки по ID, то где окажется новая запись после Requery()?

-) Если значения полей новой записи не удовлетворяют критерию отбора, указанному в WHERE для RV, то значение ID какой записи мы получим после Requery()?


Предполагаю, что на все эти вопросы Вы ответите: В моей задаче этого быть не может. Так почему Вы выдаете свое решение для очень ограниченного круга задач за единственно верное и безупречно правильное?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33597580
FoXXXРезюме:

имею RV order id , параметр по owner_id;RV2 order id , параметр по id

открываю форму
select RV
append blank
repl owner_id with m.owner, data with date()
requery()
thisform.(grid1)refresh
работаю с новой записью,
.
.
и т.д.
FoXXX
Значит в ваших задачах невозможно видеть документы других пользователей?
Я правильно понял?
А вот заказчику понадобится видеть журнал документов всех пользователей и одновременно вводить новые и так для каждого пользователя. Тогда ваша схема рушится. Или придётся делать дополнительные телодвижения для поиска вашего последнего ID документа, например такие:
go bottom
do while !bof()
if owner_id=m.owner
exit
endif
enddo
и тд
не спорю, можно и так.
Но можно проще используя SQLEXEC()
А заказчик может попросить чтобы журнал документов отображался не в порядке очерёдности ввода а в другом, тогда как найти последний ID документа?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33597608
Естественно в цикле нужно добавить
Skip -1
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33597867
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Владимир__ FoXXXРезюме:

имею RV order id , параметр по owner_id;RV2 order id , параметр по id

открываю форму
select RV
append blank
repl owner_id with m.owner, data with date()
requery()
thisform.(grid1)refresh
работаю с новой записью,
.
.
и т.д.
FoXXX
Значит в ваших задачах невозможно видеть документы других пользователей?
Я правильно понял?
А вот заказчику понадобится видеть журнал документов всех пользователей и одновременно вводить новые и так для каждого пользователя. Тогда ваша схема рушится. Или придётся делать дополнительные телодвижения для поиска вашего последнего ID документа, например такие:
go bottom
do while !bof()
if owner_id=m.owner
exit
endif
enddo
и тд
не спорю, можно и так.
Но можно проще используя SQLEXEC()
А заказчик может попросить чтобы журнал документов отображался не в порядке очерёдности ввода а в другом, тогда как найти последний ID документа?

Владимир!

RV - это всего лишь строчка "select * from * for *=* " и т.д.

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

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

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

тут вопрос в другом, может вы подобное делали, нужен метод работы с любыми базами! системе должно быть все равно где лежат данные, она должна знать только свои view.. или RV. вот такую цель я преследую, конечно если ваш продукт строго под MSSQL, то да можно использовать функции. а если данные в ORACLE? как себя поведет конструкция SQLEXEC(h,'Select @@identity','ident') ? Oracle может и не понять..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33598319
Действительно интересный метод получения последнего ID пользователя.
Если иметь дополнидельный (невизуальный) RV например с таким запросом
SELECT TOP 1 ID FROM MyTab WHERE owner_id=??? ORDER BY ID DESC
,то получение последнего ID будет довольно быстрым и всего лишь одной командой.
Думаю некоторые возьмут данный метод на вооружение.
Но нужно очень чётко отслеживать за тем, чтобы в системе небыло одновременно работающих по одними owner_id пользователей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33598604
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Владимир__Действительно интересный метод получения последнего ID пользователя.
Если иметь дополнидельный (невизуальный) RV например с таким запросом
SELECT TOP 1 ID FROM MyTab WHERE owner_id=??? ORDER BY ID DESC
,то получение последнего ID будет довольно быстрым и всего лишь одной командой.
Думаю некоторые возьмут данный метод на вооружение.
Но нужно очень чётко отслеживать за тем, чтобы в системе небыло одновременно работающих по одними owner_id пользователей.

Привет Владимир!

еще здесь не упоминалось то что кроме where в RV можно использовать команду:
set filter to owner_id=m.owner_id тогда вообще видно всех, или только овнера..

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

Если работать с базами не используя всю мощь RV, то чем тогда VFP лучше Дельфи?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33598943
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXЕсли работать с базами не используя всю мощь RV, то чем тогда VFP лучше Дельфи?
Опять слушаем только себя?

Ведь никто не сказал, что RV использовать нельзя. RV - это инструмент. Как любой другой инструмент, он имеет достоинства и недостатки. Надо всего-лишь понимать его ограничения. При чем здесь "вся мощь", если эта самая "мощь" используется неправильно?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33598950
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXЕсли работать с базами не используя всю мощь RV, то чем тогда VFP лучше Дельфи?
Опять слушаем только себя?

Ведь никто не сказал, что RV использовать нельзя. RV - это инструмент. Как любой другой инструмент, он имеет достоинства и недостатки. Надо всего-лишь понимать его ограничения. При чем здесь "вся мощь", если эта самая "мощь" используется неправильно?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33599254
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ FoXXXЕсли работать с базами не используя всю мощь RV, то чем тогда VFP лучше Дельфи?
Опять слушаем только себя?

Ведь никто не сказал, что RV использовать нельзя. RV - это инструмент. Как любой другой инструмент, он имеет достоинства и недостатки. Надо всего-лишь понимать его ограничения. При чем здесь "вся мощь", если эта самая "мощь" используется неправильно?

ВладимирМ!

В чем неправильность, не уточните?
Но не забывайте - ведение owner_id - у нас обязательно..
так в чем?

С уважением FoXXX

А дельфисты действительно работают через функции..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33599459
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXВладимирМ!

В чем неправильность, не уточните?
Но не забывайте - ведение owner_id - у нас обязательно..
так в чем?
Еще раз! Да сколько можно!

Понимате, Вы работаете в очень конкретной постановке задача. Это Ваша задача и Ваша постановка. В пределах Вашей задачи это работает (хотя, даже здесь с оговорками).

Оговорки для Вашей задачи:

-) Два пользователя не могут (не должны) войти в приложение с одинаковым owner_id.
-) Пользователь не может (не должен) модифицировать (видеть) данные другого пользователя

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

Как универсальное решение для любой задачи это не годится. Задач, когда Ваше решение не сработает достаточно много. Т.е. даже нельзя сказать, что Ваше решение сколько-нибудь распространенное. Очень уж оно узкоспециализированное. Очень частное.

Хуже того, Ваше решение не масштабируемое. Т.е. в случае изменений требований к задаче Вам придется менять весь механизм получения значения ID. Переделывать всю программу.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33599823
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ FoXXXВладимирМ!

В чем неправильность, не уточните?
Но не забывайте - ведение owner_id - у нас обязательно..
так в чем?
Еще раз! Да сколько можно!

Понимате, Вы работаете в очень конкретной постановке задача. Это Ваша задача и Ваша постановка. В пределах Вашей задачи это работает (хотя, даже здесь с оговорками).

Оговорки для Вашей задачи:

-) Два пользователя не могут (не должны) войти в приложение с одинаковым owner_id.
-) Пользователь не может (не должен) модифицировать (видеть) данные другого пользователя

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

Как универсальное решение для любой задачи это не годится. Задач, когда Ваше решение не сработает достаточно много. Т.е. даже нельзя сказать, что Ваше решение сколько-нибудь распространенное. Очень уж оно узкоспециализированное. Очень частное.

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

И можно и нужно, но здраво без эмоций..

Давайте по существу

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

это не узкоспециализированннное решение, а другая школа програмирования если хотите, другой метод програмирования, другая постановка, другая аналитика, другое отношение к процессу создания продукта..

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

п.2
пользователь может, должен и обязан видеть, модифицировать, редактировать, использовать записи других пользователей, для этого существует другой RV, для этого существует тотже RV с "пустым" параметром, для этого существует set filter, для этого существует view на сервере, для этого достаточно возможностей, способов и методов работы с RV.

п.3
поясните какие ограничения я должен применять к способу хранения данных? в чем вы видете ограничения? дополнительное поле owner_id? или вы что-то другое имели ввиду? непонятно, уточните если сможете пожалуйста.

п.4
универсальное для любой задачи.. не могу придумать многопользовательской задачи в которой отработанный годами (10 лет) метод перестанет работать.. если вы знаете такие задачи, озвучте их пожалуйста, возможно это поможет мне найти другие подходы в моей методике..

п.5
маштабируемость.. что вы имеете ввиду, увеличение клиентов? распределенные базы данных? вот как раз распределенные базы данных у нас работают очень хорошо.. RV так же хорошо работает с ORACLE как и с MSSQL, если в сетке несколько серверов, наша система работает со всеми..

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

Мой (наш) метод решения задач выработан в течении последних 15ти лет как плавная миграция из FOXBASE в VFP9-SQL,ORACLE и др.

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

С уважением FoXXX
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33599918
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Освободился немного, встряну в разговор с вопросами.

FoXXX

1. Поясните пожалуйста метод получения owner_id, те за что надо зацепиться, что бы получить уникальный идентификатор и кто его генерит.

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

3. Каким образом в Вашей идеологии (КС) достигается вложенность транзакций

4. Каким образом Вы разграничиваете доступ к данным
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33600187
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWistОсвободился немного, встряну в разговор с вопросами.

FoXXX

1. Поясните пожалуйста метод получения owner_id, те за что надо зацепиться, что бы получить уникальный идентификатор и кто его генерит.

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

3. Каким образом в Вашей идеологии (КС) достигается вложенность транзакций

4. Каким образом Вы разграничиваете доступ к данным

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

вкратце:

п.1
нужно зацепиться за администратора.. :-) он ведет пользователей в специальной таблице на сервере.. и только он имеет особые права на работу с этой таблицей. если админа нет,можно учитывать имя р.станции
п.2
основной расчет на сервере, RV видит результат работы сервера.. мелкие (текущие) расчеты на клиенте (локальные view).
п.3
этим занимается VFP
п.4
мы его не разграничиваем.. :-)

извиняюсь за краткость..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33600223
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
FoXXX

Спасибо.

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

Если у Вас не возникают проблемы, то у меня вопросов нет

авторп.2
основной расчет на сервере, RV видит результат работы сервера.. мелкие (текущие) расчеты на клиенте (локальные view).

Вот здесь мне не понятно, как RV получает расчеты с сервера, НО вопросов тоже нет

авторп.3
этим занимается VFP

Те вложенные транзакции сервера обеспечивает Фокс, тоже вопросов нет

авторп.4
мы его не разграничиваем..

Доступ не разграничивается, ну что же - вопросов тоже нет.

PS Спасибо за ответы, думаю всем ребятам многое стало понятно.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33600319
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ага, смешно, смешно задавать глупые вопросы и смеяться над ними же..


и что, вопросы кончились? или у вас иссяк запас умных слов? вы в доку загляните, там еще много интересных выражений, вы не стесняйтесь, спрашивайте, вместе посмеёмся :-)

да, чуть не забыл, за спасибо - пожалуйста!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33600351
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что же, Вы пригласили к диалогу, тогда ответьте на вопрос (приведите простой пример кода)

- как обеспечить вложенные транзакции на сервере средствами Фокса используя RV
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33600421
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXДавайте по существу
Давайте.

FoXXXп.1
а разве это допустимо? Для меня нет, в любой многопользовательской задаче.., если вы пишете однопользовательскую задачу, тогда да, один пользователь входит в систему сколько угодно раз..
"Разрешено все, что не запрещено".

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

Что значит "допустимо"? У Вас есть в программе перехват такой ситуации? Т.е. Вы можете отследить, что приложение было запущено дважды с логином и паролем одного и того же пользователя?

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

Другая "житейская" ситауция. Пришел новичек, а администратора (программиста) нет. Запускаем на его машине приложение с моим логином и паролем, а я продолжаю работать на своей машине.

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

FoXXXесли вы так не делаете, и ваши знакомые не делают, это не значит, что так не делает никто, если вы не говорите по французки, и ваши знакомые не говорят по французки, то это не значит, что в мире никто не говорит по французки..
если вы не бывали на ямайке, и ваши знакомые там не бывали, то это не значит что ямайки нет, что она не правильная, ошибочная и подозрительная..
Вы можете с этим согласиться?
С чем? Я уже говорил. Ваш подход работает, но при выполнении ряда дополнительных, очень жестких ограничений.

FoXXXп.2
пользователь может, должен и обязан видеть, модифицировать, редактировать, использовать записи других пользователей, для этого существует другой RV, для этого существует тотже RV с "пустым" параметром, для этого существует set filter, для этого существует view на сервере, для этого достаточно возможностей, способов и методов работы с RV.
Ну, вот, начинается. Вы же сами пишете, что вместо одного RV для отображения одной и той же информации используется целый набор самых разных RV. Именно в силу того, что Ваш подход требует ряда серьезных ограничений на используемый RV.


FoXXXп.3
поясните какие ограничения я должен применять к способу хранения данных? в чем вы видете ограничения? дополнительное поле owner_id? или вы что-то другое имели ввиду? непонятно, уточните если сможете пожалуйста.
Если в RV не используется ORDER BY - это предполагает, применительно к MS SQL, использование кластерного индекса по полю Id. В противном случае, нет гарантии, что последняя запись выборки окажется последней созданной записью.

FoXXXп.4
универсальное для любой задачи.. не могу придумать многопользовательской задачи в которой отработанный годами (10 лет) метод перестанет работать.. если вы знаете такие задачи, озвучте их пожалуйста, возможно это поможет мне найти другие подходы в моей методике..
Пример в рамках Вашей задачи я уже привел. 2 пользователя вошли с одинковым owner_id.

Более экзотические случаи - это отсутствие кластерного индекса и отсутствие ORDER BY в RV.

FoXXXп.5
маштабируемость.. что вы имеете ввиду, увеличение клиентов? распределенные базы данных?
Нет. Прежде всего - это расширение функциональности программы. Новые модули, новые задачи, модификация старых задач и т.п.

Вы уже упоминали, что для решения разных задач Вам пришлось пойти на "размножение" RV. Хотя все они отображают одну и ту же информацию, но "чуть чуть по разному".

FoXXXвот попробуйте настройте свою программу если поменялись сервера.. вам прийдется искать и менять строку коннекта в текстах программ. Наши все коннекты лежат в базе VFP, легко настраиваются и конфигурируются..
Какое отношение имеет способ установки коннекта к обсуждаемой проблеме? Почему Вы считаете, что настроечная информация у меня хранится в тексте программы?

FoXXXМой (наш) метод решения задач выработан в течении последних 15ти лет как плавная миграция из FOXBASE в VFP9-SQL,ORACLE и др.

Ваш метод больше похож на работу молодых программистов дельфи, не знакомых со всей гаммой возможностей VFP.. не пытаюсь обидеть, но это общие наблюдения. Обратите внимание, я не критикую ваш подход, он верный и правильный(безошибочный).
Один-в-один могу повторить все то же самое в адрес Вашего решения. Было взято наиболее простое (понятное) решение, а насколько оно корректно и удобно для пользователей - это уже второй вопрос.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33600570
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый ВладимирМ!

Извините за краткость, но отвече сначала на очевидные вопросы:

авторЧто значит "допустимо"? У Вас есть в программе перехват такой ситуации? Т.е. Вы можете отследить, что приложение было запущено дважды с логином и паролем одного и того же пользователя?


таблица пользователей имеет поле "активации"

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


вариант 1 - снять активацию на сервере (если мешает)
вариант 2 - зайти с правами супервизора(администратора)

авторДругая "житейская" ситауция. Пришел новичек, а администратора (программиста) нет. Запускаем на его машине приложение с моим логином и паролем, а я продолжаю работать на своей машине.

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

авторЕсли в RV не используется ORDER BY - это предполагает, применительно к MS SQL, использование кластерного индекса по полю Id. В противном случае, нет гарантии, что последняя запись выборки окажется последней созданной записью.

ключевое поле в сервере по id (ident) используется, order by используется, фильтр по owner_id используется, но в основном при создании новой записи для быстрого получения id.

авторНет. Прежде всего - это расширение функциональности программы. Новые модули, новые задачи, модификация старых задач и т.п.

никаких препятствий, новые формы, новые таблицы, новые RV, view и т.д.

авторКакое отношение имеет способ установки коннекта к обсуждаемой проблеме? Почему Вы считаете, что настроечная информация у меня хранится в тексте программы?


а где, базы VFP нет, в переменных?, в таблицах?- так их же нет..

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

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

если вы категорически против системы регистрации пользователей, можно это делать автоматически используя функции в тригерах SQL suser_sname(),app_name(),host_name() хотя чесно, регистрация никого не напрягает..

некотрые клиенты по ней ведут учет рабочего времени.. :-)

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

С уважением FoXXX
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33600962
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кое что о ведении пользователей.

Учет пользователей позволяет применять дополнительные функции в системе, например:

пользователь Иванов(а) не имеет(имеет) доступ к формам f1,f2,f3...
не видит(видит) опции меню a,b,c,d..
имеет активными(неактивными) в форме кнопки k1,k2,k3...

пользователь Петров(а) не видит все что связано со счетами №хххх
но видит только склад,

пользователь Сидоров(а) работает только с учетом материальных ценностей

п. Пупыркиной доступен только учет кадров
п. Запупыркиной только Расчет зарплаты
п. Пупкин может заполнять табель, работать в ОТиЗе

Все это называется распределением привелегий.. привелегиями занимается админ или д.админ..

уровень доступа определяется должностными обязанностями пользователя системы.

Весь доступ содержится в таблице пользователей, которая содержит всех пользователей, их состояние (активный, не активный); привилегии, допуски, статус, период допуска и т.д.

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

да и еще по поводу получения ID, еще способ:

sele RV
append Blank (или insert)
=Requery()
select p1 as id,p2,... from RV where owner_id=m.owner_id order by id into CURSOR ident
sele ident
go bottom
sele RV
LOCATE FOR id=ident.id
use in ident
sele RV
brows

ну и так далее, методов работы тьма.. для нас RV - обычная таблица VFP

вот такая система..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33601068
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWistНу что же, Вы пригласили к диалогу, тогда ответьте на вопрос (приведите простой пример кода)

- как обеспечить вложенные транзакции на сервере средствами Фокса используя RV

один из:

By default, Visual FoxPro automatically wraps every data-writing operation sent to the remote server in a transaction. This default automatic transaction handling is provided when the Transactions property is set to 1, or DB_TRANSAUTO.

To use automatic transaction mode
Use the DBSETPROP( ) Function to set the Transactions property on the connection to 1 or DB_TRANSAUTO.

-or-

Use the SQLSETPROP( ) Function to set the Transactions property on the active connection to 1 or DB_TRANSAUTO.

Transaction processing for the remote table is automatically handled.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33601436
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX

Выдержка из хелпа как раз говорит о том, что отдельная команда выданная со свойством соединения SQLGETPROP('Transaction') = 1, оборачивает каждый пакет посылаемый на сервер как одну транзакцию.
Свойство SQLGETPROP('Transaction') = 2 говорит, что транзакция явно задана "руками" и завершение её должно быть командами SQLCOMMIT/SQLROLLBACK.
Всё, больше ничего.

Видимо, я неправильно задал вопрос, имелось в виду конструкция

Код: plaintext
1.
2.
3.
4.
5.
BEGIN TRANSACTION
     BEGIN TRANSACTION

      что-то внутри
      COMMIT/ROLLBACK
COMMIT/ROLLBACK

Так вот средствами Фокса через RV это никак не реализовать, те Вы основываясь на своём методе заведомо ограничиваете себя в бизнес логике.

Тогда ещё вопрос (тот, что был с улыбкой), приведите пример кода, как Вы получаете в RV промежуточные/конечные расчеты выполненные на сервере, те примерно такой код

Код: 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.
create table #t (ID int)

USE pubs
DECLARE tnames_cursor CURSOR
FOR
   SELECT TABLE_NAME 
   FROM INFORMATION_SCHEMA.TABLES
OPEN tnames_cursor
DECLARE @tablename sysname
--SET @tablename = 'authors'
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> - 1 )
BEGIN
   IF (@@FETCH_STATUS <> - 2 )
   BEGIN   
      SELECT @tablename = RTRIM(@tablename) 
      insert into #t (ID) EXEC ('SELECT ''' + @tablename + ''' = count(*) FROM ' 
            + @tablename )
   END
   FETCH NEXT FROM tnames_cursor INTO @tablename
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor

select * from #t

drop table #t

Думаю, что через RV такое вряд ли получится (Попробуйте выполнить в QA), а через SPT одно удовольствие.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33602214
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВидимо, я неправильно задал вопрос, имелось в виду конструкция

к счастью конструкция не понадобилась :-)

авторВы основываясь на своём методе заведомо ограничиваете себя в бизнес логике.

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

авторкак Вы получаете в RV промежуточные/конечные расчеты выполненные на сервере, те примерно такой код

на серверах существуют процедуры, тригеры, представления..

задача программиста Баз данных представить результат в представлении (view), пока он с этим справляется.. т.е. все расчеты находятся не в VFP а на сервере..

наш програмист БД успешно реализует поставленную задачу в SQL, PROGRESS, ORACLE
Я сильно в его работу не встреваю, мое дело постановка, бизнес-систем анализ, моделирование процессов, ну и выдача требований БД программисту, иногда вместе думаем как поступить в том или другом случае

Вообще у вас вопросы интересные, вы как бы не метод получения ident обсуждаете, а просто критикуете RV, CAD.. Вам что, не нравятся эти инструменты? Но ведь это дело вкуса, не так ли, хотите работать с сервером напрямую, работайте, я ведь не принуждаю вас использовать RV..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33602440
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX авторВидимо, я неправильно задал вопрос, имелось в виду конструкция

к счастью конструкция не понадобилась :-)..

Ну, что же не понадобилась, значит не судьба :)

FoXXX[
авторВы основываясь на своём методе заведомо ограничиваете себя в бизнес логике.

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

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

FoXXX
авторкак Вы получаете в RV промежуточные/конечные расчеты выполненные на сервере, те примерно такой код

на серверах существуют процедуры , тригеры, представления..

Так не могли бы Вы привести пример как вызываются процедуры с использованием RV (не будем усугублять ХП не возвращающая набора данных)

FoXXX
задача программиста Баз данных представить результат в представлении (view), пока он с этим справляется.. т.е. все расчеты находятся не в VFP а на сервере..

наш програмист БД успешно реализует поставленную задачу в SQL, PROGRESS, ORACLE
Я сильно в его работу не встреваю, мое дело постановка, бизнес-систем анализ, моделирование процессов, ну и выдача требований БД программисту, иногда вместе думаем как поступить в том или другом случае

Ну, что же нормальный подход к постановке задачи.

FoXXX
Вообще у вас вопросы интересные, вы как бы не метод получения ident обсуждаете, а просто критикуете RV, CAD.. Вам что, не нравятся эти инструменты? Но ведь это дело вкуса, не так ли, хотите работать с сервером напрямую, работайте, я ведь не принуждаю вас использовать RV..

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

Нет, критики RV/CAD, просто мне интересно как с их помощью реализуются некоторые моменты КС, в своё время я не нашел как на них это сделать, поэтому и вопрошаю :).
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603175
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX
Интересно получается, когда Вы первый раз вышли со своей идеологией, то позиционировали ее как верную без ограничений.

Теперь выясняется, что у Вас есть в каждой записи каждой таблицы дополнительный идентификатор пользователя; используется ORDER BY по ключевому полю в RV; журнал активизации для исключения повторного входа с одним логином (кстати, если произошел аварийны выход - метка осталась, вход невозможен, зови админа); речь идет о банковской системе (определенная специфика работы); программа одновременно работает с несколькими серверными базами данных (SQL, PROGRESS, ORACLE). Ничего не пропустил?

Чувствуете разницу? Когда говорили о получении ID через SCOPE_IDENTITY(), то все это не имело никакого значения, поскольку решение было универсальное для любой задачи работающей с MS SQL. Никаких ограничений не накладывалось на систему.

А у Вас "чем дальше в лес, тем больше ..." не дров, конечно, но ограничений, о которых в самом начале дискуссии Вы скромно умолчали.

Более того, поскольку у Вас происходит одновременная работа с несколькими серверными базами данных, то разумеется, такой пожход не применим в принципе. Я не в курсе, но кажется, у Oracle просто нет полей типа Identity, т.е. бессмысленно пытаться применить синтаксис MS SQL в запросах к Oracle.

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


Насчет прав доступа.

Вообще-то я в курсе. Однако опять же, Ваша проблема в том, что Вы делаете универсальную систему под несколько баз данных. Существует своя собственная идеология разграничения прав доступа в самом MS SQL. Т.е. готовая . Подозреваю, что подобная система должна быть в любой серверной базе данных.

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


Насчет собственно использования RV и T-SQL

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

Весьма странно, что Вы так настойчиво выступаете против прямой работы через T-SQL. Для сколько-нибудь развитой банковской системы работать только и исключительно через RV - невозможно в принципе. Точнее, можно, если Вас не интересует производительность.

Вы как-то забываете, что RV - это всего-лишь надстройка над T-SQL. Т.е. нечто вроде визарда, для решения некоторых стандартных задач . Еще раз подчеркну - некоторых . По самой своей сути RV не может решить все возможные задачи.


Насчет способов хранения настроечной информации.

Во-первых, данный вопрос никак не относится к обсуждаемой проблеме.

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

В-третьих, настроечную информацию можно хранить в любом файле (INI, свободная DBF-таблица, текстовый файл, в системном реестер и т.д. и т.п.) или передавать как параметр в EXE. В общем, есть "вагон и маленькая тележка" способов отдельного хранения настроечной информации от файла EXE.


PS: пожалуйста, не надо больше приводить код вида

append blank
=requery()

Как описание идеи - это еще сойдет, но как действующий код - он говорит о полной безграмотности разработчиков или об умолчании ряда допущений и ограничений.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603393
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HI ВладимирМ!
авторА у Вас "чем дальше в лес, тем больше ..." не дров, конечно, но ограничений, о которых в самом начале дискуссии Вы скромно умолчали
я бы не называл все это ограничениями, я бы называл все это "вновь открывшимися возможностями!"

авторЯ не в курсе, но кажется, у Oracle просто нет полей типа Identity, т.е. бессмысленно пытаться применить синтаксис MS SQL в запросах к Oracle.

я в курсе, у ORACLE есть поля типа ident, там есть функция которая считает (счетчик)

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

автор Существует своя собственная идеология разграничения прав доступа в самом MS SQL. Т.е. готовая. Подозреваю, что подобная система должна быть в любой серверной базе данных
да, привилегии есть везде, но как их использовать для блокировок кнопок на форме, опций меню и т.д.? в серверах привилегии по таблицам,полям, представлениям и т.д.

авторВы как-то забываете, что RV - это всего-лишь надстройка над T-SQL вы так думаете? почему тогда не надстройка над PL-SQL?


авторПо самой своей сути RV не может решить все возможные задачи RV вообще не решает задач, он представляет(показывает) решения серверов..

PS извините за дежавю :-)

еще способ:

sele RV
append Blank (или insert)
=Requery()
select max(id) as id from RV where owner_id=m.owner_id into CURSOR ident
sele RV
LOCATE FOR id=ident.id
brows

или
sele RV
append blank
requery()
CALCULATE max(id) for owner_id=m.owner_id to ident
LOCATE FOR id=ident
brows
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603447
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ!

у меня вопрос по вашей рекомендации:

автор1) Из открытого RV можно прочитать используемый им номер соединения. CursorGetProp("ConnectHandle"). Далее по этому номеру сделать запрос через SQLExec() и прочитать @@Identity или SCOPE_IDENTITY()


sqlexec(k,'SELECT @@IDENTITY as id','id')
sqlexec(k,'SELECT SCOPE_IDENTITY()as id','id')
дают NULL
после tableupd() дают результат, но в этот промежуток м-ду tableupd() и 'SELECT @@IDENTITY может вставиться чужая запись, не так ли?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603493
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топик длинный. Что-то прочитал, что-то пропустил. Не мог ли кто-либо из увыжаемых дискутантов кратко резюмировать - как НАДО делать?

Скажем если вставка происходит через ХП, то она может вернуть в фокс SCOPE_IDENITY.

А ежели вставка происходит путём фоксовского TABLEUPDATE()? SCOPE_IDENITY использовать нельзя, потому как scope уже другой. @@IDENTITY может вернуть тоже неизвестно что (при наличии триггеров, вставляющих записи в другие таблицы). Как быть?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603540
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX
"Ты, Мань, на грубость нарываешся"

Я могу поверить, что Ваш проект существует 15 лет, но как-то сомневаюсь, что Вы занимаетесь программированием столько же. Вопросы у Вас...

FoXXXя бы не называл все это ограничениями, я бы называл все это "вновь открывшимися возможностями!"
Которые имеют принципиальное значение для работоспособности предлагаемого кода.

FoXXXя в курсе, у ORACLE есть поля типа ident, там есть функция которая считает (счетчик)
Тогда Вы должны быть в курсе, чем отличается функция , от полей типа Identity. Функция может дать значение ДО момента физического создания записи. Поле Identity только ПОСЛЕ. Это два принципиально разных подхода.

FoXXXкак будем разводить клиентов в таблицах VFP? где эти таблицы будут лежать? это не лучший вариант..
Какое отношение имеет код записи к коду клиента? Вы вообще в курсе, что делает пример (форма) NewId.scx в стандартном примере Solution.pjx поставляемом с FoxPro?

Он формирует код записи ДО момента физического создания записи. Т.е. поля типа Identity вообще не используются, а код записи формируется на стороне клиента.

Напомню: назначение кода записи - это однозначная идентификация записи. Все.

Код клиента - это уже реквизиты записи. Они призваны решать другие задачи.

FoXXXда, привилегии есть везде, но как их использовать для блокировок кнопок на форме, опций меню и т.д.? в серверах привилегии по таблицам,полям, представлениям и т.д.
Не надо путать права доступа к данным и интерфейс. Это два разных направления. Да, они взаимосвязаны, но это не одно и то же.

FoXXXвы так думаете? почему тогда не надстройка над PL-SQL?
В данном случае, я неудачно выразился. Под T-SQL я подразумевал "прямой" доступ к данным по аналогии с SQLExec(). В литературе это называется "pass-through query"

Т.е. RV - это "обертка", некий "класс", который реализует часть задач обработки данных. Расширением этого "класса" в старших версиях FoxPro стал Cursor Adapter.

FoXXXRV вообще не решает задач, он представляет(показывает) решения серверов
Вы уверены, что программированием - это то, чем Вам стоит заниматься?

По сути Вы сказали: Программист не рашает задачи, он представляет (показывает) решения программы. А саму программу кто пишет?

Вы показывали то, что возвращает профайлер. Где этот код в RV? Надо думать, он его как-то сам сформировал. На основании чего? На основании тех данных, которые были введены и с учетом настроек сделанных при создании структуры RV.

Т.е. RV сформулировал (создал) запрос к серверу, передал ему этот запрос, получил ответ, трансформировал этот ответ в соответсвующий вид. Это еще не считая того, что делает RV на стороне клиента ДО формирования запроса серверу.


PS:

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

В том как Вы ведете дискуссию я не вижу стремления понять . Пока Вы просто цепляетесь к отдельным словам. Причем Вы демонстрируете потрясающую безграмотность и самоуверенность именно в программировании.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603555
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FoXXXВладимирМ!

у меня вопрос по вашей рекомендации:

автор1) Из открытого RV можно прочитать используемый им номер соединения. CursorGetProp("ConnectHandle"). Далее по этому номеру сделать запрос через SQLExec() и прочитать @@Identity или SCOPE_IDENTITY()


sqlexec(k,'SELECT @@IDENTITY as id','id')
sqlexec(k,'SELECT SCOPE_IDENTITY()as id','id')
дают NULL
после tableupd() дают результат, но в этот промежуток м-ду tableupd() и 'SELECT @@IDENTITY может вставиться чужая запись, не так ли?

прогнал, @@IDENTITY возвращает правильное значение, т.к. K разный у клиентов..

но вот человек правильно спрашивает, а если тригеры, тогда как ?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603557
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXВладимирМ!

у меня вопрос по вашей рекомендации:

автор1) Из открытого RV можно прочитать используемый им номер соединения. CursorGetProp("ConnectHandle"). Далее по этому номеру сделать запрос через SQLExec() и прочитать @@Identity или SCOPE_IDENTITY()


sqlexec(k,'SELECT @@IDENTITY as id','id')
sqlexec(k,'SELECT SCOPE_IDENTITY()as id','id')
дают NULL
после tableupd() дают результат, но в этот промежуток м-ду tableupd() и 'SELECT @@IDENTITY может вставиться чужая запись, не так ли?
Я уже объяснял в чем тут дело. Конструкция

append blank
Requery()

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

Эта конструкция будет работоспособна только и исключительно при строковой буферизации данных (3). Этот режим, в котором, по умолчанию, открывается любое View. Он характерен тем, что сброс буфера происходит автоматически в момент перехода на другую запись или при закрытии таблицы.

Другими словами, APPEND BALNK создает новую запись в буфере Local View. Поскольку сброса буфера не произошло, то и на самом сервере новая запись создана не будет и @@IDENTITY вернет NULL.

Команда Requery() первым делом "передернет" указатель записи. Т.е. произойдет автоматический сброс буфера (но только если RV в строковом режиме буферизации). Другими словами, автоматически даст команду TableUpdate().

Только после этого будет создана запись на сервере и возможно будет прочитать значение @@IDENTITY.

Т.е. на самом деле здесь не одна команда Requery(), а еще и неявная команда TableUpdate(). Проблема именно в том, что "неявная".
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603560
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oopyr
Скажем если вставка происходит через ХП, то она может вернуть в фокс SCOPE_IDENITY.

1. При вставке через ХП логично было бы, и вернуть вставляемую запись, не так ли?! Т.е. в код ХП добавить в конце код вида:
SELECT... FROM ... WHERE KeyID = SCOPE_IDENTITY()
Вот пример:http://www.caws.atnet.ru/vfox/vfox-sql5.html - хранимая процедура Currency_AddNew

Oopyr
А ежели вставка происходит путём фоксовского TABLEUPDATE()? SCOPE_IDENITY использовать нельзя, потому как scope уже другой. @@IDENTITY может вернуть тоже неизвестно что (при наличии триггеров, вставляющих записи в другие таблицы). Как быть?
А в этом случае вы и так получает новую запись. Разумеется, это поле (IDENTITY) должно присутствовать в списке полей, как правило, оно является ключом таблицы.
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603586
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K1. При вставке через ХП логично было бы, и вернуть вставляемую запись, не так ли?! Т.е. в код ХП добавить в конце код вида:
SELECT... FROM ... WHERE KeyID = SCOPE_IDENTITY()
Да в общем-то необязательно. Ведь я все равно REQUERY() буду делать - она и проявится. А вот значение ключевого поля мне нужно. Чтобы найти эту новую запись.

Aleksey-KА в этом случае вы и так получает новую запись. Разумеется, это поле (IDENTITY) должно присутствовать в списке полей, как правило, оно является ключом таблицы.
Запись-то есть, но ключевое поле ведь пустое, пока я REQUERY() не сделаю. А после REQUERY() как мне эту запись найти?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603616
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ!

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

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

вот примеры необоснованного хамства:
авторВаш проект существует 15 лет, но как-то сомневаюсь, что Вы занимаетесь программированием столько же

Вы демонстрируете потрясающую безграмотность и самоуверенность именно в программировании.

Вы уверены, что программированием - это то, чем Вам стоит заниматься?

Встречный вопрос - а вам??? вам стоит заниматься?

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


авторФункция может дать значение ДО момента физического создания записи. Поле Identity только ПОСЛЕ. Это два принципиально разных подхода.
я это понимаю не хуже вас поверте, и не просто понимаю но применял, лично, но поля - счетчики имеются, -> с ними можно работать так же как и с полями ident в SQL, не верите мне, подключите ORACLe поработайте проверте, но не делайте своих умозаключений относительно собеседника.

авторТ.е. поля типа Identity вообще не используются, а код записи формируется на стороне клиента. мой ответ основывался на том, что таблиц VFP у нас нет(если проект вообще не на VFP).

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

авторВы уверены, что программированием - это то, чем Вам стоит заниматься?

По сути Вы сказали: Программист не рашает задачи, он представляет (показывает) решения программы. А саму программу кто пишет?

Вы показывали то, что возвращает профайлер. Где этот код в RV? Надо думать, он его как-то сам сформировал. На основании чего? На основании тех данных, которые были введены и с учетом настроек сделанных при создании структуры RV.

Т.е. RV сформулировал (создал) запрос к серверу, передал ему этот запрос, получил ответ, трансформировал этот ответ в соответсвующий вид. Это еще не считая того, что делает RV на стороне клиента ДО формирования запроса серверу.
я вообще говорил о задачах приложения(программы), т.е. расчет начисления 13-ой зарплаты, или расчет посещаемости студентами лекций и т.д. я говорил о расчете - вы опять не правильно меня поняли и сделали заявления о моей профнепригодности. Я вообще не говорил о внутренней работе RV и ODBC.

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

авторВы демонстрируете потрясающую безграмотность и самоуверенность именно в программировании. - вы демонстрируете потрясающую грамотность в одной узкой области... и самоуверенность основанную на знании этой узкой области, если бы вам в течении года приходилось по несколку раз пересаживаться на разные СУБД, я не знаю, готовы ли вы были бы так на вскидку цитировать коды програм, написанных вами, приводить куски документации для примера, говорить о конкретных приемах премененных в той или другой системе.
Я сомневаюсь что человек эрудированный в разных областях знаний, способен на вскидку возпроизвести теорию относительности, и тут же сесть за доказательство теоремы(гипотезы) ферма.. а потом расказать об особенностях воздействия укусов мухи ЦЦ крупно-рогатого скота на биржевые котировки
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603628
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OopyrДа в общем-то необязательно. Ведь я все равно REQUERY() буду делать - она и проявится. А вот значение ключевого поля мне нужно. Чтобы найти эту новую запись.

А какое отношение имеет хранимая процедура сервера на добавление к REQUERY() ? Или вы используете RV и SQLEXEC вместе?
Или я чего-то не понимаю?
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603673
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K

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

Есть общая задача. Фоксовский грид показывает данные с SQL Server. Эти данные представлены в фоксе RV, CAD или курсором - не важно. Условно назову эти данные выборкой.
Рядом с гридом кнопка "Добавить". Юзер её нажимает, всплывает форма, заполняются поля, юзер нажимает кнопку "Сохранить". После сохранения нужно, чтоб указатель записи грида встал на вновь добавленную запись.

Здесь есть 2 пути:
1. Кинуть новую запись прямиком в SQL. Но тогда я её не увижу в гриде, пока не сделаю REQUERY(). После этого указатель будет на первой записи выборки. Тут-то мне и поможет ХП, возвращающая ключ. Но если в таблице 25 полей, то надо иметь ХП с 25-ю параметрами, что превращается в кошмар для программиста.

2. Вставлять записи в выборку, а потом делать TABLEUPDATE(). Гораздо удобнее для программиста. Но ключ-то генерируется на сервере, а в выборке он остаётся 0. Это вынуждает меня делать REQUERY(). Указатель идёт на первую запись и как мне теперь найти ту запись, что я только что вставил?
SCOPE_IDENTITY не поможет. @@IDENTITY тоже может вернуть совершенно левый ключ.

В общем по варианту 1 понятно как поступать. А вот по варианту 2 - нет.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603698
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oopyr...
Здесь есть 2 пути:
1. Кинуть новую запись прямиком в SQL. Но тогда я её не увижу в гриде, пока не сделаю REQUERY().

Каким образом вам поможет REQUERY() если вы получили выборку с сервера через SQL pass-through.
Я делаю не так. Я через ХП добавляю запись на сервер и получаю ее. А потом добавляю в локальный курсор INSERT INTO ... VALUES (...).
Но приусловии, что вся работа с сервером происходит через pass-through (SQLEXEC).
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603726
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким образом вам поможет REQUERY() если вы получили выборку с сервера через SQL pass-through.

То есть мы о разных вещах говорили. Я имел ввиду RV или CAD.

В Вашем варианте получается дублирование вставки: один раз в SQL, второй - в локальный курсор. Так? На мой взгляд нетривиальный подход, поэтому я не сразу понял.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603731
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oopyr Каким образом вам поможет REQUERY() если вы получили выборку с сервера через SQL pass-through.

То есть мы о разных вещах говорили. Я имел ввиду RV или CAD.

В Вашем варианте получается дублирование вставки: один раз в SQL, второй - в локальный курсор. Так? На мой взгляд нетривиальный подход, поэтому я не сразу понял.

сделайте так:

sqlexec(k,'insert into dbo.rasp(date_reg) values (GETDATE());select * from dbo.rasp where vhod_num=SCOPE_IDENTITY()','rasp')

получите сразу новую запись для работы
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603745
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oopyr Каким образом вам поможет REQUERY() если вы получили выборку с сервера через SQL pass-through.

То есть мы о разных вещах говорили. Я имел ввиду RV или CAD.

В Вашем варианте получается дублирование вставки: один раз в SQL, второй - в локальный курсор. Так? На мой взгляд нетривиальный подход, поэтому я не сразу понял.
Вы все-таки меня не поняли. Я не использую технологии RV и CAD. Только pass-through (PT). Никакого дублирования нет. Курсор локальный НИКАК не связан с сервером, а есть результат работы хранимой процедуры, вызванной через PT.
Обновление происходит СНАЧАЛА на сервере через хранимую процедуру и после УСПЕШНОГО завершения работы хранимой процедуры на сервере, она возвращает добавленную (обновленную запись), которую я добавляю (обновляю ) в локальном курсоре через INSERT INTO ...(REPLACE)
Вы же писали, что:
OopyrЭти данные представлены в фоксе RV, CAD или курсором - не важно. Условно назову эти данные выборкой..

Т.е. вы не оговорили, как получили локальный курсор. Вот я и обратил ваше внимание, что если локальный курсор не связан с "сервером", он не будет автоматически обновляться при REQUERY().
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603782
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OopyrЯ имел ввиду RV или CAD
Если говорить о RV или CAD, то однозначно корректного решения нет. По крайней мере, пока у меня ничего не получилось. Есть решения, применимые при определенных ограничениях.

Собственно, есть 2 принципиальных способа решения:

1) Прочитать номер соединения и через SQLExec() взять @@IDENTITY.

Недостаток очевиден. Не факт, что получишь значение для текущей таблицы. SCOPE_ITENTITY() брать бессмысленно. Другой scope. Всегда будет возвращать NULL

Работает, если у таблицы нет триггеров на вставку, которые сами вставляют записи в таблицы с полями IDENTITY

2) Ввести в таблицу дополнительное поле (или набор полей), позволяющее однозначно идентифицировать новую запись в текущей выборке RV или CAD. После добавления новой записи и перезапроса искать новую запись опираясь на это дополнительное поле.

Собственно, все это громадное обсуждение вертится вокруг второго способа.

Вводится дополнительное поле - идентификатор пользователя (owner_id).

В системе пресекаются попытки войти двум пользователям с одним значением owner_id.

Тогда новая запись - это запись с максимальным значением ID в пределах одного значений owner_id
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603789
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну теперь понятно.

Собственно ещё есть способ

3) Вернуться к старым временам и генерить ключ на клиенте. В SQL ведь совсем необязательно иметь поле identity в каждой таблице. Можно и обычный integer назначить на роль primary key. Главное уникальность обеспечить.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603799
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX
Проблема в том, что Вы непоследовательны и забывчивы. Вас все время "сносит" в сторону от основной темы, Вы все время намекаете на мою некомпетентность, у Вас все время появляются новые ограничения, Вы все время читаете не то, что я написал и т.д. и т.п.

По поводу Вашего стиля работы с RV - я уже давно все понял, многократно повторил самыми разными способами. Указал на Ваши ошибки. Посмотрите мой ответ Oopyr . Это для меня было очевидно с самого первого Вашего поста. Из Вас буквально клещами приходилось тянуть, что да, действительно, есть такие ограничения.

Разговор слепого с глухим. Нет смысла дальше что-то обсуждать...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33603963
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OopyrНу теперь понятно.

Собственно ещё есть способ

3) Вернуться к старым временам и генерить ключ на клиенте. В SQL ведь совсем необязательно иметь поле identity в каждой таблице. Можно и обычный integer назначить на роль primary key. Главное уникальность обеспечить.

Уважаемы Oopyr!

если вас не смущает работа с SQLexec() функциями, то вашу проблему можно решить следующим методом:

use RView in 0
select RView
работаем в гриде
------
теперь добавляем новую запись:
k=CursorGetProp("ConnectHandle")
sqlexec(k,'insert into dbo.rasp(date_reg) values (GETDATE());select SCOPE_IDENTITY() as id','id')
requery()
locate for RView.id=id.id
указатель на новой записи в RView, работайте с ней, кроме того видимы все остальные записи в RView.


C уважением FoXXX
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33604346
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX

Мда, что-то не густо с примерами кода
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33604360
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oopyr
Здесь есть 2 пути:
1. ...
2. Вставлять записи в выборку, а потом делать TABLEUPDATE(). Гораздо удобнее для программиста. Но ключ-то генерируется на сервере, а в выборке он остаётся 0. Это вынуждает меня делать REQUERY(). Указатель идёт на первую запись и как мне теперь найти ту запись, что я только что вставил?
В общем по варианту 1 понятно как поступать. А вот по варианту 2 - нет.
Прогони код из поста 2436139 - CAD в VFP 9 решает вопрос о передаче ключевого поля, присвоенного сервером в фокс без requery() всего курсора. Сам, правда с CAD я пока на 8 фоксе работаю, там такого прибамбаса еще нет.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33604427
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Если говорить о RV или CAD, то однозначно корректного решения нет.
Собственно, есть 2 принципиальных способа решения:

1)...
2) Ввести в таблицу дополнительное поле (или набор полей), позволяющее однозначно идентифицировать новую запись
Согласен. По крайней мере в 8 и более старых версиях фокса.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33604629
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist FoXXX

Мда, что-то не густо с примерами кода

не густо, на вскидку, надеюсь критики кода нет??
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33604707
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX PaulWist FoXXX

Мда, что-то не густо с примерами кода

не густо, на вскидку, надеюсь критики кода нет??

Дык, что критиковать, если на мои вопросы я не увидел ни строчки.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33604798
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWistДык, что критиковать, если на мои вопросы я не увидел ни строчки.

ааа... а были вопросы???

если по поводу RV то вродебы все ответил..

процедуры на VFP не запускаем, все работает на сервере, у нас только результаты через RV.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33605072
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX PaulWistДык, что критиковать, если на мои вопросы я не увидел ни строчки.

ааа... а были вопросы???

если по поводу RV то вродебы все ответил..

процедуры на VFP не запускаем, все работает на сервере, у нас только результаты через RV.

Что-то у меня тоже дежавю развивается , где-то в этой ветке уже читал
- получается разговор слепого с глухим.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33605193
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
Что-то у меня тоже дежавю развивается , где-то в этой ветке уже читал
- получается разговор слепого с глухим.

значит вопросов нет
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33605250
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX PaulWistДык, что критиковать, если на мои вопросы я не увидел ни строчки.

ааа... а были вопросы???

если по поводу RV то вродебы все ответил..

процедуры на VFP не запускаем, все работает на сервере, у нас только результаты через RV.
У меня есть вопросы, можно? :)
Данные вы извлекаете с помощью RV, которые могут быть построенны на основе не только базовых таблиц сервера баз данных (MS SQL, ORACLE и пр.), но и на основе объектов сервера типа View. А вот при желании обновить данные (добавить на сервер), вы вызываете соответствующие хранимые процедуры сервера?
Я правильно вас понял?
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33605711
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-K FoXXX PaulWistДык, что критиковать, если на мои вопросы я не увидел ни строчки.

ааа... а были вопросы???

если по поводу RV то вродебы все ответил..

процедуры на VFP не запускаем, все работает на сервере, у нас только результаты через RV.
У меня есть вопросы, можно? :)
Данные вы извлекаете с помощью RV, которые могут быть построенны на основе не только базовых таблиц сервера баз данных (MS SQL, ORACLE и пр.), но и на основе объектов сервера типа View. А вот при желании обновить данные (добавить на сервер), вы вызываете соответствующие хранимые процедуры сервера?
Я правильно вас понял?
С уважением, Алексей.

Hi Алексей!

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

с уважением FoXXX
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33605732
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так..., вопрос на вопрос. Что за привычка...
Вы не ищите подвоха в моем вопросе! Его его там!
Давайте тогда для простоты будете отвечать на мои вопросы по частям:
1. Данные вы извлекаете с помощью RV, которые могут быть построенны на основе не только базовых таблиц сервера баз данных (MS SQL, ORACLE и пр.), но и на основе объектов сервера типа View? Это так?

С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33605767
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KТак..., вопрос на вопрос. Что за привычка...
Вы не ищите подвоха в моем вопросе! Его его там!
Давайте тогда для простоты будете отвечать на мои вопросы по частям:
1. Данные вы извлекаете с помощью RV, которые могут быть построенны на основе не только базовых таблиц сервера баз данных (MS SQL, ORACLE и пр.), но и на основе объектов сервера типа View? Это так?



Алексей, молодец - 5 баллов.

PS: РжуНеМогу
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33605902
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot PaulWist

Алексей, молодец - 5 баллов.

PS: РжуНеМогу [/quot]

матри не аппп не лопни..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33605960
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KТак..., вопрос на вопрос. Что за привычка...
Вы не ищите подвоха в моем вопросе! Его его там!
Давайте тогда для простоты будете отвечать на мои вопросы по частям:
1. Данные вы извлекаете с помощью RV, которые могут быть построенны на основе не только базовых таблиц сервера баз данных (MS SQL, ORACLE и пр.), но и на основе объектов сервера типа View? Это так?

С уважением, Алексей

Алексей!

Хотел бы дать пояснения

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

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

3.подвоха не ищу, тяжело отвечать не правильно поняв вопрос, мало-ли что вы имеете ввиду, как например чел. спросил о расчетах, а имел ввиду работу RV, вот и думай тут.. или чел. о транзакциях говорит, а у нас клиент на автомате выставленно в ODBC

4.если вам для пользы дела интересно, то общие принципы обрисовать могу.
если просто пофлудить - то это лучше к ПаУлю, с ним пофлудить и посмеяться можно
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606379
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergej_S Прогони код из поста 2436139 - CAD в VFP 9 решает вопрос о передаче ключевого поля, присвоенного сервером в фокс без requery() всего курсора. Сам, правда с CAD я пока на 8 фоксе работаю, там такого прибамбаса еще нет.

А вот это полностью решает проблему. Устанавливаем свойство адаптера
Код: plaintext
InsertCmdRefreshFieldList = "PKey"  && имя ключевого поля
и после TABLEUPDATE() оно автоматически обновляется. Никаких REQUERY() делать не надо и указатель остаётся на той же записи.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606392
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый FoXXX
Я не прощу от вас конкретных примеров!
Мой вопрос именно про идеологию построения системы.
Дело в том, что я на работе занимаюсь именно идеологией взаимодействия клиента и сервера.
Я в свое время (примерено лет 5 назад) отказался от построения универсальной клиентской системы, которая могла бы работать с ЛЮБЫМ сервером баз данных и в качестве сервера выбрали MS SQL Server. По этой причине у меня нет необходимости писать свой серверный код с строго в ANSI-92. Также я могу использовать SQL Pass-Through (PT) без всяких ограничений.
Вы выбрали, как я понял из ваших сообщений в этом топике, вариант с использование для извлечения и обновления существующих данных Remote View (RV).
При этом, из ваших же сообщений, я делаю вывод, что в качестве исходных данных для построения RV вы используете не только таблицы сервера, но и объекты View сервера. Это нормально и вполне логично, т.к. построитель RV самого VFP не в состоянии построить запрос для удаленного источника данных даже в соответствии с ANSI-92!.
Т.е. у вас в формах клиента (VFP) есть данные, полученные через такие RV, которые отображают данные из нескольких таблиц, т.к. View как объект базы данных сервера может почти тоже самое, что и запрос, т.е. содержать конструкции вида JOIN, UNION, GROUP BY. Не так ли.
Далее вы писали, что обновление данных на севере вы производите через RV с использованием команды VFP - TABLEUPDATE(...).
И вот тут у меня возникает большой вопрос! Каким образом вы производите обновление данных на севере через RV (TABLEUPDATE) в случае, когда в качестве источника данных для вашего RV послужил View сервера, а не таблица? Да не просто View, а View, который построен от нескольких таблиц.
При попытки обновить такое поле вы получите сообщение типа "Update or insert of view ..... failed because it contains a derived or constants field". Думаю, что переводить это не надо.
А в реальной системе, у вас все таблицы (ну за исключением, может быть "плоских" таблиц-справочников, т.е. таблиц, которые не имеют НИ одного Foreign Key) имеют связи с другими и с помощью View вы их и "собираете".
Как вы в таком случае обновляет RV в клиенте?
Если через хранимые процедуры сервера, т.е. через SQLEXEC, т.е. через PT, то тогда система у вас точно не будет универсальная и работать с любым ANSI-92 совместимым сервером баз данных.
Хотелось бы услышать от вас, как идеолога системы ответы на мои вопросы.

С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606470
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ув. Алексей!

понял ваш вопрос.
вот вы говорите:

авторт.к. построитель RV самого VFP не в состоянии построить запрос для удаленного источника данных даже в соответствии с ANSI-92!.

а для неудаленного источника? для неудаленного источника VFP в состоянии посторить запрос?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606532
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если строить запрос через Local View, то ограничения, как я полагаю, те же, что и в Remote View, но я ни разу не пользовался Local View :).
Если мне надо сделать запрос, то использую команду SELECT - SQL самого VFP. А в ней с каждой версией все больше соответствия наблюдается со стандартом ANSI-92. И это рабует!
Собственно говоря, как я полагаю, в этом одно из огромных достоинств VFP перед другим, как клиента сервера баз данных. Есть свой RDBE (Relation DataBase Enagine), который почти полностью соответствует ANSI-92. Можно гибко разделять нагрузку между севером и клиентом.
Поэтому, лет 6 назад мы на фирме и выбрали его (VFP) в качестве инструмента написания клиентской части для КИС (Корпоративной Информационной Системы).

С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606539
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей! Вы используете нормализацию? какую?

Вам много приходится собирать?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606549
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Local View вполне соответствует.. справляется, LV строим из RV таблиц.

view на сервере для отчетов, мониторинга, наблюдения , не для корректировки.

для корректировки RV таблиц, LV RV.. вот такой каламбур.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606579
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
схема такая:
RV1+RV2 -> LV1
RV3+RV4 -> LV2
RV1+RV4+LV1 -> LV3
LV1+LV2-LV3 -> LV4

вот и все... чтобы изменения вступали в силу нужны ключевые поля участников в результате.. и Send SQL Updates например Key Fields Only
Update Using SQL UPDATE
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606589
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXАлексей! Вы используете нормализацию? какую?

Вам много приходится собирать?
1. Да, конечно, 3N - 3-я нормальная форма.
2. А практически все запросы у нас следуют не к таблицам, а к View
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606596
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXXсхема такая:
RV1+RV2 -> LV1
RV3+RV4 -> LV2
RV1+RV4+LV1 -> LV3
LV1+LV2-LV3 -> LV4

вот и все... чтобы изменения вступали в силу нужны ключевые поля участников в результате.. и Send SQL Updates например Key Fields Only
Update Using SQL UPDATE
Другим словами, RV1, RV2, RVN - это View только к одной таблице?
С уважением, Алексей.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606605
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет конечно, хотя можно и к одной, но зачем?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606606
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RV - remout view
LV - local view
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606627
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да еще в Connection Designer

Batch Processing Automatic Transactions Packet Size 4096

в RV

Share Connection Number of Records to Fetch at a Time all Maximum Number of Records to Fetch all Number of Records to Batch Update 1

ну остальное по умолчанию

с уважением FoXXX
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606686
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все таки хотелось бы глянуть на пример:
У вас на SQl Server есть View, котрый объединяет 3 таблицы:
1. Документ
2. Два справочника на котором есть ссылки в документе.
Есть View на сервере, который объединяет эти три таблицы.
Как вы будете строить LV и RV?
С уважением, Алексей
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606740
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aleksey-KВсе таки хотелось бы глянуть на пример:
У вас на SQl Server есть View, котрый объединяет 3 таблицы:
1. Документ
2. Два справочника на котором есть ссылки в документе.
Есть View на сервере, который объединяет эти три таблицы.
Как вы будете строить LV и RV?
С уважением, Алексей

1. Мы же не будем корректировать справочники в форме (гриде) показывающем документ? (естественно справочники подключены и мы видим не коды, а значения) правильно?

2. Здесь возможно два варианта, это я так на вскидку как версия, union не нужен, view простенький получается:
вариант1 создать view на сервере, по-моему (если мне не изменяет память) SQL сервер не запрещает корректировку view с определенными условиями, сейчас не вспомню, но знаю что это можно, тогда все по схеме view->RV
корректируем RV, доступны для корректировки только поля главной таблицы.
вариант2 создать RV1 RV2 RV3, ну естественно с отсевом ненужной информации, что бы лишнего на клиента не тащить, потом RV1+RV2+RV3->LV
корректируем LV но здесь по полям справочников не нужно ставить галку в LV.
да и в RV справочников, хотя может быть вы хотите корректировать справочники, тогда в RV можно оставить.

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

С уважением FoXXX.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33606841
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oopyr Sergej_S Прогони код из поста 2436139 - CAD в VFP 9 решает вопрос о передаче ключевого поля, присвоенного сервером в фокс без requery() всего курсора. Сам, правда с CAD я пока на 8 фоксе работаю, там такого прибамбаса еще нет.

А вот это полностью решает проблему. Устанавливаем свойство адаптера
Код: plaintext
InsertCmdRefreshFieldList = "PKey"  && имя ключевого поля
и после TABLEUPDATE() оно автоматически обновляется. Никаких REQUERY() делать не надо и указатель остаётся на той же записи.

Подобного же результата можно добиться с помощью метода CA.RecordRefresh()(начиная опять же с 9-ки). Но его, естественно, надо вызывать ручками после каждого TABLEUPDATE(). Эдакий мини-REQUERY() на одну запись.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33608739
куб
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно делать такой RV
SELECT * FROM dbo.ra Ra WHERE Ra.id= @@identity

тогда requery() после inserta работает прекрасно!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609138
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OopyrПодобного же результата можно добиться с помощью метода CA.RecordRefresh()(начиная опять же с 9-ки).
Тоже хорошо, списибо за информацию.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609375
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergej_S, Oopyr
Нет ребята. Так не пойдет. В 9 версии по прежнему нет решения.

То, что Вы привели - это все то же решение через дополнительное поле. Просто оно скрыто в автоматическом режиме.

Тут все очень хитро "запрятано".

Чтобы понять в чем проблема, снимите в приведенном примере настройку UNIQUE с поля f_int_unique и создай новую запись со значением этого поля уже существующей записи. Например, f_int_unique=2. Делаем TableUpdate() и видим значение ключевого поля равное 2 (!). Ну, и TableUpdate() возвращает .F., поскольку поле не уникально.

Другими словами, CAD просто прочитал значение записи, опираясь в качестве ключа на то поле, которое указано в свойстве InsertCmdRefreshKeyFieldList .

По сути - это все то же решение с дополнительным полем, когда поиск новой записи осуществляется по значению другого (НЕ ключевого) поля или набора полей. Просто CAD дал возможность явно указать это дополнительное поле.

Так что, рано обрадовались. По прежнему нет адекватного решения "в общем случае" при использовании CAD.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609509
куб
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ!

А как мой пример? Нормальное решение?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609516
Oopyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это если на insert триггеры не повешены, которые вставляют в другие таблицы, у которых тоже есть identity. Тогда сработает.
Если же такой триггер есть, то вернёт identity последней таблицы, в которую вставляли, а не той, которую нам надо.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609533
куб
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OopyrЭто если на insert триггеры не повешены, которые вставляют в другие таблицы, у которых тоже есть identity. Тогда сработает.
Если же такой триггер есть, то вернёт identity последней таблицы, в которую вставляли, а не той, которую нам надо.

да наверно, но scope_identity() не срабатывает к сожалению
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33609891
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ Sergej_S, Oopyr


Нет ребята. Так не пойдет. В 9 версии по прежнему нет решения.

То, что Вы привели - это все то же решение через дополнительное поле. Просто оно скрыто в автоматическом режиме.

Тут все очень хитро "запрятано".

Чтобы понять в чем проблема, снимите в приведенном примере настройку UNIQUE с поля f_int_unique и создай новую запись со значением этого поля уже существующей записи. Например, f_int_unique=2. Делаем TableUpdate() и видим значение ключевого поля равное 2 (!). Ну, и TableUpdate() возвращает .F., поскольку поле не уникально.

Другими словами, CAD просто прочитал значение записи, опираясь в качестве ключа на то поле, которое указано в свойстве InsertCmdRefreshKeyFieldList .

По сути - это все то же решение с дополнительным полем, когда поиск новой записи осуществляется по значению другого (НЕ ключевого) поля или набора полей. Просто CAD дал возможность явно указать это дополнительное поле.

Так что, рано обрадовались. По прежнему нет адекватного решения "в общем случае" при использовании CAD.


топик настолько вырос уже стали забывать ,что было вначале.

в первом приведённом мной примере соединение происходит через ODBC
и уникальное поле необходимо потому что ODBC не поддерживает авторефреш
без уникального поля

/topic/265415&pg=4#2436396
приведён второй пример где всё происходит через ADO и уникальное поле не нужно его там просто нет если бы открыли увидели
не вводите взаблужение заинтересованных лиц



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

переубедить его не возможно 8 страниц топика показатель

но вопрос был
как CAD получить IDEntity поле

авторефреш рекордсета есть давно

хороший ресурс по ADO ввиде справочника
http://www.activeserverpages.ru/ado/

если все правильно настроить , а это не так долго , то через CAD
Мы всё это получаем в полном объёме

С уважением ко всем....... !!!

Всё боится времени
.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33610062
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_t
топик настолько вырос уже стали забывать ,что было вначале.

в первом приведённом мной примере соединение происходит через ODBC
и уникальное поле необходимо потому что ODBC не поддерживает авторефреш
без уникального поля

/topic/265415&pg=4#2436396
приведён второй пример где всё происходит через ADO и уникальное поле не нужно его там просто нет если бы открыли увидели
не вводите взаблужение заинтересованных лиц
Павел, Вы смотрели профайлер MS SQL? Т.е. как именно физически происходит это самое обновление записи?

Так вот, там "в лоб" пишется запрос

SELECT @@IDENTITY

Т.е. это все будет работать пока не появится триггер на вставку, в котором происходит вставка в другую таблицу с полем типа IDENTITY.

Я специально создал еще одну тестовую табличку и в триггере основной таблицы (которую просматривает ADO) на вставку сделал вставку в дополнительную таблицу. Так вот, Ваш пример просто заклинило! Он вообще не смог найти нужные данные! Т.е. запись физически успешно добавлялась, но обновления не происходило!

Разумеется, значение @@IDENTITY в подчиненной таблице должно отличаться от этого значения в главной. Поскольку триггер к временной таблице построить нельзя, то пришлось это все переделать для постоянных таблиц.

Pavel_tно вопрос был
как CAD получить IDEntity поле

авторефреш рекордсета есть давно

хороший ресурс по ADO ввиде справочника
http://www.activeserverpages.ru/ado/

если все правильно настроить , а это не так долго , то через CAD
Мы всё это получаем в полном объёме
Повторяю еще раз. НЕТ корректного решения "в общем случае".

ADO ведь не придумал ничего нового в этом смысле. Это просто другой способ доступа к данным. Но механизм работы MS SQL сервера от этого не изменился.

Ну, как физически ADO может получить информацию о новой записи? Особенно, если "он появился давно".
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33610075
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вернуться к теме, то вот здесь

http://forum.foxclub.ru/read.php?29,184077,184299#msg-184299

Алексей Цингауз, представитель MSFT команды разработчиков VFP привел несколько вариантов решения:

1) Через ODBC - Чтение значения @@IDENTITY после удачной вставки.
2) и 4) Через ADO - вместо прямой команды вставки формируется хранимая процедура. В нее в качестве параметров передаются значения полей и через SCOPE_IDENTITY( ) читается новое значение
3) Это ранее описанное решение с авторефрешем, когда для чтения новой записи опираются на значение другого поля.

В общем, нет простого решения. Все время приходится что-то изобретать...
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33610742
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Oopyr!

> Собственно ещё есть способ
> Вернуться к старым временам и генерить ключ на клиенте.

На клиента можно генерировать пожалуй только GUID - иначе обеспечить
уникальность будет проблематично. А вот если использовать собственно сервер
для генерации ID - тогда другое дело. При этом вполне можно обойтись одной
универсальной схемой - это модификация NewID для случая отсутствия
блокировок.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33611067
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ Sergej_S, Oopyr
Нет ребята. Так не пойдет. В 9 версии по прежнему нет решения.



ВладимирМ
2463808

Алексей Цингауз, представитель MSFT команды разработчиков VFP привел несколько вариантов решения:

В общем, нет простого решения. Все время приходится что-то изобретать...




еще немного и вы согласитесь, что решение всётаки есть
на то программист и нужен чтобы вибирать приемлемое для данной системы решение
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33611198
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_t ВладимирМ
В общем, нет простого решения. Все время приходится что-то изобретать...


еще немного и вы согласитесь, что решение всётаки есть
на то программист и нужен чтобы вибирать приемлемое для данной системы решение
А я разве говорил, что его нет? Я говорил что нет простого (читай, "автоматического") решения. Вы почитайте, то, что привел Алексей Цингауз, и сравните с тем, что предлагали Вы. По сути, он перехватывает "стандартные" команды создания новой записи и заменяет их своими (!)
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33611320
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё боится времени

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

а универсальным может быть только сыр в мышельвке


.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33611609
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavel_tя предложил самый простой вариант для самой простой таблицы
и метод через который это можно получить
Однако не указали самого главного. При каких условиях этот метод работает! Точнее, при каких условиях он НЕ работает.

Поставьте себя на место новичка. Есть метод обновления: сделал - не работает! Почему?!

Pavel_tвсё остальное описано в хелпе и те-же хранимые процедуры на вставку изменение и удаление при желании это всё настраивается на это я тоже обратил Ваше внимание

ADO - это "не родной" для FoxPro способ доступа к данным. Т.е. в штатном HELP по FoxPro ничего этого нет. Точнее, есть, но "не явно". Разбросано по разным местам.

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

ЧТО он должен искать? На ЧТО обращать внимание? Согласен, прочитать полностью HELP по ADO было бы полезно. Но желательно дать ориентиры, на что обращать внимание.

Pavel_tа универсальным может быть только сыр в мышельвке
Это Вы зря. Применительно к данной задаче в рамках описанных условий решение все-таки есть. И именно универсальное. Основанное на подмене "штатной" команды на вставку на хранимую процедуру.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33611711
Pavel_t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё боится времени

to Владимир

автор вопроса как я понял работает c CAD ,а это подразумевает
уже какой-то опыт и умение находить новое и работать с хелпом
вопросов по разъяснению если ..... то .... не возникало

...А если его стукнуть молотком, то он станет красным....
(Кир Булычёв "тайна третьей планеты" )

с вашим подходом и Odbc тоже не родной
родной только DBF формат
просто используя ADO
я могу гораздо больше чем через Odbc, но Это уже другая тема


.... и только время боится пирамид!
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33611792
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Pavel_t
В принципе, есть что возразить. Но это уже выходит за рамки обсуждаемого вопроса.

Поэтому сойдемся на том, что Ваш способ работает, но при опеределенных ограничениях. О чем я и говорил на протяжении всей этой темы. Так сказать, уточнил приведенное Вами решение.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33616228
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Резюме:

Подобные вопросы, такие как получение ID, возникают только в том случае, если программное обеспечение пишется "на коленке" в дилетантской среде, без бизнес-аналитики, постановки и технического задания. Что не удивительно, т.к. большинство FVP программистов используя удивительные свойства VFP зачастую в одном лице представляют и бизнес аналитика и постановщика да и саму "фирму" (человек - фирма). Именно безграмотный подход к созданию системы порождает вопросы обсуждаемые в данном топике на протяжении уже 9-ти страниц... Это показатель того насколько "запущен" процесс создания бизнес приложений в среде VFP в России. Не удивительно, что программисты VFP настолько низкооплачиваемы в сравнении с программистами других категорий. Это показатель низкой культуры программирования в VFP. Не смотря на огромные возможности VFP, в России этот продукт недооценен, возможно это результат работы таких вот VFP программистов...
Грамотная постановка задачи позволяет решать вопрос этого топика без дополнительных извращений обычно используемых дилетантами.

Для того, чтобы не появлялось вопросов поднятых в данном топике, при проектировании и программировании программного обеспечения необходимо соблюдать следующие правила:

1. каждая запись должна иметь автора и дату создания
2. любое исправление записи должно фиксироваться в журнале исправлений
3.журнал исправлений(модификаций) должен отражать:
а)дату исправления
б)автора исправления
г)имя поля
д)старое значение поля
е)новое значение поля
ж)идентификатор исправленной записи
з)идентификатор таблицы, базы, приложения
и)идентификатор рабочей станции с которой произведена модификация
4. каждый пользователь должен однозначно идентифицироваться системой
5. система должна позволять совершать откат ошибочных операций на основании журнала модификаций
7. система должна быть стабильной, иметь дружественный интерфейс, легко настраиваться
8. система должна иметь администратора

Соблюдение перечисленных правил позволит вам создавать действительно стоящие приложения на VFP, которые будут стоящими не только в смысле качественном, но и в смысле денежном (количественном).

Вот такие выводы и пожелания.

С уважением FoXXX.

:))
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33617332
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX
Опять!? Большая часть из этих 9 страниц посвящены лично Вам и разбору Ваших ошибок! Поэтому, насчет "безграмотности" и "дилетантизма" ...

Вы описали СВОЮ постановку задачи. Какие есть основания предполагать, что ВСЕ задачи имеют такую же постановку? Не "должны", а именно "имеют"? Ведь под термином "должны" Вы подразумеваете "должны в МОЕЙ постановке задачи".

Практически каждый из описанных пунктов, как минимум, можно поставить под сомнение. Все зависит от конкретной постановки задачи.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33617498
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ FoXXX
Опять!? Большая часть из этих 9 страниц посвящены лично Вам и разбору Ваших ошибок! Поэтому, насчет "безграмотности" и "дилетантизма" ...

Вы описали СВОЮ постановку задачи. Какие есть основания предполагать, что ВСЕ задачи имеют такую же постановку? Не "должны", а именно "имеют"? Ведь под термином "должны" Вы подразумеваете "должны в МОЕЙ постановке задачи".

Практически каждый из описанных пунктов, как минимум, можно поставить под сомнение. Все зависит от конкретной постановки задачи.

Постановка бывает грамотной (научной) и безграмотной (ненаучной) - вот и вся разница..

а по поводу "моих ошибок" это вы слишком.. я же не называю ваши разработки ошибкой, я говорю о безграмотности в вопросах формирования ТЗ, в вопросах анализа, ошибки это правописание, а анализ - искуство..

можно писать без ошибок но не быть писателем, и можно писать с ошибками, но быть им..

так и програмист, либо он делает вещи, либо нет и не важно с ошибками или нет, ошибки можно исправить, а кривое приложение - нет.. его можно только переписать заново..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33617585
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoXXX
Вы написали 9 пунктов того, что считаете ПРАВИЛЬНОЙ (грамотной, научной) постановкой задачи. ЛЮБОЕ отступление от этих правил Вы считаете НЕ ПРАВИЛЬНЫМ (безграмотным, не научным). По крайней меря я Вас так понял.

Я считаю, что постановка задачи МОЖЕТ отличаться от Ваших 9 пунктов и, тем не менее, быть ПРАВИЛЬНОЙ (грамотной, научной). Более того, может не выполняться НИ ОДИН из этих 9 пунктов и, тем не менее, постановка задачи будет ПРАВИЛЬНОЙ.

Все дело в том, что хотя Вы и говорите, как бы "вообще", но всегда подразумеваете СВОЮ постановку задачи. Неявно распространяя ее вообще на весь возможный спектр задач. Вот именно это и вызывает, мягко говоря, недоумение.

Почему Вам даже в голову не приходит, что постановка задачи может быть ДРУГОЙ? Не ошибочной или безграмотной, а просто другой. Не такой как у Вас.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33618024
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ

не 9 пунктов, меньше, несколько вычеркнул, чтобы не нагружать.

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

Извините, ничего личного, но архитектура это несколько другая область, которая тоже имеет свои изюминки.
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33618774
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi FoXXX!

Большинство из Ваших "пунктиков" более чем спорны. Я пожалуй соглашусь лишь
с одним
- система должна быть стабильной

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

Что касается профессионализма разработчиков - я пожалуй могу с Вами частично
согласиться - если конечно принять во внимание самое первое моё сообщение в
данной теме, да и несколько последующих - после чего Вы наглядно показали
свои, скажем так, неглубокие знания обсуждаемых тем... Тем не менее какие-то
(видимо личные) причины мешают Вам признать свою неправоту в тех вопросах -
ну что-же это Ваше личное дело. Я просто надеюсь что Вы всё-же примете во
внимание всё то, про что говорилось в данной теме - иначе и архитектор из
Вас будет скажем так не очень...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33619207
Gustaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столько копий сломали ...
а нельзя ли после tableupdate воспользоваться коммандой REFRESH() ?

т.е. после tableupdate выдаем REFRESH(1,1) - по идее должна обновиться всего 1 запись (текущая вместе с полем id) без всяких go bottom?
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33620031
FoXXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GustafСтолько копий сломали ...
а нельзя ли после tableupdate воспользоваться коммандой REFRESH() ?

т.е. после tableupdate выдаем REFRESH(1,1) - по идее должна обновиться всего 1 запись (текущая вместе с полем id) без всяких go bottom?

указатель слетает..
...
Рейтинг: 0 / 0
VFP + SQL поле IDENTITY
    #33625526
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Gustaf!

> а нельзя ли после tableupdate воспользоваться коммандой REFRESH() ?

Только если ключевое поле было заполнено ДО сохранения - иначе у фокса
просто нет зацепки - откуда же брать эти самые данные. По сути Refresh() -
это "мелкий" requery() - т.е. строится специальный запрос, он вынимает одну
запись, и помещает эти даные в основной курсор - при этом фокс для удалённых
данных базируется на KeyFieldList - и конечно если поле ключа после
сохранения на сервере изменилось, то такой перезапрос не пройдёт.
Более того следует учитывать, что Refresh() реально "новые данные" помещает
не в собственно поля курсора, а в "старые значения" - доступ к которым мы
получаем через OldVal() - правда если в записи курсора нет изменений то это
не имеет значения :)

Примерно такую-же идею "мелкого перезапроса" и демонстрирует вышеуказанный
код с CAD - но там идёт ориентация на дополнительное поле - ключа кандидата
(т.е. уникального ключа), заполняемого на клиенте - что конечно зачастую
недостижимо.

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


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