Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

Чудеса с таблицами DBF…   Найти похожие ветки 

 
Картошка ©   (2006-11-14 21:20) [0]

Чудеса с таблицами DBF…
Кто-нибудь может объяснить следующее... Мне необходимо написать некую программу для загрузки таблиц (dbf) и далее по 2-м выбранным полям строить Таблицу перекрестных ссылок. Все это более менее сделал…только обнаружились следующие чудеса….Предположим в таблице все числовые поля типа Number. Выбираем любые 2 поля и моя программа работает – все ОК….но вот почему-то в  каждой таблице существует какое-нибудь поле(бывает и не одно) точно такого же типа (Number), внешне ничем не отличающееся от других, только вот программа с ним не работает…..????
Для наглядности вот выложил архив, где exe-шник проги и таблицы…Так вот в данной таблице полем загадкой является «Mibid3»…..(интерфейс проги оч простой)..Поэтому если кто может, посмотри, плиз….В чем проблема??? Что за мистика такая????
Вот 2 ссылки на всякий случай http://www.ann-baulina.narod.ru/error.rar и http://www.sendspace.com/file/lnzxsz
Архивчик весит 352 КБ


 
Johnmen ©   (2006-11-14 22:19) [1]

Нам вирусов не надо. И качать мы не любим.
Ты код создания таблиц показывай.


 
sniknik ©   (2006-11-14 22:51) [2]

и какой смысл в exe-шнике ??? почему не исходники? не я понимаю, они секретны и т.д. ди и самому лазить по мгабайтам кода ломает, но почему не выделить только сам глюк и выложить его исходники на 15-ть строк и с одной/двумя таблицами? раз такая пьянка. т.е. минимум (по которому исходного суперсекретного кода не воссоздать)

а екзешник из неизвестного источника только псих и согласиться запускать... т.что не соблазняй даже.


 
Anatoly Podgoretsky ©   (2006-11-14 23:03) [3]

> sniknik  (14.11.2006 22:51:02)  [2]

> т.что не соблазняй даже.

А может передумаешь?


 
Германн ©   (2006-11-15 01:57) [4]


> Anatoly Podgoretsky ©   (14.11.06 23:03) [3]
>
> > sniknik  (14.11.2006 22:51:02)  [2]
>
> > т.что не соблазняй даже.
>
> А может передумаешь?
>

Не знаю как Николай, но я для подобных (ну очень редких экспериментов) имею отдельную ось.


 
Anatoly Podgoretsky ©   (2006-11-15 09:51) [5]

И они друг друга не видят или как?


 
sniknik ©   (2006-11-15 10:57) [6]

> имею отдельную ось.
вот тебе и флаг в руки, а я все виртуалки что были (PC/VMware) давно снес и не горю желанием опять ставить.

> И они друг друга не видят или как?
теоретически нет (если речь о виртуальных), они полностью изолированы от основной, но только ведь изолированность эта обеспечивается программно... да и в них самих есть драйвера для создания обменных каталогов (т.е. можно, встроена возможность эту изолированность обойти). полных гарантий в общем я бы не дал.

p.s. основное то не в этом, главное это то, что решить вопрос можно только с кодом (дело то наверняка в 17й строке), а нам вместо возможности решить предлагается поудивляться "чудом", "вот так работает а вот так нет, ну надо же чудо какое"... без всякой возможности поковыряться в его потрохах (и убедиться что это не совсем чудо...). нафиг, это без толку потратить время (убедится в том что я и так знаю? и там могу, сразу сказать "если не работает то смотри в 17й строке"... а сэкономленное время использовать для более приятных дел (например потрепаться ;))


 
ANB ©   (2006-11-15 11:47) [7]


> Картошка ©   (14.11.06 21:20)

Значится :
1. У DBF нету типа намбер
2. НЕ указано, как именно не работает (ошибку вываливает, поле игнорит или еще чего)
3. Экзешник я качать не буду
4. Возможная причина ошибки : DECIMAL поля в DBF хранятся в виде строк. Теоретически эти строки можно попортить и они перестанут конвертится в число драйвером. Решение - читать файл напрямую и ручками обрабатывать эту ситуювину.


 
Картошка ©   (2006-11-16 00:22) [8]

Извините, пожалуйста, что бестолково объяснил проблему и выложил 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;


 
Картошка ©   (2006-11-16 00:37) [9]

А ошибка вот такая выскакивает:
Invalid use of keyword.
Token:,2
Line Number:1.


 
Anatoly Podgoretsky ©   (2006-11-16 00:46) [10]

> Картошка  (16.11.2006 0:37:09)  [9]

в каком запросе


 
sniknik ©   (2006-11-16 01:15) [11]

