Форум: "Начинающим";
Текущий архив: 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