BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Проверка и создание файлов
 
Требуется создать файл, предварительно проверив, не открыт ли такой же файл

Код
     IF REPORT->(USED()) // ЕСЛИ ФАЙЛ ОТКРЫТ (здесь пишет что такой alias 
       REPORT->(DBCLOSEAREA()) //ЗАКРЫТЬ      не существует)
     ENDIF

     TRY
       DbCreate( LOADPATH()+"report", aStructure) // ПРОБУЕМ СОЗДАТЬ НОВЫЙ ФАЙЛ
     CATCH 
       SAYANDWAIT("База данных report.dbf занята в сети")
       RETURN Nil
     END
       // ОТКРЫВАЕМ
       NETUSE ("REPORT",LOADPATH()+"REPORT.DBF")
 


пойдет ли такой код?
Изменено: olegue olegue - 05.11.2008 23:57:12
 
Цитата
olegue olegue пишет:
IF REPORT->(USED()) // ЕСЛИ ФАЙЛ ОТКРЫТ (здесь пишет что такой alias REPORT->(DBCLOSEAREA()) //ЗАКРЫТЬне существует) ENDIF

Здесь я бы написал так:
Код
if(select('report')>0, report->(dbclosearea()), nil)
Изменено: Алексей Новиков - 06.11.2008 07:13:53
С уважением, Новиков Алексей.
 
А вообще-то, Вы хотите создать именно файл report.dbf? Он нужен для некоего обмена и поэтому должен лежать в определённом месте и определённо называться?
С уважением, Новиков Алексей.
 
Цитата
Алексей Новиков пишет:
Здесь я бы написал так:
Код
if(select('report')>0, report->(dbclosearea()), nil)

А если файл открыт в какой-либо другой рабочей области? Или с другой машины?
2 olegue olegueЧто именно требуется, уточните. Проверка использования файла вообще, кем бы то ни было? Или в текущей рабочей области?
Проверку на то открыт ли какой-либо файл сделать нельзя. Во всяком случае я когда-то подннимал данный вопрос и проверить можно, раве только существование файла. А вот то открыт он где-то еще или нет не получиться...
Единственным способом такой проверки является TRY ... CATCH и BEGIN SEQUENCE . Где можно "попытаться" эксклюзивно открыть .dbf файл (если речь идет о нем), если же какой другой файл, то...

Например так:
Код
.....
Local sPathNZ:=LoadPath()+"PLN\NZ"
            TRY
              Use (sPathNZ) New EXCLUSIVE                 
              bAllOk:=.T.
            Catch  oErr
                bAllOk:=.F.
                SayAndWait("Внимание! Таблица с наряд-заданиями уже используется!")
            end
.....
Изменено: Саак Шахламджян - 06.11.2008 09:40:55
 
Цитата
Саак Шахламджян пишет:
А если файл открыт в какой-либо другой рабочей области? Или с другой машины?

Я написал только то, что написал. Мы проверяем существование алиаса, но в случае если алиас не существует мы получаем не информацию, а сообщение об ошибке. Согласитесь, что это немного неправильно. Этот фрагмент я предлагаю заменить. В остальном автор прав.
С уважением, Новиков Алексей.
 
Цитата
Алексей Новиков пишет:



Цитата

Саак Шахламджян пишет:
А если файл открыт в какой-либо другой рабочей области? Или с другой машины?
Я написал только то, что написал. Мы проверяем существование алиаса, но в случае если алиас не существует мы получаем не информацию, а сообщение об ошибке. Согласитесь, что это немного неправильно. Этот фрагмент я предлагаю заменить. В остальном автор прав.

Ну, в общем-то да. Просто я показал как проверить использование файла...
А если файл существует и используется, то DbCreate( LOADPATH()+"report", aStructure) вернет ошибку, не создав такой файл... Если же не занят, то все пройдет нормально....
 
Цитата
Алексей Новиков пишет:
А вообще-то, Вы хотите создать именно файл report.dbf? Он нужен для некоего обмена и поэтому должен лежать в определённом месте и определённо называться?



речь идет о замещении стандартной фукнции выгрузки продаж в report.dbf. Разница лишь, что выгрузки происходит посредством спецфукции самого БЭСТ
Изменено: olegue olegue - 06.11.2008 11:07:44
 
Я Вам не советую делать сразу report.dbf
Это неправильно потому как один может начать принимать файл когда Вы в него пишете а потом БЭСТ его удалит :))
Правильнее делать временный файл а потом его переименовывать. И делать обычный IF FILE()
Если он есть выдавать предупреждение что он еще не принят и дальше либо удалять, либо прекращать операцию.
 
Алексей Новиков пишет:
Цитата

Здесь я бы написал так:
Код if(select('report')>0, report->(dbclosearea()), nil)


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

Т.е. подведу итог:

1. проверяем открыта ли таблица локально, если да - закрываем (актуально при отладке программы)
2. пытаемся создать - если нет: значит занята по сети.
 
Цитата
nordk пишет:
Я Вам не советую делать сразу report.dbf
Это неправильно потому как один может начать принимать файл когда Вы в него пишете а потом БЭСТ его удалит :))

1. по магазину обычно работает один оператор на прием и на передачу, для разных магазинов report.dbf лежит в разных каталогах
2. писать в монопольно открытый файл: он не будет доступен далее другим для удаления или приема товаров до окончания записи и закрытия, что в БЭСТе и сделано.
Принятие товаров также происходит из монопольно открытого файла что препятствует его изменению либо удалению в процессе обработки продаж.
Цитата

Правильнее делать временный файл а потом его переименовывать. И делать обычный IF FILE()
Если он есть выдавать предупреждение что он еще не принят и дальше либо удалять, либо прекращать операцию.


функция file() даст информацию о существовании файла, в чем нет никакой необходимости. dbcreate замещает существующий "свободный" файл, а получение продаж из report.dbf производится штатными средствами.

Не совсем понял Ваши предложения. Может быть есть код например из КПМ+.
Тогда стало бы более менее ясно. Здесь я пытаюсь "заточить" все под свои нужны.
Шаблоны "коробочного" решения могут оказаться совсем другими. Не было бы необходимости заморачиваться с report.dbf если бы не проблемы с номерацией документов в Учете продаж.
 
Цитата
olegue olegue пишет:
функция file() даст информацию о существовании файла, в чем нет никакой необходимости. dbcreate замещает существующий "

А правомерно ли замещать не принятый файл отчета ?
 
Цитата
nordk пишет:
Цитата olegue olegue пишет:
функция file() даст информацию о существовании файла, в чем нет никакой необходимости. dbcreate замещает существующий "
А правомерно ли замещать не принятый файл отчета ?


инициатором создания файла-отчета в моем случае является сам оператор (приемщик продаж). В противном случае - для порядка - ваше предложение аргументировано.
 
А что этот оператор не человек ?
Ему надо принять несколько отчетов сразу и он может случайно совершенно запутаться.
Причины самые разные: на обед сходил, отвлекли и т.д.
То что это один и тот же человек - это не исключает человеческий фактор
Страницы: 1
Читают тему (гостей: 1)