AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.12.2012, 15:10   #1  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Прошу опять помощи разобраться с глюком.
Сначала приведу фрагмент кода:
Код:
File.SETRANGE(Path,Путь);
File.SETRANGE("Is a file",TRUE);
File.SETRANGE(Name,ИмяФайла);

FileCount := 0;
IF File.FINDSET THEN
   REPEAT
     Процедура обработки
     FileCount += 1;
   UNTIL File.NEXT = 0;

IF FileCount = 0 THEN
File - это переменная типа Record, Subtype - File (т.е. это ссылка на виртуальную таблицу File)
Когда я с помощью трех SETRANGE накладываю на нее фильтр, то FINDSET выдыет пустой набор, т.е. ни одной записи, типа не найдено (и, соответственно, никакая Порцедура обработки" не запускается). Когда же я те же самые фильтры накладываю на сию таблицу вручную (создав по F3 в формах новую форму для нее), тогда одна запись мне показывается.
В чем тут фокус? Почему программа не "видит" запись?!

Прим.: работаем на Nav 5.0 SP1, MS SQL Server 2008 R2
Еще одно замечание: до того, как перешли на SQL, проблем не было, всё работало нормально
Старый 03.12.2012, 15:21   #2  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
Если запускаете эту штуку в периодическом задании то нужно делать так.


File.SETRANGE(Path,ПутьКуданибудьвдругоеместо);
File.FIND('-');

File.SETRANGE(Path,Путь);
File.SETRANGE("Is a file",TRUE);
File.SETRANGE(Name,ИмяФайла);
__________________
Want to believe...
Старый 03.12.2012, 16:20   #3  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от DA_NEAL Посмотреть сообщение
Если запускаете эту штуку в периодическом задании то нужно делать так.


File.SETRANGE(Path,ПутьКуданибудьвдругоеместо);
File.FIND('-');

File.SETRANGE(Path,Путь);
File.SETRANGE("Is a file",TRUE);
File.SETRANGE(Name,ИмяФайла);
Увы. не помогло ;(
Я написала так:
Код:
File.RESET;
File.SETRANGE(Path,ПутьКуданибудьвдругоеместо);
File.FINDFIRST;

File.SETRANGE(Path,Путь);
File.SETRANGE("Is a file",TRUE);
File.SETRANGE(Name,ИмяФайла);

IF FINDSET THEN
FINDFIRST показывает какую-то запись, а FINDSET уже ничего не находит />
Старый 03.12.2012, 16:24   #4  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
желательно еще reset добавить

File.RESET;

и вместо SETRANGE попробуйте SETFILTER

File.SETFILTER(Path,ПутьКуданибудьвдругоеместо);
__________________
Want to believe...
Старый 03.12.2012, 16:26   #5  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
RESET у меня есть (я поправила предыдущее сообщение)
Старый 03.12.2012, 17:17   #6  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
Kadawrik, а вы когда накладываете фильтр на Path у вас в конце пути есть обратный слэш(\) ?
Просто первое что напрашивается, это либо неправильный фильтр на путь, либо на имя файла. Имя файла, на сколько я помню, должно быть без полного пути, но с расширением.
Старый 03.12.2012, 17:23   #7  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от Constantine Посмотреть сообщение
Kadawrik, а вы когда накладываете фильтр на Path у вас в конце пути есть обратный слэш(\) ?
Просто первое что напрашивается, это либо неправильный фильтр на путь, либо на имя файла. Имя файла, на сколько я помню, должно быть без полного пути, но с расширением.
Слэш есть. Имя файла с рсширением.
Фильтр для Path и имени файла берутся из полей определенной таблицы. Так что тут все правильно. Когда те же самые значения я копирую в строку вильтря для формы, то всё фильтруется правильно.
Заметтила еще одну особенность: когда я вручную, создав ворму для просмотра, накладываю первый фильтр на Path, то таблица фильтруется *на экране отображаются строки), но указатель стоит на пустой строке. Если я теперь пытаюсь наложить фильтр еще и на имя файла, тогда пустой результат. Если же я предварительно указатель смещу на какую-нить "нормальную " запись, и потом наложу фильтр на Имя файла, тогда показывает правильно
Старый 03.12.2012, 20:27   #8  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
Покопался у нас в базе, где используется фильтр по имени файла. Попробуйте назвать переменную другим именем и сделать так:
Код:
recFile.RESET;
recFile.SETRANGE(Path, Путь);
recFile.SETRANGE("Is a file", TRUE);
recFile.SETFILTER(Name, '@' + ИмяФайла);
Старый 17.12.2012, 16:44   #9  
dmites is offline
dmites
Участник
Аватар для dmites
 
221 / 14 (1) ++
Регистрация: 10.08.2005
Цитата:
Сообщение от DA_NEAL Посмотреть сообщение
Если запускаете эту штуку в периодическом задании то нужно делать так.


File.SETRANGE(Path,ПутьКуданибудьвдругоеместо);
File.FIND('-');

File.SETRANGE(Path,Путь);
File.SETRANGE("Is a file",TRUE);
File.SETRANGE(Name,ИмяФайла);
Вы уверены что первый FIND('-') что дает ?

у меня работает без проблем код


Files.SETRANGE(Path,pDirectory);
Files.SETFILTER(Name,'*.xml');
Files.SETRANGE("Is a file",TRUE);
IF Files.FINDSET THEN
REPEAT
...
UNTIL Files.NEXT=0;


Автору - ключевая строка Files.SETFILTER(Name,'*.xml');
Руками накладываете setfilter, а кодом setrange.
Старый 18.12.2012, 12:24   #10  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от dmites Посмотреть сообщение
Автору - ключевая строка Files.SETFILTER(Name,'*.xml');
Руками накладываете setfilter, а кодом setrange.
Благодарю.
Надо будем попробовать и этот вариант.
Я тогда на скорую руку просто прописала имя нужного файла. Но это был временный костыль, т.к. процедуру нужно было сделать срочно.

Может, кто объяснит, почему такое разное поведение у натива и SQL? Ведь пока SQL не поставили, SETRANGE работал исправно. ;-/
Старый 19.12.2012, 09:00   #11  
GRIZZLY_imported is offline
GRIZZLY_imported
Участник
 
39 / 10 (1) +
Регистрация: 18.05.2007
Я думаю дело в необходимости добавления символа @, который на SQL позволяет накладывать фильтр без разницы имя написано маленькими или большими буквами. Ну а уж если используем маски, то нужно использовать оператор SETFILTER.
Я вот тоже столкнулся с проблемой, что процедура не хотела найти файл, наткнулся тоже на рекомендацию сначала установить фильтр на диск c: на мибусо.
Вот мой код, который ищет файл в каталоге и инкрементирует его имя:
Код:
  IF COPYSTR(ExportPath, STRLEN(ExportPath), 1) <> '\' THEN ExportPath += '\';
  Folder.SETRANGE(Path,'c:\');
  IF Folder.FINDFIRST THEN;
  Folder.SETRANGE(Path, ExportPath);
  Folder.SETRANGE("Is a file",TRUE);
  Folder.SETFILTER(Name, '@' + STRSUBSTNO(ExportFileMask,Company.Name,'*'));
  IF Folder.FINDLAST THEN ExportName := INCSTR(Folder.Name)
  ELSE ExportName := STRSUBSTNO(ExportFileMask,Company.Name,FORMAT(1, 0, '<Integer,4><Filler Character,0>'));
где ExportFileMask - текстовая константа %1-Export-%2.xml
в %1 подставляется имя компании, в %2 - маска по имени файла.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:42.