powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Cообщение Not a table. Можно ли что то сделать.
8 сообщений из 8, страница 1 из 1
Cообщение Not a table. Можно ли что то сделать.
    #33089880
Фотография givi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем дело обстояло так. На компьютере работала программа по штрих-кодированию изделий. Сканер штрих-кода был подключен в разрез клавы. Такие сканеры бывает виснут - клава перестает реагировать. И вот после одного такого зависания и аварийного завершения работы одна из таблиц перестала открываться. Выходит сообщение - not a table. Подскажите, можно ли как то восстановить данные из такой таблицы?
...
Рейтинг: 0 / 0
Cообщение Not a table. Можно ли что то сделать.
    #33089901
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В поиск - были ссылки на многичисленые фиксеры.
Кроме того, в хелпе расписана структура DBF-файла. Она совсем не сложная.
Так что на основе этого описания найти ошибку и исправить ее руками с помошью любого HEX-редактора или самому написать простенькую прогркмму - раз плюнуть.
Обычно в случае внезапного зависания получается несоответсвие количесва записей в заголовке фактическому (в заголовке на 1 больше)
...
Рейтинг: 0 / 0
Cообщение Not a table. Можно ли что то сделать.
    #33089934
sergej_57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как правило эта ошибка возникает в том случае, когда на диске сохранен файл нулевой длинны - Т.е. название файла имеет расширение *.DBF, но самого файла нет. Это происходит в результате сбоя программы в момент перезаписи заголовка таблицы, а также при внезапном пропадании питания и перезагрузке.
Лечение - надо проанализировать программу,если сбой происходит все время в одном и том же месте надо постараться изменить алгоритм,использовать предварительное копирование,чаще испоьзовать команду FLUSH. после каждой манипуляции с таблицами.
...
Рейтинг: 0 / 0
Cообщение Not a table. Можно ли что то сделать.
    #33089964
Фотография givi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да нет файл то не нулевой длинны...
а вот сос труктурой дбф-ника разобрался. Только вот в каком редакторе мне в шестнадцатеричном формате его можно редактировать???
...
Рейтинг: 0 / 0
Cообщение Not a table. Можно ли что то сделать.
    #33090200
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Только вот в каком редакторе мне в шестнадцатеричном формате его можно редактировать???
Выбирай:
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
Cообщение Not a table. Можно ли что то сделать.
    #33090811
Maltsev Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я открывал такой файл KARAT`ом, правил и сохранял.
...
Рейтинг: 0 / 0
Cообщение Not a table. Можно ли что то сделать.
    #33091564
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Burn!

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

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


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