Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизЧудеса с таблицами 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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.048 c