powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / интересные факты / наблюдения / анализ чужих и собственных решений
25 сообщений из 280, страница 2 из 12
интересные факты / наблюдения / анализ чужих и собственных решений
    #37132939
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во всех продуктах Microsoft Office можно закрыть текущий пользовательский объект нажатием клавиши Ctrl+W. В MS Access также работает данное сочетание клавиши (например, если хотим закрыть открытую таблицу, запрос, форму и т.д.). Но вот в режиме "Runtime", увы, не работает. Пришлось создать макрос "AUTOKEYS", где в столбце "Имя макроса" (Macro Name) ввел ^w , а в столбце "Макрокоманда" (Action) - Закрыть (в английских версиях - Close ) и при этом свойства данной команды "Тип объекта" и "Имя объекта" оставил пустыми, чтобы макрос сработал на все виды объектов БД. Что интересно, даже если мы работаем в русской раскладке клавиатуры, то при нажатии Ctrl+ц (w получается как ц), то макрос все равно реагирует.

Может быть у кого-нибудь есть иное решение как в режиме "Runtime" заставить работать сочетание клавиш Ctrl+W без макроса?
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37132960
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studieren, Ctrl+F4?
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37132967
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMindstudieren, Ctrl+F4?

Спасибо, так тоже работает. :)
А вот почему не работает Ctrl+w в чистом виде в Runtime, это загадка разработчиков.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37132996
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studieren, :) Может быть, Ctrl+W они оставили за другой комбинацией или вообще забыли?

Хотел написать своё наблюдение. Когда открываете редактор VBA, вы автоматически попадаете в последний из добавленных модулей (или модулей форм). Всегда один и тот же, если не добавляли новых. Это к топику: Сохранение позиции в модуле .
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37133014
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMind,

Проверил на всех проектах, действительно первом делом попадаем в последний из добавленных модулей. Не обращал на это внимание, теперь буду знать. :)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37156658
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как запретить ввод определенных символов в контролах формы?

Я случайно наткнулся на такой простой, но оригинальный код. Может быть кому-то пригодится:
Код: plaintext
1.
2.
3.
4.
5.
Private Sub txtMyTextBox_KeyPress(KeyAscii As Integer) 
    Dim strTemplate As String 

    strTemplate = "!@#$%^&*()_+="
    If InStr( 1 , strTemplate, Chr(KeyAscii)) >  0  Then KeyAscii =  0  
End Sub

Если юзер попробует ввести любой символ из шаблона "!@#$%^&*()_+=", то контрол формы просто будет игнорировать.


Источник: Hayder Access
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37156667
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMindstudieren, Ctrl+F4?

Небольшая поправочка:
С помощью Ctrl+F4 можно закрыть любой активный объект базы точно также как и Ctrl+W.
Но чисто экспериментально обнаружил, что если свойство формы "Всплывающее окно" (PopUp) имеет значение True, то с помощью Ctrl+F4 невозможно закрыть форму.

А вот если форма - модальное окно (т.е. свойство "Modal = True"), то с помощью Ctrl+F4 можно закрыть её.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37159663
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция Format для параметра Null, в отличие от некоторых стандартных функций, возвращает не Null, а "". Из-за этого невозможно корректно обработать случай
Код: plaintext
1.
s = ("от " + Format(vDate, "dd\.mm\.yyyy")) & ""
(появится слово "от ").
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37159681
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, способ таков:
Код: plaintext
1.
Format(vDate, "от dd\.mm\.yyyy")
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37159834
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMindФункция Format для параметра Null, в отличие от некоторых стандартных функций, возвращает не Null, а "". Из-за этого невозможно корректно обработать случай
Код: plaintext
1.
s = ("от " + Format(vDate, "dd\.mm\.yyyy")) & ""
(появится слово "от ").

Как для VBA, так и для JET SQL данное утверждение справедливо.
Код: plaintext
1.
2.
3.
4.
SELECT
     "от " + Format(Null, "dd\.mm\.yyyy"),
     Format(Null, "от dd\.mm\.yyyy"),
     "от " + Format(# 1 / 1 / 2011 #, "dd\.mm\.yyyy"),
     Format(# 1 / 1 / 2011 #, "от dd\.mm\.yyyy");

Спасибки. :))
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37166457
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как получить набор записей (Recordset) от запроса с параметрами?

Допустим у нас есть "Запрос1", у которого 2 параметра "Число", "Дата".
С помощью DAO набор записей можно получить так:
Код: plaintext
1.
2.
3.
4.
5.
6.
Dim xQuery AS DAO.Querydef
Dim RecSet AS DAO.RecordSet

SET xQuery = CurrentDB("Запрос1")
xQuery.Parameters("Число") =  1 
xQuery.Parameters("Дата") = # 1 / 1 / 2010 #
SET RecSet = xQuery.Openrecordset

Чтобы сократить код можно вообще обойтись и без Querydef.
Код: plaintext
1.
2.
3.
4.
5.
Dim RecSet As DAO.Recordset
Dim strSQL As String

strSQL = "PARAMETERS Число Long = 1, Дата Datetime = #1/1/2010#;" & vbCrLf & _
    "TABLE (Запрос1)"
Set RecSet = CurrentDb.OpenRecordset(strSQL)

Здесь вместо ключевого слово "PARAMETERS" можно использовать "PROCEDURE". Эффект будет одинаковым.
При этом название, тип и значение параметров запроса должны быть ПОЛНОСТЬЮ указаны после ключевого слова "PARAMETERS" (или "PROCEDURE"). Так если запрос имеет 3 параметра, а мы указали только 2, то Access будет ругаться.
Вместо "TABLE (Запрос1)" можно использовать более традиционное выражение "SELECT * FROM Запрос1".

А вот в случае с ADODB синтаксис будет другой, больше похож на синтаксис MS SQL Server.
Код: plaintext
1.
2.
3.
4.
5.
Dim RecSet As ADODB.Recordset
Dim strSQL As String

strSQL = "EXECUTE Запрос1 @Число=1, @Дата=#1/1/2011#;"
Set RecSet = New ADODB.Recordset
RecSet.Open strSQL, CurrentProject.Connection, adOpenKeyset

Здесь как Вы видите нужно перед названием параметра обязательно добавить "@" (в стиле MS SQL Server), иначе Access будет ругаться.
В принципе можно и пропустить название параметров, в этом случае следует строго соблюдать последовательность параметров.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37190520
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недавно обнаружил, что в запросах можно получить значение свойств некоторых объектов VBA (не все свойства конечно, но кое-что можно!).
Вот примерчик:
Код: plaintext
1.
2.
3.
4.
5.
SELECT
    CurrentDB.Name AS DBFullName,
    CurrentProject.Name AS DBName,
    Currentproject.Path AS DBPath,
    Currentproject.AccessConnection AS AccessConnection,
    Currentproject.BaseConnectionString AS Connection;

Можно оказывается получить и "длинные" свойства, т.е. чтобы добраться до нужного свойства приходится "беспокоить" несколько объектов, типа так:
Код: plaintext
SELECT CDate(CurrentProject.AllForms!Форма1.DateModified) AS DateModified

При этом если нам необходимо использовать скобки, кавычки или апострофы для того, чтобы добраться до свойство объекта, то Access будет ругаться. Поэтому так не катит:
Код: plaintext
SELECT CurrentDB.Openrecordset("SELECT Name FROM MSysobjects").Fields("Name")

Что делать в таких случаях?
Оказывается можно использовать EVAL.
Вот примерчик:
Код: plaintext
SELECT EVAL("CurrentDB.Openrecordset(""SELECT Name FROM MSysobjects"").Fields(""Name"")")

Что это даёт нам? Внутри запроса можно динамически создавать запрос. Да и не только это!
Конечно можно внутри запроса использовать VBA функцию, которая динамически сформирует SQL текст запроса. Но я заинтересовался именно этим способом из-за mde / accde формата, где рядовой пользователь сам также сможет смастерить динамический запрос. Иногда это бывает полезным.
Конечно можно использовать так сказать статистические функции (DSum, DCount и т.д.). Но этот способ всё-таки более мощнее, ибо даёт возможность обратиться к разным источникам данных в зависимости от параметра. Чтобы было более понятнее покажу простой пример:
Код: plaintext
1.
2.
3.
4.
5.
SELECT
    ID,
    EVAL("CurrentProject.Connection.Execute(""" &
        IIf(Id< 100 , "SELECT Field1 AS X FROM Table1", "SELECT Field2 AS X FROM Table2") &
            """).Fields(""Name""")") AS SomeValue
FROM Table3
Как Вы видите из примера, если Id<100, то EVAL обращается к таблице "Table1", иначе к "Table2". А вот в статистических функциях (DSum, DCount и т.д.) как это делать не знаю. Может быть там также можно как-то изощряться, по крайнем мере мне не известен способ.


P.S. Всё что здесь я написал, смог обнаружить чисто экспериментально, а не по книжкам. Если у кого-то есть ссылка на соответствующую литературу или какие-то замечания, please, напишите. Буду очень признателен!
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37190558
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибся по поводу статистических функций. :)
Там тоже в динамике можно оказывается обращаться к разным источникам. В смысле текст подменять.
Сорю однако! :)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37195556
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавная функция Eval !!! Оказывается с её помощью даже в обычных запросах на выборку можно вносить изменения в объектах БД. Т.е. совершать следующие операции:
- удалить таблицу / запрос (DROP);
- удалить данные из таблицы / запроса (DELETE);
- добавить новые записи (INSERT)
- изменить записи (UPDATE).

И этим возможности функции не исчерпаны!!!

Допустим у нас есть таблица "Table1", где имеются поля "Num" (числовое), "Text" (Текстовое).
Вот примерчик для запроса на выборку данных:
Код: plaintext
1.
2.
3.
SELECT * FROM MSysObjects
WHERE
    IIf(IsNull(Eval("CurrentDB.Execute(""INSERT INTO Table1 VALUES(1, 'Test')"")"))=False, True,
    IsNull(Eval("CurrentDB.Execute(""UPDATE Table1 SET Num = Num + 10"")")))

" CurrentDB.Execute " внутри Eval всегда возвращает Null или ошибку. Здесь Eval внутри IIf нужен не для фильтра, а для запуска запроса на добавление. Т.к. условие IIf не выполняется, то запускается следующий блок (ложь), где уже запускается запрос на обновление.
Eval можно вписать почти где угодно внутри текста запроса (после SELECT / WHERE / GROUP BY / Order By), .
В принципе как я уже написал, можно даже удалить таблицу или запрос. Но так как "DROP TABLE" и "DROP PROCEDURE" нельзя использовать в обычных запросах, внутри Eval не следует использовать "CurrentDB.Execute". В таких случаях следует использовать "CurrentProject.Connection.Execute". Правда чтобы избежать сообщение об ошибке придётся чуть-чуть изощряться.
Вот примерчик:
Допустим у нас есть запрос "Запрос1", которого следует удалить. Сначала следует проверить существование запроса, если существует, то только тогда удалить.
Код: plaintext
1.
2.
SELECT IIf(DCount("Name", "MSysobjects", "Name='Запрос1'")> 0 ,
   IsNull(EVal("CurrentProject.Connection.Execute('DROP PROCEDURE Запрос1').ActiveConnection"))=False,
   False) AS Deleted;

Здесь "ActiveConnection" в принципе не столь важен, он необходим для того чтобы избежать сообщение об ошибке. Если запрос не существует, то не следует запускать Eval в данном случае. Именно поэтому потребовался IIF.
Примерно таким же образом можно запускать Execute на создание таблицы или запроса.

