Если Вы недавно подписались и не в
курсе о чем речь, то тогда Вам полезно сходить на
наш сайт, и почитать
предыдущие этапы создания данного рабочего
проекта по складскому учету.
Вопрос: С созданием
таблиц в Ексессе мне все понятно! Единственное,
что если рассмотрев таблицу курсы валют,
возникает вопрос почему в "свойствах поля"
(и какого поля?) выбрано "индексированное
поле"(какое) и ДА (Совпадения допускаются).
Поясняю, если индексированное поле - ключевое, а
такое имеется, то почему ТЫ выбрал ДА (индекс
поле) и к тому же СОВПАДЕНИЯ НЕ ДОПУСКАЮТСЯ? Ведь
сам по себе оператор СЧЕТЧИК не даст возможности
проявиться совпадениям. Ответ: Во всех
таблицах нашей базы ключевые поля называются
"Код" - мы так условились. Свойства,
светящиеся внизу конструктора относятся к полю,
напротив которого стоит стрелка - я это объясняю
потому, что мне кажется Ты не уловил это на
приводимом рисунке. При установке ключевого
поля, для него автоматически определяется
свойство ДА (СОВПАДЕНИЯ НЕ
ДОПУСКАЮТСЯ) и при попытке его поменять на НЕТ или ДА (ДОПУСКАЮТСЯ
СОВПАДЕНИЯ) Access ругнется на
недопустимость таких действий для ключевого
поля. Так что Ты правильно сказал, что сам по себе
СЧЕТЧИК не даст возможности проявиться
совпадениям - вот он и не дает :)
Вопрос: В процессе рассмотрения создания связей
возникают следующие вопросы. Например, почему
связь полей "Код" и "КодПроизводителя"
в таблицах "Производители" и "Товар"
является стремящимся от 1 до бесконечности? Ответ:
Такое чувство, что Ты только что сдал экзамен по
высшей математике :) Связь, на самом деле, ни куда
не стремится - просто для ее обозначения
некоторые символы позаимствованы из математики.
Такая связь говорит о том, что одной записи может
соответствовать бесконечное число записей из
другой таблицы - вот и все. В нашем случае такая
связь говорит о том, что может быть несколько
(бесконечное число) товаров одного
производителя.
Вопрос: Рассмотрев саму
структуру таблиц ТЫ не делаешь пробелы в
названиях полей, почему?? Ответ:
Это делается только для того, что бы облегчить
себе работу в будущем. Дело в том, что когда
делаешь ссылки на поля таблиц в построителе
выражений или в своих программах и функциях на VBA,
пробел интерпретируется как разделительный
символ, а не как составная часть названия поля
или таблицы. Если же мы, все таки, назовем поле
"Код производителя", то тогда ссылка на него
будет выглядеть следующим образом: Товар.[Код
производителя], вместо Товар.КодПроизводителя.
Если бы такую ссылку необходимо было делать в
пару местах своих программ, то проблем не было бы,
но ведь в настоящем приложении код на VBA очень
велик!, а в нем то и дело идут ссылки на поля
различных таблиц.
Вопрос:
Прошу дать полное объяснение почему ТЫ создал
связи (определенные) именно таблиц
"Производители", "Товар", "Группы
товара" (Мне кажется что одна таблица главная,
остальные подчиненные), так же и с таблицами
"Валюты" и "Курсы валют". Тогда почему
ТЫ не связал таблицу "Клиенты" При создании
связей возникает вопрос: Для чего необходимо
поддерживать (обеспечивать) целостность данных? Ответ:
Да, можно сказать, что таблица "Товар"
является главной для таблиц "Производители"
и "ГруппыТовара", а они для нее
соответственно подчиненные. Аналогично и для
таблиц "КурсыВалют"(главная) и
"Валюты"(подчиненная). Таблицу
"Клиенты" пока не с чем связывать. В будущем
она будет являться подчиненной для таблицы
"Накладные". Целостность данных, которую
задают связи, обеспечивает нам следующие
требования (на примере таблиц "КурсыВалют" и
"Валюты"):
Курс валюты должен всегда ссылаться на
конкретную валюту (которая есть в справочнике).
База не должна позволить удалить Валюту, если
для нее есть курсы.
Спасибо Вертинскому Павлу,
приславшему свои вопросы.
Посмотреть таблицы для хранения справочных
данных и их связи между собой можно, закачав с
сайта файл: Sklad_1.zip.
Вопрос (DeD): Изменение числовых данных в
таблице с помощью запроса на изменение. Нужен
хоть один пример Для начинающего !!! В литературе
нашёл много , но об этом очень не внятно. Ответ:
Вот пример:
Делаешь таблицу "Таблица1" с
числовыми полями "Поле0", "Поле1",
"Поле2".
Набиваешь ее данными соответственно:
"Поле0"
"Поле1"
"Поле2"
50
3
3
9
3
3
40
3
3
5
3
3
3
3
3
Затем открываешь конструктор
запросов, переходишь в режим "SQL" и копируешь
эту строку:
UPDATE [Таблица1] SET [Таблица1].[Поле1] = 9,
[Таблица1].[Поле2] = 5 WHERE ((([Таблица1].[Поле0]<10));
после выполнения этого запроса данные изменятся:
"Поле0"
"Поле1"
"Поле2"
50
3
3
9
9
5
40
3
3
5
9
5
3
9
5
Вот пример обновления данных из VBA
(Application.SetOption нужен для отмены и обратной
установки вывода стандартных сообщений на
подтверждение об изменении):
Application.SetOption "Confirm Action Queries", False
Application.SetOption "Confirm Record Changes", False
DoCmd.RunSQL "UPDATE [Таблица1] SET [Таблица1].[Поле1] = 9, _
[Таблица1].[Поле2] = 5 WHERE ((([Таблица1].[Поле0]<10));"
Application.SetOption "Confirm Action Queries", True
Application.SetOption "Confirm Record Changes", True
Свои вопросы и предложения присылайте на E-Mail: msacc@km.ru
Здесь представлен набор функций по
данной проблеме. Его можно применять как для
Access'97, так и для Excel'97. Этот код надо вставить в
один модуль.
'********************** Code Start **********************
'-------------------------------------------------------------------------
' Набор функций для перевода числа в пропись
' Этот код надо вставить в один модуль
'-------------------------------------------------------------------------
' http://msa.km.ru
'-------------------------------------------------------------------------
Option Compare Database ' только для Access
'
' Функции для вычисления суммы прописью
' по числовому значению от 0 до 999999999999
'
' Вспомогательные переменные
Dim Тысячи, Миллионы As Boolean
Dim Миллиарды, ВторойДесяток As Boolean
' Массив составных частей
Dim Часть(32) As String
' Логические константы
Const Истина As Boolean = True
Const Ложь As Boolean = False
Function CapitalizeFirst(Str)
' Переводит первую букву в поле на верхний регистр;
' оставляет остальные символы не измененными.
Dim strTemp As String
strTemp = Trim(Str)
CapitalizeFirst = UCase(Left(strTemp, 1)) & Mid(strTemp, 2)
End Function
' Функция возвращает сумму прописью
Function СуммаПрописью(Число)
' Вызов функции для получения числа прописью
СуммаПрописью = ЧислоПрописью(Число)
' Строку с заглавной буквы
СуммаПрописью = UCase(Mid(СуммаПрописью, 1, 1)) + Mid(СуммаПрописью, 2)
' Вычислить длину исходного числа
Длина = Len(Число)
' Если число только из одной цифры, добавить
' до двух (для единообразия алгоритма)
If Длина = 1 Then
Число = "0" + Число
Длина = Длина + 1
End If
' Добавление нужного окончания строки
'
' Для чисел, окончивающихся на 10, 11, 12, 13,
' 14, 15, 16, 17, 18, 19 добавляем "рублей"
If Mid(Число, Длина - 1, 1) = 1 Then
СуммаПрописью = СуммаПрописью + " рублей"
' Для всех остальных случаев
Else
Select Case Mid(Число, Длина)
' Для чисел, оканчивающихся на 1, добавляем "рубль"
Case 1
СуммаПрописью = СуммаПрописью + " рубль"
' Для чисел, оканчивающихся на 2, 3, 4 добавляем "рубля"
Case 2, 3, 4
СуммаПрописью = СуммаПрописью + " рубля"
' Для чисел, оканчивающихся на 5, 6, 7, 8, 9, 0 добавляем "рублей"
Case Else
СуммаПрописью = СуммаПрописью + " рублей"
End Select
End If
' Окончательно формируем результат
СуммаПрописью = СуммаПрописью + " "
End Function
'
' функция возвращает число прописью
'
Function ЧислоПрописью(Число)
On Error GoTo Met1
' Присвоение значений массиву частей
Часть(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) = "ноль"
' Временные переменные вначале сбрасываются
Тысячи = Ложь: Миллионы = Ложь
Миллиарды = Ложь: ВторойДесяток = Ложь
' Определяем длину исходного числа
Длина = Len(Число)
' Цикл по всем цифрам числа, начиная с крайней
' левой до крвйней правой
For Позиция = Длина To 1 Step -1
' Добавляются очередные слова, описывающие
' текущую цифру
ЧислоПрописью = ЧислоПрописью + ЦифраСтрокой(Mid(Число, Длина - Позиция + 1, 1), Позиция)
Next Позиция
' Алгоритм возвращает пустую строку при
' нулевом аргументе. Исправим это
If ЧислоПрописью = "" Then
ЧислоПрописью = Часть(32)
End If
Met1:
End Function
'
' Составление слов из частей по очередной
' цифре числа и по предыстории работы
'
' Функция доступна только в текущем модуле
'
Private Function ЦифраСтрокой(Цифра, Место) As String
' Если сотни или десятки миллиардов, то
' запомнить об этом для будущего
If (Цифра <> 0) And ((Место = 11) Or (Место = 12)) Then
Миллиарды = Истина
End If
' Если сотни или десятки миллионов, то
' запомнить об этом для будущего
If (Цифра <> 0) And ((Место = 8) Or (Место = 9)) Then
Миллионы = Истина
End If
' Если сотни или десятки тысяч, то
' запомнить об этом для будущего
If (Цифра <> 0) And ((Место = 5) Or (Место = 6)) Then
Тысячи = Истина
End If
' Если предыдущая цифра была единица
' в поле десятков, то выбираем
If ВторойДесяток Then
Select Case Цифра
' пишем "десять "
Case 0
ЦифраСтрокой = Часть(29) + Часть(12) + Часть(27)
' пишем "двенадцать "
Case 2
ЦифраСтрокой = Часть(18) + Часть(13) + Часть(27)
' в остальных случаях пишем название цифры
' плюс "надцать "
Case Else
ЦифраСтрокой = Часть(Цифра) + Часть(13) + Часть(27)
End Select
' Добавляем название разрядов
Select Case Место
Case 4
' добавляем "тысяч "
ЦифраСтрокой = ЦифраСтрокой + Часть(22) + Часть(27)
' добавляем "миллионов "
Case 7
ЦифраСтрокой = ЦифраСтрокой + Часть(25) + Часть(26) + Часть(27)
' добавляем "миллиардов "
Case 10
ЦифраСтрокой = ЦифраСтрокой + Часть(31) + Часть(26) + Часть(27)
End Select
' Сбрасывем значения, так как переходим к
' предыдущим разрядам
ВторойДесяток = Ложь: Миллионы = Ложь
Миллиарды = Ложь: Тысячи = Ложь
' Во всех остальных случаях, то есть
' не для описания чисел второго десятка
Else
' Определяем названия десятков
If (Место = 2) Or (Место = 5) Or (Место = 8) Or (Место = 11) Then
Select Case Цифра
' Запоминаем про второй десяток для
' подстановки при следующем входе
Case 1
ВторойДесяток = Истина
' пишем "двадцать" или "тридцать"
Case 2, 3
ЦифраСтрокой = Часть(Цифра) + Часть(14) + Часть(27)
' пишем "сорок"
Case 4
ЦифраСтрокой = Часть(15) + Часть(27)
' пишем "девяносто"
Case 9
ЦифраСтрокой = Часть(16) + Часть(17) + Часть(27)
' в остальных случаях пишем название цифры
' плюс "десят "
Case 5, 6, 7, 8
ЦифраСтрокой = Часть(Цифра) + Часть(12) + Часть(29) + Часть(27)
End Select
End If
' Определяем названия сотен
If (Место = 3) Or (Место = 6) Or (Место = 9) Or (Место = 12) Then
Select Case Цифра
' пишем "сто "
Case 1
ЦифраСтрокой = Часть(17) + Часть(27)
' пишем "двести "
Case 2
ЦифраСтрокой = Часть(18) + Часть(19) + Часть(27)
' пишем "триста "
Case 3
ЦифраСтрокой = Часть(3) + Часть(30) + Часть(27)
' пишем "четыреста "
Case 4
ЦифраСтрокой = Часть(4) + Часть(11) + Часть(30) + Часть(27)
' в остальных случаях пишем название цифры
' плюс "сот "
Case 5, 6, 7, 8, 9
ЦифраСтрокой = Часть(Цифра) + Часть(12) + Часть(20) + Часть(27)
End Select
End If
' Определяем названия единиц
If (Место = 1) Or (Место = 4) Or (Место = 7) Or (Место = 10) Then
Select Case Цифра
' пишем "один "
Case 1
ЦифраСтрокой = Часть(1) + Часть(10) + Часть(27)
' пишем "два " или "три "
Case 2, 3
ЦифраСтрокой = Часть(Цифра) + Часть(27)
' пишем "четыре "
Case 4
ЦифраСтрокой = Часть(4) + Часть(11) + Часть(27)
' в остальных случаях пишем название цифры
Case 5, 6, 7, 8, 9
ЦифраСтрокой = Часть(Цифра) + Часть(12) + Часть(27)
End Select
' Определяем названия тысяч
If (Место = 4) Then
Select Case Цифра
' пишем "тысяч " только в том случае, если
' хотя бы в одном разряде тысяч есть не нулевое
' значение
Case 0
If Тысячи Then
ЦифраСтрокой = Часть(22) + Часть(27)
End If
' пишем "одна тысяча "
Case 1
ЦифраСтрокой = Часть(21) + Часть(27) + Часть(22) + Часть(23) + Часть(27)
' пишем "две тысячи "
Case 2
ЦифраСтрокой = Часть(18) + Часть(27) + Часть(22) + Часть(24) + Часть(27)
' добавляем "тысячи "
Case 3, 4
ЦифраСтрокой = ЦифраСтрокой + Часть(22) + Часть(24) + Часть(27)
' в остальных случаях добавляем "тысяч "
Case 5, 6, 7, 8, 9
ЦифраСтрокой = ЦифраСтрокой + Часть(22) + Часть(27)
End Select
' Сбрасываем значения тысяч, так как
' переходим к предыдущим разрядам
Тысячи = Ложь
End If
' Определяем названия миллионов
If Место = 7 Then
Select Case Цифра
' пишем "миллионов " только в том случае, если
' хотя бы в одном разряде миллионов есть не нулевое
' значение
Case 0
If Миллионы Then
ЦифраСтрокой = Часть(25) + Часть(26) + Часть(27)
End If
' добавляем "миллион "
Case 1
ЦифраСтрокой = ЦифраСтрокой + Часть(25) + Часть(27)
' добавляем "миллиона "
Case 2, 3, 4
ЦифраСтрокой = ЦифраСтрокой + Часть(25) + Часть(23) + Часть(27)
' добавляем "миллионов "
Case 5, 6, 7, 8, 9
ЦифраСтрокой = ЦифраСтрокой + Часть(25) + Часть(26) + Часть(27)
End Select
' Сбрасываем значения миллионов, так как
' переходим к предыдущим разрядам
Миллионы = Ложь
End If
' Определяем названия миллиардов
If Место = 10 Then
Select Case Цифра
' пишем "миллиардов " только в том случае, если
' хотя бы в одном разряде миллиардов есть не нулевое
' значение
Case 0
If Миллиарды Then
ЦифраСтрокой = Часть(31) + Часть(26) + Часть(27)
End If
' добавляем "миллиард "
Case 1
ЦифраСтрокой = ЦифраСтрокой + Часть(31) + Часть(27)
' добавляем "миллиарда "
Case 2, 3, 4
ЦифраСтрокой = ЦифраСтрокой + Часть(31) + Часть(23) + Часть(27)
' добавляем "миллиардов "
Case 5, 6, 7, 8, 9
ЦифраСтрокой = ЦифраСтрокой + Часть(31) + Часть(26) + Часть(27)
End Select
' Сбрасываем значения миллиардов, так как
' переходим к предыдущим разрядам
Миллиарды = Ложь
End If
End If
End If
End Function
'********************** Code End ***********************
(Access-97) Программа предназначена для
накопления полезного опыта программирования в MS
Access. Содержит начальную базу. Полностью открыта
для изменения, доработок. Может быть полезна для
изучения работы с элементом TreeView.