Ещё раз про Delete

Clarion, Clarion 7

Модератор: Дед Пахом

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

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

На прошлой недели я попытался узнать как можно сделать так, что бы кнопка Delete перед тем как удалить запись из файла Otdel копировала его в файл Karzina с аналогичной структурой.
Мне посоветовали:

Если пишешь на ABC:
- на форме в Embeds-ах в WindowManager.Kill до ParentCall пишешь

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

if ThisWindow.Response=RequestCompleted
   if ThisWindow.Request=DeleteRecord
      MyFile2:record :=: MyFile1:record
      add(MyFile2:record) ! не используется Access:Insert из за возможного autoinc
   end
end
[/color]

Попробовал по примеру

if ThisWindow.Response=RequestCompleted
if ThisWindow.Request=DeleteRecord
Kar:record :=: Otd:record
add(Kar:record)
end
end

он у меня выкинул ошибку:
invalid structure as first parameter

Только пожалуйста не надо говорить "Ты доку читал??" и тут же говорить что "нормальной доки в принципе не существует" Читал я доку. Понимаю что формат команды Add не правильный (необходимо Add(файл[длинна])), но посоветовали то так. Пробовал изменить на Add(Karzina), ошибки не было, но удаляемая запись из файла Otdel в файл Karzina не добавлялась. В чём трабола, подскажите. Если не знаете просто не отвечайте, не надо унижать меня своим превосходством в область пргограммирования на Clarion.

P.S. 1.Файл karzina я создавал путём копирования файла Otdel. Так что структура у них должна быть вроде одинаковой.
2. Файл karzina в Tables был добавлен.
Написал: Sergey(111)
Гость

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

Доброго дня!

Функция "глубокого" присваивания (:=:) копирует ТОЛЬКО одинаковые по названию поля! Структура Kar:record и Otd:record полностью одинакова?
Так add(Kar:record) не правильно!!! А вот add(Karzina) - правильно, поскольку у тебя, скорее всего, различаются структуры Kar:record и Otd:record, то происходит добавление пустой записи, или дублирование предыдущей, хранящейся в Kar:record.

------------
С уважением, bighard
bighard@mail.ru
Написал: ClaList(2)
Гость

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

Привет!

Первым параметром Add Может быть только метка файла или ссылка на файл. Поэтому компилер тебя дальше не пропустит.

Для копирования записи можно использовать универсальное хранилище - строку. Я таким образом реализую откаты в программе - завожу глобальную очередь, в ней - ссылка на FileManager и ссылка на строку. Строку создаю нужной длины (чтобы влазила вся запись), и далее str=aa:record

У этого метода один радикальный плюс - нет заморочек со структурой (полями). И обратное присваивание (aa:record=str) даёт адекватный результат. Т.е. основной выход для тебя (если нет нужды потом в дублированном файле работать с отдельными полями) - объявить файл как файл tps со структурой
code long ! автоинкремент
date date ! =today()
time time ! =clock()
Value String(15000)

TPS автоматически сожмёт строки , и реально они не займут места больше, чем запись-исходник.

Если же нужно работать с полями - либо заводи дублирующий файл как alias основного файла, либо присваивай значения по полям, избегая "глубокого" присвоения.

Наконец - используй
if errorcode() then message('file ' & ErrorFile() & ' at operation ADD make an error:' & error()).
после каждой рукописной операции с файлами. Повторяю: ПОСЛЕ КАЖДОЙ! Узнаешь очень много интересного...

Мне кажется, что у тебя ошибка именно в ADD, точнее, в месте его использования. Я бы сначала (в методе init после открытия окна) сохранил запись в строку, а потом в методе kill переписал строку

MyFile1:record = строка_с_сохраненкой
MyFile2:record :=: MyFile1:record ! ну не люблю я этот диип, если уж очень надо, то по полям - отдельно.
add(MyFile2)

Александр Агеев (aageev@satren.ru)
Написал: ClaList(2)
Аватара пользователя
StillZero
Ветеран
Сообщения: 458
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Поблагодарили: 1 раз
Контактная информация:

Сообщение StillZero »

add(Kar:record)
да конечно, так неправильно, извиняюсь, надо естественно add(Karzina).

насчет того, что не работает...хз...у меня работает
попробуй отловить ошибку как советовали товарищи выше...типо после add() добавить if error() then message(error()).
возможно что то проявиться, например, файл Karzina не открыт, т.е. не был добавлен в Tables.
насчет сохранения строки в init - это необязательно, так как и в kill данные удаляемой записи имеются в хорошем состоянии :)
Написал: PAA(27)
Ответить