Рассылка статей | Выпуск 19. Начало уроков по Access
Leadersoft.ru

Рассылка статей

Программирование и готовые решения

В этом разделе сайта дается информация от https://leadersoft.ru о статьях по программированию, ответах на вопросы и др. Статьи рассылаются подписчикам и публикуются на разных сервисах. Возможно некоторая информация устарела и ссылки не работают, но эти сведения могут быть полезны, если Вы серьезно занимаетесь разработкой баз данных

Выпуск 19. Начало уроков по Access

Введение.
    
В данном выпуске, по просьбе тех, кому лекции показались сложными, я начинаю публикацию небольших уроков по Access 2000 для начинающих. Вы можете после каждого урока задавать вопросы по теме.


Access 2000. Урок 1. Введение
   Microsoft Access 2000 [Майкрософт Эксис 2000] - компьютерная программа для работы с базами данными [1]. Она распространяется отдельно или в составе продуктов Microsoft Office 2000. Если Вы желаете получить максимум информации о ее возможностях, то желательно иметь у себя один из следующих комплектов Microsoft Office 2000: Professional, Premium или Developer.
  Access еще называют СУБД [2] реляционного типа, а программирование в ней - объектным. Это связано с тем, что в файле базы данных в отличие от других баз данных (dbf [4]) можно хранить разные объекты [3] и назначать между ними связи, отношения (relation).
  Почему же база данных стала самой популярной в мире? Ответ на этот вопрос дан ниже при сравнении с другими средствами проектирования.
  С++  и Delphi [5] - дают самый компактный исполняемый код [6] для Windows приложений. Недостаток их - неудобство в работе. На диске у Вас будет много файлов. Например, для C++ (*.cpp, *.h, *.def, *.h, *.mak, *.rc), для Delpi (*.pas, *.dfm, *.dcu, *.db, *.mb, *.px), причем, с короткими английскими именами до 8 символов. В больших проектах, становиться сложно управлять ими, а тем более быстро вносить изменения от заказчика. Поэтому работая с файлами этих программ, даже на примитивном уровне, от Вас потребуется сразу высокая квалификация как программиста.
  Microsoft Exсel - программа чем-то похожа на таблицы Access. Недостаток ее - проблемы при работе с большим количеством таблиц и данных, а также, малое количество помощников (конструкторов), которые помогают Вам создавать простой и понятный интерфейс для пользователя.
  VisualBasic - по сравнению с С++ и Delpi создает более длинный код, и при работе в сети будет медленно работать с mdb файлом из-за отсутствия единой управляющей программы. Что это за программа? Пока объяснять не буду, но она всегда запускается при открытии Access и контролирует действия приложения от возможных ошибок, а также отвечает за загрузку и сохранение данных в базах данных.
  Таким образом, приведенные выше примеры говорят о том, что Вы правильно выбрали Access - как лучшее средство для быстрой разработки программного обеспечения.
Словарь
   • [1] База данных (database) - файл, имеющий расширение mdb. Он разрабатывается пользователем и служит для сохранения информации.
   • [2] СУБД - система управления базой данных
   • [3] Объект (object): элемент базы данных, например, таблица (table), запрос (query), форма (form), макрос (macro), отчет (report), модуль (module)
   • [4] dbf - файл базы данных dBase
   • [5] С++ и Delpi (Pascal) - самые популярные языки программирования. Наиб��лее известная компания, разработчик этих систем Borland (Inprise Corp.) - давний конкурент Microsoft.
   • [6] Исполняемый код - программа с расширением exe (execute), которую выполняет операционная система Windows по запросам пользователей.

Ответы на вопросы


     Вопросы Вы можете задавать по email или опубликовать на сайте в разделе "Доска объявлений". Ответ попадает в подписку в том случае, если на него будет достаточно ответов. Кроме этого, если к вопросу придут замечания после рассылки, то они не рассылаются, а просто публикуются на сайте в соответствующем разделе подписки.
 

Вопрос 2. Возникла следующая проблема. Access 97 (SP2). В форме используется ToolBar. В подформе в обработчике Form_BeforeUpdate происходит некая проверка и может выдаваться Question. Если выход из подформы осуществляется при щелчке мыши по ToolBar, то после выдачи сообщения "теряется" клик (нажатия на кнопку не происходит, а если перемещать курсор над кнопкой, по которой был клик, она "утапливается").
  Ответ. После обработки события перерисуйте форму или сделайте "лишние" действия, чтобы фокус с кнопки пропал.
Вопрос 4. Помогите пожалуйста решить одну "проблемку". Суть дела: - Есть форма, есть 2 кнопки в форме, есть отчет. Надо: чтобы при нажатии 1-ой кнопки отчет уходил на печать на 1-ый принтер, установленный в системе, а при нажатии 2-ой, соответственно на 2-ой принтер. Думаю, что есть пути решения вопроса.
Игорь В. Макеев Кстати, по поводу настроек принтера, рекомендую ссылку: http://www.emoney.ru/access/adhch10.zip
Виктор Конюков
Вообще на эту тему много всего написано. Я дал свой вариант работы с принтерами. Код дан с подробным описанием каждой функции, структуры, даже каждой строчки на Бэйсике для принтера. Есть "птичка" для авто-печати отчета.
Вопрос 11.   ACCESS 2000 работает в 2-х режимах: - старом с провайдером Microsoft.Jet.OLEDB.4.0 - и новом, с каким либо из провайдером сервера  При этом в первом случае, ACCESS автоматически подключается к провайдеру Jet, а во втором, в диалоге можно выбрать провайдера сервера. Если возникает необходимость основную часть БД держать на сервере, а небольшую часть в формате *.mdb на клиенте (в основном tmp таблицы или, возможно, прибегнуть к обработке информации из MS Servera возможностями SQL Jet). Как организовать одновременную работу проекта ACCESS с готовыми формами от разных провайдеров?
   Игорь Макеев 
'1 пример

Dim cm As ADODB.Command
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString ="Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;DataSource = C:\Temp\Access\2000\db1.mdb"
cn.Open
Set r = New ADODB.Recordset
r.CursorLocation = adUseClient
r.Open "select * from test", cn, adOpenKeyset
Set Me.Recordset = r
'2 пример, DAO
Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim r As DAO.Recordset
Set ws = CreateWorkspace("NewJetWorkspace", "admin", "", dbUseJet)
Set db = ws.OpenDatabase("C:\Documents and Settings\Igorek\Мои
документы\Access\2000\db1.mdb")
Set r = db.OpenRecordset("Test", dbOpenDynaset)
Set Me.Recordset = r
 
Виктор Конюков.
 Я бы добавил еще несколько примеров по составлению командной строки для обращения к другим провайдерам с использованием ADO.
Access: "Provider=MSRemote;RemoteServer=http://myFolder;RemoteProvider= Microsoft.Jet.OLEDB.4.0; DataSource=mydb.mdb" (удаленный доступ к филиалу)
Excel: "Provider=Microsoft.Jet.OLEDB.4.0;DataSource= test.xls;ExtendedProperties=""Excel8.0; HDR=Yes;"";" (работа с электронными таблицами)
Oracle:
"Provider=OraOLEDB.Oracle;DataSource=mydb;UserId=xxx;Password=;" (подключение через  Oracle)
SQL server: "Provider=sqloledb;NetworkLibrary=DBMSSOCN;DataSource=xxx;InitialCatalog=myFolder; UserId=xxx;Password=;" (Microsoft SQL server)
P.S. Если есть мысли по улучшению кода - присылайте, опубликуем со ссылкой на автора.
Вопрос 15. В своих примерах Вы часто используете библиотеки Виндов. Где можно получить информацию о них, об их объектах и свойствах? Меня заинтересовал TreeView (и не только).
Igor V. Makeev
Help от MS ODE Tools.
Виктор Конюков Я бы добавил, что литературы на русском языке, по данной тематике я не встречал. Так что в качестве пособия Вы можете использовать еще библиотеку MSDN: msdn.microsoft.com
Вопрос 23. Добрый день, я пытаюсь сделать простую базу в Access и у меня такой вопрос: В таблице есть дата оплаты и сумма оплаты в рублях, в другой таблице перечень курсов по датам, мне нужно получить сумму в валюте... к сожалению я не знакома с VBA, можно ли решить мою проблему с помощью запроса?
Igor V. Makeev 
SELECT idpay, rub_sum, date, rub_sum*(select top 1 val from curs where setdt
<= date order by setdt desc) AS valut_sum FROM sum; 
ВАlеx. Это можно сделать с помощью SQL запроса:
SELECT Таблица1.Дата, Таблица1.СуммаВРублях, Таблица2.Курс_РубЗаДол,
[СуммаВРублях]/[Курс_РубЗаДол] AS СуммаВДолларах
FROM Таблица1 LEFT JOIN Таблица2 ON Таблица1.Дата = Таблица2.Дата;
Таблица1 (Дата, СуммаВРублях)
Таблица1 (Дата, Курс_РубЗаДол)
Считаем, что одному числу (дате) соответствует только одно число (например, только курс рубля к доллару). Если в справочнике курсов несколько валют, тогда в каждой таблице нужно ввести код валюты. Тип соединения таблиц зависит от предметной области (т. е. INNER JOIN или LEFT JOIN). Как самому сделать что-то похожее. Зайти в режим конструктора запросов. Задать соединение между таблицами. Выбрать поля, которые будут нужны при вычислениях или (и) их нужно будет выводить на экран. Записать запрос. Для нового поля правой кнопкой мышки вызвать построитель выражений ("Построить"). Набрать нужное выражение с помощью построителя запросов. В Help по-моему есть примеры по построителю выражений.
Виктор Конюков

Вы можете также посмотреть пример N2 в файле: la_query.mdb.
Вопрос 22. Очень хочется, при создании программным путем запросов (да и вообще чего угодно), добиваться эффекта поставленного флажка "скрытый" в свойствах запроса, к сожалению в свойствах запроса как документа, я этого не нашел.
 Виктор Конюков . Ниже приводится 2 примера для скрытия запроса и таблицы. Для других элементов используйте функцию SetHiddenAttribute аналогично указанным примерам.
Application.SetHiddenAttribute acQuery, "Запрос1", True
Application.SetHiddenAttribute acTable, "Таблица1", True
Для скрытия других элементов базы данных используйте свойство Visible, т.е Visible = False.
Igor V. Makeev
Стоит уточнить, что это верно для Аccess 2000, в Access 97 нет такого метода у Application
Вопрос 24. У меня проблема! не могу связать акцесную базу с фаилом FoxPro .dbf, т.к. в списке выбора типа связываемой таблицы нет FoxPro, а есть Dbase, но он не подходит. Как быть в этом случае?
  Надо найти драйвер ODBC FoxPro, посмотрите на сайте Microsoft.
Вопрос 25. Если связываемая БД FoxPro лежит на сервере, как сделать к ней доступ, т.е. связать с ней, она ругается в Access 97, что там нет доступа т.к. таблица FoxPro используется другим?
  Закройте бухгалтерскую программу, которая использует файл FoxPro, а потом запустите Access. А также почитайте информацию в разделе сайта dbase.
Вопрос 28. У меня возникла одна маленькая проблема как увязать Word и Access, а именно Существует поле гиперссылки куда ссылка на файл, находящийся на жестком диске. Как можно максимально упростить задачу добавления гиперссылки в поле? Скажем в форме где находится поле гипессылки есть другое поле данные которого равны названию папки на жестком диске, скажем данные "Импульс" , Папка на жестком диске "D:\Temp\Импульс". Есть также другое поле, поле с датой. Можно ли сделать так чтобы при нажатии на поле гиперссылки Открывался Word и Создавался бы файл в данном случае в папке "Импульс" с названием из поле дата скажем 22-июн-99г. Но это идеальный вариант, если такое сложно описывать, то хотя бы просто упростить задачу добавления гиперссылки
Игорь Макеев 
Один из способов:
1. Создаем форму
2. Размещаем на ней два поля: plFolder и plDate
3. Размещаем над��ись lblLink
4. Свойство надписи <Адрес гиперссылки> (HyperlinkAddress) устанавливаем в
file:\\, просто, чтобы ссылка светилась
5. Оформляем событие надписи MouseDown
Private Sub lblLink_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
Dim wdApp As Object
Set wdApp = CreateObject("word.application")
wdApp.Documents.Add
wdApp.ActiveDocument.SaveAs Me.plFolder + Format(Me.plDate, "Medium Date") +
".doc"
wdApp.Quit
Set wdApp = Nothing
Me.lblLink.HyperlinkAddress = "file:\\" + Me.plFolder + Format(Me.plDate,
"Medium Date") + ".doc"
End Sub
6. Получаем требуемую функциональность вводя в поле plFolder путь, а в
plDate - дату.
7. Добавляем по вкусу обработку исключительных ситуаций и ошибок.
Вопрос 30. У меня проблема - создала форму с кнопками, для них написала код. Потом удалила эту форму - а в проекте в списке форм она осталась, и теперь не знаю, как её можно удалить. Копалась в help-е, бесполезно :(
  Ваша проблема легко решается. Для этого надо создать новый проект и передать в него путем импорта все объекты. Удаленная форма останется в старом проекте.
Вопрос 33. Опять все то же поле "дата/время". Маска ввода в форме: "##.##.##" При переносе файла базы данных на другой компьютер разделители в маске почему-то меняются "##:##:##" Поскольку в системных настройках в качестве разделителя используются точки, при вводе данных в это поле выдается сообщение об ошибке. Т.е. mde-файл создать нельзя, потому что приходится править маски во всех формах. Не встречались ли Вы с такой проблемой, и можно ли ее каким-либо образом решить?
 Игорь Макеев Можно посоветовать формировать маску при открытии формы.
Вопрос 37. Не хочу Вас сильно утруждать, поэтому сразу к вопросу: как напечатать один отчёт два раза на одном листе? Это гарантийный талон, нужна печать с обоих сторон.
  Самое лучшее - это купить принтер с двухсторонней печатью. Если нет возможности можно использовать команду: DoCmd.PrintOut, которая позволяет отпечатать отчет по страницам.
Вопрос 41. Если у Вас есть возможность, прошу посоветовать: КТО виноват и ЧТО делать? Ситуация: Есть складская программа под DOS. Из нее периодически делается экспорт в текстовые файлы. Access97 с периодом в 20сек ищет эти файлы и печатает к ним отчет. База данных для программы под Access лежит на WinNT Server4.0 (используется совместно с выгружаемыми файлами для формирования отчета). Для печати отчета применяется Docmd.OpenReport. Работа происходит так: Пользователи запускают программу под Access (и больше к ней не возвращаются), запускают складскую программу (полноэкранный режим, DOS) и работают в ней, а Access тем временем печатает отчеты к файлам, которые они выгружают. Проблема:
    Если работа происходит на рабочей станции Win98 - все работает нормально, но если работа происходит на NT (Ws или Ser) то иногда (частоту и связь с действиями пользователей установить не удается) в момент вывода отчета на печать посредством DoCmd.OpenReport возникает ошибка: "Использован метод DoCmd для запуска макрокоманды в Visual Basic, но затем в диалоговом окне была нажата кнопка Отмена. Например,..." ну и соответственно этот отчет не печатается. Такое впечатление, что NT как-то отменяет печать отчета. Вы не встречались с подобной проблемой?
   Igor V. Makeev Можно попробовать отлавливать ошибку по On Error и запускать отчет на печать снова (число раз можно контролировать) или просто игнорировать.
   Виктор Конюков Попробуйте перед печатью файла в Windows NT сначала открыть, а потом закрыть его. Если будет ошибка, то у Вас проблемы с допуском к файлу.
    P.S. Пора переходить от складских программ под Dos на Windows.
Вопрос 42. У меня возникла такая проблема - необходимо динамично выделять цветами различные строки в ленточной форме. Самостоятельный поиск решения (по крайней мере средствами Access 97) не принес положительных результатов. Одно решение этой проблемы я обнаружил на сайте Microsoft. Автор предлагает использовать прозрачный фон у полей с данными + поле OLE (с битмапом) связанное по "нужному" алгоритму через запрос. (файл прилагается) Однако в моем случае этот вариант неприемлем ввиду того что при удалении записи удаляется и запись в таблице где хранятся битмапы, т.е. полностью удаляется цвет раскраски. Отслеживать все удаления записей и соответствующее восстановление битмапов на мой взгляд слишком громоздко и некрасиво. Организовать присвоение полю значение OLE так же не получилось, так как VBA не поддерживает работу с бинарными потоками.
     Игорь Макеев Надо всего лишь правильно расставить связи между таблицами. Видел этот вариант, нормально работает.
Вопрос 43. Можно ли заставить отчет печататься на всех принтерах и без уведомления о том, что он был якобы отформатирован для другого принтера???
   Igor V. Makeev
   Можно посмотреть свойства, относящиеся к принтеру PrtDevMode, PrtDevNames и PrtMip. Конкретней не скажу, не разбирался, но наверняка есть информация в MSDN.
   Виктор Конюков. Можно попытаться "сбросить" отчет в файл, а потом послать его копию на принтер. Однако, если у Вас принтеры разные, то из-за драйвера, который выводит на печать информацию, это может не получиться.
Вопрос 46. Помогите пожалуйста решить небольшую проблему.
Я хочу открыть объект Recordset на основе инструкции SQL:
Private Sub GetSumSalling()
Dim MyRst As ADODB.Recordset
Set MyRst = New ADODB.Recordset
MyRst.Open "SELECT Sum([qryGoodsSaling].[SumOfQuantity]) AS SUMALL FROM qryGoodsSaling", CurrentProject.Connection
Debug.Print MyRst!SUMALL
MyRst.Close
Set MyRst = Nothin
'Похоже что Access ругается на то, что подчиненный запрос ссылается на данные ActiveX 'элемента подчиненной формы subFrm. Может существует какое-то альтернативное решение ? Я решил свою проблему следующим образом:
Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb()
Dim qdf As QueryDef
Set qdf = dbs.QueryDefs("qryQV")
qdf.Parameters("[Forms]![frmGoodsMain]![Item Number]") = _
[Forms]![frmGoodsMain]![Item Number]
qdf.Parameters("[Forms]![frmGoodsMain]![subFrm].[Form]![ocxDateStart]") = _
[Forms]![frmGoodsMain]![subFrm].[Form]![ocxDateStart]
qdf.Parameters("[Forms]![frmGoodsMain]![subFrm].[Form]![ocxDateEnd]") = _
[Forms]![frmGoodsMain]![subFrm].[Form]![ocxDateEnd]
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
MsgBox rst!SUMALL
rst.Close
dbs.Close
Виктор Конюков. Старайтесь заменять такие длинные ссылки на более короткие, например, set frm = [Forms]![frmGoodsMain]![subFrm].[Form]. Это %% 70 увеличивает скорость.
Вопрос 48. Можно ли в контекстное меню поля формы ACCESS 97 ДОБАВИТЬ свой пункт меню, НЕ удаляя стандартные пункты ?
   Игорь Макеев Например, подробности в Help.
Dim newItem As CommandBarControl
Set newItem = CommandBars("Form View
Control").Controls.Add(Type:=msoControlButton)
With newItem
.BeginGroup = True
.Caption = "Make Report"
.FaceId = 0
'.OnAction = "qtrReport"
End With
Вопрос 50. Подскажите, пожалуйста, как в вычисляемом поле запроса "Access" избавиться от 15 - 18 знаков после запятой? В вычисляемом поле перемножаются данные из поля с "длинным целым" (пробовал изменить на "целое") на данные из поля с "плавающей точкой (4 байт)" (пробовал и на 8 байт).
   Игорь Макеев Format или написать функцию округления
Вопрос 51. Как создать архив в созданной базе данных, например, за предыдущие месяцы? А за текущий месяц информация оставалась бы. Архив нужен для того, чтобы можно было посмотреть информацию за предыдущие месяцы.
  Игорь Макеев  Либо добавить поле-признак того, что информация в архиве. Или разделить базы, объединяя данные для выборки с помощью UNION
Вопрос 61 (15.11.2000). Помогите, пожалуйста, разобраться в ситуации. Почему в следующей процедуре выдается сообщение: Run-time error '13': Type mismatch
Sub Кнопка0_Click()
Dim dbsStrMat As Database
Dim rstPr As Recordset
Dim strPrim As String
Set dbsStrMat = CurrentDb
Set rstPr = dbsStrMat.OpenRecordset("Касса", dbOpenDynaset)
strPrim = "Примечание"
NewName rstPr, strPrim
dbsStrMat.Close
rstPr.Close
End Sub
Function NewName(rstQQQ As Recordset, _
strPrim As String)
With rstQQQ
.AddNew
!Примечание = strPrim
.Update
.Bookmark = .LastModified
End With
End Function
Программа останавливается на строке: Set rstPr = dbsStrMat.OpenRecordset("Касса", dbOpenDynaset) При этом библиотеки DAO 3.6, Access 9.0 b Office 9.0 object Library установлены. Дело в том, что мне нужно заполняя данные в одной форме, добавить запись в другую, не связанную таблицу. Может я вообще не то делаю? Если есть более простые методы, подскажите.
Igor V. Makeev 
Все объявления для DAO (Recordset - обязательно, Database - не обязательно, но для единообразия можно тоже) нужно заменить на прямое указание источника, т.е. вместо Dim dbsStrMat As Database Dim rstPr As Recordset должно быть Dim dbsStrMat As DAO.Database
Dim rstPr As DAO.Recordset, а так же вместо Function NewName(rstQQQ As Recordset, strPrim As String) нужно написать Function NewName(rstQQQ As DAO.Recordset, strPrim As String). Просто у спрашивающего наверняка А2к и еще подключена библиотека ADO, поэтому и получается: Recordset от ADO, а значение присваивается DAO.Recordset (т.к. используется Database). По поводу упрощения: быстрее написать: CurrentDb.Execute "INSERT INTO [Касса] ([Примечание]) VALUES ('" & strPrim & "')"
Вопрос 63 (15.11.2000). До установки Access 2000 я успешно использовал в формах и модулях встроенную функцию Date(), теперь мне выдаётся сообщение об ошибке и приходится использовать Now(), формат которой крайне не удобен.
Виктор Конюков.
Вообще Date() хранится в библиотеке VBA (VBE6.DLL). Поэтому в ссылках она должна быть указана. Для чего нужны ссылки я привел в лекциях.
Igor V. Makeev
Ответ стандартный: проверить ссылки, меню Tools - References... не должно быть "сломанных" 
Вопрос 64 (15.11.2000). При разделении базы на mde и mdb файлы связи с таблицами можно обновить через диспетчер связанных таблиц. А как это сделать программным путем?
  Подробный ответ на данный вопрос дал Дмитрий Чернов.
Вопрос 66 (16.11.2000). Написал небольшую БД для учёта ЗИП на телефонной станции. Недавно появилась возможность работать с Access-2000.Открыв окно Access-2000, я понял что уже всё забыл и ничего не понимаю. Прошу Вас, если это возможно, сообщите как можно найти или приобрести учебники (обязательно с большим количеством примеров) желательно в электронном виде.
   Учебников с большим количеством примеров, в том числе и электронных, я не встречал. В некоторых книгах по Access есть CD диск c программами на VBA, но информации в них явно недостаточно. Так, что следите за примерами на сайте или задавайте вопросы.
Вопрос 67 (16.11.2000). В Access2000 произвожу экспорт таблицы в формат Paradox, нормально экспортирует, но кодировка получаемой базы .db почему-то 866, не подскажите как сделать 1251.
 Зайдите на сайт в раздел "Таблицы - dBase" там указано как это сделать. 
Вопрос 68 (16.11.2000). Сделана форма использующая 2 таблицы (типа адрес и из CboCity выбрать город. Город лежит в другой таблице. Выбор работает прекрасно, но если хочу добавить новый, сообщает (на этапе AfterUpdate, то есть до NotInList) что таблица другая, связанная с этой и внести изменения не может.
Igor V. Makeev   Надо смотреть отношения между этими таблицами (обратить внимание на контроль ссылочной целостности). А общий рецепт такой, сначала данные добавлять в главную таблицу, потом в связанную.
Вопрос 69 (16.11.2000). В форме используется 2 SubForm. Значение из первой (сумму оплаты) хочу использовать во второй - начисляются проценты к сумме. Вставила код расчета через переменную:
Private Sub Form_Current()
        varSum = Form_frmSubForm1.txtSum
        Me.txtPercentSum = varSum*Percent
End Sub
Возвращает значение varSum = 0, если ставлю breakPoint возвращает нормальное значение, но только для первого значения таблицы, остальные строки в Continues Form равны первому значению.
 Игорь Макеев Точно сказать не могу, мало информации, но скорее всего, просто пересчитывать не успевает. У меня так было, когда я считал сумму в подчиненной форме и выводил в главную, тоже через переменную (нужно было обеспечить возможность редактирования данного поля, так что прямую ссылку применить было нельзя). При изменении суммы в подчиненной форме тоже проскакивал 0. Лечилось задержкой (можно использовать управляемую или нет). Что можно посоветовать автору вопроса: а) попробовать организовать задержку (пустой цикл/через Time/до появления значения в переменной) б) если поле txtPercentSum не нуждается в редактировании, в его свойстве «Данные» (ControlSource) написать прямую ссылку на вторую форму, типа: =[frmSubForm1].[Form]![txtSum]*[Percent]
Вопрос 70 (16.11.2000). В Ваших ответах часто встречаю ссылку на файл LaForm.mdb, не поняла где его взять, может что-то упустила.
 Возможно у Вас нет возможности работать через Интернет, тогда Вам лучше скачать некоторые страницы сайта в интернете, где указаны все файлы с примерами на Access. Смотрите ссылки в конце урока. 
Вопрос 71 (16.11.2000). Я начинающий программист (если так можно выразиться) у меня есть одна проблема в Access у меня в база организована так, что есть группы и есть подгруппы, но проблема в том, что не все группы имеют подгруппы. В результате в отчете, получается - название группы, потом название подгруппы, далее данные. А в тех группах где нет подгрупп - пустые строки. Подскажите, можно сделать так, чтобы в отчете этих пустых строк не было. Ну нет у подгруппы названия - не выводи вообще названия
подгруппы.
Виктор Конюков.  
В вашем случае надо уметь научится использовать команду Cancel в отчете. Для этого для каждой записи отчета проверяется наличие в ней данных, если их нет, то она отменяется. Смотрите пример N8 в файле: la_report.mdb
Igor V. Makeev
Варианты зависят от конкретного отчета и структуры данных, можно посоветовать в событии «Форматирование» (Format) области данных управлять видимостью полей с помощью Visible или, что имхо лучше, свойствами MoveLayout, NextRecord, PrintSection (описание работы смотреть в Help)
Вопрос 72 (16.11.2000). Буду признательна, если поможете справиться со следующей проблемой. Требуется выделять другим цветом поле или строку в ленточной форме в зависимости от конкретного значения поля текущей строки.
Igor V. Makeev
Такой вопрос уже был. Посмотреть можно http://www.mvps.org/access/forms/frm0024.htm (далее по ссылкам: Объекты, формы, выделение записи в ленточной форме)
Виктор Конюков
В Access 2000 - есть пункт меню, управляющий этим свойством.
Вопрос 74 (17.11.2000). У меня вопрос слегка ленивый: можно ли сделать так, чтобы при вводе в одно поле названия города, в соседнем автоматически вставлялся его телефонный код?
Виктор Конюков.  
Если не лень, загрузите файл: la_form1.mdb. Там есть пример 12 "Заполнение реквизитов". Добавьте туда поле телефон и проблема разрешится.
Igor V. Makeev
Ленивый ответ: можно. :) Вариантов много: DLookUp на AfterUpdate, лишний столбец в поле со списком (если город представлен так) или запрос для формы правильно построить.
Вопрос 75 (17.11.2000). И еще:) Год назад мне пришлось создать базу данных с нуля(я даже не слышала слова Access до этого). БД не маленькая, честно:) Работаю в пользовательском режиме (конструктор, кнопочки..). Вообще-то ничего, но с тех пор, как начала читать Вашу подписку, где много пишется про программный метод работы с БД, ... самой захотелось..:) Где можно об этом почитать? Учусь быстро, но даже понятия пока не имею, КУДА это все программки вписывать:) Прошу не смеяться. я серьезно!
  Ответ. Ничего смешного нет, все так начинали. А Ваш вопрос задавали уже несколько раз, потому что в Access не все так просто, как в Microsoft Word. Грамотно начать работать достаточно сложно. Теперь в рассылке я буду печатать некоторые уроки по Access для начинающих, а не только отвечать на вопросы. Ответ по существу. 1. Специальной литературы по программированию нет, некоторую информацию по программированию опубликована в книгах по Access. 2.Программы вписывают в объект: "модуль", который Вы создаете сами или в так называемый модуль класса, который связан с формой.
Вопрос 76 (17.11.2000). Есть необходимость общаться из Access с вешним устройством через com-порт. Помогите решить эту проблему.
Igor V. Makeev
В любом Help по API, раздел "Communications" или MS Communications Control идет вместе с VB или прочие контролы
Виктор Конюков
2 вариант. Надо использовать API функции из библиотеки dlporti.dll. 
Public Declare Function DlPortReadPortUchar Lib "dlportio.dll" (ByVal Port As Long) As Byte
Public Declare Sub DlPortWritePortUchar Lib "dlportio.dll" (ByVal Port As Long, ByVal Value As Byte)
3 вариант. Надо использовать API функции из библиотеки vbio32.dll. 
Private Declare Function Inport Lib "vbio32.dll" (ByVal portid as Long) As Integer
Private Declare Sub OutportW Lib "vbio32.dll" (ByVal portid as Long, ByVal nbyte as Long)

 

Добавить комментарий

Loading