Queue - help

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Hello All,

Есть две очереди, очередь заголовков документов и очередь содержимого документов. Необходимо удалить текущий документ и его содержимое, но позиция в очереди сбивается.
Что смог сделать, так это создать такую-же рабочую очередь и через нее скопировать все, кроме удаляемого документа.
Может есть более лучшее решение?

--
Best regards,
avssoft mailto:avssoft@SoftHome.net
Написал: ClaList(2)
Гость

Сообщение Гость »

Здравствуйте

Вопрос мутный, но если я правильно понял, то...

Код: Выделить всё

qParent    queue
eID          signed
....
           end
qChild     queue
eParentID    signed
                      end

Когда добавляешь запись в дочернюю, то
qChild.eParentID = qParent.eID
для всех дочерних записей
Удаляешь примерно так:

Код: Выделить всё

  i# = 1
  loop 
    get(qChild, i#) 
    if errorcode() then break end
    if qChild.eParentID = qParent.eID 
      delete(qChild)
      cycle
    end
    i# += 1
  end
или так

Код: Выделить всё

  loop 
        qChild.eParentID = qParent.eID
    get(qChild, qChild.eParentID) 
    if errorcode() then break end
    delete(qChild)
  end
Первый вариант быстрее.
В общем всё точно также, как для файлов (таблиц). :))

Сергей - chusha@mail333.com ; chusha@hotbox.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

Пишу в догонку. Clarion for DOS 3.102. Провел такой тест

Например я знаю, что в документе 5 строк и знаю, что первая строка 7. Строки документа идут подряд. Такой код работает

Код: Выделить всё

          i = 7          ! position() первой строки документа
          loop 5 times   ! удаляем пять строк
             get(qt,i)
             if errorcode()
                stop(error())
             end
             delete(qt)
             if errorcode()
                stop(error())
             end
          end
Этот код в принципе всегда работать будет или возможны варианты.

--
Best regards,
avssoft
Написал: ClaList(2)
Гость

Сообщение Гость »

Здесь не видно инкремента переменной i, или ты забыл его написать?
Поэтому у тебя оно не срабатывает.
Теперь совет - снабди записи очередей уникальными кодами документов, тогда удаление, да и добавление, у тебя будут идти на ура.

--
Best regards,
Anatoly mailto:warthog@belarusbank.minsk.by
Написал: ClaList(2)
Гость

Сообщение Гость »

Привет!

Я в таких случаях использую третий вариант:

Код: Выделить всё

qChild     queue, Type
eParentID    signed
           end

qParent    queue
QC              &QueueChild
....
           end

! Добавление
Clear(qParent)
qParent.QC &= New(qChild)
...
Add(qParent)
Loop источникСтрок
        Clear(qParent.QC)
        ...
        Add(qParent.QC)
.

! Удаление
Free(qParent.QC)
Dispose(qParent.QC)
Delete(qParent)
Мне оно кажется проще и надёжнее. Только не забывай про Dispose дочерней очереди.

Александр Агеев (aageev@satren.ru)
Написал: ClaList(2)
Гость

Сообщение Гость »

Здесь не видно инкремента переменной i, или ты забыл его написать?
Как раз этот код работает. Если сделать инкримент i, то удалятся записи через одну.
Поэтому у тебя оно не срабатывает.
Теперь совет - снабди записи очередей уникальными кодами документов, тогда удаление, да и добавление, у тебя будут идти на ура.
Так и есть номер документа.

--
Best regards,
avssoft
Написал: ClaList(2)
Гость

Сообщение Гость »

Из общих соображений - крайне неочевидно на какую запись должен быть позиционирован указатель после удаления текущей записи.
Так что в любом случае очевиднее и надежнее все же принудительно позиционировать:

Код: Выделить всё

LOOP I = RECORDS(Q) TO 1 BY -1
  GET(Q,I)
  DELETE(Q)
END
--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 8230875
Написал: ClaList(2)
Гость

Сообщение Гость »

Сталкивался с этим не раз, обходил просто и без хлопот. Завел поле скажем byte в очереди хозяина и когда удаляю, то делаю эту переменную 1 и put. Очередь естественно не сбивается. Далее вызываю перерисовку очереди только с полем 0. Если документов
немного, а как правило это так, то работает все быстро. Подчиненная очередь не волнует абсолютно.

Seawolf
Ответить