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

Вниз

Непонятно в Local SQL   Найти похожие ветки 

 
Евгений Р.   (2007-01-09 23:54) [0]

Есть запрос:
select rs.opr2,rs.nomer,rs.data1,rs.data2,rs.kolich,sb.mest
from RschBn rs
left join svBn sv
 on sv.opr1=rs.opr1
left join StrBn sb
 on sb.opr2=rs.opr2
where ((rs.data1<=:data2 and rs.data2>=:data1)
                              or sv.DataR between :data1 and :data2) and
      rs.kGrup=1 and sv.KodStatus=11

Если период (data1 и Data2) достаточно большой (отбирается много записей), то при выполнении выдается ошибка: access violation ... . При меньшем периоде - все работает.
Если в конце первой строки вместо "sb.mest" указать "sb.*", то все замечательно работает при любом периоде.
Таблицы - *.dbf


 
try ©   (2007-01-09 23:59) [1]

У тебя здесь с точки зрения BDE 4 (четыре) параметра. Но у первого и четвёртого совпадают имена, так же как и у второго и третьего.
Так что надо проявить фантазию при именовании параметров, чтобы безболезненно обращаться к ним по имени :-)


 
Евгений Р.   (2007-01-10 00:16) [2]

В запросе 2 параметра Data1 и Data2


 
try ©   (2007-01-10 00:42) [3]

В запросе 4 параметра data2, data1, data1 и data2
Количество считается по двоеточиям перед именем.


 
sniknik ©   (2007-01-10 00:50) [4]

> В запросе 4 параметра data2, data1, data1 и data2
BDE позволяет одноименные, оно с ними "дружит" и понимает ;).
нет, сдесь чтото другое, но что х.з. ошибка для запроса больно странная, не в нем происходит, имхо.


 
Германн ©   (2007-01-10 01:00) [5]


> ошибка для запроса больно странная, не в нем происходит,
>  имхо.
>

Угу. Более вероятно, что ошибка в коде, в котором используются результаты запроса. Очень интересно что ещё есть в таблице sb, кроме
> mest
?


 
Евгений Р.   (2007-01-10 01:32) [6]

Структура sb:
strBN.DBF  31909  31909
 OPR1           C10/11   TStringField
 OPR2           C10/11   TStringField
 NRASP          N  / 8   TFloatField
 KODORG         N  / 8   TFloatField
 NOMER          N  / 2   TSmallintField
 PBRN           L  / 2   TBooleanField
 PRNZ           L  / 2   TBooleanField
 RNZ            N  / 2   TSmallintField
 PBEZPODS       L  / 2   TBooleanField
 PDOPMEST       L  / 2   TBooleanField
 PSTRAXOVKI     L  / 2   TBooleanField
 VDTRF          N  / 2   TSmallintField
 STRANA         C20/21   TStringField
 TIPPROG        N  / 2   TSmallintField
 FIO            C25/26   TStringField
 POL            N  / 2   TSmallintField
 DATA1          D  / 4   TDateField
 TIME1          N  / 8   TFloatField
 DATA2          D  / 4   TDateField
 TIME2          N  / 8   TFloatField
 PROGITO        N  / 8   TFloatField
 TARIF          N  / 8   TFloatField
 PPERESEL       L  / 2   TBooleanField
 MEST           N  / 2   TSmallintField

Ошибку дает именно запрос. Для проверки сделал новое приложение с одной формой. В кнопке код:
  qu.ParamByName("data1").asDateTime:=encodeDate(2006,01,1);
  qu.ParamByName("data2").asDateTime:=encodeDate(2006,12,31);
  showMessage("Перед");
  qu.open;
  showMessage("После");
Окошко с первой надписью показывает, со второй - нет.
То же в отладчике.


 
Германн ©   (2007-01-10 02:08) [7]


> Для проверки сделал новое приложение с одной формой. В кнопке
> код:
>   qu...

А что есть qu?
Если сделал тестовое приложение
> с одной формой.
, то не сложно привести его целиком. Не помню только, когда dfm стали текстовыми :( В Д5 или в Д6?


 
Desdechado ©   (2007-01-10 11:21) [8]

Вполне возможна порча данных в поле. И при "небольшом диапазоне дат" просто эта порченая запись не выбирается.
Встречал такое. Особенно, если происхождение эти DBF - неизвестная ДОС-программа.


 
Anatoly Podgoretsky ©   (2007-01-10 12:30) [9]

> sniknik  (10.01.2007 00:50:04)  [4]

> BDE позволяет одноименные, оно с ними "дружит" и понимает ;).

Что-то не припомню такого, как раз наоборот честный, одно значение - один плейсхолдер.


 
sniknik ©   (2007-01-10 12:57) [10]

> Что-то не припомню такого, как раз наоборот честный, одно значение - один плейсхолдер.
проверял так, как раз после случая на форуме когда уверяли, что работает, а по идее изза задвоенных имен параметров не должно, так то я с BDE практически не работал, бог миловал ;), сразу в дельфи на ADO начал.  

procedure TForm1.Button1Click(Sender: TObject);
begin
 Query1.SQL.Text:= "SELECT ID,:Par AS Param FROM Test.Dbf WHERE ID=:Par"; //2!
 Query1.ParamByName("ID").AsInteger:= 81; //1 раз!
 Query1.Open;
end;

после выполнения было 2 столбца одинаковых цифр. из чего сделал вывод, значения от единственного присвоения получили оба параметра и тот что "AS Param" и в условии, т.к. и условие сработало (выборка 1 значения цифры из множества) и в подстановке нормальное значение есть.
если это означает чтото другое... ну я не знаю тогда что. проверьте сами.
а вот каким образом получили, на уровне движка, или парсер в разборе "умный" делает ссылки на значение, или еще как, не разбирался. да и не нужно мне это. (BDE для меня не рабочий инструмент, а так, иногда развлечься ;о))


 
Евгений Р.   (2007-01-10 16:07) [11]


> то не сложно привести его целиком. Не помню только, когда
> dfm стали текстовыми :( В Д5 или в Д6?


unit qqqq;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Db, DBTables, StdCtrls, Grids, DBGrids;

type
 TForm1 = class(TForm)
   qu: TQuery;
   Button1: TButton;
   DataSource1: TDataSource;
   DBGrid1: TDBGrid;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  qu.ParamByName("data1").asDateTime:=encodeDate(2006,01,1);
  qu.ParamByName("data2").asDateTime:=encodeDate(2006,12,31);
  showMessage("Перед");
  qu.open;
  showMessage("После");
end;

end.
*****************************************
object Form1: TForm1
 Left = 192
 Top = 107
 Width = 696
 Height = 480
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
   Left = 288
   Top = 40
   Width = 75
   Height = 25
   Caption = "Button1"
   TabOrder = 0
   OnClick = Button1Click
 end
 object DBGrid1: TDBGrid
   Left = 48
   Top = 168
   Width = 625
   Height = 201
   DataSource = DataSource1
   TabOrder = 1
   TitleFont.Charset = DEFAULT_CHARSET
   TitleFont.Color = clWindowText
   TitleFont.Height = -11
   TitleFont.Name = "MS Sans Serif"
   TitleFont.Style = []
 end
 object qu: TQuery
   DatabaseName = "DebugVest"
   SQL.Strings = (
     "select rs.opr2,rs.nomer,rs.data1,rs.data2,rs.kolich,sb.*"
     "from RschBn rs"
     "left join svBn sv"
     "  on sv.opr1=rs.opr1"
     "left join StrBn sb"
     "  on sb.opr2=rs.opr2"
     "where ((rs.data1<=:data2 and rs.data2>=:data1)"
     
       "                               or sv.DataR between :data1 and :d" +
       "ata2) and"
     "       rs.kGrup=1 and sv.KodStatus=11"
     "")
   Left = 128
   Top = 64
   ParamData = <
     item
       DataType = ftUnknown
       Name = "data2"
       ParamType = ptUnknown
     end
     item
       DataType = ftUnknown
       Name = "data1"
       ParamType = ptUnknown
     end
     item
       DataType = ftUnknown
       Name = "data1"
       ParamType = ptUnknown
     end
     item
       DataType = ftUnknown
       Name = "data2"
       ParamType = ptUnknown
     end>
 end
 object DataSource1: TDataSource
   DataSet = qu
   Left = 192
   Top = 64
 end
end


 
Евгений Р.   (2007-01-10 16:12) [12]


> BDE позволяет одноименные, оно с ними "дружит" и понимает


Оба параметра передаются в запрос без проблем. Отчет работает стабильно у многих клиентов и часто используется.


> Вполне возможна порча данных в поле. И при "небольшом диапазоне
> дат" просто эта порченая запись не выбирается.
> Встречал такое. Особенно, если происхождение эти DBF - неизвестная
> ДОС-программа.

Данные созданы только этой программой через это БДЕ.
Если диапазон проходить по кускам - все нормально для каждого участка. Если целиком - ошибка.
Если из таблицы выбрано одно поле - ошибка, если все - нормально?????


 
sniknik ©   (2007-01-10 18:11) [13]

вышли таблицу вместе с этим примером, домой доеду посмотрю.


 
Евгений Р.   (2007-01-10 19:39) [14]

Качай по ссылке


 
sniknik ©   (2007-01-10 20:24) [15]

> Качай по ссылке
по какой? не вижу никакой ссылки, если ты ее письмом выслал то не дошла, возможно спамофильтры "зарубили".

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


 
Евгений Р.   (2007-01-10 21:23) [16]

Отправил по почте еще 2 раза
Ссылку ввести не получается, наверное рубят.


 
sniknik ©   (2007-01-10 22:45) [17]

да получил, гдето через полчаса после поста...
ошибка в данных всетаки есть, jet не хочет открывать таблицу strBN.DBF если в ней есть 11997-я запись с начала... что в ней такого так и не понял,
зато BDE открывает, ну и ладно (чуток по разному ведут себя и не только в этом).
потом есть 6 пустых записей, т.е. даже индексные (opr1/2) там где пустышки ну никак не уперлись полностью пусты... явно были сбои при записи в таблицу.

по топику, сама с BDE проблема/глюк похоже в ленгдрайвере, если поменять на DBWINUS0 то начинают отрабатывать оба запроса (только не спрашивай как мне в голову пришло проверить ;о)), сам не пойму)
изменить можно так
открыть таблицей (вернее закрыть таблицу, просто должно быть настроено, от нее "пляшем") и выполнить
 Table1.Close;
 ChangeLangDriver(ExtractFilePath(Edit1.Text), ExtractFileName(Edit1.Text), "DBWINUS0");

procedure ChangeLangDriver(DatabaseName, TableName, LDName: string);
var
 TblExt: string;
 Database: TDatabase;
 TblDesc: CRTblDesc;
 OptDesc: FLDDesc;
 OptData: array [0..250] of Char;
 Cur: hDBICur;
 Rec: CFGDesc;
begin
 if (TableName="") or (LDName="") then raise Exception.Create("Unknown TableName or LDName");
 Database:= Session.OpenDatabase(DatabaseName);
 try
   if Database.IsSQLBased then raise Exception.Create("Function ChangeLangDriver working only with dBase or Paradox tables");
   FillChar(OptDesc, SizeOf(OptDesc), #0);
   FillChar(TblDesc, SizeOf(TblDesc), #0);
   StrCopy(OptDesc.szName, "LANGDRIVER");
   OptDesc.iLen:=Length(LDName)+1;
   with TblDesc do begin
     StrPCopy(szTblName, TableName);
     TblExt:=UpperCase(ExtractFileExt(TableName));
     if TblExt=".DBF" then StrCopy(szTblType, szDbase)
     else if TblExt=".DB" then StrCopy(szTblType, szParadox)
     else begin
       AnsiToOEM(StrPCopy(OptData, DatabaseName), OptData);
       if DbiOpenCfgInfoList(nil, dbiREADONLY, cfgPersistent, StrPCopy(OptData, "\DATABASES\"+StrPas(OptData)+"\DB INFO\"),Cur)<>DBIERR_NONE
         then raise Exception.Create("Unknown table type");
       try
         while DbiGetNextRecord(Cur, dbiNOLOCK, @Rec, nil)<>DBIERR_EOF do
           if StrComp(Rec.szNodeName, "DEFAULT DRIVER")=0 then begin
             StrCopy(szTblType, Rec.szValue);
             Break;
           end;
       finally
         Check(DbiCloseCursor(Cur));
       end;
     end;
     iOptParams:=1;
     pfldOptParams:=@OptDesc;
     pOptData:=@OptData;
   end;
   StrPCopy(OptData, LDName);
   Check(DbiDoRestructure(Database.Handle, 1, @TblDesc, nil,nil, nil, False));
 finally
   Session.CloseDatabase(Database);
 end;
end;

в общемто и все, после этого твоя тестовая програмка уже ошибок не давала.

на всякий случай уже исправленный файл strBN.DBF вместе с програмкой которой можно поменять ленгдрайвер (показанный код из нее).
http://webfile.ru/1275296
пробуй.

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


 
sniknik ©   (2007-01-10 22:48) [18]

> кстати неплохо былобы создать таблицу заново
а еще лучше забросить BDE совсем, и заняться базами данных... ;о))


 
sniknik ©   (2007-01-10 22:56) [19]

> открыть таблицей (вернее закрыть таблицу, просто должно быть настроено, от нее "пляшем") и выполнить
> Table1.Close;
oops... это в программе я от нее "пляшу", т.к. она открыта из введенного в эдит, а сам ChangeLangDriver ни с чем не связан... не помню ничего уже ;(
ну да сам разберешься. вроде несложно. по именам параметров понять чего туда нужно. :)


 
Евгений Р.   (2007-01-11 00:49) [20]


> если поменять на DBWINUS0 то начинают отрабатывать оба запроса

Действительно помогло, но ...
Захожу через DataBaseDeskTop. Показывает драйвер Ansi2. Наверное он DBWINUS0 не знает, ставит стандартный. Меняю на 866 - снова глючит. Возвращаю Анси-нормально.
Но у меня там есть русские поля (fio,strana). Они, увы, анси не признают.

Пробовал удалять записи из strBn. Ошибка исчезает только когда удаляется определенное количество записей именно входящих в выборку. Удаление даже всех не входящих ничего не дает.
Но самое странное - почему работает при sb.*?????
Удаление и перезапись тоже не помогают, как и удаление индекса.


> а еще лучше забросить BDE совсем, и заняться базами данных.
> ..

а еще лучше забросить программирование и занятся добычей нефти. Но не всегда выходит делать то, что лучше.

А из СУБД, рекомендовал бы FB или MS SQL?


 
Германн ©   (2007-01-11 00:54) [21]


> sniknik ©   (10.01.07 22:48) [18]
>
> > кстати неплохо былобы создать таблицу заново
> а еще лучше забросить BDE совсем, и заняться базами данных.
> .. ;о))
>