> А ошибка вот такая выскакивает:
ну вот, и никаких чудес... ошибка синтаксиса в запросе, осталось только выяснить в каком... а еще лучше без всяких выяснений, запустить из под делфи, поймать глюк, и начать трассировку по F7, прочитать сформированный запрос, смотреть 2-е слово в 1-ой строке. именно оно не нравится движку sql. (и о чем явно написано в ошибке)


 
Ksan ©   (2006-11-16 11:02) [12]

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;
это так к слову

а по делу давай текст запроса


 
Ksan ©   (2006-11-16 11:03) [13]

пардон два плюса лишнии :)


 
Картошка ©   (2006-11-17 01:43) [14]

при выполнении этой строчки

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;

И эта ошибка, тоько если выбранно данное несчасливое поле....


 
Германн ©   (2006-11-17 01:59) [15]


> Anatoly Podgoretsky ©   (15.11.06 09:51) [5]
>
> И они друг друга не видят или как?
>

Она других не видит, я думаю. Она 98-я. NTFS ей вроде не виден.


 
sniknik ©   (2006-11-17 02:29) [16]

> ошибка возникает при переходе с предпоследней строчку на последнюю:
выполнение запроса...
вот когда он сформирован (при трассировке стоишь на Query1.Open;) и скопируй получившийся запрос из Query1.SQL.Text сюда... потому как это он выполняется (пытается), а все эти твои переменные, это ни о чем, только затрудняют восприятие...
естественно копировать надо когда, и только
> И эта ошибка, тоько если выбранно данное несчасливое поле....
выбрано это несчастное поле...

можеш даже сам найти... в ошибке -> [9] сказано что это слово запятая с двойкой (вместо имени чегото. судя по всему вместо имени поля).


 
ЮЮ ©   (2006-11-17 05:28) [17]

Если DesimalSeparator отличен от ".", то использование FloatToStr() при наличии у числа дробной части приведет к формированию синтаксически неверного SQL предложения, что у автора и наблюдается.


 
Картошка ©   (2006-11-18 01:04) [18]


> вот когда он сформирован (при трассировке стоишь на Query1.
> Open;) и скопируй получившийся запрос из Query1.SQL.Text
> сюда

вот

до <Query1.Open>:
"Select count(поле1) from "директрория" where (поле2 between 4,2 and 66,2) and (поле1 between 131 and 153)"#$D#$A

после <Query1.Open>:
Undeclared identifier:"Query1"


 
sniknik ©   (2006-11-18 11:50) [19]

Select count(поле1) from "директрория" where (поле2 between 4,2 and 66,2) and (поле1 between 131 and 153)

разделитель дробной части цифр в запросах всегда точка "." т.к. запятая отдана для перечислений. вот тебе и "чудо", то что с другими полями этого не происходит, ну вероятно в них нет дробных значений как в этой.
решение см. [17], или задавай число числом, через параметры, без переводов в строку.
+ названия полей/файлов по русски это нехорошо, бывают трудно отслеживаемые глюки, можеш еще и с этим "налететь".


 
Картошка ©   (2006-11-18 13:39) [20]

Все правильно...проблема из-за запятой в SQL запросе..В настройках компа разделитель целой и дробной части заменил с "," на "." и все заработало...
Только все равно мне не понятно, как можно по-другому обойти эту ошибку?

> решение см. [17], или задавай число числом, через параметры,
>  без переводов в строку.

в 17 посту написано ошибка, а решения нету...и число задавать числом, а если опять число дробное и дробь от целого отделена запятой???
Вобщем, никто не знает как можно выкрутиться?


 
Anatoly Podgoretsky ©   (2006-11-18 14:03) [21]

> Картошка  (18.11.2006 13:39:20)  [20]

Никаких проблем, используй параметры и забудь про все беды с литералами.


 
Картошка ©   (2006-11-18 14:26) [22]

В общем не знаю, правильно это или нет, но сделал вот так
L:=FloatToStr(left_gor);
for i:=1 to length(L) do
 if L[i]="," then L[i]:=".";

проверить до конца не успел, но вроде работает


 
Anatoly Podgoretsky ©   (2006-11-18 14:40) [23]

> Картошка  (18.11.2006 14:26:22)  [22]

В Дельфи есть функции замены, что бы не городить свои циклы.


 
sniknik ©   (2006-11-18 18:49) [24]

Картошка ©   (18.11.06 13:39) [20]
> в 17 посту написано ошибка, а решения нету...
читаем
ЮЮ ©   (17.11.06 05:28) [17]
> Если DesimalSeparator отличен от ".", то использование FloatToStr()...
что стоит посмотреть, при трассировке, естественно перед использованием FloatToStr ???
посмотреть, убедится что действительно отличается, и сделать чтобы не отличалось, простым присвоением нужного значения.

p.s. ну нельзя же ждать полностью разжеванного, готового решения... это и бвло решение.
p.p.s. параметры естественно лучше.


 
Картошка ©   (2006-11-19 14:10) [25]


