Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Метрики программного обеспечения Джилба.Содержание книги
Поиск на нашем сайте
Джилб приводит не претендующий на полноту набор метрик программного обеспечения. Он обращает внимание на то, что каждое приложение требует введения собственных понятий и инструментов; его книга предназначена для введения основных понятий, от которых может оттолкнуться пользователь. Среди прочих характеристик Джилб упоминает надежность программы, которую он определяет как вероятность того, что данная программа проработает определенный период времени без логических сбоев. Прагматической оценкой программной надежности является единица минус отношение числа логических сбоев к общему числу запусков. Отношение количества правильных данных ко всем данным приводится Джилбом в качестве меры точности (свободы от ошибок). Так же, как Боэм, Браун и Лайпоу, Джилб считает, что точность необходима для надежности программы. Прецизионность определяется как мера того, насколько часты ошибки, обусловленные одинаковыми причинами. Джилб оценивает ее дробью, в числителе которой стоит число фактических ошибок на входе, а в знаменателе - общее число наблюденных ошибок, причинами которых явились эти ошибки на входе. Так, например, если одна ошибка вызывает в течение определенного периода времени 100 сообщений об ошибках, то прецизионность равна 0.01. Второй большой категорией, введенной Джилбом, является гибкость, в которую входят: 1) логическая сложность; 2) внутренняя гибкость; 3) открытость (адаптируемость); 4) толерантность (к изменениям входа системы); 5) универсальность; 6) удобство переноса; 7) совместимость.
В качестве меры логической сложности Джилб предложил число логических "двоичных принятий решений". Такая оценка может быть получена вручную или автоматически. Абсолютная логическая сложность задается числом нестандартных выходов из операторов, в которых происходит принятие решений. Джилб предполагает, что логическая сложность окажется значимым фактором для предсказания стоимости программы. Кроме этих, Джилб приводит еще большое количество иных метрик, но это длинное перечисление скорее будит воображение, чем приносит пользу. Работа Джилба демонстрирует новые возможности, однако реальное применение этих идей на практике дает обескураживающие результаты. Большинство характеристик очень трудно получить; сбивает с толку и то, что оценки сильно связаны, что затрудняет программисту предсказание влияния изменения программы на некоторую группу характеристик.
Оценка сложности Маккейба.
Маккейб описывает оценку сложности с помощью теории графов и демонстрирует ее применение для управления, тестирования и контроля за сложностью программы. Следует оговорить, что в данном исследовании Маккейб под сложностью программы понимал ее логическую сложность. В его теории предполагается, что сложность не зависит от размера, а только от структуры выборов решений в программе. Маккейб предлагает математический метод, дающий количественные основания для модуляризации и позволяющий выявлять модули, которые будет трудно тестировать или обслуживать. Согласно его подходу вычисляется и контролируется число путей в программе. В математические предпосылки входит определение цикломатического числа V(G) для графа с n вершинами, e ребрами и p компонентами связности:
V(G) = e - n + p
Маккейб использует следующую теорему: в сильно связанном графе G цикломатическое число равно максимальному числу линейно-независимых циклов. Применяя эту теорему, Маккейб связывает с программой ориентированный граф с одним выходом. Каждой вершине графа соответствует блок кода с последовательным управлением, а каждой дуге соответствует ветвление программы. Каждой вершины можно достигнуть из входной вершины и из каждой вершины может быть достигнута выходная вершина. Этот граф сильно связан, так как для любой пары вершин существует связывающий их путь. Общий подход состоит в оценке сложности программы с помощью вычисления числа линейно-независимых путей, цикломатической сложности V(G), а также управления размером программ с помощью ограничения V(G) и использования V(G) как основы для методологии тестирования. Маккейб обнаружил, что разумной верхней границей для цикломатической сложности является 10. Если программисты переступают эту границу, им следует или переписать программу, или разбить ее на модули. Оценка цикломатической сложности Маккейба полезна при подготовке тестовых данных и может дать нужную информацию о логической сложности программы. Однако при такой оценке не принимается во внимание выбор структур данных, алгоритмов, мнемонических имен переменных или комментариев, отсутствует обсуждение таких важных понятий, как удобство переноса, гибкость, эффективность. Необходимы дополнительные исследования, чтобы прояснить, когда полезно использовать цикломатическую сложность. В рассмотренном программном модуле по созданию базы данных абонентов автоматизированной системы оповещения циклическая граница сложности модуля равняется 6, что не превышает верхнюю границу сложности. Ориентированный граф модуля представлен на рис.14.1. Это позволяет сделать вывод о правильном подходе к написанию отдельных модулей программного обеспечения системы оповещения, который применялся при разработке данного дипломного проекта.
Понимаемость.
Понимаемость программы можно назвать ее психологическую сложность, так как психологическая сложность связана с теми же характеристиками программы, которые затрудняют понимание программы человеком. Авторы работы "Predicting Software Comprehensibility" экспериментировали с 36 профессиональными программистами, предложив им по 25 минут изучать 3 программы, а затем восстановить их за 20 минут. Были использованы 3 класса задач (инженерные, статические и не численные) и 3 типа структурирования (полное, частичное и неструктурированные программы). Было также введено 3 уровня мнемоничности имен переменных. Результаты эксперимента показали, что хуже всего восстанавливаются неструктурированные программы, лучше всего - частично структурированные. Уровень мнемоничности имен переменных не оказал влияния на проведение эксперимента. Важным заключением этого эксперимента явилось то, что на способность правильно воспроизводить программы оказали влияние индивидуальные особенности участников, характеристики программы и уровень их структурированности.
Выводы.
Качество управляемо и может быть повышено. Администратор может выбрать принципы руководства, определив, что является основной целью - своевременная выдача результата, эффективное использование ресурсов или надежное обслуживание. В любом из этих случаев не следует забывать о психологической сложности программ. Как показывает опыт, в случае создания и отладки большого программного комплекса очень важно, чтобы программа каждого из авторов была понятна остальным, что обеспечивает четкую и безболезненную стыковку. К сожалению, приемлемый набор оценок пока еще не разработан. Глубокое теоретическое понимание поведения человека в программировании может привести к разработке более совершенных оценок, но проверить их пригодность следует экспериментально.
Список литературы к специальной части. 1. Р.Ахаян и др. «Эффективная работа с СУБД», Санкт-Петербург, «Питер», 1997г. 2. «Проектирование и разработка систем автоматизации предприятий». 3. «Database Unleashed», Indianapolis USA, «SAMS Publishing», 1996г. 4. Боуман Джудит, Эмерсон Сандра, Дарновски Марси. «Практическое руководство по SQL. 3-е издание». Пер с англ. – Киев, Диалектика. 1997. 5. Дейт, К. «Введение в системы баз данных».-М.:Наука, Диалектика. 1980. 6. Мартин, Дж. «Организация баз данных в вычислительных системах».-М.:Наука, Диалектика. 1980.
7. ANSI SQL Standart. The 1992 ISO-ANSI SQL standart is available through ANSI as document X3.135-1992 and through ISO as document ISO/EC 9075:1992. 8. Кодд, Е.Ф. «Реляционная модель данных». Пер с англ. – Киев, Диалектика. 1996. 9. Ипстейн, Роберт. «Реляционная производительность: Понимание производительности реляционных баз данных». Пер с англ. – Киев, Диалектика. 1996. 10. Ross, Ronald G. «Entity Modeling: Techniques and Application». Boston: Database Research Group, Inc. 1995. 11. Гайн, Крисс. «Введение в SQL».-М.:Наука, Диалектика. 1980. 12. Праг, Керри Н. и др. «Секреты Access 97» Пер с англ. – Киев, Диалектика. 1997. 13. Кент, Вилиам. «Введение в пять нормальных форм в теории реляционных баз данных». Пер с англ. – Киев, Диалектика. 1996. 14. Ларcон, Брюс. «Руководство по экспертным базам данных». Пер с англ. – Киев, Диалектика. 1996. 15. Date C.J. «An Introduction to Database Systems» Volume 1, Reading, Mass.: Addison-Wesley Publishing Company, 1989. 16. Date C.J. «An Introduction to Database Systems» Volume 2, 2-th edition. Reading, Mass.: Addison-Wesley Publishing Company, 1989. 17. Перкинсон, Р.С. «Анализ данных: Ключ к проектированию баз данных». Пер с англ. – Киев, Диалектика. 1996. 18. Microsoft Corporation. «Описание Transact-SQL».-М.:Наука, Диалектика. 1980.
Приложение А Листинг программ 1) Преобразование числового денежного номера в строчное выражение Public Function NewNumber(nnn As Double) As String Dim numb(21) As String Dim numb1(11) As String Dim numb2(11) As String Dim mil, tus, ed As Long Dim sot, des, ed1 As Integer Dim strval, strkop As String Dim kop As Integer
Dim str1, str2 As String Dim numstr As Integer
If (nnn > 999999999) Then MsgBox ("Слишком большое число!") Exit Function End If ' nnn = CDbl(Format(nnn, "Currency"))
If GetStrAfterSign(CStr(nnn) & "0") = "" Then NewNumber = "00 копеек" Exit Function End If kop = CInt(Left(GetStrAfterSign(CStr(nnn) & "0"), 2)) nnn = kop
numb(0) = " один" numb(1) = " двe" numb(2) = " три" numb(3) = " четыре" numb(4) = " пять" numb(5) = " шесть" numb(6) = " семь" numb(7) = " восемь" numb(8) = " девять" numb(9) = " десять" numb(10) = " одиннадцать" numb(11) = " двенадцать" numb(12) = " тринадцать" numb(13) = " четырнадцать" numb(14) = " пятнадцать" numb(15) = " шестнадцать" numb(16) = " семнадцать" numb(17) = " восемнадцать" numb(18) = " девятнадцать"
numb1(0) = " двадцать" numb1(1) = " тридцать" numb1(2) = " сорок" numb1(3) = " пятьдесят" numb1(4) = " шестьдесят" numb1(5) = " семьдесят" numb1(6) = " восемьдесят" numb1(7) = " девяносто"
numb2(0) = " сто" numb2(1) = " двести" numb2(2) = " триста" numb2(3) = " четыреста" numb2(4) = " пятьсот" numb2(5) = " шестьсот" numb2(6) = " семьсот" numb2(7) = " восемьсот" numb2(8) = " девятьсот"
numb(19) = " одна" numb(20) = " две"
mil = nnn \ 1000000 tus = (nnn - mil * 1000000) \ 1000 ed = nnn - mil * 1000000 - tus * 1000
If (mil <> 0) Then sot = mil \ 100 des = (mil - sot * 100) \ 10 ed1 = mil - sot * 100 - des * 10
If (sot > 0) Then strval = strval & numb2(sot - 1) End If
If (des > 0) Then If (des = 1) Then strval = strval & numb(des * 10 + ed1 - 1) & " миллионов" GoTo nex Else strval = strval & numb1(des - 2) End If End If
If (ed1 = 0) Then strval = strval & " миллионов" ElseIf (ed1 = 1) Then strval = strval & " один миллион" ElseIf (ed1 > 1 And ed1 < 5) Then strval = strval & numb(ed1 - 1) & " миллиона" Else strval = strval & numb(ed1 - 1) & " миллионов" End If End If
nex:
If (tus <> 0) Then
sot = tus \ 100 des = (tus - sot * 100) \ 10 ed1 = tus - sot * 100 - des * 10
If (sot > 0) Then strval = strval & numb2(sot - 1) End If
If (des > 0) Then If (des = 1) Then strval = strval & numb(des * 10 + ed1 - 1) & " тысяч" GoTo nex1 Else strval = strval & numb1(des - 2) End If End If
If (ed1 = 0) Then strval = strval & " тысяч" ElseIf (ed1 = 1) Then strval = strval & " одна тысяча" ElseIf (ed1 = 2) Then strval = strval & " две тысячи" ElseIf (ed1 > 2 And ed1 < 5) Then strval = strval & numb(ed1 - 1) & " тысячи" Else strval = strval & numb(ed1 - 1) & " тысяч" End If End If
nex1:
If (ed <> 0) Then sot = ed \ 100 des = (ed - sot * 100) \ 10 ed1 = ed - sot * 100 - des * 10
If (sot > 0) Then strval = strval & numb2(sot - 1) End If
If (des > 0) Then If (des = 1) Then strval = strval & numb(des * 10 + ed1 - 1) & " копеек" GoTo nex2 Else strval = strval & numb1(des - 2) End If End If
If (ed1 = 0) Then strval = strval & " копеек" ElseIf (ed1 = 1) Then strval = strval & " одна копейка" ElseIf (ed1 > 1 And ed1 < 5) Then strval = strval & numb(ed1 - 1) & " копейки" Else strval = strval & numb(ed1 - 1) & " копеек" End If Else strval = strval & " копеек" End If
nex2: strval = LTrim(strval) NewNumber = strval End Function
2) Занесение денежных средств по счету на авансовый остаток. Sub Кнопка347_Click() On Error GoTo Err_Кнопка347_Click
Dim dbs As Database Dim rst, rstПоCчету, rstПоАО As Recordset Dim rstПоДате As Recordset Dim strSQL As String Dim i, j As Integer Dim Цена, ЦенаП, Сопровождение, Сумма As Double Dim Дата As Date Dim ДатаTMP As Date Dim ДатаПМС As Date Dim ДатаTMP2 As Date Dim ДАТАПМП As Date Dim flagДата As Boolean Dim flagБольше As Boolean Dim flagГолоеСопр As Boolean Dim Разница As Currency Dim sing As String 'Dim ЦенаП_Р, Сумма_Р As Currency
flagБольше = False Set dbs = CurrentDb Me.Refresh
sing = Chr(34)
Set dbs = CurrentDb strSQL = "SELECT DISTINCTROW ОсновныеСчета.НомерСчета, Дистрибутивы.Цена AS Цена, Дистрибутивы.Сопровождение AS Сопровождение FROM [ОсновныеСчета] INNER JOIN Дистрибутивы ON ОсновныеСчета.КодСчета = Дистрибутивы.КодСчета WHERE (((ОсновныеСчета.НомерСчета)=" & sing & Forms![Просмотр]![ОсновныеСчета].Form![НомерСчета] & sing & "));" Set rst = dbs.OpenRecordset(strSQL)
If Forms![Просмотр]![ОсновныеСчета].Form![ВнесениеВАО] = True And Разница = 0 Then Msg = "Суммы по счету уже внесены в авансовый отчет." ' Сообщение.
Style = vbOKCancel + vbQuestion ' Кнопки. Title = "Сообщение" ' Заголовок. Response = MsgBox(Msg, Style, Title) ' Выводит сообщение. If Response = vbOK Then ' Если нажата кнопка "Да" (Yes). GoTo labelBegin Else Exit Sub End If End If
labelBegin:
Цена = 0 Сопровождение = 0 rst.MoveLast j = rst.RecordCount rst.MoveFirst For i = 1 To j Цена = rst![Цена] * 1.2 + Цена Сопровождение = rst![Сопровождение] * 1.2 + Сопровождение rst.MoveNext Next i Сумма = Цена + Сопровождение Forms![Просмотр]![ОсновныеСчета].Form![ПоСчету] = Сумма rst.Close
strSQL = "SELECT DISTINCTROW ОсновныеСчета.НомерСчета, Платежки.СуммаПрихода As Цена, Платежки.ДатаВыписки As Дата FROM [ОсновныеСчета] INNER JOIN Платежки ON ОсновныеСчета.КодСчета = Платежки.КодСчета WHERE (((ОсновныеСчета.НомерСчета)=" & sing & Forms![Просмотр]![ОсновныеСчета].Form![НомерСчета] & sing & "));"
Set rst = dbs.OpenRecordset(strSQL) rst.MoveLast Дата = rst![Дата] j = rst.RecordCount rst.MoveFirst
For i = 1 To j ЦенаП = rst![Цена] + ЦенаП rst.MoveNext Next i Forms![Просмотр]![ОсновныеСчета].Form![ПоПлатежке] = ЦенаП rst.Close
If ЦенаП < Сумма Then Msg = "Cумма по счету" & Chr(13) & " - " & Сумма & "р." & Chr(13) & "Cуммы по платежкам " & Chr(13) & " - " & ЦенаП & "р." & Chr(13) & "Cуммы по платежкам меньше суммы по счета." ' Сообщение. 'Msg = "Cуммы по платежкам меньше суммы по счетам." & Chr(13) & "Занести в авансовый отчет?" ' Сообщение. Style = vbCancel + vbCritical ' Кнопки. Title = "Предупреждение" ' Заголовок. Response = MsgBox(Msg, Style, Title) ' Выводит сообщение.
Exit Sub
End If
If ЦенаП > Сумма Then Msg = "Cумма по счету" & Chr(13) & " - " & Сумма & "р." & Chr(13) & "Cуммы по платежкам " & Chr(13) & " - " & ЦенаП & "р." & Chr(13) & "Cуммы по платежкам больше суммы по счета." ' Сообщение. 'Msg = "Cуммы по платежкам больше суммы по счета." & Chr(13) & "Занести в авансовый отчет?" ' Сообщение. Style = vbOKCancel + vbCritical ' Кнопки. Title = "Предупреждение" ' Заголовок. Response = MsgBox(Msg, Style, Title) ' Выводит сообщение. If Response = vbOK Then ' Если нажата кнопка "Да" (Yes). flagБольше = True Разница = ЦенаП - Сумма GoTo labelOK Else Exit Sub End If End If
'ЦенаП_Р = ЦенаП 'Сумма_Р = Сумма Msg = "Cумма по счету" & Chr(13) & " - " & Сумма & "р." & Chr(13) & "Cуммы по платежкам " & Chr(13) & " - " & ЦенаП & "р." & Chr(13) & "Суммы совпадают." & Chr(13) & "Занести в авансовый отчет?" ' Сообщение. Style = vbOKCancel + vbInformation ' Кнопки. Title = "Сообщение" ' Заголовок. Response = MsgBox(Msg, Style, Title) ' Выводит сообщение.
If Response = vbOK Then ' Если нажата кнопка "Да" (Yes). Forms![Просмотр]![ОсновныеСчета].Form![Разница] = 0 GoTo labelOK Else Exit Sub End If
labelOK:
Set rst = dbs.OpenRecordset("ДанныеДляАвансОтчета") strSQL = "SELECT DISTINCTROW ОсновныеСчета.НомерСчета, Дистрибутивы.КодСистемы, Дистрибутивы.Цена, Дистрибутивы.ТолькоИПС, Дистрибутивы.Сопровождение, Дистрибутивы.КоличествоМ, Дистрибутивы.Количество FROM [ОсновныеСчета] INNER JOIN Дистрибутивы ON ОсновныеСчета.КодСчета = Дистрибутивы.КодСчета WHERE (((ОсновныеСчета.НомерСчета)=" & sing & Forms![Просмотр]![ОсновныеСчета].Form![НомерСчета] & sing & "));"
'"SELECT DISTINCTROW ОсновныеСчета.НомерСчета, Дистрибутивы.КодСистемы, Дистрибутивы.Цена, Дистрибутивы.Сопровождение, Дистрибутивы.КоличествоМ, Дистрибутивы.Количество FROM [ОсновныеСчета] INNER JOIN Дистрибутивы ON ОсновныеСчета.НомерСчета = Дистрибутивы.НомерСчета WHERE (((ОсновныеСчета.НомерСчета)=" & Forms![Просмотр]![ОсновныеСчета].Form![НомерСчета] & "));" Set rstПоCчету = dbs.OpenRecordset(strSQL) Set rstПоАО = dbs.OpenRecordset("АвансовыйОтчет")
rstПоCчету.MoveLast j = rstПоCчету.RecordCount
ДатаStore = Дата Select Case Forms![Просмотр]![ОсновныеСчета].Form![Код] Case 1, 3 Нал = False Case 2 Нал = True End Select
rstПоCчету.MoveFirst 'ОСНОВНОЙ ЦИКЛ flagДата = False For i = 1 To j
'Проверка для вторичного ИПС
If rstПоCчету![Цена] = 0 Then If flagДата = False Then GoTo ДатаОпределение End If
Дата = ДатаStore
Set dbs = CurrentDb strSQLTMP = "SELECT DISTINCTROW ДанныеДляАвансОтчета.Код, ДанныеДляАвансОтчета.КодЗаказчика, ДанныеДляАвансОтчета.КодСистемы, ДанныеДляАвансОтчета.КоличествоМС, Max(ДанныеДляАвансОтчета.ДатаПМС) AS ДатаПМС FROM [ДанныеДляАвансОтчета] GROUP BY ДанныеДляАвансОтчета.Код, ДанныеДляАвансОтчета.КодЗаказчика, ДанныеДляАвансОтчета.КодСистемы, ДанныеДляАвансОтчета.КоличествоМС HAVING (((ДанныеДляАвансОтчета.КодЗаказчика)=" & Forms![Просмотр]![КодЗаказчика] & ") AND ((ДанныеДляАвансОтчета.КодСистемы)=" & rstПоCчету![КодСистемы] & ") AND ((ДанныеДляАвансОтчета.КоличествоМС)<>0));" Set rstTMP2 = dbs.OpenRecordset(strSQLTMP)
If rstTMP2.RecordCount >= 1 Then GoTo labelЕстьЗаписи 'Else 'MsgBox ("Записей Нет") Exit Sub End If labelЕстьЗаписи:
rstTMP2.MoveLast rstTMP2.Close
Дата: ДатаTMP2 = Format(ДатаStore, "m yy") If flagГолоеСопр = True Then 'Расписать если сопров голое rst.AddNew rst![КодЗаказчика] = Forms![Просмотр]![КодЗаказчика] rst![КодСчета] = Forms![Просмотр]![ОсновныеСчета].Form![КодСчета] rst![КодСистемы] = rstПоCчету![КодСистемы] rst![ДатаПМС] = Format(ДатаTMP2, "m yy") rst![КоличествоМС] = rstПоCчету![КоличествоМ] rst![Нал] = Нал
Msg = "Заносим сопровождение " & НазваниеСистемы(rstПоCчету![КодСистемы]) & " на " & rstПоCчету![КоличествоМ] & " месяцев" Style = vbOKCancel + vbInformation ' Кнопки. Title = "Сообщение" ' Заголовок. MsgBox Msg, Style, Title
rst.Update rst.MoveLast
m = rstПоCчету![КоличествоМ]
For k = 1 To m rstПоАО.AddNew rstПоАО![ИдентКод] = rst![Код] ЦенаСоп = rstПоCчету![Сопровождение] / m rstПоАО![Сумма] = ЦенаСоп * 1.2 rstПоАО![Нал] = Нал ДатаTMP = Format(ДатаПМС, "m yy") rstПоАО![Месяц] = ДатаTMP ДатаTMP = ДатаTMP + 32 ДатаПМС = ДатаTMP rstПоАО.Update Next k GoTo labelnext End If
'Сравнение с месяцем выписки
ДатаTMP2 = CDate(Format(ДатаStore, "m yy")) If CDate(ДатаTMP2) <= CDate(ДатаПМС) Or (CDate(Format(ДатаStore, "m yy")) - CDate(Format(ДатаПМС, "m yy"))) / 100 = 1 Then rst.AddNew rst![КодЗаказчика] = Forms![Просмотр]![КодЗаказчика] rst![КодСчета] = Forms![Просмотр]![ОсновныеСчета].Form![КодСчета] rst![КодСистемы] = rstПоCчету![КодСистемы] ДАТАПМП = Format(ДатаПМС, "m yy") ДАТАПМП = ДАТАПМП + 32 rst![ДатаПМС] = Format(ДатаTMP2, "m yy") rst![КоличествоМС] = rstПоCчету![КоличествоМ] rst![Нал] = Нал
Msg = "Заносим сопровождение " & НазваниеСистемы(rstПоCчету![КодСистемы]) & " на " & rstПоCчету![КоличествоМ] & " месяцев с " & CurrentMonthWParamWSuf(ДатаTMP2) Style = vbOKOnly + vbInformation ' Кнопки. Title = "Сообщение" ' Заголовок. MsgBox Msg, Style, Title
rst.Update rst.MoveLast
m = rstПоCчету![КоличествоМ]
For k = 1 To m rstПоАО.AddNew rstПоАО![ИдентКод] = rst![Код] ЦенаСоп = rstПоCчету![Сопровождение] / m rstПоАО![Сумма] = ЦенаСоп * 1.2 rstПоАО![Нал] = Нал ДатаTMP = Format(ДАТАПМП, "m yy") rstПоАО![Месяц] = ДатаTMP ДатаTMP = ДатаTMP + 32 ДАТАПМП = ДатаTMP rstПоАО.Update Next k
Else
РазницаДат = (CDate(Format(ДатаStore, "m yy")) - CDate(Format(ДатаПМС, "m yy"))) / 100 rst.AddNew rst![КодЗаказчика] = Forms![Просмотр]![КодЗаказчика] rst![КодСчета] = Forms![Просмотр]![ОсновныеСчета].Form![КодСчета] rst![КодСистемы] = rstПоCчету![КодСистемы] rst![ДатаПМС] = ДатаTMP2 rst![КоличествоМС] = rstПоCчету![КоличествоМ] rst![Нал] = Нал rst.Update rst.MoveLast
rstПоАО.AddNew rstПоАО![ИдентКод] = rst![Код] ЦенаСоп = rstПоCчету![Сопровождение] / rstПоCчету![КоличествоМ] rstПоАО![Сумма] = ЦенаСоп * 1.2 * CInt(РазницаДат) rstПоАО![Нал] = Нал ДатаTMP = Format(Дата, "m yy") rstПоАО![Месяц] = ДатаTMP ДатаTMP = ДатаTMP + 32 Дата = ДатаTMP rstПоАО.Update
m = rstПоCчету![КоличествоМ]
For k = 1 To m - CInt(РазницаДат) rstПоАО.AddNew rstПоАО![ИдентКод] = rst![Код] ЦенаСоп = rstПоCчету![Сопровождение] / m rstПоАО![Сумма] = ЦенаСоп * 1.2 rstПоАО![Нал] = Нал ДатаTMP = Format(Дата, "m yy") rstПоАО![Месяц] = ДатаTMP ДатаTMP = ДатаTMP + 32 Дата = ДатаTMP rstПоАО.Update Next k End If
Else 'ДЛЯ ПЕРВИЧНОЙ ПОКУПКИ Дата = ДатаStore If rstПоCчету![Цена] <> 0 Then rst.AddNew rst![КодЗаказчика] = Forms![Просмотр]![КодЗаказчика] rst![КодСчета] = Forms![Просмотр]![ОсновныеСчета].Form![КодСчета] rst![КодСистемы] = rstПоCчету![КодСистемы] rst![ДатаПМС] = Дата rst![КоличествоМС] = 0 rst![Нал] = Нал rst.Update rst.MoveLast
rstПоАО.AddNew rstПоАО![ИдентКод] = rst![Код] rstПоАО![Сумма] = rstПоCчету![Цена] * 1.2 rstПоАО![Месяц] = Дата rstПоАО![Нал] = Нал
Msg = "Заносим сумму реализации системы " & НазваниеСистемы(rstПоCчету![КодСистемы]) & " на " & CurrentMWParam(Дата) Style = vbOKOnly + vbInformation ' Кнопки. Title = "Сообщение" ' Заголовок. MsgBox Msg, Style, Title
rstПоАО.Update
End If
If rstПоCчету![Сопровождение] <> 0 Then rst.AddNew rst![КодЗаказчика] = Forms![Просмотр]![КодЗаказчика] rst![КодСчета] = Forms![Просмотр]![ОсновныеСчета].Form![КодСчета] rst![КодСистемы] = rstПоCчету![КодСистемы] rst![ДатаПМС] = Дата rst![КоличествоМС] = rstПоCчету![КоличествоМ] rst![Нал] = Нал
Msg = "Заносим сопровождение " & НазваниеСистемы(rstПоCчету![КодСистемы]) & " на " & rstПоCчету![КоличествоМ] & " месяцев с " & CurrentMonthWParamWSuf(Дата) Style = vbOKOnly + vbInformation ' Кнопки. Title = "Сообщение" ' Заголовок. MsgBox Msg, Style, Title
rst.Update rst.MoveLast
m = rstПоCчету![КоличествоМ]
For k = 1 To m rstПоАО.AddNew rstПоАО![ИдентКод] = rst![Код] ЦенаСоп = rstПоCчету![Сопровождение] / m rstПоАО![Сумма] = ЦенаСоп * 1.2 rstПоАО![Нал] = Нал If Format(Дата, "dd") < 20 Then ДатаTMP = Format(Дата, "m yy") rstПоАО![Месяц] = ДатаTMP ДатаTMP = ДатаTMP + 32 Дата = ДатаTMP rstПоАО.Update Else ДатаTMP = Format(Дата + 12, "m yy") rstПоАО![Месяц] = ДатаTMP ДатаTMP = ДатаTMP + 32 Дата = ДатаTMP rstПоАО.Update End If Next k End If End If labelnext: rstПоCчету.MoveNext Next i
Код = rst![КодСистемы] rst.Close rstПоCчету.Close rstПоАО.Close
labelEnd: Forms![Просмотр]![ОсновныеСчета].Form![ВнесениеВАО] = True
If flagБольше = True Then Set rst = dbs.OpenRecordset("КредитАванс") rst.AddNew rst.[КодЗаказчика] = Forms![Просмотр]![КодЗаказчика] rst![+или-] = Разница rst![КодСистемы] = Код rst![Месяц] = Дата rst.Update rst.Close End If
Exit_Кнопка347_Click:
DoCmd.OpenTable "АвансовыйОтчет"
dbs.Close
Exit Sub
Err_Кнопка347_Click: If Err.Number = 94 Then MsgBox ("Задайте дату платежки") Exit Sub End If If Err.Number = 3021 Then DoCmd.OpenForm "Месяц2",,,,, acDialog ДатаTMP3 = "01." & Forms![Месяц2]![Месяц] & "." & Forms![Месяц2]![Год] ДатаПМС = Format(ДатаTMP3, "m yy") flagГолоеСопр = True 'ДатаTMP3 = Forms![Месяц2]![Месяц] 'ДатаПМС = Format(ДатаTMP3, "m yy") Resume Дата End If If Err.Number = 424 Then Resume labelEnd End If If Err.Number = 2113 Then Resume labelBegin End If
' Вначале, вычитаем константу, добавленную объектом, чтобы получить ' собственный код ошибки объекта. MyError = Err.Number - vbObjectError ' Если после вычитания константы vbObjectError число по-прежнему ' попадает в диапазон 0 - 65535, то ошибка определена в объекте. If MyError > 0 And MyError < 65535 Then Msg = "Адресуемый объект присвоил ошибке следующий код: " _ & MyError & ". Источником ошибки является: " _ & Err.Source & ". Нажмите клавишу F1 для вывода справки."
' В противном случае ошибке соответствует код ошибки Visual Basic. Else Msg = "Эта ошибка (# " & Err.Number & ") имеет код ошибки Visual" & _ " Basic. Для вывода раздела справки Visual Basic нажмите" & _ " кнопку 'Справка' или клавишу F1." End If MsgBox Msg,, "Ошибка объекта", Err.HelpFile, Err.HelpContext Err.Number = 0 Resume Exit_Кнопка347_Click
ДатаОпределение: strSQLДата = "SELECT DISTINCTROW ДанныеДляАвансОтчета.КодЗаказчика, ДанныеДляАвансОтчета.КодСчета, ДанныеДляАвансОтчета.КодСистемы, ДанныеДляАвансОтчета.КоличествоМС, Max(АвансовыйОтчет.Месяц) AS Max_Месяц FROM [ДанныеДляАвансОтчета] INNER JOIN [АвансовыйОтчет] ON ДанныеДляАвансОтчета.Код = АвансовыйОтчет.ИдентКод GROUP BY ДанныеДляАвансОтчета.КодЗаказчика, ДанныеДляАвансОтчета.КодСчета, ДанныеДляАвансОтчета.КодСистемы, ДанныеДляАвансОтчета.КоличествоМС HAVING (((ДанныеДляАвансОтчета.КодЗаказчика)=" & Forms![Просмотр]![КодЗаказчика] & ") AND ((ДанныеДляАвансОтчета.КодСистемы)=" & rstПоCчету![КодСистемы] & ") AND ((ДанныеДляАвансОтчета.КоличествоМС)<>0));" Set rstПоДате = dbs.OpenRecordset(strSQLДата) rstПоДате.MoveLast ДатаПМС = rstПоДате![Max_Месяц] flagДата = True rstПоДате.Close GoTo Дата End Sub
3) Просмотр информации по счетам и системам выбранного заказчика.
Private Sub Счет_Click() Dim rst, rstTMP As Recordset Dim dbs As Database Dim i, j As Integer Dim strSQL As String Dim Дата As Date
Set dbs = CurrentDb strSQL = "SELECT DISTINCTROW Заказчики.КодЗаказчика, ОсновныеСчета.НомерСчета, ОсновныеСчета.ОплатаСчета, ОсновныеСчета.ДатаСчета, ОсновныеСчета.СрокДействияСчета, Дистрибутивы.КодСистемы, Дистрибутивы.Код, Дистрибутивы.КоличествоМ, Дистрибутивы.Цена, Дистрибутивы.Сопровождение, Дистрибутивы.Скидки, Дистрибутивы.СкидкиС, Дистрибутивы.СпецвупыскИлиНет FROM ([Заказчики] INNER JOIN [ОсновныеСчета] ON Заказчики.КодЗаказчика = ОсновныеСчета.КодЗаказчика) INNER JOIN Дистрибутивы ON ОсновныеСчета.КодСчета = Дистрибутивы.КодСчета WHERE (((Заказчики.КодЗаказчика)=" & Me![КодЗаказчика] & "));" Set rst = dbs.OpenRecordset(strSQL) Set rstTMP = dbs.OpenRecordset("ИнфоПоСистемамЗаказчика")
Do Until rstTMP.EOF rstTMP.Delete rstTMP.MoveNext Loop
If rst.RecordCount = 0 Then MsgBox ("Нет счетов на данную организацию") rstTMP.Close rst.Close dbs.Close Me.Refresh Exit Sub End If
rst.MoveLast j = rst.RecordCount rst.MoveFirst For i = 1 To j rstTMP.AddNew rstTMP![КодСистемы] = НазваниеСистемы(rst![КодСистемы]) rstTMP![ПоСчету] = rst![НомерСчета] If rst![Код] = 1 Then rstTMP![Тип] = "Локальная" Else rstTMP![Тип] = "Сетевая" End If rstTMP![ДатаС] = CurrentDateWParam(rst![ДатаСчета]) rstTMP![Цена] = rst![Цена] rstTMP![Сопр] = rst![Сопровождение] rstTMP![Скид] = rst![Скидки] rstTMP![СкидС] = rst![СкидкиС] rstTMP![ДейстПо] = rst![СрокДействияСчета] rstTMP![Спец] = rst![СпецвупыскИлиНет] rstTMP![Кво] = rst![КоличествоМ] rstTMP![Оплата] = rst![ОплатаСчета] rst.MoveNext rstTMP.Update Next i
Me![ИнфоПоОрганСистемы].Form.Visible = -1 Me![ИнфоПоОрганизSub].Form.Visible = 0 rstTMP.Close rst.Close dbs.Close Me.Refresh
End Sub
Private Sub Сист_Click() On Error GoTo Err_Кнопка6_Click Dim rst, rstTMP, rstTMP2 As Recordset Dim rstTMP3 As Recordset Dim rstTMP4 As Recordset Dim rstTMP5 As Recordset Dim dbs As Database Dim i, j As Integer Dim strSQL, strSQLTMP, strSQLTMP3 As String Dim strSQLTMP2 As String Dim Дата As Date
DoCmd.Hourglass True
Set dbs = CurrentDb strSQL = "SELECT DISTINCTROW ДанныеДляАвансОтчета.КодЗаказчика, ДанныеДляАвансОтчета.КодСистемы FROM [ДанныеДляАвансОтчета] WHERE (((ДанныеДляАвансОтчета.КодЗаказчика)=" & Me![КодЗаказчика] & ") AND ((ДанныеДляАвансОтчета.КоличествоМС)<>0));" Set rst = dbs.OpenRecordset(strSQL) Set rstTMP4 = dbs.OpenRecordset("ИнфоПоСистемамЗаказчика")
Do Until rstTMP4.EOF rstTMP4.Delete rstTMP4.MoveNext Loop
If rst.RecordCount = 0 Then ' MsgBox ("Не сопровождается") rst.Close Me![ИнфоПоОрганизSub].Form.Visible = -1 Me![ИнфоПоОрганСистемы].Form.Visible = 0 'инфо по 1996 году strSQLTMP2 = "SELECT DISTINCTROW АвансПоОстаткамС1996Года.Заказчик, АвансПоОстаткамС1996Года.Месяц, АвансПоОстаткамС1996Года.Сумма FROM АвансПоОстаткамС1996Года WHERE (((АвансПоОстаткамС1996Года.Заказчик)=" & Me![КодЗаказчика] & "));" Set rstTMP5 = dbs.OpenRecordset(strSQLTMP2) rstTMP4.AddNew rstTMP5.MoveFirst rstTMP4![Дата1С1996] = CurrentMWParam(rstTMP5![Месяц]) rstTMP5.MoveLast rstTMP4![Дата2С1996] = rstTMP5![Месяц] rstTMP5.Close rstTMP4.Update Me.Refresh rstTMP4.Close dbs.Close DoCmd.Hourglass False Exit Sub End If
rst.MoveLast j = rst.RecordCount rst.MoveFirst For i = 1 To j rstTMP4.AddNew
rstTMP4![КодСистемы] = НазваниеСистемы(rst![КодСистемы])
strSQLTMP = "SELECT DISTINCTROW Заказчики.Организация, ДанныеДляАвансОтчета.КодСистемы, АвансовыйОтчет.Месяц, ДанныеДляАвансОтчета.КоличествоМС, Заказчики.КодЗаказчика, ДанныеДляАвансОтчета.КодСчета, ОсновныеСчета.НомерСчета AS НС, АвансовыйОтчет.ИдентКод, Дистрибутивы.СкидкиС, ОсновныеСчета.ДатаСчета" strSQLTMP = strSQLTMP & " FROM (([ОсновныеСчета] INNER JOIN ([Заказчики] INNER JOIN [ДанныеДляАвансОтчета] ON (Заказчики.КодЗаказчика = ДанныеДляАвансОтчета.КодЗаказчика) AND (Заказчики.КодЗаказчика = ДанныеДляАвансОтчета.КодЗаказчика)) ON (Заказчики.КодЗаказчика = ОсновныеСчета.КодЗаказчика) AND (ОсновныеСчета.КодСчета = ДанныеДляАвансОтчета.КодСчета)) INNER JOIN [АвансовыйОтчет] ON ДанныеДляАвансОтчета.Код = АвансовыйОтчет.ИдентКод) INNER JOIN Дистрибутивы ON ОсновныеСчета.КодСчета = Дистрибутивы.КодСчета" strSQLTMP = strSQLTMP & " GROUP BY Заказчики.Организация, ДанныеДляАвансОтчета.КодСистемы, АвансовыйОтчет.Месяц, ДанныеДляАвансОтчета.КоличествоМС, Заказчики.КодЗаказчика, ДанныеДляАвансОтчета.КодСчета, ОсновныеСчета.НомерСчета, АвансовыйОтчет.ИдентКод, Дистрибутивы.СкидкиС, ОсновныеСчета.ДатаСчета" strSQLTMP = strSQLTMP & " HAVING (((ДанныеДляАвансОтчета.КодСистемы)=" & rst![КодСистемы] & ") AND ((ДанныеДляАвансОтчета.КоличествоМС)<>0) AND ((Заказчики.КодЗаказчика)=" & Me![КодЗаказчика] & "));"
Set rstTMP2 = dbs.OpenRecordset(strSQLTMP) Дата = Format(rstTMP2![Месяц], "m yy") rstTMP4![ДатаС] = Дата rstTMP2.MoveLast Дата = Format(rstTMP2![Месяц], "m yy") rstTMP4![ДейстПо] = Дата rstTMP4![ПоСчету] = rstTMP2![НС] rstTMP4![ДатаСчСопр] = CurrentDateWParam(rstTMP2![ДатаСчета]) rstTMP4![СкидС] = rstTMP2![СкидкиС]
'Запрос по системам strSQLTMP = "SELECT DISTINCTROW Заказчики.КодЗаказчика, Заказчики.Организация, ОсновныеСчета.НомерСчета, ОсновныеСчета.ДатаСчета, ОсновныеСчета.ДатаУстановки, Дистрибутивы.КодСистемы, Дистрибутивы.Код, Дистрибутивы.СпецвупыскИлиНет, Дистрибутивы.Скидки, Дистрибутивы.Цена, Дистрибутивы.НомерДистрибутива" strSQLTMP = strSQLTMP & " FROM ([Заказчики] INNER JOIN [ОсновныеСчета] ON Заказчики.КодЗаказчика = ОсновныеСчета.КодЗаказчика) INNER JOIN Дистрибутивы ON ОсновныеСчета.КодСчета = Дистрибутивы.КодСчета" strSQLTMP = strSQLTMP & " WHERE (((Заказчики.КодЗаказчика)=" & Me![КодЗаказчика] & ") AND ((Дистрибутивы.КодСистемы)=" & rst![КодСистемы] & ") AND ((Дистрибутивы.Цена)<>0));" Set rstTMP3 = dbs.OpenRecordset(strSQLTMP) rstTMP4![ПоСчетуПок] = rstTMP3![НомерСчета] rstTMP4![ДатСчПок] = CurrentDateWParam(rstTMP3![ДатаСчета]) rstTMP4![Рег] = rstTMP3![НомерДистрибутива] rstTMP4![Скид] = rstTMP3![Скидки] rstTMP4![Спец] = rstTMP3![СпецвупыскИлиНет] If rstTMP3![Код] = 1 Then rstTMP4![Тип] = "Локальная" Else rstTMP4![Тип] = "Сетевая" End If labelnext: strSQLTMP2 = "SELECT DISTINCTROW АвансПоОстаткамС1996Года.Заказчик, АвансПоОстаткамС1996Года.Месяц, АвансПоОстаткамС1996Года.Сумма FROM АвансПоОстаткамС1996Года WHERE (((АвансПоОстаткамС1996Года.Заказчик)=" & Me![КодЗаказчика] & "));" Set rstTMP5 = dbs.OpenRecordset(strSQLTMP2) If rstTMP5.RecordCount > 0 Then rstTMP5.MoveFirst rstTMP4![Дата1С1996] = CurrentMWParam(rstTMP5![Месяц]) rstTMP5.MoveLast rstTMP4![Дата2С1996] = CurrentMWParam(rstTMP5![Месяц]) rstTMP5.Close rstTMP4.Update rst.MoveNext rstTMP2.Close rstTMP3.Close Else rstTMP5.Close rstTMP2.Close rstTMP3.Close End If Next i
rstTMP4.Close rst.Close dbs.Close Me.Refresh
Exit_Кнопка6_Click: Me.Refresh Me![ИнфоПоОрганизSub].Form.Visible = -1 Me![ИнфоПоОрганСистемы].Form.Visible = 0 DoCmd.Hourglass False Exit Sub
Err_Кнопка6_Click: If Err.Number = 3021 Then 'MsgBox ("Нет данных по этой организации") Resume labelnext: 'Resume Exit_Кнопка6_Click 'MsgBox Err.Description End If MsgBox ("Нет данных по этой организации") Me![ИнфоПоОрганизSub].Form.Visible = 0 Me![ИнфоПоОрганСистемы].Form.Visible = 0 MsgBox Err.Number Resume Exit_Кнопка6_Click
DoCmd.Hourglass False End Sub
Задание по организационно – экономической части к дипломному проекту. Тема: «Технико-экономическое обоснование проекта. Расчет сметы затрат и цены на ПП. Оценка конкурентоспособности разработки» Календарный график.
В силу того, что данная разработка относится к НИР, которая не является комплексом работ высокой сложности и в ее выполнении не участвуют большое количество исполнителей, в данном случае для реализации работ выбран календарный график.
|