Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.21;
Скачать: CL | DM;

Вниз

Аналог следующего 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.


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


> Medbe}I{onok XML ©   (06.08.08 13:38) [39]

Ок. У каждой строки, к примеру, есть флаг - напечатана она или нет. Необходимо вывести строки, которые до этого не были напечатаны? Как тогда нумеровать?


 
Ega23 ©   (2008-08-06 13:43) [42]


> Ок. У каждой строки, к примеру, есть флаг - напечатана она
> или нет. Необходимо вывести строки, которые до этого не
> были напечатаны? Как тогда нумеровать?


Заведи локальное поле Statusб в которое пиши по мере необщрдимости - напечатано, или нет.


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


> Заведи локальное поле Statusб в которое пиши по мере необщрдимости
> - напечатано, или нет.

Потом выборку по этому полю, а нумеровать то как?


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


> Пример из жизни


Хреновый пример, за отмазку не канает)

Прежде чем отправить задание на печать Ворд засосал из файла весь документ.


> нужно ли тебе видеть все остальные страницы, чтобы продолжить
> печать, или достаточно в диалоге печати задать диапазон
> печати "300-1000"?


Мне не нужно. А вот Ворду нужен весь документ, чтобы расчитать, с какого "места" начинается 300-я страница.

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


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


> По ассоцииации с СУБД считай что Ворд являет собой при этом
> клиента.

А ты считай, что СУБД это Ворд, а клиент это ты. Ты знаешь что тебе нужны страницы с 300 по 1000. Ты делаешь запрос "300-1000", получаешь (через принтер) свой результат пронумерованный с 300 по 1000. Ты ведь не будешь печатать весь документ, затем выбирать из него нужные тебе страницы.


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

пациент безнадежен. мы его теряем


 
Palladin ©   (2008-08-06 14:16) [47]

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


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

Ему про фому, а он все про ерему гнет)


> Dmitry S ©   (06.08.08 13:52) [45]



> изза 10 строк тащить из базы еще 15000 .. нумеровать


Это твои слова ?

Так вот Ворд именно это и делает)

И НЕ хранит в контейнере нумерацию листов)


 
Dmitry S ©   (2008-08-06 14:28) [49]


> И НЕ хранит в контейнере нумерацию листов)

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


> Palladin ©   (06.08.08 14:16) [47]

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

Отнеситесь к задаче не как к реальной, а как к тестовой на каком либо экзамене.


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


> Вообще то хранит


Где ? Показывай ..


 
Dmitry S ©   (2008-08-06 14:42) [51]

В поле, как и в любом другом.
Вопрос не в этом!



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

Текущий архив: 2008.09.21;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.018 c
15-1217557079
Slider007
2008-08-01 06:17
2008.09.21
С днем рождения ! 1 августа 2008 пятница


2-1218188554
начинающий
2008-08-08 13:42
2008.09.21
Связи


2-1218107041
_Джо_
2008-08-07 15:04
2008.09.21
StrToDate


2-1218546159
darova
2008-08-12 17:02
2008.09.21
Восстановить подключение к сетевому диску


15-1217233243
Олег
2008-07-28 12:20
2008.09.21
Визуализировать компонент