Есть функциональность - берутся данные из одного модуля и импортируются в другой, с учетом определенных условий + небольшие преобразования. Какие-то данные не попадают в импорт. Задача - вывести после импорта информацию о данных, которые не импортировавились - при этом определены 3 условия, при котором данные не будут испортироваться. Т.е. "достать" эти данные - не проблема. Но в каком виде и как их можно подать пользователю? В MessageBox информацию о 200 (например) контрактах (даже если выводить только Title) не запихнуть...
Нравится
функции OpenFileWithFullAccess и WriteMessageToFile Вам помогут
можете посмотреть как это реализовано, например, в контексте интеграции из экселя:
scr_DataflowUtils
function ImportDataByImportObject(...) { ... WriteMessageToFile(...); ImportObject.Imported = true; } finally { ... }
scr_DataflowExcelUtils
function ExecuteImportFromExcel(...) { if (Assigned(DataflowUtils.ImportLogFile)){ if (ShowConfirmationDialog(msgDoYouWantLookImportLog) == wmrYes){ OpenFileWithFullAccess(LogFileName, true); } DataflowUtils.ImportLogFile.Close(); DataflowUtils.ImportLogFile = null; } ... }
Спасибо. С созданием и показом содержимого файла разобралась. Код :
DatasetPrice.Open(); if (IsDatasetEmpty(DatasetPrice)) { DatasetPrice.Close(); return; } DatasetPrice.GotoFirst(); var Message = ''; var LogFileName = GetCustomLogFileName('BillingInfo'); var FileSystemObject = GetFileSystemObject(); var InfoLogFile = FileSystemObject.CreateTextFile(LogFileName, true, true); while (!DatasetPrice.IsEOF) { Message = DatasetPrice.Values('ContractTitle'); InfoLogFile.WriteLine(Message); DatasetPrice.GotoNext(); } OpenFileWithFullAccess(LogFileName);
SaveToFile - вроде бы метод для объектов террасофт, а не для текста, и он (в вариациях) не позволяет дозаписывать
Надо еще определиться, что пользователь будет делать с этой информацией. Например, если он ее просто скопирует - возможно лучше не создавать файл. а вывести окно с MemoControl.
Если вам удобно сначала собрать инфо, а потом записывать - ваш вариант то, что нужно. Если удобнее дописывать в файл - используйте .WriteLine (http://msdn.microsoft.com/en-us/library/t5399c99(v=vs.84).aspx) и в конце закрывайте файл.
Опять-таки, пользователь не увидит закрытый файл - его надо открыть System.OpenFile(FileName, fatReadWrite) (http://terrasoft.ru/sdk/IScriptUtils__OpenFile@[in]_BSTR@[in]_FileAcces…)
"Андросов Дмитрий" написал:а ну вы и сами уже)
Да, спасибо. Я потому и удалила предыдущий вопрос
Еще вопрос. А как здесь можно указать конкретное место для сохранения файла? Например на диске С?
function GetCustomLogFileName(LogName) { CreateFolder(Connector.LogsDirectory); return Connector.LogsDirectory + LogName+ '_' + DateToStr(new Date(System.Now()), '') + '_' +TimeToStr(new Date(System.Now()), '') + '.log'; }
При попытке изменить эту функцию на
function GetLogFileName(LogName) { return 'C:\\' + LogName+ '_' + DateToStr(new Date(System.Now()), '') + '_' +TimeToStr(new Date(System.Now()), '') + '.log'; }
вылетаю с ошибкой Invalid procedure call or argument
корневая папка диска С считается системной - мб у вас не хватает прав или включен UAC. Так-то вроде все норм
Наталия, протестировала код, отрабатывает корректно. Попробуйте проверить права, как порекомендовал Дмитрий.
это старый баг подсветки и больше ничего - работает как должно
Ну вот и тем не менее - не работало. Хотя и не ругалось. Я тестировала выводом на экран через MessageBox - выдало пустоту.