Конференция "Начинающим" » В Access есть внутренняя сортировка?
 
  • JJ (11.02.12 19:47) [0]
    Здравствуйте!
    Проблема следующая. Есть БД 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, там то запись внизу нормально увеличивались на единицу?
  • sniknik © (11.02.12 21:35) [1]
    > а в действительности этого нет.
    бред.

    > Как тогда «пересортировать таблицу» в соответствии с RecNo?
    RecNo в ADO расчетное значение, и значит будет "правильное" при любой сортировке локального рекордсета.
    другое дело использовать его не совсем правильно...

    > там то запись внизу нормально увеличивались на единицу?
    не нормально, а ОБЫЧНО, и только потому, что всем плевать на значение инкремента, оставляют дефаултный = 1, но поставь -1 например оно "там внизу" будет уменьшаться.
  • JJ (11.02.12 23:03) [2]
    Я объясню зачем мне оно нужно.
    У таблице привязана кнопка «Вырезать»
    Пользователь в DbGrid-е может вырезать не одну ячейку а диапазон (в т.ч. по строкам).
    Так вот я занес эти данные из таблицы DbGrid  в буфер а теперь мне необходимо в этом диапазоне БД данные очистить. Если бы можно было выделить ТОЛЬКО 1 строку, то это можно было бы сделать через DataSet источника DataSource по активной записи, но так как речь идет о диапазоне, то записи необходимо перебрать вот я и использую RecNO -  но учитывая, что он может идти не последовательно (см. 1 пост) – то, как тогда сделать я не знаю…..Можете помочь?
  • Сергей М. © (11.02.12 23:36) [3]

    > но так как речь идет о диапазоне, то записи необходимо перебрать


    в св-ве DBGrid.SelectedRows хранится список закладок на все записи , выделенные юзером в дан.момент в гриде - вот его и "перебирай", на то он и существует.
  • JJ (11.02.12 23:42) [4]
    О как супер! буду пробовать
  • JJ (11.02.12 23:47) [5]
    Написал и призадумался…
    SelectedRows – да….но мне необходимо связать строки которые выделены в DBGRID с набором данных. Т.е. SelectedRows позволяет перебрать строки в DBGRID но не позволяет занести туда данные (т.е. DbGrid.Cells[1,1,]:=’Привет’ – не работает). А DataSource – позволяет занести туда данные черех DataSet но я непонимаю как перебрать строки  в соответствии со строками выделенными в DbGrid!!!
  • sniknik © (11.02.12 23:48) [6]
    > но учитывая, что он может идти не последовательно (см. 1 пост)
    а давай не будем бред учитывать (см. 2 пост)
  • sniknik © (11.02.12 23:50) [7]
    > как перебрать строки  в соответствии со строками выделенными в DbGrid!!!
    а что говорит по этому поводу Кальтенбруннер? ээээ т.е. справка?
  • Сергей М. © (11.02.12 23:52) [8]

    > связать строки которые выделены в DBGRID с набором данных


    Ты не поверишь - каждая закладка в этом списке и есть та самая связь.
    Переходишь по закладке (GotoBookmark) - соотв.запись в НД становится активной
  • JJ (11.02.12 23:53) [9]
    не вижу....поясните пож-ста
  • sniknik © (11.02.12 23:59) [10]
    поясняю...
    пишешь в дельфе интересующее тебя понятие, например упомянутый SelectedRows, встаеш на него курсором, нажимаешь Ctrl+F1, ... наслаждаешься развернутым ответом, иногда с примером.
  • sniknik © (12.02.12 00:01) [11]
    да, как ни удивительно, но "фокус" сработает и с после упомянутым GotoBookmark, и вообще по любому оператору/методу/....
  • JJ (12.02.12 14:26) [12]
    Спасибо! Но возникла еще одна проблема я пользуюсь неDBGrid а TMS DbAdvGrid в нем нет как написано в справке по SelectedRows:

    GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));

    вот этого там нет DBGrid1.SelectedRows.Items[i]

    но есть DBGrid1.rows[i]
    или DBAdvGrid1.SelectRows(i,1)
    Но если я ставлю 1 то получаю ошибку при выполнении программы...а второй вариант вообще не работает
    Может быть кто-нить сталкивался?
  • Сергей М. © (12.02.12 16:37) [13]
    Похоже программирование - это не твоё
  • mamon (12.02.12 17:00) [14]
    Читая от начла немного запутался...
    Если хочешь свою сортировку то вот:
    ADOQuery1.Sort:= 'имя_поля'

    Если хочешь вырезать диапазон то как то ты в не ту сторону копаешь...
  • JJ (12.02.12 18:26) [15]
    Так Все таки....

    GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));


    В моем компоненте Tms Adv DB Grid этого нет! Перечисленные два варианта:

    DBAdvGrid1.rows[i]
    DBAdvGrid1.SelectRows(i,1)



    дают ошибку при выполнеиии программы... что необходимо поставить
    GotoBookmark(pointer(???));
  • Плохиш © (12.02.12 18:46) [16]

    > что необходимо

    Нанять программиста.
  • Inovet © (12.02.12 18:56) [17]
    > [15] JJ   (12.02.12 18:26)
    > что необходимо поставить

    Справка есть к Tms Adv DB Grid? Вней посмотреть что это за

    DBAdvGrid1.SelectRows(i,1)


    функция что ли? Что принимает, что возвращает? Справки нет - смотреть в примерах. Примеров нет - смотреть в исходниках. Исходников нет - догадаться по прототипу.
  • mamon (13.02.12 11:02) [18]
    Говоришь что из DBGrid’а ты выделил диапазон строк и хранишь их в буфере, непонял как ты это зделал но как то так это будет...
    Создай в таблице индексное поле (У меня по умолч.  "Код")
    Цикл от начала диапазона до конца выполнить
     If ADOQuery1.Locate('Код', 'Значения', [loPartialKey]) then
       Begin
        ADOQuery2.Insert;
        ADOQuery2поля1.AsValue:= ADOQuery1поля1.AsValue;
        ...
        ...
        ADOQuery2.Post;
        ADOQuery1.Delete;
       End;

  • MsGuns © (13.02.12 11:43) [19]
    Он чё, эксел захотел из акцеса сделать ?
 
Конференция "Начинающим" » В Access есть внутренняя сортировка?
Есть новые Нет новых   [134431   +13][b:0][p:0.001]