Преместване на записи - нагоре - и - надолу

Задача:
Необходимо е да преместите записа в таблицата "нагоре", "надолу". Всъщност нищо сложно. същността на въпроса е начинът на изпълнение. Струваше ми се, че моят не е съвсем рационален.

Ако имате време - погледнете.

Знам, че няма нищо по-ужасно да се разбере кода на някой друг, улесних го, като вмъкнах коментари.

Опитах се да реша:Използвани компоненти:
qQUERY: TQuery

ТАБЛИЦА структура:
NUM - Код за автоматично увеличаване
ИМЕ - Име
POS - Позиция (чрез която действително се определя позицията на записа)

Използвани променливи:
PR - POS на предишния запис
CR - POS на текущия запис
- NUM от предишния запис
CN - NUM от текущия запис
BM - Отметка за определяне на мястото, където курсорът трябва да отиде след внедряването

Ето пример за действие на бутон (въпреки че го имам в отделна процедура)

процедура TForm1.bbUpClick (Изпращач: TObject);
var PR, CR, PN, CN: Цяло число;
BM: TBookmark;
започнете
// Проверете дали записът не е първият
ако qQUERY.RecNo = 1, тогава излезте;
// Дефиниране на стойности на променливи
// Текущ запис
CN: = qQUERY ["NUM"];
CR: = qQUERY ["POS"];
qQUERY.Prior;
// Запомнете позицията на курсора
BM: = qQUERY.GetBookmark;
// Предишна публикация
PN: = qQUERY ["NUM"];
PR: = qQUERY ["POS"];
// Актуализиране на новата стойност за текущия и предишния запис
qQUERY.Затваряне;
qQUERY.SQL.Text: = "АКТУАЛИЗИРАНЕ НА ТАБЛИЦАТА НАСТРОЙКА POS =" + IntToStr (CR) + "КЪДЕ NUM =" + IntToStr (PN);
qQUERY.ExecSQL;

qQUERY.Затваряне;
qQUERY.SQL.Text: = "АКТУАЛИЗИРАНЕ НА ТАБЛИЦА НАСТРОЙКА ПОС =" + IntToStr (PR) + "КЪДЕ NUM =" + IntToStr (CN);
qQUERY.ExecSQL;

// Показване на данни, сортирани за показване
qQUERY.Затваряне;
qQUERY.SQL.Text: = "ИЗБЕРЕТЕ * ОТ ПОРЪЧКА НА МАСА ПО ПОС";
qQUERY.Open;
// Поставете курсора върху желания запис
qQUERY.GotoBookmark (BM);
qQUERY.FreeBookmark (BM);
край;
Преместването надолу се извършва по изображение и подобие - така че не давам кода.

Правите глупости, както повечето от тези, които, без да навлизат в детайлите на теорията на релационните бази, базирани на принципа на ISAM (метод на индексно-последователен достъп), се опитват, използвайки ги, да измислят собствено триъгълно колело.

1. Защо да сменя 2 записа? Достатъчно за 1. И за 1 път можете да го поставите точно на правилното място, а не да се трепвате със стъпки, като пръскате базата данни на всяка стъпка.
2. Защо е всичко това?

Подигравка - съжалявам, сгреших форум! Нарича се още „Професионалисти за споделяне на опит“!
Сергей 13
1) Хвърлете няколко реда
2) Това е програма за контрол на запасите и приятел на управителя на склада иска да оцени групи стоки по този начин. Премествайте ги нагоре и надолу и непрекъснато спазвайте желания ред.

> 1) Хвърлете няколко реда

Ами точно сега. С думи - моля, направих го по този начин. Попитан потребителят след кой запис иска да види преместения запис. Наблюдавах рейтинга на желания запис и следващия и зададох рейтинга на преместената средна стойност. Това трябва да се направи в набора от данни, а не чрез директни заявки към базата данни, за да не се препрочита набора от данни след всяко кихане.

PS: А шефът на склада е глупак. Тогава той самият ще се обърка и ще въведе едно и също нещо 10 пъти само с единствената причина, че не е намерил чехли в началото на списъка.


> А управителят на склада е глупак.

И ако програмист бърза да изпълни изискванията на такъв шеф, тогава кой е програмистът ?
Джуджу предположи ?
Правилно.


> Джуджу (13.11.06 15:18)

Настроики:
1. Направете полето "Приоритет", покажете го в мрежата и разрешете редактиране (можете да използвате отделен формуляр). И нека шефът прави каквото си иска с него. В същото време трябва да добавите това поле към опциите за сортиране
2. Можете да актуализирате таблицата с една актуализация, като изместите номерацията. След това препрочетете набора от данни. IMHO - ще бъде по-бързо.

ANB
Вариант 1 - изключен - последиците ще бъдат най-лоши.
Задачата е ясна - или чрез „Ctrl“ + „стрелка нагоре/надолу“, или чрез отделни бутони на формуляра за преместване на записа.
Вариант 2 не е ясен с думи. как
> Можете да актуализирате таблицата с една актуализация, като преместите номерирането?

> задачата на програмиста е да се опита да задоволи това желание

И ако той иска да преведе пари по сметката си, тогава вие също ще задоволите това желание?

Затова направете това, което ни помолите.


> 2-ри вариант не е ясен с думи. как
Цитирано1 >> Можете да актуализирате таблицата с една актуализация, като преместите номерирането?
>

Направих го в отделен ListBox "д. Разпръснах ги по приоритет, плъзнете DragAndDrop", както е необходимо и при затваряне на формуляра UPDATE, полето "приоритет" в съответствие с позицията в ListBox "e.

Аз лично изпращам такива шефове и "програмистите", които се мятат до тях в "горската степ" и "Мореокиян" - точното място, нека се скитат.

Анатолий Подгорецки
> [9]
> И ако той иска да преведе пари по сметката си, тогава вие също ще задоволите това желание?

Зависи как се чувствате по този въпрос.
Не знам колко лесно е да намерите клиенти. И колко адекватно те плащат за вашата работа. Държа на всички.
Има задача за програмиста. Оценява се в парично изражение. Струва си да се спрем на това. И ако го оцените в морален план, ще загубите работата си.

> [10]
> Затова направете това, което ни помолите.
направих. Моята версия работи - но имам съмнения относно рационалността и правилността на подхода към задачата! Няма да замина от чужди сили. Преди да задам въпрос, се опитвам да реша всичко сам. И ако гуруто не иска да отговори - той не отговаря - това е всичко. Някаква нездравословна реакция в понеделник нещо!
ANB
Всичко е наред. Вече не зареждам.
mfender
Наскоро направих програма и организирах движение в ListBox-e. Ето база данни на Access и използвам TQuery като набор от данни.

Подигравка - всеки има различна позиция. За мен това е препитание. Ако човек плаща пари, получава това, за което плаща, това е всичко.

Но като цяло темата на форума не е за това. И забележете: Заявки като: „Напишете процедурата за мен“ - не звучи тук. защо е реакцията?


> Някаква нездравословна реакция в понеделник!

Реакцията е нормална за тези, които се опитват да превърнат очевидната и правилно заложена функционалност в съответствие с "цвета на гащичките си".
Не разбирате какво е ISAM ?
Прочети.
Или отидете, както беше казано, към контроли, които не са DBAware.

> И ако го оцените в морален смисъл, ще загубите работата си.

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

изберете * от Поръчка по каталог от поз

актуализиране на каталог
задайте Pos =
случай
когато Pos =: Oldpos
след това: Newpos
когато: Newpos>: Oldpos
след това Pos - 1
кога: Newpos

Тук наскоро друг изобретател на велосипеди се опита да прокара всеки запис, от който се нуждае, в горната DBgrid.

Да, всичко е възможно, ess-but.
Но е по-добре да не бързате да изпълнявате "волята" на клиента, а да работите с него и да го убеждавате в целесъобразността на интерфейсите, разработени от ИТ общността.


> Реакцията е нормална за тези, които се опитват очевидното и правилното
> включете вградената функционалност, за да съответства на "цвета на вашите гащи".
>
> Не разбирате какво е ISAM ?

Защо си привързан към човек. В този случай е по-бързо да напишете това, което шефът иска, отколкото да убедите, че е погрешно. Ако шефът получи криви данни, това е неговият проблем. След това срещу заплащане ще бъде ремонтиран.

Ето само съмнения относно осъществимостта на поетата задача - складът не е шега работа.

Ех! преди месеци обсади форум с абсолютно същите проблеми! И попаднах на същата стена на неразбиране и презрение. И в крайна сметка никой не попита уважаваните майстори "защо е това?" Ако не знаете защо, няма нужда да давате съвет. Извинете, ако сте обидили някого.

> Джуджу
Разбирам, че полетата не са уникални?

> [21] StriderMan (c) 13-ноември-2006, 19:23> Не знам „защо“ - няма нужда да давате съвет.
телепатите са постоянно във ваканция. и недоволни от отговорите - не питайте.

> [23] StriderMan (c) 13-ноември 2006 г., 19:35> знайте къде ще ви избодат:)
не е задължително. ясно е, че в помощта или документацията. % -)

Да съвестта трябва да бъде.
Ако искате да бъдете обвързани, свържете се с поддръжката.

И тук е моята идея, това е форум и никой не дължи на никого нищо, никой не получава пари за отговори във форумите, те прекарват само личното си време, но също няма задължение.

> Джуджу
алтернативно, евентуално перверзно.
пренесете таблицата в StringGrid, преместете редовете в нея, както искате, актуализирайте основата при затваряне.

Някой бърка форумите с услугите за поддръжка.
И някой не иска да обсъжда, вероятно е по-лесно да обвинява членовете на форума за това, така че, така че ние няма да позволим това да се направи, отидете в службата за поддръжка.