|
|
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
ВладимирМ! Странный у вас метод ведения разговора, чем вежливей вам отвечают тем больше вы хамите.. я думал вам интересен наш опыт, вы же просто пытаетесь представить лично меня плохим программистом.. уверяю вас это не лучший метод ведения беседы. вот примеры необоснованного хамства: авторВаш проект существует 15 лет, но как-то сомневаюсь, что Вы занимаетесь программированием столько же Вы демонстрируете потрясающую безграмотность и самоуверенность именно в программировании. Вы уверены, что программированием - это то, чем Вам стоит заниматься? Встречный вопрос - а вам??? вам стоит заниматься? давайте не будем переходить на личности, и обсуждать особенности характера, давайте говорить по существу если вам это интересно, если не интересно, то можно закончить беседу.. авторФункция может дать значение ДО момента физического создания записи. Поле Identity только ПОСЛЕ. Это два принципиально разных подхода. я это понимаю не хуже вас поверте, и не просто понимаю но применял, лично, но поля - счетчики имеются, -> с ними можно работать так же как и с полями ident в SQL, не верите мне, подключите ORACLe поработайте проверте, но не делайте своих умозаключений относительно собеседника. авторТ.е. поля типа Identity вообще не используются, а код записи формируется на стороне клиента. мой ответ основывался на том, что таблиц VFP у нас нет(если проект вообще не на VFP). авторНе надо путать права доступа к данным и интерфейс. Это два разных направления. Да, они взаимосвязаны, но это не одно и то же я и не путаю, это было ваше предположение, я просто вам разьяснил, что есть привелегии базы, а есть привилегии системы(программы). Есть люди которые не совсем понимают с первого раза что им говорят, поэтому приходится повторять. :-)) авторВы уверены, что программированием - это то, чем Вам стоит заниматься? По сути Вы сказали: Программист не рашает задачи, он представляет (показывает) решения программы. А саму программу кто пишет? Вы показывали то, что возвращает профайлер. Где этот код в RV? Надо думать, он его как-то сам сформировал. На основании чего? На основании тех данных, которые были введены и с учетом настроек сделанных при создании структуры RV. Т.е. RV сформулировал (создал) запрос к серверу, передал ему этот запрос, получил ответ, трансформировал этот ответ в соответсвующий вид. Это еще не считая того, что делает RV на стороне клиента ДО формирования запроса серверу. я вообще говорил о задачах приложения(программы), т.е. расчет начисления 13-ой зарплаты, или расчет посещаемости студентами лекций и т.д. я говорил о расчете - вы опять не правильно меня поняли и сделали заявления о моей профнепригодности. Я вообще не говорил о внутренней работе RV и ODBC. авторДело в том, что большинство людей не могут ясно выражать свои мысли да и еще дело в том,что некоторые люди плохо понимают что им говорят, приходится обьяснять и обьяснять.. авторВы демонстрируете потрясающую безграмотность и самоуверенность именно в программировании. - вы демонстрируете потрясающую грамотность в одной узкой области... и самоуверенность основанную на знании этой узкой области, если бы вам в течении года приходилось по несколку раз пересаживаться на разные СУБД, я не знаю, готовы ли вы были бы так на вскидку цитировать коды програм, написанных вами, приводить куски документации для примера, говорить о конкретных приемах премененных в той или другой системе. Я сомневаюсь что человек эрудированный в разных областях знаний, способен на вскидку возпроизвести теорию относительности, и тут же сесть за доказательство теоремы(гипотезы) ферма.. а потом расказать об особенностях воздействия укусов мухи ЦЦ крупно-рогатого скота на биржевые котировки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 20:33 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
OopyrДа в общем-то необязательно. Ведь я все равно REQUERY() буду делать - она и проявится. А вот значение ключевого поля мне нужно. Чтобы найти эту новую запись. А какое отношение имеет хранимая процедура сервера на добавление к REQUERY() ? Или вы используете RV и SQLEXEC вместе? Или я чего-то не понимаю? С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 20:41 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Aleksey-K Я пытаюсь выяснить как делать в обоих случаях. А потом выбрать вариант, который мне понравится. Есть общая задача. Фоксовский грид показывает данные с SQL Server. Эти данные представлены в фоксе RV, CAD или курсором - не важно. Условно назову эти данные выборкой. Рядом с гридом кнопка "Добавить". Юзер её нажимает, всплывает форма, заполняются поля, юзер нажимает кнопку "Сохранить". После сохранения нужно, чтоб указатель записи грида встал на вновь добавленную запись. Здесь есть 2 пути: 1. Кинуть новую запись прямиком в SQL. Но тогда я её не увижу в гриде, пока не сделаю REQUERY(). После этого указатель будет на первой записи выборки. Тут-то мне и поможет ХП, возвращающая ключ. Но если в таблице 25 полей, то надо иметь ХП с 25-ю параметрами, что превращается в кошмар для программиста. 2. Вставлять записи в выборку, а потом делать TABLEUPDATE(). Гораздо удобнее для программиста. Но ключ-то генерируется на сервере, а в выборке он остаётся 0. Это вынуждает меня делать REQUERY(). Указатель идёт на первую запись и как мне теперь найти ту запись, что я только что вставил? SCOPE_IDENTITY не поможет. @@IDENTITY тоже может вернуть совершенно левый ключ. В общем по варианту 1 понятно как поступать. А вот по варианту 2 - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 21:17 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Oopyr... Здесь есть 2 пути: 1. Кинуть новую запись прямиком в SQL. Но тогда я её не увижу в гриде, пока не сделаю REQUERY(). Каким образом вам поможет REQUERY() если вы получили выборку с сервера через SQL pass-through. Я делаю не так. Я через ХП добавляю запись на сервер и получаю ее. А потом добавляю в локальный курсор INSERT INTO ... VALUES (...). Но приусловии, что вся работа с сервером происходит через pass-through (SQLEXEC). С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 21:47 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Каким образом вам поможет REQUERY() если вы получили выборку с сервера через SQL pass-through. То есть мы о разных вещах говорили. Я имел ввиду RV или CAD. В Вашем варианте получается дублирование вставки: один раз в SQL, второй - в локальный курсор. Так? На мой взгляд нетривиальный подход, поэтому я не сразу понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 22:33 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
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') получите сразу новую запись для работы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 22:43 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Oopyr Каким образом вам поможет REQUERY() если вы получили выборку с сервера через SQL pass-through. То есть мы о разных вещах говорили. Я имел ввиду RV или CAD. В Вашем варианте получается дублирование вставки: один раз в SQL, второй - в локальный курсор. Так? На мой взгляд нетривиальный подход, поэтому я не сразу понял. Вы все-таки меня не поняли. Я не использую технологии RV и CAD. Только pass-through (PT). Никакого дублирования нет. Курсор локальный НИКАК не связан с сервером, а есть результат работы хранимой процедуры, вызванной через PT. Обновление происходит СНАЧАЛА на сервере через хранимую процедуру и после УСПЕШНОГО завершения работы хранимой процедуры на сервере, она возвращает добавленную (обновленную запись), которую я добавляю (обновляю ) в локальном курсоре через INSERT INTO ...(REPLACE) Вы же писали, что: OopyrЭти данные представлены в фоксе RV, CAD или курсором - не важно. Условно назову эти данные выборкой.. Т.е. вы не оговорили, как получили локальный курсор. Вот я и обратил ваше внимание, что если локальный курсор не связан с "сервером", он не будет автоматически обновляться при REQUERY(). С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 23:02 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
OopyrЯ имел ввиду RV или CAD Если говорить о RV или CAD, то однозначно корректного решения нет. По крайней мере, пока у меня ничего не получилось. Есть решения, применимые при определенных ограничениях. Собственно, есть 2 принципиальных способа решения: 1) Прочитать номер соединения и через SQLExec() взять @@IDENTITY. Недостаток очевиден. Не факт, что получишь значение для текущей таблицы. SCOPE_ITENTITY() брать бессмысленно. Другой scope. Всегда будет возвращать NULL Работает, если у таблицы нет триггеров на вставку, которые сами вставляют записи в таблицы с полями IDENTITY 2) Ввести в таблицу дополнительное поле (или набор полей), позволяющее однозначно идентифицировать новую запись в текущей выборке RV или CAD. После добавления новой записи и перезапроса искать новую запись опираясь на это дополнительное поле. Собственно, все это громадное обсуждение вертится вокруг второго способа. Вводится дополнительное поле - идентификатор пользователя (owner_id). В системе пресекаются попытки войти двум пользователям с одним значением owner_id. Тогда новая запись - это запись с максимальным значением ID в пределах одного значений owner_id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 00:25 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Ну теперь понятно. Собственно ещё есть способ 3) Вернуться к старым временам и генерить ключ на клиенте. В SQL ведь совсем необязательно иметь поле identity в каждой таблице. Можно и обычный integer назначить на роль primary key. Главное уникальность обеспечить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 00:44 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
FoXXX Проблема в том, что Вы непоследовательны и забывчивы. Вас все время "сносит" в сторону от основной темы, Вы все время намекаете на мою некомпетентность, у Вас все время появляются новые ограничения, Вы все время читаете не то, что я написал и т.д. и т.п. По поводу Вашего стиля работы с RV - я уже давно все понял, многократно повторил самыми разными способами. Указал на Ваши ошибки. Посмотрите мой ответ Oopyr . Это для меня было очевидно с самого первого Вашего поста. Из Вас буквально клещами приходилось тянуть, что да, действительно, есть такие ограничения. Разговор слепого с глухим. Нет смысла дальше что-то обсуждать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 01:11 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 07:37 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
FoXXX Мда, что-то не густо с примерами кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 10:34 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Oopyr Здесь есть 2 пути: 1. ... 2. Вставлять записи в выборку, а потом делать TABLEUPDATE(). Гораздо удобнее для программиста. Но ключ-то генерируется на сервере, а в выборке он остаётся 0. Это вынуждает меня делать REQUERY(). Указатель идёт на первую запись и как мне теперь найти ту запись, что я только что вставил? В общем по варианту 1 понятно как поступать. А вот по варианту 2 - нет. Прогони код из поста 2436139 - CAD в VFP 9 решает вопрос о передаче ключевого поля, присвоенного сервером в фокс без requery() всего курсора. Сам, правда с CAD я пока на 8 фоксе работаю, там такого прибамбаса еще нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 10:38 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Если говорить о RV или CAD, то однозначно корректного решения нет. Собственно, есть 2 принципиальных способа решения: 1)... 2) Ввести в таблицу дополнительное поле (или набор полей), позволяющее однозначно идентифицировать новую запись Согласен. По крайней мере в 8 и более старых версиях фокса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 10:51 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
PaulWist FoXXX Мда, что-то не густо с примерами кода не густо, на вскидку, надеюсь критики кода нет?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 11:36 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
FoXXX PaulWist FoXXX Мда, что-то не густо с примерами кода не густо, на вскидку, надеюсь критики кода нет?? Дык, что критиковать, если на мои вопросы я не увидел ни строчки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 11:53 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
PaulWistДык, что критиковать, если на мои вопросы я не увидел ни строчки. ааа... а были вопросы??? если по поводу RV то вродебы все ответил.. процедуры на VFP не запускаем, все работает на сервере, у нас только результаты через RV. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 12:09 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
FoXXX PaulWistДык, что критиковать, если на мои вопросы я не увидел ни строчки. ааа... а были вопросы??? если по поводу RV то вродебы все ответил.. процедуры на VFP не запускаем, все работает на сервере, у нас только результаты через RV. Что-то у меня тоже дежавю развивается , где-то в этой ветке уже читал - получается разговор слепого с глухим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 13:05 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
PaulWist Что-то у меня тоже дежавю развивается , где-то в этой ветке уже читал - получается разговор слепого с глухим. значит вопросов нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 13:31 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
FoXXX PaulWistДык, что критиковать, если на мои вопросы я не увидел ни строчки. ааа... а были вопросы??? если по поводу RV то вродебы все ответил.. процедуры на VFP не запускаем, все работает на сервере, у нас только результаты через RV. У меня есть вопросы, можно? :) Данные вы извлекаете с помощью RV, которые могут быть построенны на основе не только базовых таблиц сервера баз данных (MS SQL, ORACLE и пр.), но и на основе объектов сервера типа View. А вот при желании обновить данные (добавить на сервер), вы вызываете соответствующие хранимые процедуры сервера? Я правильно вас понял? С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 13:43 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Aleksey-K FoXXX PaulWistДык, что критиковать, если на мои вопросы я не увидел ни строчки. ааа... а были вопросы??? если по поводу RV то вродебы все ответил.. процедуры на VFP не запускаем, все работает на сервере, у нас только результаты через RV. У меня есть вопросы, можно? :) Данные вы извлекаете с помощью RV, которые могут быть построенны на основе не только базовых таблиц сервера баз данных (MS SQL, ORACLE и пр.), но и на основе объектов сервера типа View. А вот при желании обновить данные (добавить на сервер), вы вызываете соответствующие хранимые процедуры сервера? Я правильно вас понял? С уважением, Алексей. Hi Алексей! давайте сначала уточним, о чем вы спрашиваете, что вы понимаете под словами обновить данные? если внесение новых записей в таблицы, то мы уже об этом гворили здесь, просто через RV, или я вас не правильно понимаю? с уважением FoXXX ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 15:28 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Так..., вопрос на вопрос. Что за привычка... Вы не ищите подвоха в моем вопросе! Его его там! Давайте тогда для простоты будете отвечать на мои вопросы по частям: 1. Данные вы извлекаете с помощью RV, которые могут быть построенны на основе не только базовых таблиц сервера баз данных (MS SQL, ORACLE и пр.), но и на основе объектов сервера типа View? Это так? С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 15:33 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Aleksey-KТак..., вопрос на вопрос. Что за привычка... Вы не ищите подвоха в моем вопросе! Его его там! Давайте тогда для простоты будете отвечать на мои вопросы по частям: 1. Данные вы извлекаете с помощью RV, которые могут быть построенны на основе не только базовых таблиц сервера баз данных (MS SQL, ORACLE и пр.), но и на основе объектов сервера типа View? Это так? Алексей, молодец - 5 баллов. PS: РжуНеМогу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 15:42 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
[quot PaulWist Алексей, молодец - 5 баллов. PS: РжуНеМогу [/quot] матри не аппп не лопни.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 16:17 |
|
||
|
VFP + SQL поле IDENTITY
|
|||
|---|---|---|---|
|
#18+
Aleksey-KТак..., вопрос на вопрос. Что за привычка... Вы не ищите подвоха в моем вопросе! Его его там! Давайте тогда для простоты будете отвечать на мои вопросы по частям: 1. Данные вы извлекаете с помощью RV, которые могут быть построенны на основе не только базовых таблиц сервера баз данных (MS SQL, ORACLE и пр.), но и на основе объектов сервера типа View? Это так? С уважением, Алексей Алексей! Хотел бы дать пояснения 1.во первых я не могу приводить конкретных примеров, в силу того что эту переписку веду из отпуска, а не из офиса, поэтому под рукой ничего нет.. 2.как я уже говорил, у нас есть програмист БД, который занимется серверами и лучше меня знает эту кухню, разные там тонкости типа BOLа, я как бы больше занимаюсь идеалогией, постановкой, "руководством", самому в этом копаться уже лень, но общие принципы могу прокоментировать 3.подвоха не ищу, тяжело отвечать не правильно поняв вопрос, мало-ли что вы имеете ввиду, как например чел. спросил о расчетах, а имел ввиду работу RV, вот и думай тут.. или чел. о транзакциях говорит, а у нас клиент на автомате выставленно в ODBC 4.если вам для пользы дела интересно, то общие принципы обрисовать могу. если просто пофлудить - то это лучше к ПаУлю, с ним пофлудить и посмеяться можно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 16:34 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33603745&tid=1592046]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
205ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
81ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 589ms |

| 0 / 0 |