> В Дельфи есть функции замены, что бы не городить свои циклы.

А что за функции конкретно???

Вся моя проблема заключается в том, что данная прога должна быть универсальной...Так вот с другой уже таблицой обнурежено следующее чудо (без преувеличения)..Имеется значит поле (даже 2) типа Number(2,0)...и эти самые поля не проходят вот это вот условие:

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;


то есть компютер почему-то не хочет их считать числовыми....??????


 
sniknik ©   (2006-11-19 14:31) [26]

> то есть компютер почему-то не хочет их считать числовыми....??????
нет, он похоже не хочет считать их ftInteger или ftFloat которыми все множество числовых типов не ограничивается...

TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd)

Number(2,0) это будет скорее всего ftBCD (оп свойств установленных зависит)

> Вся моя проблема заключается в том, что данная прога должна быть универсальной...
все ясно, бросай все пока не поздно и увольняйся... универсальных прог не бывает (пока что ни одной не написано), все по до чтото и для чегото.


 
Anatoly Podgoretsky ©   (2006-11-19 15:00) [27]

> Картошка  (19.11.2006 14:10:25)  [25]

Например StringReplace


 
Anatoly Podgoretsky ©   (2006-11-19 15:01) [28]

> sniknik  (19.11.2006 14:31:26)  [26]

> бросай все пока не поздно и увольняйся

Зачем? Это же такое выгодное дело, кусок хлеба до пенсии обеспечен.


 
Картошка ©   (2006-11-19 17:51) [29]


> все ясно, бросай все пока не поздно и увольняйся... универсальных
> прог не бывает (пока что ни одной не написано), все по до
> чтото и для чегото

=)))) Это моя бакалаврская работа =))) Такие вот грамотные преподаватели в институтах..... Насчет типов - спасибо, попробую добавить еще BCD...


 
Картошка ©   (2006-11-21 16:07) [30]

люди, плиз, еще один глюк есть(надеюсь что последний)..Как исправить его и из=за чего он??? Проблема заключается в следующем: мне необходимо также чтобы можно было строить таблицу перекрестных ссылок, с полем типа "DateTime"(дата)...что я делаю для этого:
в условие добавил типы ftDate и ftDateTime..Условие выполняется, все оК
Но вот здесь происходит ошибка:

Query1.SQL.Add("SELECT count("+field_vert+") from ""+tablica+"" where ("+field_gor+" BETWEEN "+left_gorS+" and "+prav_gorS+") AND ("+field_vert+" BETWEEN "+left_vertS+" and "+prav_vertS+")");
Query1.Open;

Значение Query1
"SELECT count(поле1) from "директория" where (поле2 between 34535 and 34716) and (поле2 between 131 and 153)"#$D#$A
и
Undeclared identifier: "query 1"
поле2 - это есть числовое поле..
ошибка вот такая вылетает:

Project Project1.exe raised exception class EDBEngineError with message "Type mismatch inexpession.". Process stopped.Use Step or Run to continue.


 
Картошка ©   (2006-11-21 16:09) [31]


> поле2 - это есть числовое поле..

тьфу, в смысле после с датой


 
Картошка ©   (2006-11-21 16:12) [32]


> Значение Query1
> "SELECT count(поле1) from "директория" where (поле2 between
> 34535 and 34716) and (поле2 between 131 and 153)"#$D#$A

во втором случае не поле 2, а поле 1 уже...

P.S. Неплохо было бы сделать кнопку редактировать сообщение =)


 
sniknik ©   (2006-11-21 16:38) [33]

> "Type mismatch in expession."
> тьфу, в смысле после с датой
а в условии число, неудивительно что ошибка не того типа в выражении, не находишь?
есть конечно движки с авто конвертацией (jet например), и это бы "прокатило", но BDE судя по всему не из их числа.

про параметры тебе еще не говорили?... попробуй, классная штука.


 
Anatoly Podgoretsky ©   (2006-11-21 17:13) [34]

> Картошка  (21.11.2006 16:07:30)  [30]

В приведеном коде такой идентификатор не фигурирует, отсюда вывод - этот код не реальный, у тебя другой код.



Страницы: 1 вся ветка

Текущий архив: 2006.12.10;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.051 c
15-1163696766
ArtemESC
2006-11-16 20:06
2006.12.10
Зачем нужна теория вероятности?


8-1146079729
Azeem
2006-04-26 23:28
2006.12.10
контурные треугольники


2-1163925948
F33l
2006-11-19 11:45
2006.12.10
отступ текста в TMemo


1-1161768709
BFG9k
2006-10-25 13:31
2006.12.10
Как скачать каринку с помощью idHTTPServer


3-1159871123
ККВ
2006-10-03 14:25
2006.12.10
Как получить значение поля?