Требуется создать файл, предварительно проверив, не открыт ли такой же файл
Код
IF REPORT->(USED()) // ЕСЛИ ФАЙЛ ОТКРЫТ (здесь пишет что такой alias
REPORT->(DBCLOSEAREA()) //ЗАКРЫТЬ не существует)
ENDIF
TRY
DbCreate( LOADPATH()+"report", aStructure) // ПРОБУЕМ СОЗДАТЬ НОВЫЙ ФАЙЛ
CATCH
SAYANDWAIT("База данных report.dbf занята в сети")
RETURN Nil
END
// ОТКРЫВАЕМ
NETUSE ("REPORT",LOADPATH()+"REPORT.DBF")
А вообще-то, Вы хотите создать именно файл 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
.....
Саак Шахламджян пишет:
А если файл открыт в какой-либо другой рабочей области? Или с другой машины?
Я написал только то, что написал. Мы проверяем существование алиаса, но в случае если алиас не существует мы получаем не информацию, а сообщение об ошибке. Согласитесь, что это немного неправильно. Этот фрагмент я предлагаю заменить. В остальном автор прав.
Саак Шахламджян пишет:
А если файл открыт в какой-либо другой рабочей области? Или с другой машины?
Я написал только то, что написал. Мы проверяем существование алиаса, но в случае если алиас не существует мы получаем не информацию, а сообщение об ошибке. Согласитесь, что это немного неправильно. Этот фрагмент я предлагаю заменить. В остальном автор прав.
Ну, в общем-то да. Просто я показал как проверить использование файла...
А если файл существует и используется, то DbCreate( LOADPATH()+"report", aStructure) вернет ошибку, не создав такой файл... Если же не занят, то все пройдет нормально....
Алексей Новиков пишет:
А вообще-то, Вы хотите создать именно файл report.dbf? Он нужен для некоего обмена и поэтому должен лежать в определённом месте и определённо называться?
речь идет о замещении стандартной фукнции выгрузки продаж в report.dbf. Разница лишь, что выгрузки происходит посредством спецфукции самого БЭСТ
Я Вам не советую делать сразу report.dbf
Это неправильно потому как один может начать принимать файл когда Вы в него пишете а потом БЭСТ его удалит :))
Правильнее делать временный файл а потом его переименовывать. И делать обычный IF FILE()
Если он есть выдавать предупреждение что он еще не принят и дальше либо удалять, либо прекращать операцию.
nordk пишет:
Я Вам не советую делать сразу report.dbf
Это неправильно потому как один может начать принимать файл когда Вы в него пишете а потом БЭСТ его удалит :))
1. по магазину обычно работает один оператор на прием и на передачу, для разных магазинов report.dbf лежит в разных каталогах
2. писать в монопольно открытый файл: он не будет доступен далее другим для удаления или приема товаров до окончания записи и закрытия, что в БЭСТе и сделано.
Принятие товаров также происходит из монопольно открытого файла что препятствует его изменению либо удалению в процессе обработки продаж.
Цитата
Правильнее делать временный файл а потом его переименовывать. И делать обычный IF FILE()
Если он есть выдавать предупреждение что он еще не принят и дальше либо удалять, либо прекращать операцию.
функция file() даст информацию о существовании файла, в чем нет никакой необходимости. dbcreate замещает существующий "свободный" файл, а получение продаж из report.dbf производится штатными средствами.
Не совсем понял Ваши предложения. Может быть есть код например из КПМ+.
Тогда стало бы более менее ясно. Здесь я пытаюсь "заточить" все под свои нужны.
Шаблоны "коробочного" решения могут оказаться совсем другими. Не было бы необходимости заморачиваться с report.dbf если бы не проблемы с номерацией документов в Учете продаж.
nordk пишет:
Цитата olegue olegue пишет:
функция file() даст информацию о существовании файла, в чем нет никакой необходимости. dbcreate замещает существующий "
А правомерно ли замещать не принятый файл отчета ?
инициатором создания файла-отчета в моем случае является сам оператор (приемщик продаж). В противном случае - для порядка - ваше предложение аргументировано.
А что этот оператор не человек ?
Ему надо принять несколько отчетов сразу и он может случайно совершенно запутаться.
Причины самые разные: на обед сходил, отвлекли и т.д.
То что это один и тот же человек - это не исключает человеческий фактор