1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Программы и программирование

Тема в разделе "Софт", создана пользователем osa, 31.01.02.

  1. osa

    osa Активный участник

    883
    0
    Друзья. Я хотел бы начать традицию. Говорить о теме данного письма.

    Меня можно спрашивать: basic, pascal, c, cpp, clipper, foxpro, assembler, lisp и еще куча всякого+софт.

    Хочу спрашивать: AutoCAD, сети и др.
     
  2. Fox

    Fox Активный участник

    1.778
    0
    Ну у меня вопросов куча... Ну вот, к примеру:
    когда я создаю инсталляционный пакет в 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
     
  3. osa

    osa Активный участник

    883
    0
    Во-первых, можно вообще отключить запись подобных строк.

    Во-вторых, формат даты регулируется в Windows. Или при создании инсталляхи, или уже при установке.

    Хотя я от этого далёк.
     
  4. OEM

    OEM Почётный

    2.957
    1
    2 Fox
    На просторах Интернета мне не раз попадалось упоминание о данном визарде с патчами и локализацией под русский язык (кстати, именно эта проблема была и описана). Так что ищи.

    С моей точки зрения - данной проблемы можно избежать, используя Visual Studio Installer (на базе Windows Installer, дополнение можно было скачать с сайта M$) - но придется за собой таскать его runtime. Заменители в виде InstallShield / Wyse InstallMaster - функциональности побольше, да и гадят они после себя поменьше, чем этот визард (не относится к версиям под Windows Installer).
     
  5. Fox

    Fox Активный участник

    1.778
    0
    Спасибо за советы ! Приятно сознавать, что в любой, даже самой трудной ситуации найдутся люди, знающие ответы буквально на все интересующие вопросы. Всё-таки на что-то этот форум ещё годится (кто тут говорил, что форумы - это напрасная трата времени ???)
     
  6. osa

    osa Активный участник

    883
    0
    ОК. Скажите где в AutoCAD'е настроить толщину при выводе на печать для линии заданного цвета. Вчера полдня потратил - не нашел.
    Лучше говорите про ACAD 2000. У меня русский.
     
  7. Cadder

    Cadder Гость

    Насколько я чего-то помню, там была функция выделения объектов по атрибутам. Цвет - один из них. Ну а для выделения толщина ставится так же, как и для одной полилинии.
     
  8. Fox

    Fox Активный участник

    1.778
    0
    Коротко суть проблемы:
    Я написал программу, которая работает с базой данных Access. Застрял на примитивнейшей вещи - не могу написать функцию резервного копирования файла mdb. По замыслу, файл базы данных должен копироваться в резервный файл с другим именем и местоположением при выходе из программы. Но на операторе FileCopy появляется ошибка "Permission denied" и файл не копируется. Это происходит из-за того, что прога работает с файлом, а именно с рекордсетом, который, в конечном счёте, ссылается на этот файл. Если проверять последовательно процесс открытия файла БД, то данная ошибка при попытке копирования возникает после выполнения следующего действия:
    rs.ActiveConnection = cn.ConnectionString
    К сожалению, обнулить данное свойство рекордсета не получается, методы rs.close, set rs = nothing также ни к чему не приводят. И чего я только уже не пробовал.
    Подскажите, плиз, что надо сделать, чтобы закрыть файл БД, ну или по крайней мере, как можно обойти эту ошибку. Можно в WinAPI, а именно: попытаться скопировать файл при открытой БД (ведь, в експлорере он копируется без проблем при работающей проге), но я пока не знаю, как это сделать. Если знаете как это сделать - напишите. Если надо, могу привести кусок программы, который открывает базу данных.
     
  9. OEM

    OEM Почётный

    2.957
    1
    Давай кусок, но в принципе мне кажется, что твоя ошибка в том, что ты пытаешься закрыть recordset, хотя надо закрывать connection/database/etc, т.е. те объекты, которые выше по иерархии. Попробуй, если не выйдет - пости сюда кусок, будем смотреть.
     
  10. Ilyasio

    Ilyasio Участник

    118
    0
  11. OEM

    OEM Почётный

    2.957
    1
    Кстати, когда-то давно в VBA Access этой функции не было, и мы вовсю юзали WinAPI. Странно, я думал, что FileCopy - это обычный враппер функции CopyFile - ан нет, и здесь напортачить ухитрились ребятки из M$.
     
  12. Nekto

    Nekto Почётный

    5.710
    0
    Присоединясь.
    Могу ответить на ваши вопросы по perl
     
  13. osa

    osa Активный участник

    883
    0
    Фокс. Совета два
    1. Делай это bat-файлом, запуская его стандартно

    2. Делай все рез. копирования до программы, например тоже батником
     
  14. OEM

    OEM Почётный

    2.957
    1
    2 osa
    1 способ - кривизна. А если кто-нибудь сотрет или поменяет этот батник? Что тогда? Падать в синий экран?
    2 способ - те же яйца, вид сбоку.

    Склоняюсь к тому, что надо сначала освободить объект, а потом использовать FileCopy (чтобы не заморачиваться с собственным враппером, GetLastWindowsError и т.п.)
     
  15. osa

    osa Активный участник

    883
    0
    Слушай!!! Ты вдумывайся плиз!!!

    Батник надо ессно писать самому через мемо.

    Дальше - на фига ему твой гетластеррор, когда эксцепшены работают как часы.

    Объект можно не особождать вообще, если исп-ть ф-ю какую-то (сорри не помню), которой пофиг занят файл или нет.
     
  16. Drema

    Drema Участник

    610
    0
    Копировать открытый другой программой файл, IMHO, не совсем правильно. После копирования, может статься, что файл испорчен, потому как в момент копирования был изменен занявшим процессом. Вероятность этого, безусловно, мала, но я бы не подвергал правильность back-копии даже таким.. вероятностям :)
     
  17. Fox

    Fox Активный участник

    1.778
    0
    Насчёт бат файла - бред, конечно. Насчёт создания резервной копии до открытия БД - запросто и без бат файла, и нормально будет работать, я в этом не сомневаюсь, НО ! Какой на$%^ толк от такой резервной копии, если она не будет учитывать последнии изменения БД ?!! Ты представь, работаешь ты с базой данных целый день, занёс туда около стольника записей, произошёл сбой, ты восстанавливаешь БД с файла РК а твоего стольника записей - как не бывало !
    Теперь насчёт закрытия коннекшн:
    Ребят, вы походу не поняли... Чтобы развеять все недопонимания, придётся выложить часть кода:
    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

    Ну вот вроде и всё...
     
  18. Fox

    Fox Активный участник

    1.778
    0
    Кстати, кому интересно, я эту задачу пока решил таким способом:
    Я накалякал мелкий экзешник, который делал резервную копию, причём все пути он обрабатывал корректно, поскольку открывал тот же INI файл, что и сама БД. Затем я заменил операцию копирования в проге на запуск данного экзешника. Естественно, вылезла та-же ошибка, просто уже из другой программы :D . Была мысль, подождать завершения работы главной проги, да стало очень влом возиться с дескрипторами окна... Поэтому я поступил довольно гнусно, но, в принципе, очень просто и логично: поставил в программе резервного копирования задержку по времени 1 сек (можно и меньше, наверное, да смысла нет). Естественно, за 1 секунду главная прога успевала закрыться и заткнуться навсегда, поэтому, программе резервного копирования уже ничего больше не мешало. В этом способе есть ещё один плюс: я эту прогу поставил вместе с базой данных и ей можно пользоваться для создания резервной копии без запуска основной программы, причём, я добавил туда функции по восстановлению повреждённой базы данных. А задержка в 1 секунду позволила мне гордо написать свою фамилию и инициалы в заголовке окошка программы резервного копирования (можно, конечно, было-бы сделать это всё дело прозрачным, но я считаю, юзер всегда должен знать, что творится в его компутере), правда, я потом эту задержку переделал на 2 секунды - не все успевали прочитать чё тама написано :D
     
  19. Ilyasio

    Ilyasio Участник

    118
    0
    >>коннекшн-то уже открыт вроде ? Или нет ???
    нет

    Я не пойму, почему бы не закрыть _все_ обьекты (rs, cn) а потом копировать файл?
    ...
    rs.Close
    Set rs = Nothing

    cnDatabase.Close
    Set cn = Nothing

    FileCopy ...
     
  20. Ilyasio

    Ilyasio Участник

    118
    0
    Точней cn.Close вместо cnDatabase.Close
     
  21. OEM

    OEM Почётный

    2.957
    1
    Не, ну вы даете! Есть же способ, и он правильный по определению! Нет ссылки на объект БД - значит, он свободен, можно копировать. Изобретаете велосипед зачем-то...
     
  22. Fox

    Fox Активный участник

    1.778
    0
    cn.close не проходит, потому что не было cn.open (где ты его видишь в коде ?). Зачем нужен cn.open я не пойму, если честно, и без него всё работает прекрасно...

    ОЕМ: я тебя на понял... Какой способ-то ???
     
  23. Ilyasio

    Ilyasio Участник

    118
    0
    А что такое Adodc1? Контрол? Так открой мсдн да почитай как он работает, как он подсоединяется к базе. Тебе надо убить его коннект к базе - такая тема.
    Либо, если можно, без контрола вообще - создавай обьект через
    Set cn = New ADODB.Connection
    тогда заодно и поймешь зачем Open нужно.
    cn.Close - это у меня привычка из АСП, только там юзаю vb, да и вообще считаю, что vb сакс биг тайм, однако вот асп быстро работает, ничего не скажешь. А с другой стороны, вся эта майкрософтовсая идея с укладыванием всего в "удобные коробочки" иногда просто бесит, как вот в твоем, Фокс, случае - хотя это ерунда полная(просто надо прочитать про это). А когда что-нибудь серьезное типа того, что к необходимым интерфейсам надо обязательно припаять еще кучу, которые требует Майкрософт для "стабильной работы" вот это уже бесит не по-деццки. Хотя к бейсику это уже мало относится. Сорри, накипело...
     
  24. OEM

    OEM Почётный

    2.957
    1
    В твоем контексте это Set cn=Nothing
     
  25. Fox

    Fox Активный участник

    1.778
    0
    Set cn=Nothing ни к чему не приводит. Ошибка появляется и с этой командой и без неё.
     
  26. Ilyasio

    Ilyasio Участник

    118
    0
    Может Adodc1.Enabled = False спасет?
     
  27. Fox

    Fox Активный участник

    1.778
    0
    На сей раз вопросик по 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. Как это сделать ?

    Но самый главный мой вопрос - это первый ! Потому что большая проблема у меня с этими запросами... Не могу сделать фильтр записей по первым буквам - а какая это база без фильтра ??? У меня две базы уже горят из-за этого !!!
     
  28. Drema

    Drema Участник

    610
    0
    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%'
     
  29. Fox

    Fox Активный участник

    1.778
    0
    Дрёма !!! Ты пиво пьёшь ? :D
    А почему в литературе и в менеджере всё-таки звёздочки, интересно ?
     
  30. Ilyasio

    Ilyasio Участник

    118
    0
    SQL Reference >> Wildcard Characters