Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.21;
Скачать: [xml.tar.bz2];

Вниз

Аналог следующего update на Access-e   Найти похожие ветки 

 
Dmitry S ©   (2008-08-05 18:28) [0]

MySQL:

SET @i=0;
UPDATE `table` SET `field`=(@i:=@i+1) WHERE ... ORDER BY [name];

Как сделать тоже самое на Access-e?
Устно говоря, задача такая: пронумеровать по порядку таблицу в при определенной сортировке.


 
Dmitry S ©   (2008-08-05 18:40) [1]

кавычки у name, конечно, должны быть другие.


 
Johnmen ©   (2008-08-05 21:35) [2]

Странного желаете, барин...


 
Сергей М. ©   (2008-08-06 08:33) [3]


> Как сделать тоже самое на Access-e?


Что подразумевается под Access - контейнерный формат или само приложение ?

А вообще см. [2] )


 
Dmitry S ©   (2008-08-06 10:22) [4]


> Что подразумевается под Access - контейнерный формат или
> само приложение ?

Standart Jet DB через ADO имею ввиду :)


> Странного желаете, барин...

А что странного? Очень удобно.


 
Сергей М. ©   (2008-08-06 10:26) [5]


> Standart Jet DB


Нет там такого аналога.


 
Dmitry S ©   (2008-08-06 10:36) [6]


> Сергей М. ©   (06.08.08 10:26) [5]

Есть идеи как выполнить задачу?


 
Сергей М. ©   (2008-08-06 10:49) [7]

Сначала поясни, в чем заключается "удобство" ..


 
Dmitry S ©   (2008-08-06 11:20) [8]

Я об использовании переменных вообще.
Например, решение данной задачи я пока не вижу проще, точнее вообще пока никак не вижу, кроме как выполнить запрос SELECT, пронумеровать вручную, а потом несколько UPDATE-ов.


 
Dmitry S ©   (2008-08-06 11:27) [9]

Вот такой, например, вариант еще:

UPDATE [table] SET [pos]=0 WHERE <...>;

UPDATE [table] SET [pos]=1 + (SELECT COUNT(*) FROM [table] WHERE <...> AND [pos]<>0) WHERE <...> ORDER BY <...>;



Если, конечно, Jet поддерживает UPDATE ... ORDER BY ...;


 
stas ©   (2008-08-06 11:29) [10]

Dmitry S ©   (06.08.08 11:20) [8]
А вчем смысл задачи?
может пойдет просто добавления поля счетчика? или нумерация на клиенте?


 
Сергей М. ©   (2008-08-06 11:30) [11]


> Dmitry S ©   (06.08.08 11:20) [8]


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


 
Ega23 ©   (2008-08-06 11:39) [12]

Делай нумерацию на клиенте. Нафига на сервере-то?


 
Dmitry S ©   (2008-08-06 11:52) [13]

Есть документ, в нем строки, грубо говоря. Строки в документе структурированы в виде дерева.

[doc] - таблица документов (Поля: doc_id, name, ...)
[line] - таблица строк (Поля: line_id, doc_id, linegroup_id, pos, name, ...)
[linegroup] - таблица для задания структуры. Она общая для всех документов. (Поля: linegroup_id, linegroupparent_id, name).

В line содержатся строки всех документов. Принадлежность строки документу определяется полем doc_id.

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

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

Вот в общих чертах.


 
sniknik ©   (2008-08-06 11:54) [14]

сделать можно, правда с ограничениями...
первое - уникальные значения у сортируемого поля/полей. (фактически требуется наличие ключа, чего в [0] и далее не видно)

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

> SET @i=0;
> UPDATE "table" SET "field"=(@i:=@i+1) WHERE ... ORDER BY [name];
вот какой смысл?
пронумеровать физически в таблице часть данных (имеется WHERE) если по определению sqlсерверу на любую нумерацию плевать. т.е. серверу это не нужно.
пользователю? а ему оно нафиг? ктото например пронумеровал в таблице всех с именем "сергей", и тут же, с именем "марина", или вообще не с именем а всех женского пола... что ему даст тот бардак, что в результате будет в этй "нумерации"? или предполагается выборку делать сразу после нумерации? тогда почему не нумеровать именно выборку (тем более там это уже есть), нафига сохранять бессмысленные вне контекста результаты в базу?

