Страница 1 из 1
					
				
				Добавлено: 18 Октябрь 2004, 11:15
				 Гость
				Hello All,
   Есть две очереди, очередь заголовков документов и очередь содержимого документов. Необходимо удалить текущий документ и его содержимое, но позиция в очереди сбивается.
Что смог сделать, так это создать такую-же рабочую очередь и через нее скопировать все, кроме удаляемого документа.
Может есть более лучшее решение?
-- 
Best regards,
 
avssoft                          mailto:
avssoft@SoftHome.net
Написал: ClaList(2)
 
			 
			
					
				
				Добавлено: 18 Октябрь 2004, 11:18
				 Гость
				Здравствуйте
 
Вопрос мутный, но если я правильно понял, то...
Код: Выделить всё
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)
 
			 
			
					
				
				Добавлено: 18 Октябрь 2004, 11:20
				 Гость
				Пишу в догонку. 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)
 
			 
			
					
				
				Добавлено: 18 Октябрь 2004, 11:22
				 Гость
				Здесь не видно инкремента переменной i, или ты забыл его написать?
Поэтому у тебя оно не срабатывает.
Теперь совет - снабди записи очередей уникальными кодами документов, тогда удаление, да и добавление, у тебя будут идти на ура.
-- 
Best regards,
 
Anatoly                            mailto:
warthog@belarusbank.minsk.by
Написал: ClaList(2)
 
			 
			
					
				
				Добавлено: 18 Октябрь 2004, 11:24
				 Гость
				Привет!
Я в таких случаях использую третий вариант:
Код: Выделить всё
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)
 
			 
			
					
				
				Добавлено: 19 Октябрь 2004, 10:27
				 Гость
				Здесь не видно инкремента переменной i, или ты забыл его написать?
Как раз этот код работает. Если сделать инкримент i, то удалятся записи через одну.
Поэтому у тебя оно не срабатывает.
Теперь совет - снабди записи очередей уникальными кодами документов, тогда удаление, да и добавление, у тебя будут идти на ура.
Так и есть номер документа.
-- 
Best regards,
 
avssoft
Написал: ClaList(2)
 
			 
			
					
				
				Добавлено: 19 Октябрь 2004, 10:27
				 Гость
				Из общих соображений - крайне неочевидно на какую запись должен быть позиционирован указатель после удаления текущей записи.
Так что в любом случае очевиднее и надежнее все же принудительно позиционировать:
Код: Выделить всё
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)
 
			 
			
					
				
				Добавлено: 19 Октябрь 2004, 13:18
				 Гость
				Сталкивался с этим не раз, обходил просто и без хлопот. Завел поле скажем byte в очереди хозяина и когда удаляю, то делаю эту переменную 1 и put. Очередь естественно не сбивается. Далее вызываю перерисовку очереди только с полем 0. Если документов
немного, а как  правило это так, то работает все быстро.  Подчиненная очередь не волнует абсолютно.
Seawolf