Можно с помощью Eval даже запустить программу находясь внутри запроса! Например так:
Код: plaintext
1.
2.
SELECT
Eval("Shell(""""""C:\Program Files\Microsoft Office\OFFICE11\MSACCESS.EXE""""
""""C:\Test.mdb"""""")");

Есть ещё 1 особенность: если мы используем Eval или даже пользовательской VBA функции, предназначенной для открытия объекта БД (Docmd.OpenTable, Docmd.OpenQuery, Docmd.OpenForm и т.д.), то Access будет ругаться и никак не будет открывать объект.


P.S.
Всё что я здесь написал про Eval можно было бы реализовать с помощью пользовательской VBA функции, что конечно же более естественно и разумно! Но я здесь просто попытался показать некоторые возможности Eval и что теоретически одним запросом можно совершать много операций словно хранимая процедура MS SQL Server.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37195615
Фотография Sator Arepo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenЗабавная функция Eval !!! Оказывается с её помощью даже в обычных запросах на выборку можно вносить изменения в объектах БД. Т.е. совершать следующие операции:
- удалить таблицу / запрос (DROP);
- удалить данные из таблицы / запроса (DELETE);
- добавить новые записи (INSERT)
- изменить записи (UPDATE).

И этим возможности функции не исчерпаны!!!

...................
Такое использование функции Eval напоминает мину-ловушку. Невинный с виду предмет оказывается убийственным. Просто селект, вызывающий изменение объектов - идея того же порядка, ИМХО.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37219713
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMindХотел написать своё наблюдение. Когда открываете редактор VBA, вы автоматически попадаете в последний из добавленных модулей (или модулей форм). Всегда один и тот же, если не добавляли новых. Это к топику: Сохранение позиции в модуле .

Случайно сегодня обнаружил такую закономерность. Допустим, мы хотим любой произвольный модуль (в том числе и модуль формы) отметить как модуль, автоматически загружаемый при первом же открытии VBA редактора.
Что для этого надо делать? CoolMind предложил свой вариант, который работает. Но оказывается есть и другой способ.
Открываем нужный модуль, специально вводим какой-нибудь ошибочный код во времени исполнения, из-за которого нельзя откомпилировать проект. Скажем такой код:
Код: plaintext
With CurrentDB.QueryDefs("")
Здесь я использовал "With", но не использовал "End With". Конечно это и есть типичная ошибка "Runtime error". Теперь проект нельзя компилировать, Access будет ругаться. Закрываем файл и сохраняем. Затем открываем файл и заходим в VBA редактор. Теперь будем всегда попадать первым в "отмеченный" модуль. Т.к. теперь ошибочный код нам больше не нужен, то его следует убрать. После этого не плохо бы и откомпилировать файл.

Вот так вот.

P.S. Обнаружено эмпирически, случайно. :-)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37228352
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот здесь нашёл простую функцию, которая преобразует байтовое число в бинарное выражение. Сам код выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function sBin(ByVal b As Byte) As String
    Dim i As Integer
    
    For i =  0  To  7 
        If b And  2  ^ i Then
            sBin =  1  & sBin
        Else
            sBin =  0  & sBin
        End If
    Next i
End Function

Вроде простая функция. Проверил, работает. Но меня сначала удивила вот эта часть кода:
b And 2 ^ i
Для меня было не понятно, как это вообще работает.
Ведь если b не равно 0, значит он как бы True, ну и 2 ^ i всегда не 0. Значит если b не 0, то выражение должно вернуть True. Действительно попробовал вот такой запрос, который возвращает всегда True:
Код: plaintext
SELECT  3  And  7 
Попробовал и в VBA, но здесь результат в корне другой
Код: plaintext
1.
? 3  And  7 
 3 
Честно скажу, что поначалу не понял в чём тут дело. Открыл справочник и нашёл причину.
helpThe And operator also performs a bitwise comparison of identically positioned bits in two numeric expressions and sets the corresponding bit in result ...
Давным-давно не открыл справочник про AND, вот и забыл, что And ещё и совершает побитовое сравнение.
Я не нашёл аналогичную функцию или оператор в Jet SQL для побитового сравнения. Если кто-нибудь подскажет, буду признателен.
А вот в MS SQL Server аналогичную функцию можно написать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE FUNCTION fBin (@Value Tinyint) RETURNS Char( 8 )
AS
BEGIN
	DECLARE @I Tinyint, @V Char( 8 );

	/*	По умолчанию все переменные пустые (Null), поэтому им нужно присвоить
		первоначальные значения.
	*/
	SELECT @I =  0 , @V = '';

	WHILE @I <  8 
	BEGIN
		SELECT @V = CASE WHEN (@Value & POWER( 2 , @I)) >  0  THEN '1' ELSE '0' END + @V;
		SET @I = @I +  1 ;
	END

	RETURN @V;
END
Здесь побитовое сравнение совершает &.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37228386
ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ё
Гость
studierenДействительно попробовал вот такой запрос, который возвращает всегда True:
Код: plaintext
SELECT  3  And  7 
Попробовал и в VBA, но здесь результат в корне другой
Код: plaintext
1.
? 3  And  7 
 3 

если в свойствах БД установить "синтаксис для СКЛ Сервер"
то такой же результат (как в VBA), можно получить в запросе
Код: plaintext
1.
SELECT  3  band  7  as a,  3  band  8  as b
ab30
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37228406
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Ё! Вы как всегда на высоте. Спасибочки ОГРОМНОЕ за науку!!!
Попробовал так, как Вы посоветовали (правда, слегка по другому):
Код: plaintext
1.
?CurrentProject.Connection.Execute("SELECT 3 Band 7 as A").Fields("A").Value
  3  

Не знал, что есть "BAND" (а не просто "AND"). Мой справочник молчит как партизан про этот оператор. А где можно почитать о нём?
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37228424
ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ё
Гость
studieren...
Не знал, что есть "BAND" (а не просто "AND"). Мой справочник молчит как партизан про этот оператор. А где можно почитать о нём?

...чесно говоря - я тоже про него (BAND) - узнал только здесь на форуме,
а в литературе - нигде не сталкивался... )))

там их несколько подобных
Код: plaintext
SELECT  3  band  7  AS a1,  3  band  8  AS b1,  3  bor  7  AS a2,  3  bor  8  AS b2,  3  bxor  7  AS a3,  3  bxor  8  AS b3
a1b1a2b2a3b330711411
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37228765
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно "бинарные" числа бывают иногда полезными, чтобы спрятать секретные свойства БД. Ну скажем так:
Можно создать таблицу, где будут хранится значения секретных свойств. Саму таблицу можно назвать как "~TMPCLP..." (вместо точек какое-нибудь слово или символы), чтобы таблицу невозможно было бы увидеть "штатными" инструментами Access. В этой таблице ключевое поле будет "ID", где будут числа 2^n (т.е. 1, 2, 4, 8, и т.д.), ну и дополнительные поля, где будут "секретные" свойства различных объектов (всё что угодно, да хоть дата истечения срока эксплуатации БД для определённой группы пользователей или серийные номера жёстких дисков пользователей, у кого есть право пользоваться программой и т.п.).
Далее, ещё одна таблица для настроек, где и будет поле с неким числом для настройки, скажем, пользовательского интерфейса. К примеру, если там число 7 (т.е. 1+2+4), то первые три записи из секретной таблицы будут относится к таблице "Настройка". Напрямую связать эти 2 таблицы обычном запросом при отключённом SQL ANSI 92 будет невозможно, поэтому не все продвинутые пользователи поймут что к чему. Можно внутри VBA с помощью "CurrentProject.Connection.Execute" запустить запрос и узнать какие свойства доступны для данного кода настройки.
Что-то вроде этого запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim strSQL As String

strSQL = "SELECT N.*, T.*" & vbCrLf & _
"FROM Настройка AS N, [~TMPCLP_Table] AS T" & vbCrLf & _
"WHERE (N.ID Band T.ID) > 0"
With CurrentProject.Connection.Execute(strSQL)
    Do Until EOF
        ' Здесь получаем значения свойств и настраиваем БД.
        ' К примеру, устанавливаем запрет открытия какой-либо формы или отчёта
        ' определённым группам пользователей
        .MoveNext
    Loop
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37241671
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня обнаружил такую закономерность:
Допустим, у нас есть таблица в какой-либо СУБД (скажем в MS SQL Server), где есть необязательное логическое поле (некое поле X bit Null). Ещё одна важная деталь: поле "X" не имеет значение по умолчанию! Пусть даже в данной таблице есть уникальный ключ (можно даже счётчик или можно даже timestamp).
Теперь в Accessе (в mdb | accdb файле) линкуем таблицу через ODBC.
Для эксперимента введём одну запись и сохраним, но при этом не трогаем поле "X" и тем самым в данном поле сохраним значение Null. Вот теперь данную запись невозможно не удалить, не вносить изменения, Access постоянно будет ругаться (см. картинку).

Есть мнение:
Видимо Access перед тем, как изменить или удалить данные сверяет «старые» данные и при такой сверки допускает значения только «True» и «False» для логических полей. Видать «кудесники» из Microsoftа забыли, что необязательные логические поля могут иметь значение «Null». Скорее всего, при сверке «старых» данных с «новыми» Access пользуется каким-то внутренним запросом, где фильтрует данные и получает пустой набор записей, когда логическое поле Null. Вот и Access «предполагает», что раз невозможно «достать» и сверять «старые» и «новые» записи, то кто-то уже заблокировал / изменил запись.

Как лечить?
Не пользуйтесь НЕ обязательными логическими полями или хотя бы обеспечьте всегда значение по умолчанию. А ещё лучше вместо логического поля использовать байтовое целое число (tinyint / byte).

P.S.
Вот ещё 1 топик, где показаны очень интересные случаи.
FAQ: Проблемы при работе с ADP/ADE
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37246558
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказывается у Message box есть одна особенность:
когда выходит сообщение (не важно мы сами в программе вызвали или же программа сама сообщает о чём-то, например об ошибке), то можно нажать на Ctrl+C или Shift+Insert и тем самым скопировать в буфер обмена текст самого сообщения. Я раньше всегда "фотографировал" и вставлял в этом форуме рисунок Message Boxа. И какого было моё изумление, когда случайно обнаружил, что Ctrl+C работает. На всякий случай пролистал "официальный" help от Microsoftа, но там по этому поводу ничего не нашёл. Может как всегда "надёжно спрятали" где-то в недрах хелпа или может забыли.

P.S. Если баян, то уж извиняйте. Думаю для многих новичков всё-таки это новость. :)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37246601
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда-то (я уже не помню в каком топике) Анатолий из Киева предложил очень интересную функцию Message Boxа, где после истечения n секунд если пользователь не нажмёт на кнопку, то сообщение само закрывается. Вот собственно сама функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function MsgBoxExt(Prompt As String, Optional Buttons As VbMsgBoxStyle = vbOKOnly, _
        Optional Title, Optional ByVal SecondsToWait As Integer) As Integer
    ' Аналог MsgBox с возможностью самовыключения.
    ' Возвращает код нажатой клавиши или -1, если время ожидания исчерпано.
    Dim wshShell As Object
    
    Set wshShell = VBA.CreateObject("WScript.Shell")
    MsgBoxExt = wshShell.PopUp(Prompt, SecondsToWait, Title, Buttons)
End Function

Здесь вместо стандартного для VBA функции MsgBox использован объект "WScript.Shell" и его метод "PopUp". Оказывается и у этого способа можно скопировать текст самого сообщения в буфер обмена, когда выходит сообщение.
А вот когда аварийно останавливается программа и выходит не совсем "красивое" сообщение, то увы, я не смог скопировать в буфер обмена. Пришлось "фотографировать" (см. картинку).

P.S. А какие сообщения можно таким образом скопировать в буфер обмена, а какие нет никто не подскажет? Был бы признателен.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37249564
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не большое уточнение. Вот эти слова, отмеченные красным цветом, всё-таки оказались лишними, я тут немного ошибся:
studieren...(не важно мы сами в программе вызвали или же программа сама сообщает о чём-то, например об ошибке)...
Если мы перехватываем ошибку и сами "красиво" сообщаем пользователю в MsgBox, то можно копировать текст сообщения. Ну а если программа сама сообщает об ошибке (к примеру запускаем запрос с ошибкой), то сообщение в лучшем случае можно "фотографировать", а копировать нельзя.
Увы, Inputbox, пользовательская диалоговая форма и многое другое - "не копируемые".
Я всё больше думаю, что только пользовательский MsgBox имеет такую особенность.
...
Рейтинг: 0 / 0
25 сообщений из 280, страница 2 из 12
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / интересные факты / наблюдения / анализ чужих и собственных решений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]