Перебір записів у датасеті

Щось я туплю. Ось це працює (перебирає у прямому порядку)DataSet.First; while notDataSet.bofdo begin // Щось робимо .. DSetTestType.Prior; end; а це відповідно немає O_o DataSet.First; while not DataSet.eof do begin // Щось робимо .. DSetTestType.Next; end; Одразу позиціонується на останній запис. Використовую FIBPlus. У додатку безліч датасетів і всюди все працює нормально, а в одному ось такий косяк. Вже годину медитую на це, не зрозумію, в чому справа. Всі властивості датасета ідентичні властивостям інших датасетів. Підкажіть, pls, в чому може бути справа?

DataSet.First; while notDataSet.eof do begin // Щось робимо ..DSetTestType.Next; end;

неа, це я помилився, коли тут уже правив назва датасетів. У коді все правильно написано.

> Ось це працює (перебирає у прямому порядку) > DataSet.First; while not DataSet.bofdoне вірю!

> [0] AndreyBg (24.09.08 11:03) > Ось це працює (перебирає у прямому порядку) > DataSet.First; > while not DataSet.bof do > begin > // Щось робимо .. > DSetTestType.Prior; > end;Ех і обманщик. :) Курсор Датасета встановити на початок потім у циклі навіть інший датасет жодного разу не встигає перейти на попередній запис так як умови циклу виконані. А у другому способі. Ну, звичайно, ні. Тут взагалі "висяк" :) До речі другий спосіб правильніший, ніж перший, але другий датасет все псує.

У коді все правильно написано.

Тоді навіщо питання про помилку?

> У коді все правильно написано> Відразу позиціонується на останнюзапис

І де в цьому "правильному" коді позиціонування на останній запис? На першу бачу - First, а де на останній?

все це схоже на якусь розводку.

> // Щось робимо ..у цьому чорному ящику може бути будь-що, не тільки перепозиціонування

Млинець, ну розводка так розводка. робити мені більше нічого. Ось оригінальний текст: DSetTestType.CloseOpen(true); DSetTestType.First; якщо немає DSetTestType.eof do begin BoardTemplateTest := TComboObject.Create(DSetTestType.FBN("id_otkttype").AsInteger, DSetTestType.FBN("name").AsString ); FrmTemplateAdd.cbTestType.Properties.Items.AddObject(BoardTemplateTest.Get_Name, BoardTemplateTest); DSetTestType.Next; end; cbTestType - це комбік. У таблиці всього 8 записів. У комбік потрапляє лише остання. намагався виводити ці записи в текстовий файл у тому циклі. Ситуація аналогічна – виводиться лише остання.

виводиться лише остання.

і з чого ти раптом вирішив що трабл у перерахуванні датасету?

DSetTestType.CloseOpen(true); DSetTestType.First; while not DSetTestType.eof do begin ShowMessage("Вважай записи, загинаючи пальці");

BoardTemplateTest := TComboObject.Create(DSetTestType.FBN("id_otkttype").AsInteger, DSetTestType.FBN("name").AsString ); FrmTemplateAdd.cbTestType.Properties.Items.AddObject(BoardTemplateTest.Get_Name, BoardTemplateTest); DSetTestType.Next; end;

Нарахував ОДНУ! FetchAll у налаштування датасету дорівнює true.

Цікавіше, що ось це cbTestType.Properties.Items

Нарахував ОДНУ! FetchAll в налаштування датасету дорівнює true.

У таблиці всього 8 записів.

А запит повернув одну.

TComboBox чи? А що таке cbTestType.Properties? У стандартного "комбіка" немає такого св-ва.

> FetchAll в налаштування датасета дорівнює true. Це по-барабану.

пропертіес вже по барабану. у нього все правильно. в нд один запис, який і потрапляє в комбо.

Загалом як завжди - почали за здоров'я, а продовжуємо за упокій)

Страшно навіть подумати про те, скільки ж автора пальців виявилося)

> неа, це я помиливсяТоді питання, а навіщо нам обговорювати не той код?

AndreyBg (24.09.08 11:45) [10]

Це ж треба так писати! Вам, добродію, треба в хірурги. Гланди через анал вирізати. Фашистам.