Лучше было бы и не начинать с ней шаманские пляски. Но если он только начал, тогда ещё может быть и не поздно.


 
sniknik ©   (2007-01-11 01:09) [22]

> Но самое странное - почему работает при sb.*?????
наверное не анализирует по полям, открывает как бы таблицей.

попытайся всеже сделать корректировку структуры/данных (последний абзац в [17]), + вообще наведи порядок в таблице, там у тебя например куча логических полей (у которых в принципе Null нету) не заполнено.
пустышки опять же.
потом связка(обьеденение) по строковым полям тоже какаято... ;(, не нравится мне чегото, на числа нельзя перейти? (потому как это первые поля по которым заподозрил ленгдрайвер... а уж после того как пытался посчитать повторения и сделал группировку по одному из них и SQL Explorer выдал ошибку индекса or ланпдравера... ну понятно)

> А из СУБД, рекомендовал бы FB или MS SQL?
мне практически все равно, но на работе у нас больше востребован MS SQL поэтому им больше и занимаюсь. (под IB 6.5 заказ был 1 единственный раз в 5 лет...)
имхо, что угодно, лиш бы не BDE. :)


 
sniknik ©   (2007-01-11 01:27) [23]

+
в самих "ключевых" полях зачастую концевики у значений символом "_", опасный символ... ;), это в запросах с LIKE  означает любой символ, а как его обрабатывает ленгдрайвер в нестандартной ситуации? хз.
к тому же это явно результат некорректного переноса  с какойто системы... в оригинале их наверняка не было (имхо), а при переносе ими "добили" короткие varchar-ы, до максимального размера поля. (заметь они длинной строго 10 даже там где это не нужно, ну не считая пустышек от явных глюков записи)



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

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

Наверх




Память: 0.55 MB
Время: 0.073 c
6-1156437318
i-s-v
2006-08-24 20:35
2007.01.28
Прослушка сети


2-1168331690
DelphiLexx
2007-01-09 11:34
2007.01.28
Как в DBGrid e вычислить Top и Bottom последней записи


2-1168104623
Infinityx93
2007-01-06 20:30
2007.01.28
Обьясните как Chart om пользоваться???


1-1164973182
LexusU
2006-12-01 14:39
2007.01.28
Подключение DLL написаной на VC++ в проекте Delphi


15-1168246600
Chort
2007-01-08 11:56
2007.01.28
Вопрос