Друзья. Я хотел бы начать традицию. Говорить о теме данного письма. Меня можно спрашивать: basic, pascal, c, cpp, clipper, foxpro, assembler, lisp и еще куча всякого+софт. Хочу спрашивать: AutoCAD, сети и др.
Ну у меня вопросов куча... Ну вот, к примеру: когда я создаю инсталляционный пакет в Package & Deployment Wizard для VB 6.0, в файле SETUP.LST прописываются подобные строки: File1=@MDAC_TYP.EXE,$(AppPath),,,6.26.98 12:00:00 AM,8124720,4.71.1015.0 которые, в правильном написании должны выглядеть так: File1=@MDAC_TYP.EXE,$(AppPath),,,6/26/98 12:00:00 AM,8124720,4.71.1015.0 (проблема с форматом даты - Винда ругается и завершает установку). В связи с этим данный файл приходится править вручную... Как исправить данный глюк ? А то придётся прогу писать, чтобы она меняла формат даты... А влом :D
Во-первых, можно вообще отключить запись подобных строк. Во-вторых, формат даты регулируется в Windows. Или при создании инсталляхи, или уже при установке. Хотя я от этого далёк.
2 Fox На просторах Интернета мне не раз попадалось упоминание о данном визарде с патчами и локализацией под русский язык (кстати, именно эта проблема была и описана). Так что ищи. С моей точки зрения - данной проблемы можно избежать, используя Visual Studio Installer (на базе Windows Installer, дополнение можно было скачать с сайта M$) - но придется за собой таскать его runtime. Заменители в виде InstallShield / Wyse InstallMaster - функциональности побольше, да и гадят они после себя поменьше, чем этот визард (не относится к версиям под Windows Installer).
Спасибо за советы ! Приятно сознавать, что в любой, даже самой трудной ситуации найдутся люди, знающие ответы буквально на все интересующие вопросы. Всё-таки на что-то этот форум ещё годится (кто тут говорил, что форумы - это напрасная трата времени ???)
ОК. Скажите где в AutoCAD'е настроить толщину при выводе на печать для линии заданного цвета. Вчера полдня потратил - не нашел. Лучше говорите про ACAD 2000. У меня русский.
Насколько я чего-то помню, там была функция выделения объектов по атрибутам. Цвет - один из них. Ну а для выделения толщина ставится так же, как и для одной полилинии.
Коротко суть проблемы: Я написал программу, которая работает с базой данных Access. Застрял на примитивнейшей вещи - не могу написать функцию резервного копирования файла mdb. По замыслу, файл базы данных должен копироваться в резервный файл с другим именем и местоположением при выходе из программы. Но на операторе FileCopy появляется ошибка "Permission denied" и файл не копируется. Это происходит из-за того, что прога работает с файлом, а именно с рекордсетом, который, в конечном счёте, ссылается на этот файл. Если проверять последовательно процесс открытия файла БД, то данная ошибка при попытке копирования возникает после выполнения следующего действия: rs.ActiveConnection = cn.ConnectionString К сожалению, обнулить данное свойство рекордсета не получается, методы rs.close, set rs = nothing также ни к чему не приводят. И чего я только уже не пробовал. Подскажите, плиз, что надо сделать, чтобы закрыть файл БД, ну или по крайней мере, как можно обойти эту ошибку. Можно в WinAPI, а именно: попытаться скопировать файл при открытой БД (ведь, в експлорере он копируется без проблем при работающей проге), но я пока не знаю, как это сделать. Если знаете как это сделать - напишите. Если надо, могу привести кусок программы, который открывает базу данных.
Давай кусок, но в принципе мне кажется, что твоя ошибка в том, что ты пытаешься закрыть recordset, хотя надо закрывать connection/database/etc, т.е. те объекты, которые выше по иерархии. Попробуй, если не выйдет - пости сюда кусок, будем смотреть.
OEM прав - попробуй убивать сначала обьект базы, потом копировать Но можно и через WinAPI и дос Ходи сюды http://support.microsoft.com/default.aspx?scid=kb;EN-US;q207703
Кстати, когда-то давно в VBA Access этой функции не было, и мы вовсю юзали WinAPI. Странно, я думал, что FileCopy - это обычный враппер функции CopyFile - ан нет, и здесь напортачить ухитрились ребятки из M$.
Фокс. Совета два 1. Делай это bat-файлом, запуская его стандартно 2. Делай все рез. копирования до программы, например тоже батником
2 osa 1 способ - кривизна. А если кто-нибудь сотрет или поменяет этот батник? Что тогда? Падать в синий экран? 2 способ - те же яйца, вид сбоку. Склоняюсь к тому, что надо сначала освободить объект, а потом использовать FileCopy (чтобы не заморачиваться с собственным враппером, GetLastWindowsError и т.п.)
Слушай!!! Ты вдумывайся плиз!!! Батник надо ессно писать самому через мемо. Дальше - на фига ему твой гетластеррор, когда эксцепшены работают как часы. Объект можно не особождать вообще, если исп-ть ф-ю какую-то (сорри не помню), которой пофиг занят файл или нет.
Копировать открытый другой программой файл, IMHO, не совсем правильно. После копирования, может статься, что файл испорчен, потому как в момент копирования был изменен занявшим процессом. Вероятность этого, безусловно, мала, но я бы не подвергал правильность back-копии даже таким.. вероятностям
Насчёт бат файла - бред, конечно. Насчёт создания резервной копии до открытия БД - запросто и без бат файла, и нормально будет работать, я в этом не сомневаюсь, НО ! Какой на$%^ толк от такой резервной копии, если она не будет учитывать последнии изменения БД ?!! Ты представь, работаешь ты с базой данных целый день, занёс туда около стольника записей, произошёл сбой, ты восстанавливаешь БД с файла РК а твоего стольника записей - как не бывало ! Теперь насчёт закрытия коннекшн: Ребят, вы походу не поняли... Чтобы развеять все недопонимания, придётся выложить часть кода: Sub Main() ' Здесь кое-какие операции с INI файлами и защитой... ' Далее идёт строки: If Metod = "Access" Then ConString = "Driver=Microsoft Access Driver (*.mdb);DBQ=" & App.Path & "\Database.mdb" If Metod = "Jet" Then ConString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & App.Path & "\Database.mdb" ' Необходимое объяснение: какой из этих методов лучше - я пока не знаю, поэтому оставил возможность выбирать, но мне кажется, что они немного отличаются по быстродействию, но пока записей в БД мало - проверить очень сложно. Как вы поняли, здесь формируется Коннекшн Стринг. Form1.Show ' Самая главная форма End Sub Private Sub Form_Load() ' Здесь всякая неинтересная Вам мелочь... ' Идём дальше: Set cn = New ADODB.Connection Set rs = New ADODB.Recordset rs.CursorType = adOpenKeyset rs.LockType = adLockOptimistic On Error GoTo OpenErr cn.ConnectionString = ConString Adodc1.ConnectionString = cn Adodc1.CommandType = adCmdText ' Если операцию копирования вставить здесь, то она сработает !!! Файл копируется без вопросов, хотя коннекшн-то уже открыт вроде ? Или нет ??? ' Открываем набор записей rs.ActiveConnection = cn.ConnectionString ' А вот в этом месте оператор FileCopy уже не проходит !!! Поэтому-то я и пытаюсь избавиться от этого самого рекордсета, а не получается ! rs.Source = "SELECT * From Main ORDER BY " & Sort ' Sort - это часть SQL запроса, в которой хранится параметр сортировки rs.Open DataUpdate Exit Sub End Sub Ну вот вроде и всё...
Кстати, кому интересно, я эту задачу пока решил таким способом: Я накалякал мелкий экзешник, который делал резервную копию, причём все пути он обрабатывал корректно, поскольку открывал тот же INI файл, что и сама БД. Затем я заменил операцию копирования в проге на запуск данного экзешника. Естественно, вылезла та-же ошибка, просто уже из другой программы :D . Была мысль, подождать завершения работы главной проги, да стало очень влом возиться с дескрипторами окна... Поэтому я поступил довольно гнусно, но, в принципе, очень просто и логично: поставил в программе резервного копирования задержку по времени 1 сек (можно и меньше, наверное, да смысла нет). Естественно, за 1 секунду главная прога успевала закрыться и заткнуться навсегда, поэтому, программе резервного копирования уже ничего больше не мешало. В этом способе есть ещё один плюс: я эту прогу поставил вместе с базой данных и ей можно пользоваться для создания резервной копии без запуска основной программы, причём, я добавил туда функции по восстановлению повреждённой базы данных. А задержка в 1 секунду позволила мне гордо написать свою фамилию и инициалы в заголовке окошка программы резервного копирования (можно, конечно, было-бы сделать это всё дело прозрачным, но я считаю, юзер всегда должен знать, что творится в его компутере), правда, я потом эту задержку переделал на 2 секунды - не все успевали прочитать чё тама написано :D
>>коннекшн-то уже открыт вроде ? Или нет ??? нет Я не пойму, почему бы не закрыть _все_ обьекты (rs, cn) а потом копировать файл? ... rs.Close Set rs = Nothing cnDatabase.Close Set cn = Nothing FileCopy ...
Не, ну вы даете! Есть же способ, и он правильный по определению! Нет ссылки на объект БД - значит, он свободен, можно копировать. Изобретаете велосипед зачем-то...
cn.close не проходит, потому что не было cn.open (где ты его видишь в коде ?). Зачем нужен cn.open я не пойму, если честно, и без него всё работает прекрасно... ОЕМ: я тебя на понял... Какой способ-то ???
А что такое Adodc1? Контрол? Так открой мсдн да почитай как он работает, как он подсоединяется к базе. Тебе надо убить его коннект к базе - такая тема. Либо, если можно, без контрола вообще - создавай обьект через Set cn = New ADODB.Connection тогда заодно и поймешь зачем Open нужно. cn.Close - это у меня привычка из АСП, только там юзаю vb, да и вообще считаю, что vb сакс биг тайм, однако вот асп быстро работает, ничего не скажешь. А с другой стороны, вся эта майкрософтовсая идея с укладыванием всего в "удобные коробочки" иногда просто бесит, как вот в твоем, Фокс, случае - хотя это ерунда полная(просто надо прочитать про это). А когда что-нибудь серьезное типа того, что к необходимым интерфейсам надо обязательно припаять еще кучу, которые требует Майкрософт для "стабильной работы" вот это уже бесит не по-деццки. Хотя к бейсику это уже мало относится. Сорри, накипело...
На сей раз вопросик по SQL запросам. Короче, вот такой вот запрос: Select Main.Name,Main.NDog,Main.AdressUr,Main.AdressFakt, Main.KKMMark,Main.KKMN,Main.NPasp,Main.Pay, Main.Master,Main.Empty,Main.DDog From Main Where (Main.AdressUr Like 'ул.*' ) Этот запрос написал не я, он создан в Visual Data Manager. Мой вариант был, конечно, покороче, поскольку я не перечислял все поля. Проблема заключается в том, что символы шаблонов не работают, то есть знак * при выполнении запроса из программы воспринимается в буквальном смысле, т.е. результатом запроса является запись "ул.*", если таковая, конечно имеется в базе, хотя должно быть, сами понимаете что - все записи, начинающиеся на "ул.". Также почему-то не работает шаблон "?". В правильности SQL запроса я не сомневаюсь, так как в том-же Visual Data Manager он выполняется прекрасно. Вообще, похоже на какой-то глюк, потому что я уже не знаю, что тут может быть неправильно... Вопрос №2: Зачем нужны скобочки в SQL запросе в записи "(Main.AdressUr Like 'ул.*' )" ? Без них работает абсолютно так-же, но, наверное, они для чего-то всё таки нужны... Вопрос №3: У меня в базе поле формата Integer. Естественно, шаблон * тут не пройдёт, есть только # - но он обозначает 1 знак, а если я не знаю, сколько знаков ? Т.е. мне надо, чтобы показывались, к примеру все номера, начинающиеся на 1. Как это сделать ? Но самый главный мой вопрос - это первый ! Потому что большая проблема у меня с этими запросами... Не могу сделать фильтр записей по первым буквам - а какая это база без фильтра ??? У меня две базы уже горят из-за этого !!!
Fox, <strong>..Проблема заключается в том, что символы шаблонов не работают, то есть знак *</strong> Ставь вместо звездочки - '%' <strong>...Вопрос №2: Зачем нужны скобочки в SQL запросе в записи "(Main.AdressUr Like 'ул.*' )" ? Без них работает абсолютно так-же, но, наверное, они для чего-то всё таки нужны...</strong> Программе визуального создания SQL так легче. Можешь их удалить. <strong>Вопрос №3: У меня в базе поле формата Integer. Естественно, шаблон * тут не пройдёт, есть только # - но он обозначает 1 знак, а если я не знаю, сколько знаков ? Т.е. мне надо, чтобы показывались, к примеру все номера, начинающиеся на 1. Как это сделать ?</strong> Смотря в какой среде исполняется SQL. Если в MSSQL, то надо так: convert(varchar(20), pole) like '1%'