![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чудеса с таблицами DBF… [D7, dBase, FoxPro]
Картошка © (2006-11-14 21:20:00)Чудеса с таблицами DBF…
Кто-нибудь может объяснить следующее... Мне необходимо написать некую программу для загрузки таблиц (dbf) и далее по 2-м выбранным полям строить Таблицу перекрестных ссылок. Все это более менее сделал…только обнаружились следующие чудеса….Предположим в таблице все числовые поля типа Number. Выбираем любые 2 поля и моя программа работает – все ОК….но вот почему-то в каждой таблице существует какое-нибудь поле(бывает и не одно) точно такого же типа (Number), внешне ничем не отличающееся от других, только вот программа с ним не работает…..????
Для наглядности вот выложил архив, где exe-шник проги и таблицы…Так вот в данной таблице полем загадкой является «Mibid3»…..(интерфейс проги оч простой)..Поэтому если кто может, посмотри, плиз….В чем проблема??? Что за мистика такая????
Вот 2 ссылки на всякий случай http://www.ann-baulina.narod.ru/error.rarи http://www.sendspace.com/file/lnzxsz
Архивчик весит 352 КБ
Картошка (2006-11-17 01:43:00) [21]при выполнении этой строчки
Form2.Table1.Fields.Fields[j].AsString:=kolich_peresech(j,i,mx1,mn1,mx,mn, diap1,diap,mas[2],mas[1]);
ошибка возникает в функции:
function TForm1.kolich_peresech(n_gor,n_vert:integer; max_gor,min_gor,max_vert,min_vert:real; diap_gor,diap_vert:integer;field_gor,field_vert:shortstring):string;
var left_gor, prav_gor, left_vert, prav_vert:real;
begin
left_gor:=min_gor+(n_gor-1)*diap_gor+1;
prav_gor:=min_gor+(n_gor)*diap_gor;
left_vert:=min_vert+(n_vert-1)*diap_gor+1;
prav_vert:=min_vert+(n_vert)*diap_vert;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT count('+field_vert+') from "'+tablica+'" where ('+field_gor+' BETWEEN '+FloatTOStr(left_gor)+' and '+FloatToStr(prav_gor)+') AND ('+field_vert+' BETWEEN '+FloatTOStr(left_vert)+' and '+FloatToStr(prav_vert)+')');
Query1.Open;
REsult:=Query1.Fields.Fields[0].AsString;
end;
ошибка возникает при переходе с предпоследней строчку на последнюю:
Query1.Open;
REsult:=Query1.Fields.Fields[0].AsString;
И эта ошибка, тоько если выбранно данное несчасливое поле....
Ksan (2006-11-16 11:03:00) [22]пардон два плюса лишнии :)
Ksan (2006-11-16 11:02:00) [23]procedure TForm1.diapazon(stroka:shortstring; var max,min:real);
begin
Query1.SQL.Clear;
Query1.SQL.Add('SELECT MAX('+stroka+',) + MIN('+stroka+') + FROM "'+tablica+'"');
Query1.Open;
max:=Query1.Fields.Fields[0].Value;
min:=Query1.Fields.Fields[1].Value;
end;
это так к слову
а по делу давай текст запроса
sniknik (2006-11-16 01:15:00) [24]> А ошибка вот такая выскакивает:
ну вот, и никаких чудес... ошибка синтаксиса в запросе, осталось только выяснить в каком... а еще лучше без всяких выяснений, запустить из под делфи, поймать глюк, и начать трассировку по F7, прочитать сформированный запрос, смотреть 2-е слово в 1-ой строке. именно оно не нравится движку sql. (и о чем явно написано в ошибке)
Anatoly Podgoretsky (2006-11-16 00:46:00) [25]> Картошка (16.11.2006 0:37:09) [9]
в каком запросе
Картошка (2006-11-16 00:37:00) [26]А ошибка вот такая выскакивает:
Invalid use of keyword.
Token:,2
Line Number:1.
Картошка (2006-11-16 00:22:00) [27]Извините, пожалуйста, что бестолково объяснил проблему и выложил exe-шник...Все-таки первый раз....
Напомню, в программе мне необходимо пересечь 2 числовых поля(каждое поле делится на несколько диапазонов), другими словами нужно посторить таблицу перекрестных ссылок, внутри которой отображается кол-во пересечений диапазона с диапазоном...
вот и код...если не понятно, зачем какие переменные, пишите - я отвечу..
function TForm1.proverka(stroka:shortstring):boolean; //функция для выявления числовых полей
begin
Result:=false;
if (Table1.Fields.FieldByName(stroka).DataType=ftInteger) or (Table1.Fields.FieldByName(stroka).DataType=ftFloat) then
Result:=true;
end;
procedure TForm1.diapazon(stroka:shortstring; var max,min:real);
begin
Query1.SQL.Clear;
Query1.SQL.Add('SELECT MAX('+stroka+') FROM "'+tablica+'"');
Query1.Open;
max:=Query1.Fields.Fields[0].Value;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT MIN('+stroka+') FROM "'+tablica+'"');
Query1.Open;
min:=Query1.Fields.Fields[0].Value;
end;
function TForm1.kolich_peresech(n_gor,n_vert:integer; max_gor,min_gor,max_vert,min_vert:real; diap_gor,diap_vert:integer;field_gor,field_vert:shortstring):string;
var left_gor, prav_gor, left_vert, prav_vert:real;
begin
left_gor:=min_gor+(n_gor-1)*diap_gor+1;
prav_gor:=min_gor+(n_gor)*diap_gor;
left_vert:=min_vert+(n_vert-1)*diap_gor+1;
prav_vert:=min_vert+(n_vert)*diap_vert;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT count('+field_vert+') from "'+tablica+'" where ('+field_gor+' BETWEEN '+FloatTOStr(left_gor)+' and '+FloatToStr(prav_gor)+') AND ('+field_vert+' BETWEEN '+FloatTOStr(left_vert)+' and '+FloatToStr(prav_vert)+')');
Query1.Open;
REsult:=Query1.Fields.Fields[0].AsString;
end;
Form2.Query1.SQL.Add('CREATE TABLE MyTable(Field1 CHAR(20), '); //формируем собственно таблицу перекрестных ссылок, приченм в той же директории, где и таблица из которой извлекаем 2 поля
for i:=1 to kol do
if i<>kol then
Form2.Query1.SQL.Add('Field'+IntToStr(i+1)+' CHAR(20), ')
else
Form2.Query1.SQL.Add('Field'+IntToStr(i+1)+' CHAR(20))');
Form2.Query1.ExecSQL;
tablica1:=tablica;
i:=Length(tablica1);
while tablica1[i] <>'\' do
i:=i-1;
delete(tablica1,i+1,length(tablica1));
tablica1:=tablica1+'MyTable.db';
...
Query1.SQL.Clear;
if proverka(mas[1])and proverka(mas[2])then //выбраны оба поля
begin
diapazon(mas[1],mx,mn);
diapazon(mas[2],mx1,mn1);
diap:=round((mx-mn)/koldv);
diap1:=round((mx1-mn1)/koldg);
for i:=1 to koldv do
begin
Form2.Table1.Append;
Form2.Table1.Fields.Fields[0].AsString:='От '+FloatToStr((mn+(i-1)*diap)+1)+' до '+FloatToStr(mn+diap*i);
for j:=1 to koldg do
Form2.Table1.Fields.Fields[j].AsString:=kolich_peresech(j,i,mx1,mn1,mx,mn,diap1, diap,mas[2],mas[1]);
Form2.Table1.Post;
end;
for i:=1 to koldg-1 do
Form2.DBGrid1.Columns[i].Title.Caption:='От '+FloatToStr((mn1+(i-1)*diap1+1))+' до '+FloatToStr((mn1+diap1*i));
FOrm2.DBGrid1.Columns[koldg].Title.Caption:='От '+FloatToStr((mn1+(koldg-1)*diap1+1))+' до '+FloatToStr(mx1);
end;
ANB (2006-11-15 11:47:00) [28]
> Картошка © (14.11.06 21:20)
Значится :
1. У DBF нету типа намбер
2. НЕ указано, как именно не работает (ошибку вываливает, поле игнорит или еще чего)
3. Экзешник я качать не буду
4. Возможная причина ошибки : DECIMAL поля в DBF хранятся в виде строк. Теоретически эти строки можно попортить и они перестанут конвертится в число драйвером. Решение - читать файл напрямую и ручками обрабатывать эту ситуювину.
sniknik (2006-11-15 10:57:00) [29]> имею отдельную ось.
вот тебе и флаг в руки, а я все виртуалки что были (PC/VMware) давно снес и не горю желанием опять ставить.
> И они друг друга не видят или как?
теоретически нет (если речь о виртуальных), они полностью изолированы от основной, но только ведь изолированность эта обеспечивается программно... да и в них самих есть драйвера для создания обменных каталогов (т.е. можно, встроена возможность эту изолированность обойти). полных гарантий в общем я бы не дал.
p.s. основное то не в этом, главное это то, что решить вопрос можно только с кодом (дело то наверняка в 17й строке), а нам вместо возможности решить предлагается поудивляться "чудом", "вот так работает а вот так нет, ну надо же чудо какое"... без всякой возможности поковыряться в его потрохах (и убедиться что это не совсем чудо...). нафиг, это без толку потратить время (убедится в том что я и так знаю? и там могу, сразу сказать "если не работает то смотри в 17й строке"... а сэкономленное время использовать для более приятных дел (например потрепаться ;))
Anatoly Podgoretsky (2006-11-15 09:51:00) [30]И они друг друга не видят или как?
Германн (2006-11-15 01:57:00) [31]
> Anatoly Podgoretsky © (14.11.06 23:03) [3]
>
> > sniknik (14.11.2006 22:51:02) [2]
>
> > т.что не соблазняй даже.
>
> А может передумаешь?
>
Не знаю как Николай, но я для подобных (ну очень редких экспериментов) имею отдельную ось.
Anatoly Podgoretsky (2006-11-14 23:03:00) [32]> sniknik (14.11.2006 22:51:02) [2]
> т.что не соблазняй даже.
А может передумаешь?
sniknik (2006-11-14 22:51:00) [33]и какой смысл в exe-шнике ??? почему не исходники? не я понимаю, они секретны и т.д. ди и самому лазить по мгабайтам кода ломает, но почему не выделить только сам глюк и выложить его исходники на 15-ть строк и с одной/двумя таблицами? раз такая пьянка. т.е. минимум (по которому исходного суперсекретного кода не воссоздать)
а екзешник из неизвестного источника только псих и согласиться запускать... т.что не соблазняй даже.
Johnmen (2006-11-14 22:19:00) [34]Нам вирусов не надо. И качать мы не любим.
Ты код создания таблиц показывай.