Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Cообщение Not a table. Можно ли что то сделать. / 8 сообщений из 8, страница 1 из 1
30.05.2005, 09:10:31
    #33089880
givi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cообщение Not a table. Можно ли что то сделать.
Вообщем дело обстояло так. На компьютере работала программа по штрих-кодированию изделий. Сканер штрих-кода был подключен в разрез клавы. Такие сканеры бывает виснут - клава перестает реагировать. И вот после одного такого зависания и аварийного завершения работы одна из таблиц перестала открываться. Выходит сообщение - not a table. Подскажите, можно ли как то восстановить данные из такой таблицы?
...
Рейтинг: 0 / 0
30.05.2005, 09:26:01
    #33089901
Burn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cообщение Not a table. Можно ли что то сделать.
В поиск - были ссылки на многичисленые фиксеры.
Кроме того, в хелпе расписана структура DBF-файла. Она совсем не сложная.
Так что на основе этого описания найти ошибку и исправить ее руками с помошью любого HEX-редактора или самому написать простенькую прогркмму - раз плюнуть.
Обычно в случае внезапного зависания получается несоответсвие количесва записей в заголовке фактическому (в заголовке на 1 больше)
...
Рейтинг: 0 / 0
30.05.2005, 09:37:06
    #33089934
sergej_57
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cообщение Not a table. Можно ли что то сделать.
как правило эта ошибка возникает в том случае, когда на диске сохранен файл нулевой длинны - Т.е. название файла имеет расширение *.DBF, но самого файла нет. Это происходит в результате сбоя программы в момент перезаписи заголовка таблицы, а также при внезапном пропадании питания и перезагрузке.
Лечение - надо проанализировать программу,если сбой происходит все время в одном и том же месте надо постараться изменить алгоритм,использовать предварительное копирование,чаще испоьзовать команду FLUSH. после каждой манипуляции с таблицами.
...
Рейтинг: 0 / 0
30.05.2005, 09:49:18
    #33089964
givi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cообщение Not a table. Можно ли что то сделать.
да нет файл то не нулевой длинны...
а вот сос труктурой дбф-ника разобрался. Только вот в каком редакторе мне в шестнадцатеричном формате его можно редактировать???
...
Рейтинг: 0 / 0
30.05.2005, 11:22:10
    #33090200
Burn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cообщение Not a table. Можно ли что то сделать.
>Только вот в каком редакторе мне в шестнадцатеричном формате его можно редактировать???
Выбирай:
http://www.google.ru/search?hl=ru&ie=windows-1251&q=hex+%F0%E5%E4%E0%EA%F2%EE%F0+%F1%EA%E0%F7%E0%F2%FC&lr=

Вполне можно и на фоксе - вот примерчик. Как раз исправляет проблему с неправильным счетчиком записей в заголовке. Писалось правда давное, еще под FPD 2.6 с тех пор не обновлялось. Как пример сойдет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
****************************************************************************
*                                                                          *
*                      Ф У Н К Ц И Я   NOT_DBF                             *
*                                                                          *
*      Функция предназначена для корректировки заголовка файла *.DBF       *
*   на низком уровне в случае, когда длинна файла отличается от записанной *
*   в заголовке ( например когда счетчик записей не соответствует          *
*   фактическому количеству ).                                             *
*      Ошибка FoxPro N  15  - Not a database file, при выполнении команды    *
*   USE.                                                                   *
*                                                                          *
*   Параметры: FILE_NAME - имя обрабатываемого файла                       *
*                                                                          *
*   Возвращаемые значения:                                                 *
*       0  - корректировка закончилась успешно                               *
*     - 1  - невозможно открыть файл                                         *
*       1  - файл имеет нулевую длинну                                       *
*       2  - файл не DBF-овского формата                                     *
*       3  - корректировка невозможна (длинны совпадают)                     *
*                                                                          *
*   Если пришлось закрыть файл командой CLOSE ALL, все возращаемые значения*
*   умножаются на  10  ( кроме перврго и второго), а в случае успешной       *
*   корректировки возвращатся  100 .                                         *
*                                                                          *
*               Copyright  1998  by Dmytriy Gomzhin                          *
****************************************************************************
FUNCTION NOT_DBF
PARAMETERS file_name

* ------------------  Вычисление размера файла  ---------------------------
=ADir(a_file, file_name)
file_size=a_file( 1 , 2 )

*   Определение множетелей для перевода систем счисления и рабочего массива
*   откорректированного заголовка
*---------------------------------------------------------------------------
DIMENSION a_mult( 4 ), a_byte( 4 )
a_mult( 1 )= 1 
a_mult( 2 )= 256 
a_mult( 3 )= 65536 
a_mult( 4 )= 16777216 
a_byte= 0 

* --------------  Попытка окрытия файла на низком уровне ------------------
file_hand=FOpen(file_name, 2 )

IF file_hand = - 1 
* ---------------------  Невозможно открыть файл  -------------------------
   RETURN - 1 
ELSE
* --------------------  Проверка на нулевую длинну  -----------------------
   =FSeek(file_hand,  0 ,  0 )
   IF FEOF(file_hand)
      IF .not.FClose(file_hand)
         CLOSE ALL
         RETURN  10 
      ENDIF
      RETURN  1 
   ELSE
* -------------------  Проверка DBF-фовского формата  ---------------------
      m_byte=FRead(file_hand, 1 )
      IF m_byte <> Chr( 3 ).and.;
         m_byte <> Chr( 131 ).and.;
         m_byte <> Chr( 139 ).and.;
         m_byte <> Chr( 245 )
         IF .not.FClose(file_hand)
            CLOSE ALL
            RETURN  20 
         ENDIF
         RETURN  2 
      ELSE
*   Перевод в десятичные числа количества записей
*--------------------------------------------------------------------------
         m_count= 0 
         FOR i= 0  TO  3 
            =FSeek(file_hand,  4 +i,  0 )
            m_byte=FRead(file_hand,  1 )
            m_count=m_count+ASC(m_byte)*a_mult(i+ 1 )
         ENDFOR
         
*   Перевод в десятичные числа длинны заголовка
*--------------------------------------------------------------------------
         m_hand= 0 
         FOR i= 0  TO  1 
            =FSeek(file_hand,  8 +i,  0 )
            m_byte=FRead(file_hand,  1 )
            m_hand=m_hand+ASC(m_byte)*a_mult(i+ 1 )
         ENDFOR
         
*   Перевод в десятичные числа длинны записи
*--------------------------------------------------------------------------
         m_size= 0 
         FOR i= 0  TO  1 
            =FSeek(file_hand,  10 +i,  0 )
            m_byte=FRead(file_hand,  1 )
            m_size=m_size+ASC(m_byte)*a_mult(i+ 1 )
         ENDFOR
         
* -------------  Вычисление теоритического размера файла  -----------------
         m_file_size=m_count*m_size+m_hand+ 1 
         
         IF file_size <> m_file_size
*   Реальная и расчетная длинна файлов не совпадает
*--------------------------------------------------------------------------
            IF file_size > m_file_size
*   Если расчетная длина больше расчетной то файл усекаем
*--------------------------------------------------------------------------
               =FChSize(file_hand, m_file_size)
            ELSE
*   Если расчетная больше, то корректируем заголовок
---------------------------------------------------------------------------
               IF Mod(file_size-(m_hand+ 1 ), m_size) =  0 
*   Если нет в конце лишних байт, то просто в заголовке уменьшаем
*   число записей
*--------------------------------------------------------------------------
                  m_new_count=(file_size-(m_hand+ 1 ))/m_size
                  
