Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.03.2009, 14:52
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию помогите.. с очередью

Всем привет!!!
Делаю малюсенькую бд (акесс) в ней будет вестись очередь на поступление в садик. В ней есть таблица (главная) в ней 4 столбца (первый "кеу", тип счетчик и является ключевым полем) и (три остальных "фамилия", "имя", "сад", типы текстовые). При добавлении новой записи она будет будет добавлятся в конец таблицы и отображатся в низу DBGridEh. А что делать если чел который будет забивать данные пропустит одного ребенка и спохватится когда забьет данные скажем 200 человек хотя пропущенный ребенок должен быть 10 в списке. Помогите пожалуйста очень нужно.
Ответить с цитированием
  #2  
Старый 06.03.2009, 15:17
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

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

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 07.03.2009, 19:40
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

Aristarh Dark, добавил еще одно поле (rnomer, тип поля текс) поле заполняется автоматом
Код:
Form1.ADOTable1.FieldValues['rnomer']:=IntToStr((form1.DBGridEh1.RowCount)-1);
а дальше ............... не знаю. помоги пожалуйста
Ответить с цитированием
  #4  
Старый 07.03.2009, 21:33
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

На самом деле тебе нужно запросом вычислять максимальное значение этого поля и делать новое поле на +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  
Старый 08.03.2009, 15:25
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

При вставке в середину (например в позицию 5) думаю пригодился бы SQL
Код:
UPDATE tablename SET rnomer = rnomer + 1 WHERE rnomer >= 5;
Ответить с цитированием
  #6  
Старый 09.03.2009, 22:28
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

Yurk@, я так понял твой код должен менять номер каждой записи

s0Creator, у меня делфи выдает ошибку "несоответствие типов данных в выражении условия отбора"

и еще вопросик а можно строку в DBGridEh сдвинуть вверх или в низ ???
Ответить с цитированием
  #7  
Старый 09.03.2009, 23:39
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Я привел чистый 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;
который вызывает кучу запросов к БД можно использовать TADOQuery, запихнуть в него "SQL" и сделать TADOQuery.ExecSQL
Ответить с цитированием
  #8  
Старый 09.03.2009, 23:55
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от pesi
s0Creator, у меня делфи выдает ошибку "несоответствие типов данных в выражении условия отбора"
Заметил, странно почему
Цитата:
rnomer, тип поля текс
по идее должно быть integer, всетаки там не текстовые данные а число определяющее порядок.
Ответить с цитированием
  #9  
Старый 10.03.2009, 00:15
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

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  
Старый 10.03.2009, 14:07
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Цитата:
Сообщение от s0Creator
Я привел чистый SQL.
Т.е. вместо цикла
который вызывает кучу запросов к БД

Кто тебе сказал, что цикл вызывает больше запросов чем SQL`ный UPDATE? В конце концов, если таблица проиндексирована, то цикл сделает ровно столько же телодвижений что и UPDATE. Или я не прав?

pesi, по- моему какой- то не рабочий у тебя код... Во- первых ты прогоняешь всю таблицу от начала до конца, вместо прогона с нужной записи, потом делаешь POST на каждом шаге, да и присваиваешь полю rnomer что- то не то... Воспользуйся подсказками s0Creator, его примеры точняк рабочие...
З.Ы. Сдвиг вверх и вниз, по аналогии с добавлением новой записи.

Последний раз редактировалось TOJluK, 10.03.2009 в 14:19.
Ответить с цитированием
  #11  
Старый 10.03.2009, 14:28
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от TOJluK
Кто тебе сказал, что цикл вызывает больше запросов чем SQL`ный UPDATE? В конце концов, если таблица проиндексирована, то цикл сделает ровно столько же телодвижений что и UPDATE. Или я не прав?
По моему при выполнении метода Post на каждом проходе цикла в базе будет обновлять запись посылкой SQL:
"UPDATE [имя таблицы] SET [имя измененного поля] = [новое значение] (, [имя следующего измененного поля] = [новое значение]) WHERE [ключевое поле] = [код измененной записи];"
Ответить с цитированием
  #12  
Старый 10.03.2009, 14:49
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Кстати, а не упростит задачу введение поля "Дата и время постановки в очередь" (с сортировкой по нему) вместо rnomer?
Ответить с цитированием
  #13  
Старый 10.03.2009, 14:53
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Цитата:
Сообщение от s0Creator
По моему при выполнении метода Post на каждом проходе цикла в базе будет обновлять запись посылкой SQL:
"UPDATE [имя таблицы] SET [имя измененного поля] = [новое значение] (, [имя следующего измененного поля] = [новое значение]) WHERE [ключевое поле] = [код измененной записи];"

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;
В конце концов дэльфовское представление SQL запроса, это всего лишь набор функций для работы с драйверами БД. Так что никакой дополнительной нагрузки на базу нести не должно...

Последний раз редактировалось TOJluK, 10.03.2009 в 14:57.
Ответить с цитированием
  #14  
Старый 10.03.2009, 15:28
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

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  
Старый 10.03.2009, 15:33
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Код:
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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter