Главная страница
    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.


 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.011 c
2-1218521158
Sergey2
2008-08-12 10:05
2008.09.21
Доступ к базе по локальной сети через IP


15-1216559287
Германн
2008-07-20 17:08
2008.09.21
Отправка почты


15-1217264142
Gooler
2008-07-28 20:55
2008.09.21
Как отследить копирование экрана?


15-1217179982
Перебежчик
2008-07-27 21:33
2008.09.21
Как это будет на C#?


11-1193554558
files32
2007-10-28 09:55
2008.09.21
RTTI или как его там в KOL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский