|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
помогите.. с очередью
Всем привет!!!
Делаю малюсенькую бд (акесс) в ней будет вестись очередь на поступление в садик. В ней есть таблица (главная) в ней 4 столбца (первый "кеу", тип счетчик и является ключевым полем) и (три остальных "фамилия", "имя", "сад", типы текстовые). При добавлении новой записи она будет будет добавлятся в конец таблицы и отображатся в низу DBGridEh. А что делать если чел который будет забивать данные пропустит одного ребенка и спохватится когда забьет данные скажем 200 человек хотя пропущенный ребенок должен быть 10 в списке. Помогите пожалуйста очень нужно. |
#2
|
||||
|
||||
Добавь еще одно поле, в котором и будешь держать порядок очереди. Сделай так чтобы оно заполнялось автоматически, а если понадобиться поменять местами 2-х человек, то это нужно сделать как бы отдельной опцией.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
||||
|
||||
Aristarh Dark, добавил еще одно поле (rnomer, тип поля текс) поле заполняется автоматом
Код:
Form1.ADOTable1.FieldValues['rnomer']:=IntToStr((form1.DBGridEh1.RowCount)-1); |
#4
|
||||
|
||||
На самом деле тебе нужно запросом вычислять максимальное значение этого поля и делать новое поле на +1 ... а когда тебе будет нужно сменить порядок то:
Код:
var n:string; n:=Edit1.Text; Table1.Edit; Table1.Locate(n,'rnomer',[]); Table1.FieldByName('rnomer').AsString:=n+'_'; Table1.Post; Table1.Locate(n,'rnomer',[]); Table1.First; while not Table1.Eof do begin Table1.Edit; Table1.FieldByName('rnomer').AsString:=IntToStr(StrToInt(Table1.FieldByName('rnomer').AsString)+1); Table1.Post; Table1.Next; end; Table1.Locate(n+'_','rnomer',[]); Table1.Edit; Table1.FieldByName('rnomer').AsString:=n; Table1.Post; ... примерно так Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Последний раз редактировалось Yurk@, 10.03.2009 в 20:32. |
#5
|
||||
|
||||
При вставке в середину (например в позицию 5) думаю пригодился бы SQL
Код:
UPDATE tablename SET rnomer = rnomer + 1 WHERE rnomer >= 5; |
#6
|
||||
|
||||
Yurk@, я так понял твой код должен менять номер каждой записи
s0Creator, у меня делфи выдает ошибку "несоответствие типов данных в выражении условия отбора" и еще вопросик а можно строку в DBGridEh сдвинуть вверх или в низ ??? |
#7
|
||||
|
||||
Я привел чистый SQL.
Т.е. вместо цикла Код:
while not Table1.Eof do begin Table1.Locate(n,'rnomer',[]); Table1.Edit; Table1.FieldByName('rnomer').AsString:=IntToStr(StrToInt(Table1.FieldByName('rnomer').AsString)+1); Table1.Post; end; |
#8
|
||||
|
||||
Цитата:
Цитата:
|
#9
|
||||
|
||||
s0Creator, я сделал вот так:
Код:
var i,p:integer; begin adoTable1.First; p :=((DBGridEh1.RowCount)-1); for i:=1 to p do begin adoTable1.Edit; Form1.ADOTable1.FieldValues['rnomer']:=IntToStr(form1.dbgrideh1.Row); adotable1.Post; adotable1.Next; end; end; и еще вопросик а можно строку в DBGridEh сдвинуть вверх или в низ, например добавить еще две кнопки, которые отвечали бы за это, к примеру пользователь выделил строку, нажал на первую кнопку и строка поднялась на позицию вверх ??? |
#10
|
||||
|
||||
Цитата:
Кто тебе сказал, что цикл вызывает больше запросов чем SQL`ный UPDATE? В конце концов, если таблица проиндексирована, то цикл сделает ровно столько же телодвижений что и UPDATE. Или я не прав? pesi, по- моему какой- то не рабочий у тебя код... Во- первых ты прогоняешь всю таблицу от начала до конца, вместо прогона с нужной записи, потом делаешь POST на каждом шаге, да и присваиваешь полю rnomer что- то не то... Воспользуйся подсказками s0Creator, его примеры точняк рабочие... З.Ы. Сдвиг вверх и вниз, по аналогии с добавлением новой записи. Последний раз редактировалось TOJluK, 10.03.2009 в 14:19. |
#11
|
||||
|
||||
Цитата:
"UPDATE [имя таблицы] SET [имя измененного поля] = [новое значение] (, [имя следующего измененного поля] = [новое значение]) WHERE [ключевое поле] = [код измененной записи];" |
#12
|
||||
|
||||
Кстати, а не упростит задачу введение поля "Дата и время постановки в очередь" (с сортировкой по нему) вместо rnomer?
|
#13
|
||||
|
||||
Цитата:
POST можно ж сделать и после прогона всего цикла, тогда и получим тот же: UPDATE tablename SET rnomer = rnomer + 1 WHERE rnomer >= 5; т.е. Код:
Table1.Edit; while not Table1.Eof do begin Table1.Locate(n,'rnomer',[]); Table1.FieldByName('rnomer').AsString:=IntToStr(StrToInt(Table1.FieldByName('rnomer').AsString)+1); end; Table1.Post; Последний раз редактировалось TOJluK, 10.03.2009 в 14:57. |
#14
|
||||
|
||||
TOJluK
А Вы проверяли свой код? Код:
Table1.Edit; while not Table1.Eof do begin Table1.Locate(n,'rnomer',[]); Table1.FieldByName('rnomer').AsString:=IntToStr(StrToInt(Table1.FieldByName('rnomer').AsString)+1); end; Table1.Post; метод Post применяется к одной записи находящейся в режиме редактирования а для группового изменения записей применяют блочный режим (и тот для каждой измененной, вставленной, удаленной записи пошлет драйверу свой SQL) |
#15
|
||||
|
||||
Код:
function TCustomADODataSet.LocateRecord(const KeyFields: string; const KeyValues: OleVariant; Options: TLocateOptions; SyncCursor: Boolean): Boolean; var ........... begin CheckBrowseMode; .................... Код:
procedure TDataSet.CheckBrowseMode; begin CheckActive; DataEvent(deCheckBrowseMode, 0); case State of dsEdit, dsInsert: begin UpdateRecord; if Modified then Post else Cancel; end; dsSetKey: Post; end; end; |