> Вот в общих чертах.
не убедительно. не обьясняет нафига оно физически в базе.


 
sniknik ©   (2008-08-06 12:07) [15]

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


 
Dmitry S ©   (2008-08-06 12:54) [16]


> до меня дошло!

Не правильно дошло, зря ветку переместил.

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

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

А также для быстрого поиска строки с определенным номером. Пользователь вводит номер, по которому осуществляется поиск. Строить дерево при этом очень накладно :(

И вообще вопрос не о том, как планировать структуру БД, а вполне конкретный: Как пронумеровать по порядку таблицу при определенной сортировке?


 
Ega23 ©   (2008-08-06 12:58) [17]


> Как пронумеровать по порядку таблицу при определенной сортировке?


Вот смотри. Я получил НД на клиент. Дальше я могу сделать с ним всё, что хочу. Могу наложить фильтр, тогда часть записей скроется. Могу наложить правило(а) сортировки. Причём применять их по банальному OnTitleClick грида. И каждый раз порядок представления НД будет другим.

Так что ты хочешь получить?


 
Medbe}I{onok XML ©   (2008-08-06 12:59) [18]

Пользователь вводит номер, по которому осуществляется поиск.

Юзер ввел десять и надо найти десятую запись?
Для этого не надо ничего нумеровать.


 
Сергей М. ©   (2008-08-06 13:00) [19]


> Как пронумеровать по порядку таблицу при определенной сортировке?


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

Сервер тебе отдал НД в требуемой тебе сортировке, получи его и пронумеруй полученное как тебе надо, в чем проблема-то ?)


 
Medbe}I{onok XML ©   (2008-08-06 13:01) [20]

в чем проблема-то ?)

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


 
Dmitry S ©   (2008-08-06 13:05) [21]


> Ega23 ©   (06.08.08 12:58) [17]

Вот к примеру задачи такая:
1. Необходимо напечатать 10 строк начиная с N-ой - делается просто с помощью LIMIT-а или его аналога, если он есть в Access-е.

2. А, например, необходимо напечатать строки определенной группы (т.е. записи выбраны не очевидным условием WHERE), а при печати строки важно выводить ее номер. А изза 10 строк тащить из базы еще 15000 (в среднем), нумеровать, а потом фильтровать не хочется - это долго. Поэтому мной и было решено поместить эти данные в таблицу.


 
Dmitry S ©   (2008-08-06 13:06) [22]


> Сервер тебе отдал НД в требуемой тебе сортировке, получи
> его и пронумеруй полученное как тебе надо, в чем проблема-
> то ?)

см [21].2


 
Ega23 ©   (2008-08-06 13:09) [23]


> 2. А, например, необходимо напечатать строки определенной
> группы


Блин. Я нихрена не понял, что тебе всё-таки надо.


 
Medbe}I{onok XML ©   (2008-08-06 13:10) [24]

а при печати строки важно выводить ее номер.

Нумерация на печати делается средствами репортера.


 
Johnmen ©   (2008-08-06 13:11) [25]


>  Необходимо напечатать 10 строк начиная с N-ой - делается
> просто с помощью LIMIT-а или его аналога

Хм... Как связан предикат LIMIT с печатью?
:)


 
Dmitry S ©   (2008-08-06 13:15) [26]

Удалено модератором


 
Medbe}I{onok XML ©   (2008-08-06 13:15) [27]

ну как как.
печатать же можно только то, что видишь в гриде.
"что вижу, то и пою"


 
Ega23 ©   (2008-08-06 13:16) [28]


> Оно вам надо, знать для чего я это делаю? Если делаю, значит
> оно так нужно мне. Какие еще проблемы?


Да делай, кто мешает-то? Ты сначала проблему сформулируй. из твоего [21] нихрена не понятно.


 
Medbe}I{onok XML ©   (2008-08-06 13:16) [29]

Если делаю, значит оно так нужно мне.

нужно нумеровать строки - нумеруй. в шаблоне отчета.


 
Сергей М. ©   (2008-08-06 13:18) [30]


> записи выбраны не очевидным условием WHERE


Это еще что за зверь ?)