Всі посміялися, молодці. У наборі 8 записів. А в комбік або, як я вже писав вище, в текстовий файл потрапляє тільки один останній запис. Комбік не стандартний - cbTestType: TcxComboBox; DSetTestType.First; while not DSetTestType.bofdo begin BoardTemplateTest := TComboObject.Create(DSetTestType.FBN("id_otkttype").AsInteger, DSetTestType.FBN("name").AsString ); FrmTemplateAdd.cbTestType.Properties.Items.AddObject(BoardTemplateTest.Get_Name, BoardTemplateTest); DSetTestType.Prior; end; Видає всі 8 записів у комбік! Я сам розумію, що це маячня, але воно працює! І як уже говорив, у програмі подібних циклів повним повно(у тому числі які заповнюють аналогічні комбіки) і тільки з цим датасетом спостерігаю такий глюк.

DSetTestType.First; while not DSetTestType.bof do begin . DSetTestType.Prior; end;

8 записів кажеш? Казочник кімнатний.

> сам розумію, що це маячня

Навіщо ж тоді писати, якщо це свідомо марення?

В 1]дано шаблон правильно прямого проходу по НД, ось його і користуйся.

І комбік твій, ким би він не був, тут нікому не цікавий – спочатку треба реалізувати правильну логіку навігації з НД, а вже потім морочитися ранніми там комбіками-шмомбиками.

Якщо код [1] показує всього одну ітерацію циклу, то вір очам своїм - у твоєму НД справді лише один запис.

Спробуйте попередньо очистити FrmTemplateAdd.cbTestType і подивіться, що вийде в результаті Вашого "проходу" (так і напрошується прикметник "заднього")

> [25] AndreyBg (24.09.08 12:53) & gt; DSetTestType.First; > while not DSetTestType.bof do > begin > DSetTestType.Prior; > end;

Ось це інший коленкор!)

Але ж тобі потрібен пряме проходження НД, чому ж ти встаєш на останній запис і рухаєшся назад?

І якщо ти робиш це усвідомлено, називаючи це "прямим прозодом" (хоча як не назви це "задній прохід"), то чому тоді дивуєшся, що НД позиціонується відразу на останній запис?

Ось це інший коленкор!)

Це не він. Це інший чувак радить йому виправити код.

вихідний код, як стверджує казкар такий

> [25] AndreyBg (24.09.08 12:53) & gt; DSetTestType.First; > while not DSetTestType.bof do > begin > DSetTestType.Prior; > end;

А й точно).. "чуваки" - суцільні Андрії, аж очі розбігаються)

Спробую востаннє пояснити проблему. Використовую не задній прохід, комбік попередньо очищений, додатково на форму кинута таблиця для представлення даних, приєднана до того ж датасету. Рез-т: - у комбіці один запис останній. - у табличці відображається 8 рядків, виділено останній.

DSetTestType.CloseOpen(true); FrmTemplateAdd.cbTestType.Properties.Items.Clear; DSetTestType.First; якщо немає DSetTestType.eof do begin BoardTemplateTest := TComboObject.Create(DSetTestType.FBN("id_otkttype").AsInteger, DSetTestType.FBN("name").AsString ); FrmTemplateAdd.cbTestType.Properties.Items.AddObject(BoardTemplateTest.Get_Name, BoardTemplateTest); DSetTestType.Next; end;

А взагалі все навіть цікавіше. Одразу після DSetTestType.First; я опиняюся на останній запис.

> - у табличці відображається 8 рядків

Тоді як пояснити [14] ? Там ти чомусь примудрився загнути всього один палець.

Тут нічого дивного - ти пройшовся прямим курсом з НД, активним при цьому став останній запис, він і виглядає виділеним у гриді

> - у комбіці один запис останній

А це ти вже зі своїм "комбіком" розумійся - дейтасет тут ні до чого, він справно тримає 8 записів.

До речі, причому тут взагалі св-во properties?

Я в очі не бачив твій "комбік", але якщо він є спадкоємцем TCustomComboBox, то маніпуляції із вмістом контрольованого ним списку рядків здійснюється через св-во Items

> [36] AndreyBg (24.09.08 13:42)

Монітор переверни. Може варто скористатися таки DBLookupComboBox-ом?

> Я в очі не бачив твій "комбік", але якщо він є спадкоємцем > TCustomComboBoxу нього DevExpress"івський, швидше за все. він не спадкоємець :)