*   Перевод числа записей в шестнадцатиричные
*--------------------------------------------------------------------------
                  IF m_new_count >= a_mult( 4 )
                     a_byte( 4 )=Int(m_new_count/a_mult( 4 ))
                     m_new_count=Mod(m_new_count, a_mult( 4 ))
                  ENDIF
                  IF m_new_count >= a_mult( 3 )
                     a_byte( 3 )=Int(m_new_count/a_mult( 3 ))
                     m_new_count=Mod(m_new_count, a_mult( 3 ))
                  ENDIF
                  IF m_new_count >= a_mult( 2 )
                     a_byte( 2 )=Int(m_new_count/a_mult( 2 ))
                     m_new_count=Mod(m_new_count, a_mult( 2 ))
                  ENDIF
                  a_byte( 1 )=m_new_count
                  
*   Запись откорректированного заголовка в файл
*--------------------------------------------------------------------------
                  FOR i= 0  TO  3 
                     m_byte=Chr(a_byte(i+ 1 ))
                     =FSeek(file_hand,  4 +i,  0 )
                     =FWrite(file_hand, m_byte,  1 )
                  ENDFOR
               ELSE
*   Определяем число лишних байт и усекаем файл
*--------------------------------------------------------------------------
                  m_diff=Mod(file_size-(m_hand+ 1 ), m_size)
                  =FChSize(file_hand, file_size-m_diff)
                  
*   Уменьшаем в заголовке число записей
*--------------------------------------------------------------------------
                  m_new_count=(file_size-m_diff-(m_hand+ 1 ))/m_size
                  
*   Перевод числа записей в шестнадцатиричные
*--------------------------------------------------------------------------
                  IF m_new_count >= a_mult( 4 )
                     a_byte( 4 )=Int(m_new_count/a_mult( 4 ))
                     m_new_count=Mod(m_new_count, a_mult( 4 ))
                  ENDIF
                  IF m_new_count >= a_mult( 3 )
                     a_byte( 3 )=Int(m_new_count/a_mult( 3 ))
                     m_new_count=Mod(m_new_count, a_mult( 3 ))
                  ENDIF
                  IF m_new_count >= a_mult( 2 )
                     a_byte( 2 )=Int(m_new_count/a_mult( 2 ))
                     m_new_count=Mod(m_new_count, a_mult( 2 ))
                  ENDIF
                  a_byte( 1 )=m_new_count
                  
*   Запись откорректированного заголовка в файл
*--------------------------------------------------------------------------
                  FOR i= 0  TO  3 
                     m_byte=Chr(a_byte(i+ 1 ))
                     =FSeek(file_hand,  4 +i,  0 )
                     =FWrite(file_hand, m_byte,  1 )
                  ENDFOR
               ENDIF
            ENDIF
         ELSE
*  !!!!!!!!!!!!!!!!     Файл невозможно исправить      !!!!!!!!!!!!!!!!!!!!
            IF .not.FClose(file_hand)
               CLOSE ALL
               RETURN  30 
            ENDIF
            RETURN  3 
         ENDIF
         
         IF .not.FClose(file_hand)
*   Если не можем закрыть файл функцией назкого уровня, то закрываем
*   все открытые файлы
*--------------------------------------------------------------------------
            CLOSE ALL
            RETURN  100 
         ENDIF
      ENDIF
   ENDIF
ENDIF
RETURN  0 
...
Рейтинг: 0 / 0
30.05.2005, 14:53:56
    #33090811
Maltsev Max
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cообщение Not a table. Можно ли что то сделать.
Я открывал такой файл KARAT`ом, правил и сохранял.
...
Рейтинг: 0 / 0
30.05.2005, 23:33:37
    #33091564
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cообщение Not a table. Можно ли что то сделать.
Hi Burn!

Кстати говоря иногда в конец dbf-а записывается ещё код SUB - это CHR(0x1A). Он не обязателен для фокса (и вроде бы даже в стандартах на dbf не описан)

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
31.05.2005, 09:29:52
    #33091765
Burn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cообщение Not a table. Можно ли что то сделать.
Дык делалось на колене в в пределах минимальной необходимости - просто в свое время задолбало ездить подымать таблицы в одной конторе, когда с напряжением были проблемы
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Cообщение Not a table. Можно ли что то сделать. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]