> изза 10 строк тащить из базы еще 15000


А никто и не заставляет тебя их всех тащить.

С другой стороны, как юзер узнает , что ему нужно оперировать с M записями, начиная с N-ной, пока он не увидит все K записей, среди которых фигурируют эти самые N интересующих его записей ?


 
sniknik ©   (2008-08-06 13:19) [31]

> Какие еще проблемы?
хотели реально помочь...

с описанными ограничениями
UPDATE [table]
SET [field]=DSum(1, "[table]" , "name<="""+table.name+"""")


 
sniknik ©   (2008-08-06 13:20) [32]

> с описанными ограничениями
вернее с одним... на второе плюнул. ;(


 
Dmitry S ©   (2008-08-06 13:21) [33]


> Ega23 ©   (06.08.08 13:16) [28]

Я упростил задачу до минимума еще в [0], зачем усложнять?

Специально для Medbe}I{onok XML. В данной задаче не используются ни компоненты-отчеты, ни даже DB-компоненты, за исключением самого TADOConnection, конечно.


 
Сергей М. ©   (2008-08-06 13:22) [34]

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


 
Medbe}I{onok XML ©   (2008-08-06 13:22) [35]

а кто здесь недавно про печать строк говорил?


 
Medbe}I{onok XML ©   (2008-08-06 13:24) [36]

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

то есть цикл и вывод на tprinter ?
Монопенисуально.
Текущий номер строки все равно есть.


 
Ega23 ©   (2008-08-06 13:29) [37]


> Я упростил задачу до минимума еще в [0], зачем усложнять?


Я ещё раз тебя спрашиваю:

Я получил на клиент НД в таком виде:

ID  Name  Value
__ _____  ____
1  A        18
2  B        15
3  C        44


Теперь на клиенте я отсортировал эти данные по Value (имею право)

ID  Name  Value
__ _____  ____
2  B        15
1  A        18
3  C        44


Нумерация сбилась нафиг.
Вопрос: зачем её тянуть с сервера, если на клиенте один хрен придётся перестраивать? Это и удобнее и проще и идеологически более правильно.


 
Dmitry S ©   (2008-08-06 13:32) [38]


> С другой стороны, как юзер узнает , что ему нужно оперировать
> с M записями, начиная с N-ной, пока он не увидит все K записей,
>  среди которых фигурируют эти самые N интересующих его записей
> ?

Легко.
Пример из жизни: Ты печатаешь Word-документ из 1000 страниц с нумерацией. На 300ой странице принтер дает сбой. Ты видишь, что последняя страница 299, нужно ли тебе видеть все остальные страницы, чтобы продолжить печать, или достаточно в диалоге печати задать диапазон печати "300-1000"? Понимаешь о чем я?


> sniknik ©   (06.08.08 13:19) [31]

Вот это уже интереснее. Задача усложняется еще тем, что простым name<=""table.name"" тут не обойтись, потому что в задаче сортировка задается по полям двух таблиц. Но от этого уже можно исходить! Спасибо.


 
Medbe}I{onok XML ©   (2008-08-06 13:38) [39]

чтобы продолжить печать, или достаточно в диалоге печати задать диапазон печати "300-1000"? Понимаешь о чем я?

inputbox("скажите начальный номер" .....)

dataset.MoveBy();
while not eof do
вывод на принтер;
инкремент номера строки;
next;
end;


 
Dmitry S ©   (2008-08-06 13:40) [40]


> Ega23 ©   (06.08.08 13:29) [37]

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



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.09.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.1 c
6-1193322445
Nucer
2007-10-25 18:27
2008.09.21
Проблема с TServerSocket


2-1218362895
mokmoc
2008-08-10 14:08
2008.09.21
TStatusBar, размер TStatusPanel


2-1218377845
mefodiy
2008-08-10 18:17
2008.09.21
Количество записей в отфильтрованной ADOQuery


2-1218300547
Putnik
2008-08-09 20:49
2008.09.21
Сохранение массива в БД MS Access


2-1218107846
Newss
2008-08-07 15:17
2008.09.21
Вращение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский