powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / давно зреет вопрос к гуру
16 сообщений из 16, страница 1 из 1
давно зреет вопрос к гуру
    #32243587
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть стандартная проблемка "привода" разошедшихся со временем версий приложений к общему знаменателю. Когда уже никто особо и не помнит, что и для чего в каждой версии менялось. ((работают люди и просят тот -того, этот - этого... потом выясняется, что один просил мудрее - приходится менять и тем, кто просил "не того", ну и т.п ...)). Для того, чтобы как-то отследить (автоматически подновить) состояние табличных объектов я пользую набор функций, просматривающих пару баз с предположительно одинаковыми таблицами, и пытающихся "поправить" таблицы в одной из (баще "назначения"). Все бы ничего, но вот одна из функций вызывает дикий висяк при выходе из процедуры. (На мой взгляд, все прочии процедуры выходят так же, но там этого нет. Чтобы не бфть голословным, привожу код и отчет дебугерра:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
Function aCompareExistingFields(FilePathSource As String, FilePathIn As String) As Integer
'сравнение размеров и свойств всех полей таблиц из БД FilePathIn,
'обновление изменяемых
'имеющих одноименные поля таблиц в БД FilePathSource
'иногда вызывает ошибку открытия dbsSource, лечится импортом чего - нить куда -нить.
'выполняется крайне долго. Лучше не злоупотреБлять
Dim tbl As TableDef
Dim tblIn As TableDef
Dim i As Long, k As Long, j As Long
Dim aName As String

Dim dbsSource As Database, dbsIn As Database, FilePath As String
Dim fldS As Field, fldIn As Field, fName As String

Dim prpS As Property, prpIn As Property, pName As String
Debug.Print Time
On Error GoTo err_aTrOpenDBs
    Set dbsSource = DBEngine.Workspaces(0).OpenDatabase(FilePathSource)
    Set dbsIn = DBEngine.Workspaces(0).OpenDatabase(FilePathIn)

On Error Resume Next
    For k = 0 To dbsIn.TableDefs.Count - 1
        Set tblIn = dbsIn.TableDefs(k)
        aName = tblIn.Name
        Err.Clear
        Set tbl = dbsSource.TableDefs(aName)
        If Err.Number <> 0 Then
            Debug.Print "  В БД источнике нет табл " & aName
            Err.Clear
        Else
            For j = 0 To tblIn.Fields.Count - 1
                Set fldIn = tblIn.Fields(j)
                fName = fldIn.Name
                Err.Clear   'Только ошибку присвоения
                Set fldS = tbl.Fields(fName)
                If Err =  3265  Then  '<>0
                    'В источнике нет поля
                    Err.Clear
                Else
                    'поле есть
                    For i = 0 To fldS.Properties.Count - 1
                        Set prpS = fldS.Properties(i)
                        pName = prpS.Name
                        If pName <> "OrdinalPosition" Then
                            Set prpIn = fldIn.Properties(pName)
                            If prpS.Value <> prpIn.Value Then
                                If Err = 0 Then 'т.е. проперти имеет величину
                                    Debug.Print  "   ["  & aName &  "].["  & fName &  "].["  & pName &  "] ="  & prpS.Value &  " / "  & prpIn.Value
                                    If (pName <>  "Size" ) And (pName <>  "Type" ) Then 'And (pName <> "Attributes")  не все атрибуты, но можно менять
                                        prpIn.Value = prpS.Value
                                        'tblIn.Fields.Refresh ' попытка избавиться от висюка
                                        If Err <> 0 Then
                                            Debug.Print Err.Description
                                            Err.Clear
                                        End If
                                    End If
                                Else
                                    Err.Clear
                                End If
                            End If
                            If Err <> 0 Then
                                Debug.Print Err.Description
                                Err.Clear
                            End If
                        End If
                        Set prpIn = Nothing
                        Set prpS = Nothing
                    Next i
                End If
                Set fldS = Nothing
                Set fldIn = Nothing
            Next j
        End If
        'dbsIn.TableDefs.Refresh ' попытка избавиться от висюка
    Next k
    Debug.Print Time
    'dbsSource.Close - тут висяк
    'dbsIn.Close
err_aCompareExistingFields:
    Set tbl = Nothing
    Set tblIn = Nothing
    Set dbsSource = Nothing
    Set dbsIn = Nothing
    aCompareExistingFields = True
    Debug.Print Time
    Exit Function
    
err_aTrOpenDBs:
    MsgBox Err.Description
    Resume err_aCompareExistingFields
End Function

Вот отчет на почти идентичных базах:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
?aCompareExistingFields( "C:\xxx.mdb"  ,  "C:\yyy.mdb" )
 14 : 34 : 56  
  В БД источнике нет табл ttttt
 14 : 35 : 00  
 14 : 36 : 26  
- 1  

?aCompareExistingFields( "C:\xxx.mdb"  ,  "C:\yyy.mdb" )
 15 : 06 : 47  
  В БД источнике нет табл ttttt
 15 : 06 : 51  
 15 : 08 : 17  
- 1  

- висяк 1м 26сек ПОСЛЕ отработки всех операторов (присвоения) в момент закрытия ссылок на базы (или явного "close") (при практически идентичных БД) никакие танцы с бубнами типа dbANY.Close и anyCollection.Refresh не ведут к существенному изменению (Refresh, как видно по отчету (1-й вариант), даже не изменил времен выполнения/закрытия).

Что-то я тут упускаю, или действительно нет способа повлиять на этот феномен? Уж больно надолго все это. Причем дисковых операций вроде и нет, а процессор грузит на все 100. А уж ежели в Access2.0 (с маленькими синтаксическими помарками)... :o) там минут на 10 -15 зависание в норме. Но, что странно, - прочухивается сам.

зы: код конечно не блеск - правлю по случаям.
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32243666
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, канешна, не гуру, но позволил себе скопировать и запустить изложенный текст. Для пробы использовались 2 одинаковых файла xxx.mdb и yyy.mdb. "Висяки" "откомментарил". Их нету. Усе отработалось махом.
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32243769
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия Акеса? - (я наблюдаю в 97, и 2-м).
Размер файлов? (число таблиц) - (36/37 - мой тест)
Наличие данных? (общий объем данных - до 3-mb - тест).

То-то и оно, что все отрабатывается (даже с изменениями в таблицах) в приемлемое время, а завершение - минуты интенсивного счета на одном операторе вида Set ... = Nothing (...Close).

mayBe файл рабочих группппп?/разрешения?/хотя пересоединился к файлу р/г на сетке - 1:28 - т.е. в пределах погрешности :) то же самое.
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32243864
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, в 97-м с более-менее немаленькой базой работает медленно. Поскольку я не могу пока ответить на твой вопрос, я его перефразирую:

Вот этот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
Function aCompareExistingFields(FilePathSource As String, FilePathIn As String) As Integer
Dim tbl As TableDef
Dim tblIn As TableDef
Dim i As Long, k As Long, j As Long
Dim aName As String
Dim t As Long

Dim dbsSource As Database, dbsIn As Database, FilePath As String
Dim fldS As Field, fldIn As Field, fName As String

Dim prpS As Property, prpIn As Property, pName As String

Debug.Print Time
    Set dbsSource = DBEngine.Workspaces( 0 ).OpenDatabase(FilePathSource)
    Set dbsIn = DBEngine.Workspaces( 0 ).OpenDatabase(FilePathIn)

    For k =  0  To dbsIn.TableDefs.Count -  1 
        Set tblIn = dbsIn.TableDefs(k)
        aName = tblIn.Name
On Error Resume Next
        Set tbl = dbsSource.TableDefs(aName)
        If Err.Number <>  0  Then
On Error GoTo  0 
        Else
On Error GoTo  0 
            For j =  0  To tblIn.Fields.Count -  1 
                Set fldIn = tblIn.Fields(j)
                fName = fldIn.Name
On Error Resume Next
                Set fldS = tbl.Fields(fName)
                If Err <>  0  Then
On Error GoTo  0 
                Else
On Error GoTo  0 
                    For i =  0  To fldS.Properties.Count -  1 
                        Set prpS = fldS.Properties(i)
                        pName = prpS.Name
                        If pName <>  "OrdinalPosition"  Then
'                            Set prpIn = fldIn.Properties(pName)'
'On Error Resume Next'
'                            If prpS <> prpIn Then'
'                                If Err = 0 Then'
'On Error GoTo 0'
'                                    Debug.Print "   [" & aName & "].[" & fName & "].[" & pName & "] =" & prpS.Value & " / " & prpIn.Value'
'                                    If (pName <> "Size") And (pName <> "Type") Then'
'                                        prpIn.Value = prpS.Value'
'                                        tblIn.Fields.Refresh'
'                                        If Err <> 0 Then'
'                                            Debug.Print Err.Description'
'                                            Err.Clear'
'                                        End If'
'                                    End If'
'                                Else'
'On Error GoTo 0'
'                                End If'
'                            End If'
                        End If
                        Set prpIn = Nothing
                        Set prpS = Nothing
                        t = t +  1 
                    Next i
                End If
                Set fldS = Nothing
                Set fldIn = Nothing
            Next j
        End If
        dbsIn.TableDefs.Refresh
        Set tbl = Nothing
        Set tblIn = Nothing
    Next k
    MsgBox t
 
    dbsSource.Close
    dbsIn.Close
    
    MsgBox t
    Beep
End Function

в 97 аксесе при сравнении двух одинаковых файлов с несколькими десятками таблиц работает очень быстро. Но если "раскоментарить" первую из закоментаренных строк, появляются явные тормоза.
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32243870
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
причем вот такой код работает с приемлимой скоростью
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Function aCompareExistingFields(FilePathSource As String, FilePathIn As String) As Integer
Dim tbl As TableDef
Dim tblIn As TableDef
Dim i As Long, k As Long, j As Long
Dim aName As String
Dim t As Long

Dim dbsSource As Database, dbsIn As Database, FilePath As String
Dim fldS As Field, fldIn As Field, fName As String

Dim prpS As Property, prpIn As Property, pName As String

Debug.Print Time
    Set dbsSource = DBEngine.Workspaces( 0 ).OpenDatabase(FilePathSource)
    Set dbsIn = DBEngine.Workspaces( 0 ).OpenDatabase(FilePathIn)

    For k =  0  To dbsIn.TableDefs.Count -  1 
        Set tblIn = dbsIn.TableDefs(k)
        aName = tblIn.Name
On Error Resume Next
        Set tbl = dbsSource.TableDefs(aName)
        If Err.Number <>  0  Then
On Error GoTo  0 
        Else
On Error GoTo  0 
            For j =  0  To tblIn.Fields.Count -  1 
                Set fldIn = tblIn.Fields(j)
                fName = fldIn.Name
On Error Resume Next
                Set fldS = tbl.Fields(fName)
                If Err <>  0  Then
On Error GoTo  0 
                Else
On Error GoTo  0 
                    For i =  0  To fldS.Properties.Count -  1 
                        Set prpS = fldS.Properties(i)
                        pName = prpS.Name
                        If pName <>  "OrdinalPosition"  Then
                            Set prpIn = fldIn.Properties( "name" )
                        End If
                        Set prpIn = Nothing
                        Set prpS = Nothing
                        t = t +  1 
                    Next i
                End If
                Set fldS = Nothing
                Set fldIn = Nothing
            Next j
        End If
        dbsIn.TableDefs.Refresh
        Set tbl = Nothing
        Set tblIn = Nothing
    Next k
    MsgBox t
 
    dbsSource.Close
    dbsIn.Close
    
    MsgBox t
    Beep
End Function

Видимо, обращение к некоторым свойствам поля по имени почему-то заставляет Access как бы "кэшировать" операции до закрытия.
Отсюда встречный вопрос:
а нельзя ли вместа прохода по всем возможным свойствам поля проверить десяток нужных, как то: подпись, тип, источник строк и т.п. (кстати, а не в источнике строк ли дело? Любит Access на всякий случай проверять его корректность).
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32243885
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Действительно, проверка только свойства .Name ("name") не вызывает таких тормозов как (хотя бы опрос) свойств Default, Constraint (не помню имен) и т.п. Но именно их я и проверяю. Идея о "несинхронной" обработке результатов изменений с задержанной обработкой по выходу интересна, но, боюсь, не верна: -

Смешно, но аналогичная функция копирования индексов тормозов не вызывает. (хоть я и запускаю ее больше на этапе отладки процедуры "приведения" к таблиц с данными к нужному новому виду), не слишком полагаясь на безупречность своего кода.
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32244252
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, гуру в отпуске :о)

Меня интересует вопрос именно потому, что даже когда в базе ничего не меняем, висяк возникает - пропорционально, видимо, количеству просмотренных полей объектов семейств TableDefs (обеих? баз). Хотелось бы избавиться от этой зависимости от "интимной жизни" Аксесса. Но переписывать задачу на sql вида Alter Table не хочется - все равно нужно будет осуществлять анализ dbSource по пропертям полей таблиц (семейства TableDefs) -если дело в обращениях к свойствам - висяки остануться (разве что впополам сократятся по времени). Путь создания новых таблиц по образцам (копирования структур из образца методом Tranfer) и вливания туда данных из (переименованных) старых таблиц тут не желателен - при несовместимости размеров/типов нужно принимать решение о конечном типе/размере полей (чтобы не потерять данных и/или, дополнительной функциональности, возможно реализованной в модифицируемом приложении, но не реализованной в "образце" сравнения). Т.е. этот путь обоснован для окончательной реализации "стандартной" процедуры конвертации (после создания полнофункционального эталонного образца), но при анализе (напр. в процессе ручной конвертации, что чаще, ибо обычно нет явных поколенческих "версий", но есть масса мелких модификаций приложений /как правило, даже не моих :0)/).
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32244305
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще немного:
(обеих? баз)
Не обеих. Если выкинуть
Set prpIn = fldIn.Properties(pName)
и все, что ниже нее внутри последнего цикла, мы проходим по всем(!) пропертям базы1 через .Properties(i), но не обращаемся по имени к свойствам полей базы2, и зависаний нет.
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32244498
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Geo Спасибо.

Я заметил это по Вашим постам, но не вижу разницы в том случае, если мы НИЧЕГО не меняем во второй базе. Т.е. Аксес, вы думаете, начинает заниматься "интимом" именно после обращения к пропертям по имени? А это наводит....! - тогда делаем перебор по индексу до нахождения имени (т.е. обращаемся по индексу, но не по имени), и ...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
                        If pName <>  "OrdinalPosition"  Then
                            'Set prpIn = fldIn.Properties(pName)
                            Dim o As Long
                                For o =  0  To fldIn.Properties.Count -  1 
                                    If fldIn.Properties(i).Name = pName Then
                                        Set prpIn = fldIn.Properties(o)
                                        Exit For
                                    End If
                                Next o
                            If prpS.Value <> prpIn.Value Then

получаем:
Код: plaintext
1.
2.
3.
4.
5.
?aCompareExistingFields( "C:\xxx.mdb"  ,  "C:\yyy.mdb" )
 11 : 38 : 38  
  В БД источнике нет табл ttttt
 11 : 38 : 42  
 11 : 39 : 58  
- 1  


т.е. :
циклы поиска не увеличили (существенно) времени исполнения, но, кажется время "закрытия" сократилось на 10+-2 сек. ? (проверка со "старой" процедурой сегодня - 1:27) ? С "новой", но без "исполняемой части (коментарий на все строки цикла If prpS.Value <> prpIn.Value ) - время закрытия - 1:18 -в пределах ошибки замера(+1-1) =1:16).

Таким образом: !да, обращение по имени вызывает большую задержку закрытия, !но проблема в самом факте вызова имменно "пропертей" полей таблицы "вставки" (без вставки). Вызов проперти таблицы "источника" почему-то не вызывает таких проблем ???!!! Или просто проблема открытия одновременно 2-х баз в одном Workspace-е?? /проверю, позже. надеюсь вернуться :)/
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32244563
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
п.с. Только, если можно, на "ты". :)
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32244564
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
п.с. Только, если можно, на "ты". :)
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32244575
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К гуру и на "ты"? Эдак можно и канделябром схлопотать
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32244718
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
21-08-03, 16:54 Я, канешна, не гуру,...
Лифчик, не подкалывай, плиз :)
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32245225
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проверил.
1. задание разных воркспейсов не приводит (к заметным) изменениям. А вот гемора не оберешься - требуется явное задание юзера и пароля. Если неохота - добавляй нового, вставляй (в цикле) во все группы, и надейся, что прав на открытие для правки таблиц хватит (а не толькона чтение макетов). Как будто сложно открыть воркспейс с текущим юзером. Он же не от балды тут груши околачивает. ссссс...

2. Вроде чуть (~10 сек) быстрее закрывается, если явно задать режимы открытия:

Set dbsSource = DBEngine.Workspaces(0).OpenDatabase(FilePathSource, False, True)
Set dbsIn = DBEngine.Workspaces(0).OpenDatabase(FilePathIn, False, False)
(причем именно НЕмонопольный). и
dbsSource.Close : dbsIn.Close
или это ошибка измерения? (что-то теперь зависимости от способа вызова проперти по имени/номеру я не намерил). Зато можно явно замерить время закрытия каждой бд. На моем "стандартном наборе время поделилось ~ 24с/46с на закрытие dbsSource и dbsIn соотвтественно.

Таким образом : время закрытия dbsSource растет с ~0 до 24 сек, только при условии, что я опрашиваю проперти таблиц второй базы (dbsIn). Что занятно. Осталось еще попробовать разделить открытия баз по времени. т.е. заполнять массивы, при открытии таблицы из первой базы, закрывать базу, открывать вторую, пытаться вставить массивы. Ибо, как я проверил, _последовательное_ (с закрытием первой перед открытием второй) открытие баз, перебор таблиц, полей и их проперти не приводит (как и ожидалось) к зависанию (по крайней мере до тех пор, пока ничего в свойства не пишется).

ЗЫ. А гуру отмолчались. :(
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32245261
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> ЗЫ. А гуру отмолчались. :(

Значит, у них никаких идей...
...
Рейтинг: 0 / 0
давно зреет вопрос к гуру
    #32246372
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробно реализовал "разделение" по времени. Действительно считает медленнее (заполнение всех массивов с переопределением размеров), но закрывается шустрее.
Приведу результаты, может быть интересно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
?mCompareExistingFields( "C:\xxx.mdb"  ,  "C:\yyy.mdb" )
 14 : 38 : 09  A
  В БД источнике нет табл ttttt
 14 : 38 : 25  B
 14 : 38 : 26  dbsSource.Close
   [COUNTRY].[Name].[Size] = 51  /  50 
   [COUNTRY].[Name].[DefaultValue] = "Страна"  / 
   [Payments].[Summa_Count].[DefaultValue] = 1  /  0 
 14 : 38 : 28  dbsIn.Close
 14 : 38 : 28  end
- 1  

?mCompareExistingFields( "C:\xxx.mdb"  ,  "C:\yyy.mdb" )
 14 : 40 : 56  A
  В БД источнике нет табл ttttt
 14 : 41 : 12  B
 14 : 41 : 13  dbsSource.Close
   [COUNTRY].[Name].[Size] = 51  /  50 
   [COUNTRY].[Name].[DefaultValue] = /  "Страна" 
   [Payments].[Summa_Count].[DefaultValue] = 0  /  1 
 14 : 41 : 15  dbsIn.Close
 14 : 41 : 15  end
- 1  

(базы те же, что и раньше)
- прогнал "туда и обратно" - то, что менялось - меняется и т.п. + Имеет видимо смысл вытаскивать только свойства из заданного перечня [имен] - а то заполение массивов времени требует многовато.

:( теперь проблема, как это на совместимый с Акс2.0 синтаксис перевести :(
Ему ж не скажешь: { ReDim Preserve tbl_S(nT).tfld(nF).mprp(nP) }

Однако вопрос о том, что понуждает аксесс надолго задумываться в случае, когда к свойствам полей таблиц второй бд я обращался до закрытия первой (бд)остается. И можно ли обойти эту неприятную особенность, не прибегая к сложным развязкам (с созданием собственных сложных структур, что не только требует времени, но и может быть источником ошибок)?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / давно зреет вопрос к гуру
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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