Автор | Сообщение |
|
| постоянный участник
|
Пост N: 104
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.11.06 01:06. Заголовок: Ошибка _DBFCDX/1020 для APPEND FROM
/* Подскажите кто может. Как боротся с ошибкой: Error _DBFCDX/1020 Ошибка в типе данных Called from __DBTRANS(0) Called from __DBAPP(0) Called from MAIN(23) При копирование записей с одной базы в другую возникает эта ошибка. Я в структуру новой базы вставил с 58 поля 4 новых поля: NKODDOST;N;1;0 CKODDOST;C;25;0 SUMDVER;N;2;0 NKALITKA;N;1;0 И теперь при копирование записей возникает ошибка и на Clipper'e и на Harbour'e. Вообще-то это происходит всегда, когда добавляешь в DBFCDX-драйвер дополнительные поля в середине базы. Для решения этой проблемы приходиться запускать утилиту bdbfs.exe и ручками копировать с одной базы в другую. Достало это. Подскажите пожалуйста как решить эту проблему. Ниже привожу пример. */ FUNCTION MAIN() LOCAL aDbf #ifndef __HARBOUR__ #else REQUEST HB_CODEPAGE_RU866 hb_SetCodepage( "RU866" ) REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") #endif REQUEST DBFCDX RDDSETDEFAULT( "DBFCDX" ) USE ("dog_stru.dbf") ALIAS BASE_NEW EXCLUSIVE NEW aDbf := BASE_NEW->(DBSTRUCT()) CLOSE BASE_NEW DBCREATE("dog_new.dbf", aDbf) USE ("dog_new.dbf") ALIAS BASE_NEW NEW SELECT BASE_NEW SET DELETED OFF APPEND FROM ("dogovor.dbf") SELECT BASE_NEW ? LASTREC() wait RETURN NIL
|
|
|
Ответов - 31
, стр:
1
2
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 43
Зарегистрирован: 09.10.06
|
|
Отправлено: 29.11.06 00:16. Заголовок: Re:
Лукашевский пишет: цитата: | И кстати, не будете ли Вы так любезны продемонстрировать Вашу функцию? |
| Не буду В подобных случаях использую или команду APPEND FROM или соответствующую ей встроенную функцию. Еще раз внимательно рассмотрите код который Вы предлагаете использовать вместо APPEND FROM Function Append1From (from) local f_num, f_pos, f_get if PCOUNT() = 1 append blank endif for f_num=1 TO (from)->(FCOUNT()) f_pos = FIELDPOS( (from)->(FIELDNAME(f_num)) ) if f_pos > 0 f_get = (from)->(FIELDGET(f_num)) if VALTYPE(f_get) = TYPE(FIELDNAME(f_pos)) FIELDPUT(f_pos, f_get) endif endif next DBCOMMIT() return .T. Да она работает, да она проверяет тип поля, а дальше что. А если VALTYPE(f_get) <> TYPE(FIELDNAME(f_pos)) тогда FIELDGET(f_pos) что даст? Наверное не всегда то, что ожидалось. Вы ведь просто теряете данные! Не случайно в документации по APPEND FROM указывается, что КОПИРУЕМЫЕ ПОЛЯ ДОЛЖНЫ БЫТЬ ОДНОГО ТИПА, а то будет вам ошибка времени исполнения, а другими словами смотри, что делаешь, не будет Clipper за тебя думать! Хотите анализируйте структуру таблицы приемника и таблицы источника (с помощью DBStruct) до вызова APPEND FROM, хотите пишите обработчик ошибок, хотите пишите свою функцию и там ловите ошибки, хотите ничего не делайте, надейтесь что все будет нормально. Ну и сама реализация - код Димы пошустрее будет.
|
|
|
|
| постоянный участник
|
Пост N: 116
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.11.06 00:59. Заголовок: Re:
Петр пишет: цитата: | Ну и сама реализация - код Димы пошустрее будет. |
| Петр ! Вы только отчасти правы. Здесь самое главное не быстродействие, а возможность сохранения записей из базы "приемника". И вы все расматриваете только одну ситуацию, а именно что база "приемник" целая, т.е. нет "битых" записей. Если они есть, то труба на всё. Т.е. нужно делать обработку и на прием "битых" записей. Я переодически с таким сталкиваюсь. И причину понять не могу.
|
|
|
|
| постоянный участник
|
Пост N: 45
Зарегистрирован: 09.10.06
|
|
Отправлено: 29.11.06 10:13. Заголовок: Re:
Andrey пишет: цитата: | Здесь самое главное не быстродействие, а возможность сохранения записей |
| 1) Одно другому не помеха 2) речь именно о сохранении, а не о сознательной потере данных Andrey пишет: цитата: | И вы все расматриваете только одну ситуацию |
| Я рассматривал не ситуацию, а конкретный код и его возможное поведение Andrey пишет: цитата: | а именно что база "приемник" целая, т.е. нет "битых" записей |
| Здесь не совсем понял Вашу мысль, но если в базе (приемнике, источнике - неважно) действительно есть "битые" записи - "то труба на всё" Если серьезно, то ситуация не из приятных. Но, думаю, Вы что-то напутали с терминологией. Andrey пишет: цитата: | Т.е. нужно делать обработку |
| Согласен, и реализация такой обработки может происходить по разному. Разработчики APPEND FROM предложили свой вариант - не самый худший. Ни ГЛЮКОМ, ни ошибкой здесь и не пахнет, стандартное задокументированое поведение.
|
|
|
|
| постоянный участник
|
Пост N: 118
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.11.06 17:26. Заголовок: Re:
Dima Дима, я тебе несколько файлов могу скинуть на мыло, там еще несколько моих функций сидят. Сюда кинуть не могу, слишком много.
|
|
|
|
| |
Пост N: 490
Зарегистрирован: 17.05.05
|
|
Отправлено: 29.11.06 17:32. Заголовок: Re:
Andrey пишет: цитата: | Дима, я тебе несколько файлов могу скинуть на мыло |
| cмотри личное сообщение (ЛС)
|
|
|
|
| постоянный участник
|
Пост N: 122
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.12.06 19:59. Заголовок: Re:
Так, а как быть если записи базы откуда копируем "битые" ? Т.е. записей МЕМО поля нехватает, записи с мусором и т.д.
|
|
|
|
| |
Пост N: 494
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.12.06 20:25. Заголовок: Re:
Andrey пишет: цитата: | Т.е. записей МЕМО поля нехватает, записи с мусором и т.д. |
| была та же проблема и не раз , клиенты меня просто задергали. в общем в Clipper я отказался от использования memo полей.
|
|
|
|
| постоянный участник
|
Пост N: 123
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.12.06 15:28. Заголовок: Re:
Хорошо, с мемо-полями понятно, что информацию не востановить, а как быть при копировании записей, если Clipper или Harbour ругается на ошибку чтения и просто сваливается программа ? Как написать обрабоку такой ситуации.
|
|
|
|
| постоянный участник
|
Пост N: 127
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.12.06 11:11. Заголовок: Re:
Дима, а где ты хранишь данные типа МЕМО-полей. Для них же по барабану кто "рушит", Клипер или Харбор. Да вообще-то рушит скорее всего система, откуда-же идет мусор ?
|
|
|
|
| |
Пост N: 497
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.12.06 15:08. Заголовок: Re:
Andrey пишет: цитата: | Дима, а где ты хранишь данные типа МЕМО-полей. |
| В символьных полях длиной от 100 до 250 символов , больше не нужно было.
|
|
|
|
| постоянный участник
|
Пост N: 52
Зарегистрирован: 09.10.06
|
|
Отправлено: 04.12.06 16:58. Заголовок: Re:
Andrey пишет: цитата: | Хорошо, с мемо-полями понятно, что информацию не восстановить |
| Попытаться можно. Например с помощью программы ASC (Advantage and SIx Commander) (автор Юрий Сухарев: suv - частый гость этого форума). Файл ->Доктор - совмещает проверку заголовка, memo, а также содержимого НЕ-memo полей (например, для поиска переполнения *** в числовых полях) (это из описания). Или вручную. цитата: | Да вообще-то рушит скорее всего система, откуда-же идет мусор ? |
| Этот вопрос в сети обсуждался довольно часто. Ищите. Устранить причину разрушения memo надо в первую очередь. Лично я храню MEMO или в dbt (проще структура, легче восстанавливать, размер при современных объемах ЖД значения не имеет), или в базе символьное поле - путь + имя файла (или просто имя файла), MEMO соответственно в указанном файле ( txt, rtf, doc, xls, jpg - в общем, что нужно). При втором подходе есть свои плюсы и минусы. Но все можно решить.
|
|
|
Ответов - 31
, стр:
1
2
All
[только новые]
|
|