:: Архив конференции по VFP до 2005 года
Алиас не найден ...
Dionnis

Сообщений: 5
Дата регистрации: 17.01.2005
Всем добрый день!
Столкнулся со следующей проблемой:
Сразу скажу что работаю с dbf таблицами через Delphi при помощи провайдера Microsoft OLE DB Provider for Visual FoxPro. Опубликовал тему не на форуме Delphi, так как проблема именно касается Fox'а.
Я выполняю импорт данных из dbf файла в mdb.
Обрабатывается большой объём даных по циклу, где для проверки даных
производятся запросы к различным dbf - таблицам. При выполнении запросов используются хранимые процедуры, описанные в файле dbc., ниже представлен код одной из процедур (их код аналогичен, меняется только название таблицы к которой адресован запрос):

PROCEDURE GetDeloN
PARAM M.ND
LOCAL lcAliasName
SET EXCLUSIVE OFF
lcAliasName = 'a' + SYS(2015)
USE DELO IN 0 AGAIN SHARED ALIAS (lcAliasName)
SELE (lcAliasName)
SET INDEX TO IDELO.CDX
SET ORDER TO TAG NOM
SELECT * FROM (lcAliasName) WHERE (NOM=M.ND) INTO CURSOR TmpDbf NOFILTER
SELE (lcAliasName)
USE
RETURN

И в какойто момент времени у меня возникает ошибка: Alias (имя Алиаса) is not found.
С чем это может быть связано, может быть в ХП чтото неверно написано?
Ratings: 0 negative/0 positive
Re: Алиас не найден ...
GS

Сообщений: 5
Дата регистрации: 07.02.2005
Hi, Dionnis!
Может быть, несколько упростить код, чтобы проще было найти ошибку, либо вообще её обойти:
PROCEDURE GetDeloN (m.ND)
SET EXCLUSIVE OFF
USE DELO IN 0 AGAIN SHARED ALIAS Delo1 ORDER NOM OF "IDELO.CDX" && Фиксированный алиас (всё равно потом закрывать)
SELECT * FROM Delo1 WHERE NOM = m.ND INTO CURSOR TmpDbf NOFILTER
USE IN SELECT("Delo1")
&& Достаточно даже USE IN Delo1, т.к. если таблица DELO не будет открыта по тем или иным причинам, то выскочит ошибка на команде USE
RETURN

P.S.
Кстати, из каких соображений таблице DELO соответствует индексный файл IDELO.CDX?
Если таблице DELO будет соответствовать индексный файл DELO.CDX, то он откроется автоматически,
а SQL-запрос сам найдёт индекс по полю NOM, т.е. достаточно написать:
USE DELO IN 0 AGAIN SHARED ALIAS Delo1
SELECT * FROM Delo1 ...
Ratings: 0 negative/0 positive
Re: Алиас не найден ...
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Dionnis!

Мягко говоря странная процедура - и как же вы умудряетесь пользоваться такой
через Ole DB провайдера? Она ничего не возвращает, никаких постоянных
объектов нигде не создаёт (а до созданного ею курсора "извне" достучаться
AFAIK нельзя вплоть до VFP9 - но даже там нужны доп. команды)... Да и
НАЗНАЧЕНИЕ процедуры непонятно - надо определить есть ли запись с таким
кодом? Или посчитать сколько таких записей?
Кроме того полное отсутствие обработчика ошибок это явный прокол
разработчика - например недоступна соответствующая таблица и что тогда?

Кстати указать используемую версию VFP и VFP OLE DB Provider явно не лишним
будет.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Алиас не найден ...
Dionnis

Сообщений: 5
Дата регистрации: 17.01.2005
А за советы большое спасибо GS писал(а):
Цитата:
Hi, Dionnis!
Может быть, несколько упростить код, чтобы проще было найти ошибку, либо вообще её обойти:
PROCEDURE GetDeloN (m.ND)
SET EXCLUSIVE OFF
USE DELO IN 0 AGAIN SHARED ALIAS Delo1 ORDER NOM OF "IDELO.CDX" && Фиксированный алиас (всё равно потом закрывать)
SELECT * FROM Delo1 WHERE NOM = m.ND INTO CURSOR TmpDbf NOFILTER
USE IN SELECT("Delo1")
&& Достаточно даже USE IN Delo1, т.к. если таблица DELO не будет открыта по тем или иным причинам, то выскочит ошибка на команде USE
RETURN

