-
Здравствуйте! Проблема следующая. Есть БД Access и в ней таблица. В таблице есть столбец «СolNumber». Когда я загружаю и смотрю эту таблице то данные автоматически упорядочены по столбцу ColNumber. А когда я загружаю их через ADOQuerty то получается следующее:
FrmMain.ADOQuery1.First;
I:=0;
While not FrmMain.ADOQuery1.Eof do Begin
S:=FrmMain.ADOQuery1.Fields.FieldByName('PoleName').asstring;
a:=FrmMain.ADOQuery1.RecNo;
FrmMain.ADOQuery1.Next;
End; Так вот казалось бы записи RecNo будут идти подряд. В действительности "a" присваивается значение 1,2,3,4, а потом 28,29, а лишь потом 5,6,7,8???????Почему так происходит? Мне казалось что номера записей должны быть упорядочены и RecNo должен в цикле увеличиваться на 1, а в действительности этого нет. Т.е. есть какая-то внутренняя сортировка? Как тогда «пересортировать таблицу» в соответствии с RecNo? Или есть какой-нибудь другой параметр, который можно было бы использовать вместо RecNo? Да и еще одно. Когда я перемещаюсь по записям в таблице через Access, там то запись внизу нормально увеличивались на единицу?
-
> а в действительности этого нет. бред.
> Как тогда «пересортировать таблицу» в соответствии с RecNo? RecNo в ADO расчетное значение, и значит будет "правильное" при любой сортировке локального рекордсета. другое дело использовать его не совсем правильно...
> там то запись внизу нормально увеличивались на единицу? не нормально, а ОБЫЧНО, и только потому, что всем плевать на значение инкремента, оставляют дефаултный = 1, но поставь -1 например оно "там внизу" будет уменьшаться.
-
Я объясню зачем мне оно нужно. У таблице привязана кнопка «Вырезать» Пользователь в DbGrid-е может вырезать не одну ячейку а диапазон (в т.ч. по строкам). Так вот я занес эти данные из таблицы DbGrid в буфер а теперь мне необходимо в этом диапазоне БД данные очистить. Если бы можно было выделить ТОЛЬКО 1 строку, то это можно было бы сделать через DataSet источника DataSource по активной записи, но так как речь идет о диапазоне, то записи необходимо перебрать вот я и использую RecNO - но учитывая, что он может идти не последовательно (см. 1 пост) – то, как тогда сделать я не знаю…..Можете помочь?
-
> но так как речь идет о диапазоне, то записи необходимо перебрать
в св-ве DBGrid.SelectedRows хранится список закладок на все записи , выделенные юзером в дан.момент в гриде - вот его и "перебирай", на то он и существует.
-
О как супер! буду пробовать
-
Написал и призадумался… SelectedRows – да….но мне необходимо связать строки которые выделены в DBGRID с набором данных. Т.е. SelectedRows позволяет перебрать строки в DBGRID но не позволяет занести туда данные (т.е. DbGrid.Cells[1,1,]:=’Привет’ – не работает). А DataSource – позволяет занести туда данные черех DataSet но я непонимаю как перебрать строки в соответствии со строками выделенными в DbGrid!!!
-
> но учитывая, что он может идти не последовательно (см. 1 пост) а давай не будем бред учитывать (см. 2 пост)
-
> как перебрать строки в соответствии со строками выделенными в DbGrid!!! а что говорит по этому поводу Кальтенбруннер? ээээ т.е. справка?
-
> связать строки которые выделены в DBGRID с набором данных
Ты не поверишь - каждая закладка в этом списке и есть та самая связь. Переходишь по закладке (GotoBookmark) - соотв.запись в НД становится активной
-
не вижу....поясните пож-ста
-
поясняю... пишешь в дельфе интересующее тебя понятие, например упомянутый SelectedRows, встаеш на него курсором, нажимаешь Ctrl+F1, ... наслаждаешься развернутым ответом, иногда с примером.
-
да, как ни удивительно, но "фокус" сработает и с после упомянутым GotoBookmark, и вообще по любому оператору/методу/....
-
Спасибо! Но возникла еще одна проблема я пользуюсь неDBGrid а TMS DbAdvGrid в нем нет как написано в справке по SelectedRows:
GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
вот этого там нет DBGrid1.SelectedRows.Items[i]
но есть DBGrid1.rows[i] или DBAdvGrid1.SelectRows(i,1) Но если я ставлю 1 то получаю ошибку при выполнении программы...а второй вариант вообще не работает Может быть кто-нить сталкивался?
-
Похоже программирование - это не твоё
-
Читая от начла немного запутался... Если хочешь свою сортировку то вот: ADOQuery1.Sort:= 'имя_поля'
Если хочешь вырезать диапазон то как то ты в не ту сторону копаешь...
-
Так Все таки....
GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
В моем компоненте Tms Adv DB Grid этого нет! Перечисленные два варианта:
DBAdvGrid1.rows[i]
DBAdvGrid1.SelectRows(i,1)
дают ошибку при выполнеиии программы... что необходимо поставить GotoBookmark(pointer(???));
-
> что необходимо
Нанять программиста.
-
> [15] JJ (12.02.12 18:26) > что необходимо поставить
Справка есть к Tms Adv DB Grid? Вней посмотреть что это за
DBAdvGrid1.SelectRows(i,1)
функция что ли? Что принимает, что возвращает? Справки нет - смотреть в примерах. Примеров нет - смотреть в исходниках. Исходников нет - догадаться по прототипу.
-
Говоришь что из DBGrid’а ты выделил диапазон строк и хранишь их в буфере, непонял как ты это зделал но как то так это будет... Создай в таблице индексное поле (У меня по умолч. "Код") Цикл от начала диапазона до конца выполнить
If ADOQuery1.Locate('Код', 'Значения', [loPartialKey]) then
Begin
ADOQuery2.Insert;
ADOQuery2поля1.AsValue:= ADOQuery1поля1.AsValue;
...
...
ADOQuery2.Post;
ADOQuery1.Delete;
End;
-
Он чё, эксел захотел из акцеса сделать ?
|