Метрики программного обеспечения Джилба. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Метрики программного обеспечения Джилба.



 

Джилб приводит не претендующий на полноту набор метрик программного обеспечения. Он обращает внимание на то, что каждое приложение требует введения собственных понятий и инструментов; его книга предназначена для введения основных понятий, от которых может оттолкнуться пользователь.

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

Отношение количества правильных данных ко всем данным приводится Джилбом в качестве меры точности (свободы от ошибок). Так же, как Боэм, Браун и Лайпоу, Джилб считает, что точность необходима для надежности программы. Прецизионность определяется как мера того, насколько часты ошибки, обусловленные одинаковыми причинами. Джилб оценивает ее дробью, в числителе которой стоит число фактических ошибок на входе, а в знаменателе - общее число наблюденных ошибок, причинами которых явились эти ошибки на входе. Так, например, если одна ошибка вызывает в течение определенного периода времени 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

 

 

Задание по организационно – экономической части к дипломному проекту.

Тема: «Технико-экономическое обоснование проекта. Расчет сметы затрат и цены на ПП. Оценка конкурентоспособности разработки»

Календарный график.

 

В силу того, что данная разработка относится к НИР, которая не является комплексом работ высокой сложности и в ее выполнении не участвуют большое количество исполнителей, в данном случае для реализации работ выбран календарный график.

 

N п/п

Наименование работ

Исполнители

Длительность работы



Поделиться:


Последнее изменение этой страницы: 2020-03-14; просмотров: 249; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.144.40 (0.613 с.)