P.S.
Кстати, из каких соображений таблице DELO соответствует индексный файл IDELO.CDX?
Если таблице DELO будет соответствовать индексный файл DELO.CDX, то он откроется автоматически,
а SQL-запрос сам найдёт индекс по полю NOM, т.е. достаточно написать:
USE DELO IN 0 AGAIN SHARED ALIAS Delo1
SELECT * FROM Delo1 ...



Ах если бы это зависело от меня, я бы так не парился конечно.
Но наши чудо-программисты имеют свои взгляды на этот счёт, говорят что у них в Clipper'е что то
будет конфликтовать если индексный файл будет иметь имя такое же как и dbf-таблица.
Ratings: 0 negative/0 positive
Re: Алиас не найден ...
Dionnis

Сообщений: 5
Дата регистрации: 17.01.2005
Igor Korolyov писал(а):
Цитата:
Hi, Dionnis!
Мягко говоря странная процедура - и как же вы умудряетесь пользоваться такой
через Ole DB провайдера? Она ничего не возвращает, никаких постоянных
объектов нигде не создаёт (а до созданного ею курсора "извне" достучаться
AFAIK нельзя вплоть до VFP9 - но даже там нужны доп. команды)... Да и
НАЗНАЧЕНИЕ процедуры непонятно - надо определить есть ли запись с таким
кодом? Или посчитать сколько таких записей?
Кроме того полное отсутствие обработчика ошибок это явный прокол
разработчика - например недоступна соответствующая таблица и что тогда?

Кстати указать используемую версию VFP и VFP OLE DB Provider явно не лишним
будет.



Hi, Игорь Королёв!
Версия VFP OLE DB Provider'а номер 8.
Конечно может быть и странная процедура, всё таки Fox, я вообще можно сказать не знаю,
она была написана по советам знакомых, чтото на форумах советовали, гдето прочитал, вот и получилась такая сборная солянки. Но главное что она работала ... как оказалось не во всех случаях. Почему же она ничего не возвращает? Она данные помещает в курсор, а потом оттуда средставми Delphi я получаю этот набор данных. Вот и функция с помощью которой я это делаю:

function CreateQueryARM(Connection: TADOConnection; SQL: WideString; const Params: array of const): TADODataSet;
var Command:TADOCommand;
begin
Command := TADOCommand.Create(Application);
Command.Connection := Connection;
Command.CommandText := format(SQL, Params); // Здесь через переменную SQL я вызываю нужную ХП
//Command.CommandTimeout := 3000;
Command.Execute;
Command.Free;
result := CreateQuery(Connection, 'SELECT * FROM TmpDbf', []);
end;

То есть назначение процедуры : подключить индекс, для достижения большего быстродействия
доступа к данным и соответственно получить эти данные.
Ratings: 0 negative/0 positive
Re: Алиас не найден ...
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Dionnis!

Ну вообще такая схема меня как-то смущает - в одной ХП ты создаешь курсор, в
другом месте - выборку из него делаешь О чём я собственно и сказал...
Всё-же лучше это сделать в одной процедуре, а полученный результат (курсор)
перегнать в XML (банальным CURSORTOXML()) и получить на клиенте. Тогда явно
можно закрыть всё использованное по завершении ХП. Кстати проблема возникает
в самой ХП, или во втором запросе? Если во втором запросе, то явно не в коде
ошибка, а в использованном ПОДХОДЕ...

Как вариант (если есть собственно фокс) можно нарисовать COM сервер на
фоксе, который будет делать то-же самое, и так-же возвращать данные в виде
XML строки, или ещё каком-то - в COM меньше ограничений чем в OLE DB
провайдере, да и как-то это лучше вписывается в многозвенку Если
понадобиться работать с удалёнными данными (т.е. на другой машине), то
поместив COM сервер в COM+ приложение на этой маг\шине мы получим
существеннейший прирост в скорости - ибо фоксу не придётся гонять данные по
сети (OLE DB всё равно вынимает здоровый кусок индекса, и собственно данные
из dbf - т.к. "исполняется" всё на той машине где создан Connection - COM+
же исполняет код на той машине где зарегистрирован COM сервер).




------------------
WBR, Igor
Ratings: 0 negative/0 positive


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

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика