ASP NET, NET Framework, MONO, SQL, Visual Studio | Professional Programs | Программист Еремин В.В.
(SQL) SQL (2010 год)

Фрагмент реальной BLL на PostgeSQL

Это небольшой фрагмент совершенно реальной BLL, выполненный мною на MONO, использующий вот эту низкоуровневую обвязку коннекта к PostgreSQL и используется на формах cозданного мною терминала примерно вот так.

Классы наследуются от базового класса и добавляют новые методы и свойства:

Это наиболее простой пример BLL из представленных на моем сайте фрагментов выполненных мною BLL. Для меня его ценность в том, что я выполнил его впервые на бесплатном, переносимом на Unix и Windows SQL-сервере PosrgreSQL. С более сложными концепециями построения BLL вы можете познакомится тут:


Итак, посмотрим на код этой моей несложной обвязки для работы с данными. Я мог бы выполнить ее в любой технике, например вот в такой Практическое применение наследования, полиморфизма, интерфейсов, дженериков и делегатов на примерах в Visual Basic .NET, но выполнил эту BLL в строгих традициях классического бейсика:


   1:  Public Class SQL_Postgres
   2:      Dim _PG As Postgres
   3:      Public ReadOnly Property PG() As Postgres
   4:          Get
   5:              Return _PG
   6:          End Get
   7:      End Property
   8:   
   9:      Dim _PG_CN As Npgsql.NpgsqlConnection
  10:      Public ReadOnly Property PG_CN() As Npgsql.NpgsqlConnection
  11:          Get
  12:              Return _PG_CN
  13:          End Get
  14:      End Property
  15:   
  16:      Public Sub New()
  17:          Try
  18:              _PG = New Postgres
  19:              _PG_CN = _PG.Open(My.Settings.Postgres)
  20:          Catch ex As Exception
  21:              Dim Y As New ErrForm
  22:              Y.ErrorMessage = ex.Message
  23:              Y.ShowDialog()
  24:              Exit Sub
  25:          End Try
  26:      End Sub
  27:   
  28:      Sub CheckConnect()
  29:          Try
  30:              If _PG_CN Is Nothing Then
  31:                  _PG = New Postgres
  32:                  _PG_CN = _PG.Open(My.Settings.Postgres)
  33:              Else
  34:                  If PG_CN.FullState = ConnectionState.Open Then
  35:                      'отлично, работаем дальше
  36:                  ElseIf PG_CN.FullState = ConnectionState.Closed Then
  37:                      _PG_CN = _PG.Open(My.Settings.Postgres)
  38:                  ElseIf PG_CN.FullState = ConnectionState.Broken Then
  39:                      Throw New Exception("ConnectionState=Broken")
  40:                  ElseIf PG_CN.FullState = ConnectionState.Connecting Then
  41:                      Throw New Exception("ConnectionState=Connecting")
  42:                  ElseIf PG_CN.FullState = ConnectionState.Executing Then
  43:                      Throw New Exception("ConnectionState=Executing")
  44:                  ElseIf PG_CN.FullState = ConnectionState.Fetching Then
  45:                      Throw New Exception("ConnectionState=Fetching")
  46:                  End If
  47:              End If
  48:          Catch ex As Exception
  49:              Dim Y As New ErrForm
  50:              Y.ErrorMessage = ex.Message
  51:              Y.ShowDialog()
  52:              Exit Sub
  53:          End Try
  54:      End Sub
  55:   
  56:      Public Sub Close()
  57:          Try
  58:              If _PG IsNot Nothing Then
  59:                  _PG.Close()
  60:              End If
  61:          Catch ex As Exception
  62:              'молча
  63:          End Try
  64:      End Sub
  65:  End Class
  66:   
  67:  ''' <summary>
  68:  ''' Main
  69:  ''' </summary>
  70:  Public Class SQL_XMLexport
  71:      Inherits SQL_Postgres
  72:   
  73:      Dim _XML_export As String
  74:      Public ReadOnly Property XML_export() As String
  75:          Get
  76:              Return _XML_export
  77:          End Get
  78:      End Property
  79:   
  80:      Dim _CMD_XML_export As String
  81:      Public ReadOnly Property CMD_XML_export() As String
  82:          Get
  83:              Return _CMD_XML_export
  84:          End Get
  85:      End Property
  86:   
  87:      Public Sub GetZakaz()
  88:          _CMD_XML_export = "select * from ""ExportZakaz""();"
  89:          Dim RDR As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_XML_export)
  90:          Dim X As New System.Text.StringBuilder
  91:          While RDR.Read
  92:              If Not IsDBNull(RDR("ExportZakaz")) Then
  93:                  X.AppendLine(RDR("ExportZakaz"))
  94:              End If
  95:          End While
  96:          _XML_export = X.ToString
  97:      End Sub
  98:   
  99:  End Class
 100:   
 101:  ''' <summary>
 102:  ''' SelectAutoDetail
 103:  ''' </summary>
 104:  Public Class SQL_AutoDetail
 105:      Inherits SQL_Postgres
 106:   
 107:      Dim _PG As Postgres
 108:      Dim _Импорт_i As Integer
 109:      Public ReadOnly Property [Импорт_i]() As Integer
 110:          Get
 111:              Return _Импорт_i
 112:          End Get
 113:      End Property
 114:   
 115:      Dim _Марка_i As Integer
 116:      Public ReadOnly Property [Марка_i]() As Integer
 117:          Get
 118:              Return _Марка_i
 119:          End Get
 120:      End Property
 121:   
 122:      Dim _CMD_GetMarkaAuto As String
 123:      Public ReadOnly Property CMD_GetMarkaAuto() As String
 124:          Get
 125:              Return _CMD_GetMarkaAuto
 126:          End Get
 127:      End Property
 128:   
 129:   
 130:      'берем выбранную марку из последнего импорта - это всегда первый запрос пакета
 131:      Public Sub GetMarkaAuto(ByVal Brand As String)
 132:          CheckConnect()
 133:          _CMD_GetMarkaAuto = "select * from ""МаркаАвто"" where ""Наименование"" ~* '" & Brand & "' order by i desc  limit 1;"
 134:          Dim RDR1 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_GetMarkaAuto)
 135:          If RDR1.Read Then
 136:              [_Импорт_i] = RDR1("toimport")
 137:              [_Марка_i] = RDR1("i")
 138:          Else
 139:              Dim Y As New ErrForm
 140:              Y.ErrorMessage = "Марка автомобиля не найдена." & vbCrLf & vbCrLf & _
 141:              "Служебная информация для техподдержки:" & vbCrLf & _
 142:              "Импорт_i=" & MainTerminal.Импорт_i & vbCrLf & _
 143:              _CMD_GetMarkaAuto
 144:              Y.ShowDialog()
 145:              Exit Sub
 146:          End If
 147:      End Sub
 148:   
 149:      Dim _Модель_i As Collection
 150:      Public ReadOnly Property [Модель_i]() As Collection
 151:          Get
 152:              Return _Модель_i
 153:          End Get
 154:      End Property
 155:   
 156:      Dim _Модель_Наименование As Collection
 157:      Public ReadOnly Property [Модель_Наименование]() As Collection
 158:          Get
 159:              Return _Модель_Наименование
 160:          End Get
 161:      End Property
 162:   
 163:      Dim _Модель_НачалоВыпуска As Collection
 164:      Public ReadOnly Property [Модель_НачалоВыпуска]() As Collection
 165:          Get
 166:              Return _Модель_НачалоВыпуска
 167:          End Get
 168:      End Property
 169:   
 170:      Dim _Модель_КонецВыпуска As Collection
 171:      Public ReadOnly Property [Модель_КонецВыпуска]() As Collection
 172:          Get
 173:              Return _Модель_КонецВыпуска
 174:          End Get
 175:      End Property
 176:   
 177:      Dim _CMD_GetAllModel As String
 178:      Public ReadOnly Property CMD_GetAllModel() As String
 179:          Get
 180:              Return _CMD_GetAllModel
 181:          End Get
 182:      End Property
 183:   
 184:      'берем все модели текущей марки автомобиля [_Марка_i]
 185:      Public Sub GetAllModel()
 186:          _Модель_i = New Collection
 187:          _Модель_Наименование = New Collection
 188:          _Модель_НачалоВыпуска = New Collection
 189:          _Модель_КонецВыпуска = New Collection
 190:          CheckConnect()
 191:          _CMD_GetAllModel = "select * from ""МодельАвто"" where tomarka=" & [_Марка_i].ToString & " order by i asc;"
 192:          Dim RDR2 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_GetAllModel)
 193:          If RDR2.Read Then
 194:              _Модель_i.Add(RDR2("i"))
 195:              _Модель_Наименование.Add(RDR2("Наименование"))
 196:              _Модель_НачалоВыпуска.Add(RDR2("НачалоВыпуска"))
 197:              _Модель_КонецВыпуска.Add(RDR2("КонецВыпуска"))
 198:              While RDR2.Read
 199:                  _Модель_i.Add(RDR2("i"))
 200:                  _Модель_Наименование.Add(RDR2("Наименование"))
 201:                  _Модель_НачалоВыпуска.Add(RDR2("НачалоВыпуска"))
 202:                  _Модель_КонецВыпуска.Add(RDR2("КонецВыпуска"))
 203:              End While
 204:          Else
 205:              Dim Y As New ErrForm
 206:              Y.ErrorMessage = "Модель автомобиля не найдена." & vbCrLf & vbCrLf & _
 207:              "МаркаАвто=" & MainTerminal.МаркаАвто & vbCrLf & _
 208:              "Служебная информация для техподдержки:" & vbCrLf & _
 209:              "Импорт_i=" & MainTerminal.Импорт_i & vbCrLf & _
 210:              "Марка_i=" & MainTerminal.Марка_i & vbCrLf & _
 211:              _CMD_GetAllModel
 212:              Y.ShowDialog()
 213:              Exit Sub
 214:          End If
 215:      End Sub
 216:   
 217:      Dim [_ГодыВыпуска] As Collection
 218:      Public ReadOnly Property [ГодыВыпуска]() As Collection
 219:          Get
 220:              Return _ГодыВыпуска
 221:          End Get
 222:      End Property
 223:   
 224:      'делаем коллекцию с годами выпуска 
 225:      Public Sub GetYear(ByVal Модель_i_index As Integer)
 226:          _ГодыВыпуска = New Collection
 227:          Dim ГодНачалаВыпуска As Integer
 228:          If _Модель_НачалоВыпуска(Модель_i_index) = "" Then
 229:              ГодНачалаВыпуска = Now.Year
 230:          Else
 231:              ГодНачалаВыпуска = CInt(_Модель_НачалоВыпуска(Модель_i_index).ToString.Remove(4))
 232:          End If
 233:          Dim ГодКонцаВыпуска As Integer
 234:          If _Модель_КонецВыпуска(Модель_i_index) = "" Then
 235:              ГодКонцаВыпуска = Now.Year
 236:          Else
 237:              ГодКонцаВыпуска = CInt(_Модель_КонецВыпуска(Модель_i_index).ToString.Remove(4))
 238:          End If
 239:          For i As Integer = 0 To ГодКонцаВыпуска - ГодНачалаВыпуска
 240:              [_ГодыВыпуска].Add(ГодНачалаВыпуска + i)
 241:          Next
 242:      End Sub
 243:   
 244:      Dim _Модификация_i As Collection
 245:      Public ReadOnly Property [Модификация_i]() As Collection
 246:          Get
 247:              Return _Модификация_i
 248:          End Get
 249:      End Property
 250:   
 251:      Dim _Модификация_Наименование As Collection
 252:      Public ReadOnly Property [Модификация_Наименование]() As Collection
 253:          Get
 254:              Return _Модификация_Наименование
 255:          End Get
 256:      End Property
 257:   
 258:      Dim _CMD_GetModif As String
 259:      Public ReadOnly Property CMD_GetModif() As String
 260:          Get
 261:              Return _CMD_GetModif
 262:          End Get
 263:      End Property
 264:   
 265:      'Берем все модификации указанной модели
 266:      Public Sub GetModif(ByVal Модель_i_index As Integer)
 267:          _Модификация_i = New Collection
 268:          _Модификация_Наименование = New Collection
 269:          CheckConnect()
 270:          _CMD_GetModif = "select * from ""МодификацияАвто"" where tomodel=" & Модель_i_index & " order by i asc "
 271:          Dim RDR3 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_GetModif)
 272:          If RDR3.Read Then
 273:              _Модификация_i.Add(RDR3("i"))
 274:              _Модификация_Наименование.Add(RDR3("Наименование"))
 275:              While RDR3.Read
 276:                  _Модификация_i.Add(RDR3("i"))
 277:                  _Модификация_Наименование.Add(RDR3("Наименование"))
 278:              End While
 279:          Else
 280:              Dim Y As New ErrForm
 281:              Y.ErrorMessage = "Модификация автомобиля не найдена." & vbCrLf & vbCrLf & _
 282:              "МаркаАвто=" & MainTerminal.МаркаАвто & vbCrLf & _
 283:              "Модель_Наименование=" & MainTerminal.Модель_Наименование & vbCrLf & _
 284:              "Служебная информация для техподдержки:" & vbCrLf & _
 285:              "Импорт_i=" & MainTerminal.Импорт_i & vbCrLf & _
 286:              "Марка_i=" & MainTerminal.Марка_i & vbCrLf & _
 287:              "Модель_i=" & MainTerminal.Модель_i & vbCrLf & _
 288:              _CMD_GetModif
 289:              Y.ShowDialog()
 290:              Exit Sub
 291:          End If
 292:      End Sub
 293:   
 294:  End Class
 295:   
 296:  ''' <summary>
 297:  ''' SelectDiskParameters
 298:  ''' </summary>
 299:  Public Class SQL_DiskParameters
 300:      Inherits SQL_Postgres
 301:   
 302:      Dim _ОбщиеПараметрыДисков_i As Integer
 303:      Public ReadOnly Property ОбщиеПараметрыДисков_i() As Integer
 304:          Get
 305:              Return _ОбщиеПараметрыДисков_i
 306:          End Get
 307:      End Property
 308:   
 309:      Dim _ОбщиеПараметрыДисков_КрепежныеОтверстия As String
 310:      Public ReadOnly Property ОбщиеПараметрыДисков_КрепежныеОтверстия() As String
 311:          Get
 312:              Return _ОбщиеПараметрыДисков_КрепежныеОтверстия
 313:          End Get
 314:      End Property
 315:   
 316:      Dim _ОбщиеПараметрыДисков_ПосадочноеОтверстие As String
 317:      Public ReadOnly Property ОбщиеПараметрыДисков_ПосадочноеОтверстие() As String
 318:          Get
 319:              Return _ОбщиеПараметрыДисков_ПосадочноеОтверстие
 320:          End Get
 321:      End Property
 322:   
 323:      Dim _ОбщиеПараметрыДисков_ЦентральноеОтверстие As String
 324:      Public ReadOnly Property ОбщиеПараметрыДисков_ЦентральноеОтверстие() As String
 325:          Get
 326:              Return _ОбщиеПараметрыДисков_ЦентральноеОтверстие
 327:          End Get
 328:      End Property
 329:   
 330:      Dim _ЗаводскаяКомплектацияДисков_i As Integer
 331:      Public ReadOnly Property ЗаводскаяКомплектацияДисков_i() As Integer
 332:          Get
 333:              Return _ЗаводскаяКомплектацияДисков_i
 334:          End Get
 335:      End Property
 336:   
 337:      Dim _ЗаводскаяКомплектацияДисков_ПередняяОсь_ПосадочныйДиаметр As String
 338:      Public ReadOnly Property ЗаводскаяКомплектацияДисков_ПередняяОсь_ПосадочныйДиаметр() As String
 339:          Get
 340:              Return _ЗаводскаяКомплектацияДисков_ПередняяОсь_ПосадочныйДиаметр
 341:          End Get
 342:      End Property
 343:   
 344:      Dim _ЗаводскаяКомплектацияДисков_ПередняяОсь_Вылет As String
 345:      Public ReadOnly Property ЗаводскаяКомплектацияДисков_ПередняяОсь_Вылет() As String
 346:          Get
 347:              Return _ЗаводскаяКомплектацияДисков_ПередняяОсь_Вылет
 348:          End Get
 349:      End Property
 350:   
 351:      Dim _ОбщиеПараметрыДисков_Count As Integer
 352:      Public ReadOnly Property ОбщиеПараметрыДисков_Count() As Integer
 353:          Get
 354:              Return _ОбщиеПараметрыДисков_Count
 355:          End Get
 356:      End Property
 357:   
 358:      Dim _ЗаводскаяКомплектацияДисков_Count As Integer
 359:      Public ReadOnly Property ЗаводскаяКомплектацияДисков_Count() As Integer
 360:          Get
 361:              Return _ЗаводскаяКомплектацияДисков_Count
 362:          End Get
 363:      End Property
 364:   
 365:      Dim _ВариантЗаменыДисков_Count As Integer
 366:      Public ReadOnly Property ВариантЗаменыДисков_Count() As Integer
 367:          Get
 368:              Return _ВариантЗаменыДисков_Count
 369:          End Get
 370:      End Property
 371:   
 372:      Dim _CMD_GetОбщиеПараметрыДисков As String
 373:      Public ReadOnly Property CMD_GetОбщиеПараметрыДисков() As String
 374:          Get
 375:              Return _CMD_GetОбщиеПараметрыДисков
 376:          End Get
 377:      End Property
 378:   
 379:      Dim _CMD_ЗаводскаяКомплектацияДисков As String
 380:      Public ReadOnly Property CMD_ЗаводскаяКомплектацияДисков() As String
 381:          Get
 382:              Return _CMD_ЗаводскаяКомплектацияДисков
 383:          End Get
 384:      End Property
 385:   
 386:      Public Sub GetОбщиеПараметрыДисков(ByVal ToModif As Integer, ByVal Year As Integer)
 387:          CheckConnect()
 388:          _CMD_GetОбщиеПараметрыДисков = "select i, ""КрепежныеОтверстия"", ""ПосадочноеОтверстие"", ""ЦентральноеОтверстие""  from ""ОбщиеПараметрыДисков"" where tomodif=" & ToModif.ToString & "  and ""Год"" like '" & Year.ToString & "%' order by i desc limit 1"
 389:          Dim RDR1 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_GetОбщиеПараметрыДисков)
 390:          If RDR1.Read Then
 391:              _ОбщиеПараметрыДисков_Count = 1
 392:              If Not IsDBNull(RDR1("КрепежныеОтверстия")) Then
 393:                  _ОбщиеПараметрыДисков_КрепежныеОтверстия = RDR1("КрепежныеОтверстия")
 394:              End If
 395:              If Not IsDBNull(RDR1("ПосадочноеОтверстие")) Then
 396:                  _ОбщиеПараметрыДисков_ПосадочноеОтверстие = RDR1("ПосадочноеОтверстие")
 397:              End If
 398:              If Not IsDBNull(RDR1("ЦентральноеОтверстие")) Then
 399:                  _ОбщиеПараметрыДисков_ЦентральноеОтверстие = RDR1("ЦентральноеОтверстие")
 400:              End If
 401:              _ОбщиеПараметрыДисков_i = RDR1("i")
 402:          Else
 403:              _ОбщиеПараметрыДисков_Count = 0
 404:              Dim Y As New ErrForm
 405:              Y.ErrorMessage = "ОбщиеПараметрыДисков не найдены." & vbCrLf & vbCrLf & _
 406:              "МаркаАвто=" & MainTerminal.МаркаАвто & vbCrLf & _
 407:              "Модель_Наименование=" & MainTerminal.Модель_Наименование & vbCrLf & _
 408:              "ГодВыпуска=" & MainTerminal.ГодВыпуска & vbCrLf & _
 409:              "Модификация_Наименование=" & MainTerminal.Модификация_Наименование & vbCrLf & _
 410:               vbCrLf & vbCrLf & _
 411:              "Служебная информация для техподдержки:" & vbCrLf & _
 412:              "Импорт_i=" & MainTerminal.Импорт_i & vbCrLf & _
 413:              "Модификация_i=" & MainTerminal.Модификация_i & vbCrLf & _
 414:              _CMD_GetОбщиеПараметрыДисков.Replace(",", "," & vbCrLf).Replace("from", vbCrLf & "from").Replace("where", vbCrLf & "where").Replace("order", vbCrLf & "order")
 415:              Y.ShowDialog()
 416:              Exit Sub
 417:          End If
 418:          '
 419:          CheckConnect()
 420:          _CMD_ЗаводскаяКомплектацияДисков = "select i, ""ПередняяОсь_ПосадочныйДиаметр"",""ПередняяОсь_Ширина"", ""ПередняяОсь_Вылет"" from ""ЗаводскаяКомплектацияДисков"" where tomodif=" & ToModif.ToString & "  and ""Год"" like '" & Year.ToString & "%'  order by i desc limit 1"
 421:          RDR1 = PG.ExecRDR(_CMD_ЗаводскаяКомплектацияДисков)
 422:          If RDR1.Read Then
 423:              _ЗаводскаяКомплектацияДисков_Count = 1
 424:              _ЗаводскаяКомплектацияДисков_ПередняяОсь_ПосадочныйДиаметр = RDR1("ПередняяОсь_ПосадочныйДиаметр").ToString & "x" & RDR1("ПередняяОсь_Ширина").ToString
 425:              _ЗаводскаяКомплектацияДисков_ПередняяОсь_Вылет = RDR1("ПередняяОсь_Вылет")
 426:              _ЗаводскаяКомплектацияДисков_i = RDR1("i")
 427:          Else
 428:              _ЗаводскаяКомплектацияДисков_Count = 0
 429:              Dim Y As New ErrForm
 430:              Y.ErrorMessage = "ЗаводскаяКомплектацияДисков не найдена." & vbCrLf & vbCrLf & _
 431:              "МаркаАвто=" & MainTerminal.МаркаАвто & vbCrLf & _
 432:              "Модель_Наименование=" & MainTerminal.Модель_Наименование & vbCrLf & _
 433:              "ГодВыпуска=" & MainTerminal.ГодВыпуска & vbCrLf & _
 434:              "Модификация_Наименование=" & MainTerminal.Модификация_Наименование & vbCrLf & _
 435:               vbCrLf & vbCrLf & _
 436:              "Служебная информация для техподдержки:" & vbCrLf & _
 437:              "Импорт_i=" & MainTerminal.Импорт_i & vbCrLf & _
 438:              "Модификация_i=" & MainTerminal.Модификация_i & vbCrLf & _
 439:              CMD_ЗаводскаяКомплектацияДисков.Replace(",", "," & vbCrLf).Replace("from", vbCrLf & "from").Replace("where", vbCrLf & "where").Replace("order", vbCrLf & "order")
 440:              Y.ShowDialog()
 441:              Exit Sub
 442:          End If
 443:      End Sub
 444:   
 445:      Dim _ВариантЗаменыДисков_i As Collection
 446:      Public ReadOnly Property ВариантЗаменыДисков_i() As Collection
 447:          Get
 448:              Return _ВариантЗаменыДисков_i
 449:          End Get
 450:      End Property
 451:   
 452:      Dim _ВариантЗаменыДисков_ПередняяОсь_ПосадочныйДиаметр As Collection
 453:      Public ReadOnly Property ВариантЗаменыДисков_ПередняяОсь_ПосадочныйДиаметр() As Collection
 454:          Get
 455:              Return _ВариантЗаменыДисков_ПередняяОсь_ПосадочныйДиаметр
 456:          End Get
 457:      End Property
 458:   
 459:      Dim _ВариантЗаменыДисков_ПередняяОсь_Ширина As Collection
 460:      Public ReadOnly Property ВариантЗаменыДисков_ПередняяОсь_Ширина() As Collection
 461:          Get
 462:              Return _ВариантЗаменыДисков_ПередняяОсь_Ширина
 463:          End Get
 464:      End Property
 465:   
 466:      Dim _ВариантЗаменыДисков_ПередняяОсь_Вылет As Collection
 467:      Public ReadOnly Property ВариантЗаменыДисков_ПередняяОсь_Вылет() As Collection
 468:          Get
 469:              Return _ВариантЗаменыДисков_ПередняяОсь_Вылет
 470:          End Get
 471:      End Property
 472:   
 473:   
 474:      Dim _CMD_ВариантЗаменыДисков As String
 475:      Public ReadOnly Property CMD_ВариантЗаменыДисков() As String
 476:          Get
 477:              Return _CMD_ВариантЗаменыДисков
 478:          End Get
 479:      End Property
 480:   
 481:      Sub GetВариантЗаменыДисков(ByVal ToModif As Integer, ByVal Year As Integer)
 482:          CheckConnect()
 483:          '
 484:          _ВариантЗаменыДисков_i = New Collection
 485:          _ВариантЗаменыДисков_ПередняяОсь_ПосадочныйДиаметр = New Collection
 486:          _ВариантЗаменыДисков_ПередняяОсь_Ширина = New Collection
 487:          _ВариантЗаменыДисков_ПередняяОсь_Вылет = New Collection
 488:          '
 489:          _CMD_ВариантЗаменыДисков = "select * from ""ВариантЗаменыДисков"" where tomodif=" & ToModif.ToString & "  and ""Год"" like '" & Year.ToString & "%'  order by i desc limit 1"
 490:          Dim RDR1 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_ВариантЗаменыДисков)
 491:          If RDR1.Read Then
 492:              _ВариантЗаменыДисков_Count = 1
 493:              _ВариантЗаменыДисков_i.Add(RDR1("i"))
 494:              _ВариантЗаменыДисков_ПередняяОсь_ПосадочныйДиаметр.Add(RDR1("ПередняяОсь_ПосадочныйДиаметр"))
 495:              _ВариантЗаменыДисков_ПередняяОсь_Ширина.Add(RDR1("ПередняяОсь_Ширина"))
 496:              _ВариантЗаменыДисков_ПередняяОсь_Вылет.Add(RDR1("ПередняяОсь_Вылет"))
 497:          Else
 498:              _ВариантЗаменыДисков_Count = 0
 499:              Dim Y As New ErrForm
 500:              Y.ErrorMessage = "ВариантЗаменыДисков не найден." & vbCrLf & vbCrLf & _
 501:              "МаркаАвто=" & MainTerminal.МаркаАвто & vbCrLf & _
 502:              "Модель_Наименование=" & MainTerminal.Модель_Наименование & vbCrLf & _
 503:              "ГодВыпуска=" & MainTerminal.ГодВыпуска & vbCrLf & _
 504:              "Модификация_Наименование=" & MainTerminal.Модификация_Наименование & vbCrLf & _
 505:               vbCrLf & vbCrLf & _
 506:              "Служебная информация для техподдержки:" & vbCrLf & _
 507:              "Импорт_i=" & MainTerminal.Импорт_i & vbCrLf & _
 508:              "Модификация_i=" & MainTerminal.Модификация_i & vbCrLf & _
 509:              _CMD_ВариантЗаменыДисков.Replace(",", "," & vbCrLf).Replace("from", vbCrLf & "from").Replace("where", vbCrLf & "where").Replace("order", vbCrLf & "order")
 510:              Y.ShowDialog()
 511:              Exit Sub
 512:          End If
 513:      End Sub
 514:   
 515:  End Class
 516:   
 517:  ''' <summary>
 518:  ''' SelectDiskModel
 519:  ''' </summary>
 520:  Public Class SQL_DiskModel
 521:      Inherits SQL_Postgres
 522:   
 523:      Dim _СкладскиеОстатки_ReadingRecordsetCount As Integer
 524:      Public ReadOnly Property СкладскиеОстатки_ReadingRecordsetCount() As Integer
 525:          Get
 526:              Return _СкладскиеОстатки_ReadingRecordsetCount
 527:          End Get
 528:      End Property
 529:   
 530:      Dim _СкладскиеОстаткиДисков_i As Collection
 531:      Public ReadOnly Property СкладскиеОстаткиДисков_i() As Collection
 532:          Get
 533:              Return _СкладскиеОстаткиДисков_i
 534:          End Get
 535:      End Property
 536:   
 537:      Dim _СкладскиеОстаткиДисков_Атрикул As Collection
 538:      Public ReadOnly Property СкладскиеОстаткиДисков_Атрикул() As Collection
 539:          Get
 540:              Return _СкладскиеОстаткиДисков_Атрикул
 541:          End Get
 542:      End Property
 543:   
 544:      Dim _СкладскиеОстаткиДисков_Наименование As Collection
 545:      Public ReadOnly Property СкладскиеОстаткиДисков_Наименование() As Collection
 546:          Get
 547:              Return _СкладскиеОстаткиДисков_Наименование
 548:          End Get
 549:      End Property
 550:   
 551:      Dim _СкладскиеОстаткиДисков_Kol As Collection
 552:      Public ReadOnly Property СкладскиеОстаткиДисков_Kol() As Collection
 553:          Get
 554:              Return _СкладскиеОстаткиДисков_Kol
 555:          End Get
 556:      End Property
 557:   
 558:      Dim _СкладскиеОстаткиДисков_Цена As Collection
 559:      Public ReadOnly Property СкладскиеОстаткиДисков_Цена() As Collection
 560:          Get
 561:              Return _СкладскиеОстаткиДисков_Цена
 562:          End Get
 563:      End Property
 564:   
 565:      Dim _СкладскиеОстаткиДисков_ЦенаТекст As Collection
 566:      Public ReadOnly Property СкладскиеОстаткиДисков_ЦенаТекст() As Collection
 567:          Get
 568:              Return _СкладскиеОстаткиДисков_ЦенаТекст
 569:          End Get
 570:      End Property
 571:   
 572:      Dim _ИмпортСкладскихОстатков_i As Integer
 573:      Public ReadOnly Property [ИмпортСкладскихОстатков_i]() As Integer
 574:          Get
 575:              Return _ИмпортСкладскихОстатков_i
 576:          End Get
 577:      End Property
 578:   
 579:      Dim _ИмпортСкладскихОстатков_ДатаИмпорта As String
 580:      Public ReadOnly Property [ИмпортСкладскихОстатков_ДатаИмпорта]() As String
 581:          Get
 582:              Return _ИмпортСкладскихОстатков_ДатаИмпорта
 583:          End Get
 584:      End Property
 585:   
 586:      Dim _СвойстаТовара_ВылетET As Collection
 587:      Public ReadOnly Property [СвойстаТовара_ВылетET]() As Collection
 588:          Get
 589:              Return _СвойстаТовара_ВылетET
 590:          End Get
 591:      End Property
 592:   
 593:      Dim _СвойстаТовара_РазмерДиска As Collection
 594:      Public ReadOnly Property [СвойстаТовара_РазмерДиска]() As Collection
 595:          Get
 596:              Return _СвойстаТовара_РазмерДиска
 597:          End Get
 598:      End Property
 599:   
 600:      Dim _СвойстаТовара_Сверловка As Collection
 601:      Public ReadOnly Property [СвойстаТовара_Сверловка]() As Collection
 602:          Get
 603:              Return _СвойстаТовара_Сверловка
 604:          End Get
 605:      End Property
 606:   
 607:      Dim _СвойстаТовара_Цвет As Collection
 608:      Public ReadOnly Property [СвойстаТовара_Цвет]() As Collection
 609:          Get
 610:              Return _СвойстаТовара_Цвет
 611:          End Get
 612:      End Property
 613:   
 614:      Dim _СвойстаТовара_ЦентральноеОтверстиеDIA As Collection
 615:      Public ReadOnly Property [СвойстаТовара_ЦентральноеОтверстиеDIA]() As Collection
 616:          Get
 617:              Return _СвойстаТовара_ЦентральноеОтверстиеDIA
 618:          End Get
 619:      End Property
 620:   
 621:      Dim _СвойстаТовара_ТоварКартинка As Collection
 622:      Public ReadOnly Property [СвойстаТовара_ТоварКартинка]() As Collection
 623:          Get
 624:              Return _СвойстаТовара_ТоварКартинка
 625:          End Get
 626:      End Property
 627:   
 628:      Dim _СвойстаТовара_Hole As Collection
 629:      Public ReadOnly Property [СвойстаТовара_Hole]() As Collection
 630:          Get
 631:              Return _СвойстаТовара_Hole
 632:          End Get
 633:      End Property
 634:   
 635:      Dim _СвойстаТовара_PCD As Collection
 636:      Public ReadOnly Property [СвойстаТовара_PCD]() As Collection
 637:          Get
 638:              Return _СвойстаТовара_PCD
 639:          End Get
 640:      End Property
 641:   
 642:      Dim _СкладскиеОстаткиДисков_ВсегоПодходящихДисков As Integer = 0
 643:      Public ReadOnly Property СкладскиеОстаткиДисков_ВсегоПодходящихДисков() As Integer
 644:          Get
 645:              Return _СкладскиеОстаткиДисков_ВсегоПодходящихДисков
 646:          End Get
 647:      End Property
 648:   
 649:      Dim _CMD_Count As String
 650:      Public ReadOnly Property CMD_Count() As String
 651:          Get
 652:              Return _CMD_Count
 653:          End Get
 654:      End Property
 655:   
 656:      Dim _CMD_GetDisk As String
 657:      Public ReadOnly Property CMD_GetDisk() As String
 658:          Get
 659:              Return _CMD_GetDisk
 660:          End Get
 661:      End Property
 662:   
 663:      Public Sub GetКоличествоПодходящихДисков(ByVal ДиаметрДиска As String, ByVal ШиринаДиска As String, ByVal Вылет_ET As String, ByVal Сверловка_HOLE As String, ByVal Сверловка_PCD As String, ByVal ЦентральноеОтверстие_DIA As String)
 664:          _CMD_Count = "select * from ""DiskCount""('" & ДиаметрДиска & "','" & _
 665:          ШиринаДиска & "','" & Вылет_ET & "','" & Сверловка_HOLE & "','" & Сверловка_PCD & "');"
 666:          'ШиринаДиска & "','" & Вылет_ET & "','" & Сверловка_HOLE & "','" & Сверловка_PCD & "','" & ЦентральноеОтверстие_DIA & "')"
 667:   
 668:          Dim RDR3 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_Count)
 669:          If RDR3.Read Then
 670:              _СкладскиеОстаткиДисков_ВсегоПодходящихДисков = RDR3("DiskCount")
 671:              RDR3.Close()
 672:          Else
 673:              _СкладскиеОстаткиДисков_ВсегоПодходящихДисков = 0
 674:          End If
 675:      End Sub
 676:   
 677:      Public Sub GetOstatok(ByVal RecordsetOffset As Integer, ByVal ДиаметрДиска As String, ByVal ШиринаДиска As String, ByVal Вылет_ET As String, ByVal Сверловка_HOLE As String, ByVal Сверловка_PCD As String, ByVal ЦентральноеОтверстие_DIA As String)
 678:          _СкладскиеОстатки_ReadingRecordsetCount = 0
 679:          _СкладскиеОстаткиДисков_i = New Collection
 680:          _СкладскиеОстаткиДисков_Атрикул = New Collection
 681:          _СкладскиеОстаткиДисков_Наименование = New Collection
 682:          _СкладскиеОстаткиДисков_Kol = New Collection
 683:          _СкладскиеОстаткиДисков_Цена = New Collection
 684:          _СкладскиеОстаткиДисков_ЦенаТекст = New Collection
 685:          _СвойстаТовара_ВылетET = New Collection
 686:          _СвойстаТовара_РазмерДиска = New Collection
 687:          _СвойстаТовара_Сверловка = New Collection
 688:          _СвойстаТовара_Цвет = New Collection
 689:          _СвойстаТовара_ЦентральноеОтверстиеDIA = New Collection
 690:          _СвойстаТовара_ТоварКартинка = New Collection
 691:          _СвойстаТовара_Hole = New Collection
 692:          _СвойстаТовара_PCD = New Collection
 693:          CheckConnect()
 694:          _CMD_GetDisk = "select * from ""GetDisk"" ('" & ДиаметрДиска & "','" & _
 695:          ШиринаДиска & "','" & Вылет_ET & "','" & Сверловка_HOLE & "','" & Сверловка_PCD & "',7," & RecordsetOffset.ToString & ");"
 696:          'ШиринаДиска & "','" & Вылет_ET & "','" & Сверловка_HOLE & "','" & Сверловка_PCD & "','" & ЦентральноеОтверстие_DIA & "',7," & RecordsetOffset.ToString & ")"
 697:          Dim RDR3 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_GetDisk)
 698:          If RDR3.Read Then
 699:              _СкладскиеОстатки_ReadingRecordsetCount = 1
 700:              _ИмпортСкладскихОстатков_i = CInt(RDR3("ИмпортСкладскихОстатков_i"))
 701:              _ИмпортСкладскихОстатков_ДатаИмпорта = RDR3("ИмпортСкладскихОстатков_ДатаИмпо")
 702:              _СкладскиеОстаткиДисков_i.Add(RDR3("i"))
 703:              _СкладскиеОстаткиДисков_Атрикул.Add(RDR3("ПредложениеАртикул"))
 704:              _СкладскиеОстаткиДисков_Наименование.Add(RDR3("ПредложениеНаименование"))
 705:              _СкладскиеОстаткиДисков_Kol.Add(RDR3("ОстатокKol"))
 706:              _СкладскиеОстаткиДисков_Цена.Add(RDR3("ПредложениеЦенаЗаЕдиницу"))
 707:              _СкладскиеОстаткиДисков_ЦенаТекст.Add(RDR3("ПредложениеЦена"))
 708:              _СвойстаТовара_ВылетET.Add(RDR3("Вылет - ET (мм)"))
 709:              _СвойстаТовара_РазмерДиска.Add(RDR3("Размер диска"))
 710:              _СвойстаТовара_Цвет.Add(RDR3("Цвет"))
 711:              _СвойстаТовара_ЦентральноеОтверстиеDIA.Add(RDR3("Центрально отверстие - DIA (мм)"))
 712:              _СвойстаТовара_ТоварКартинка.Add(RDR3("ТоварКартинка"))
 713:              _СвойстаТовара_Сверловка.Add(RDR3("Сверловка"))
 714:              Dim HolePCD() As String = _СвойстаТовара_Сверловка(_СвойстаТовара_Сверловка.Count).ToString.Split("/")
 715:              If HolePCD.Count = 2 Then
 716:                  _СвойстаТовара_Hole.Add(HolePCD(0))
 717:                  _СвойстаТовара_PCD.Add(HolePCD(1))
 718:              Else
 719:                  _СвойстаТовара_Hole.Add("")
 720:                  _СвойстаТовара_PCD.Add("")
 721:              End If
 722:              While RDR3.Read
 723:                  _СкладскиеОстатки_ReadingRecordsetCount += 1
 724:                  _ИмпортСкладскихОстатков_i = CInt(RDR3("ИмпортСкладскихОстатков_i"))
 725:                  _ИмпортСкладскихОстатков_ДатаИмпорта = RDR3("ИмпортСкладскихОстатков_ДатаИмпо")
 726:                  _СкладскиеОстаткиДисков_i.Add(RDR3("i"))
 727:                  _СкладскиеОстаткиДисков_Атрикул.Add(RDR3("ПредложениеАртикул"))
 728:                  _СкладскиеОстаткиДисков_Наименование.Add(RDR3("ПредложениеНаименование"))
 729:                  _СкладскиеОстаткиДисков_Kol.Add(RDR3("ОстатокKol"))
 730:                  _СкладскиеОстаткиДисков_Цена.Add(RDR3("ПредложениеЦенаЗаЕдиницу"))
 731:                  _СкладскиеОстаткиДисков_ЦенаТекст.Add(RDR3("ПредложениеЦена"))
 732:                  _СвойстаТовара_ВылетET.Add(RDR3("Вылет - ET (мм)"))
 733:                  _СвойстаТовара_РазмерДиска.Add(RDR3("Размер диска"))
 734:                  _СвойстаТовара_Цвет.Add(RDR3("Цвет"))
 735:                  _СвойстаТовара_ЦентральноеОтверстиеDIA.Add(RDR3("Центрально отверстие - DIA (мм)"))
 736:                  _СвойстаТовара_ТоварКартинка.Add(RDR3("ТоварКартинка"))
 737:                  _СвойстаТовара_Сверловка.Add(RDR3("Сверловка"))
 738:                  HolePCD = _СвойстаТовара_Сверловка(_СвойстаТовара_Сверловка.Count).ToString.Split("/")
 739:                  If HolePCD.Count = 2 Then
 740:                      _СвойстаТовара_Hole.Add(HolePCD(0))
 741:                      _СвойстаТовара_PCD.Add(HolePCD(1))
 742:                  Else
 743:                      _СвойстаТовара_Hole.Add("")
 744:                      _СвойстаТовара_PCD.Add("")
 745:                  End If
 746:              End While
 747:          Else
 748:              'Dim Y As New ErrForm
 749:              'Y.ErrorMessage = "На этот автомобиль на складе дисков нет."
 750:              'Y.ShowDialog()
 751:              'Exit Sub
 752:          End If
 753:      End Sub
 754:   
 755:      Dim _CMD_AllDiskCount As String
 756:      Public ReadOnly Property CMD_AllDiskCount() As String
 757:          Get
 758:              Return _CMD_AllDiskCount
 759:          End Get
 760:      End Property
 761:   
 762:      Public Function GetAllDiskCount() As String
 763:          _CMD_AllDiskCount = "select * from ""AllDiskCount"";"
 764:          Dim RDR As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_AllDiskCount)
 765:          Dim X As New System.Text.StringBuilder
 766:          If RDR.Read Then
 767:              X.Append("Всего дисков: 12""=")
 768:              X.Append(RDR("12"))
 769:              X.Append(", 13""=")
 770:              X.Append(RDR("13"))
 771:              X.Append(", 14""=")
 772:              X.Append(RDR("14"))
 773:              X.Append(", 15""=")
 774:              X.Append(RDR("15"))
 775:              X.Append(", 16""=")
 776:              X.Append(RDR("16"))
 777:              X.Append(", 17""=")
 778:              X.Append(RDR("17"))
 779:              X.Append(", 18""=")
 780:              X.Append(RDR("18"))
 781:              RDR.Close()
 782:              Return X.ToString
 783:          Else
 784:              Return ""
 785:          End If
 786:      End Function
 787:   
 788:  End Class
 789:   
 790:  ''' <summary>
 791:  ''' ZakazEndDisk
 792:  ''' </summary>
 793:  Public Class SQL_ZakazEndDisk
 794:      Inherits SQL_Postgres
 795:   
 796:      Dim _НомерЗаказа As Integer
 797:      Public ReadOnly Property НомерЗаказа() As Integer
 798:          Get
 799:              Return _НомерЗаказа
 800:          End Get
 801:      End Property
 802:   
 803:      Dim _CMD_AddDiskZakaz As String
 804:      Public ReadOnly Property CMD_AddDiskZakaz() As String
 805:          Get
 806:              Return _CMD_AddDiskZakaz
 807:          End Get
 808:      End Property
 809:   
 810:      Public Sub AddZakaz( _
 811:              ByVal tomodif As Integer, ByVal МаркаАвто As String, ByVal Модель_Наименование As String, ByVal Модификация_Наименование As String, _
 812:              ByVal ГодВыпуска As String, ByVal ИмпортСкладскихОстатков_i As Integer, ByVal ИмпортСкладскихОстатков_ДатаИмпо As String, _
 813:              ByVal СкладскиеОстаткиДисков_i As Integer, ByVal ВыбранныйДиск_ПосадочныйДиаметр As String, _
 814:              ByVal ВыбранныйДиск_Ширина As String, ByVal ВыбранныйДиск_Вылет_ET As String, ByVal ВыбранныйДиск_Сверловка_Hole As String, _
 815:              ByVal ВыбранныйДиск_Сверловка_PCD As String, ByVal ВыбранныйДиск_ЦентральноеОтверст As String, _
 816:              ByVal ВыбранныйДиск_Цвет As String, ByVal ВыбранныйДиск_Атрикул As String, ByVal ВыбранныйДиск_Наименование As String, _
 817:              ByVal ВыбранныйДиск_Kol As String, ByVal ВыбранныйДиск_Цена As String, ByVal Заказ_Количество As String, _
 818:              ByVal Заказчик_Tel As String, ByVal Заказчик_АдресДоставки As String, _
 819:              ByVal Заказчик_ФИО As String, ByVal ДатаЗаказа As String)
 820:          _CMD_AddDiskZakaz = "select * from ""AddDiskZakaz"" ('" & _
 821:              tomodif & "','" & МаркаАвто & "','" & Модель_Наименование & "','" & Модификация_Наименование & "','" & _
 822:              ГодВыпуска & "','" & ИмпортСкладскихОстатков_i & "','" & ИмпортСкладскихОстатков_ДатаИмпо & "','" & _
 823:              СкладскиеОстаткиДисков_i & "','" & ВыбранныйДиск_ПосадочныйДиаметр & "','" & _
 824:              ВыбранныйДиск_Ширина & "','" & ВыбранныйДиск_Вылет_ET & "','" & ВыбранныйДиск_Сверловка_Hole & "','" & _
 825:              ВыбранныйДиск_Сверловка_PCD & "','" & ВыбранныйДиск_ЦентральноеОтверст & "','" & _
 826:              ВыбранныйДиск_Цвет & "','" & ВыбранныйДиск_Атрикул & "','" & ВыбранныйДиск_Наименование & "','" & _
 827:              ВыбранныйДиск_Kol & "','" & ВыбранныйДиск_Цена & "','" & Заказ_Количество & "','" & _
 828:              Заказчик_Tel & "','" & Заказчик_АдресДоставки & "','" & _
 829:              Заказчик_ФИО & "','" & ДатаЗаказа & _
 830:              "');"
 831:          Try
 832:              Dim RDR As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_AddDiskZakaz)
 833:              Dim X As New System.Text.StringBuilder
 834:              If RDR.Read Then
 835:                  _НомерЗаказа = RDR("AddDiskZakaz")
 836:                  RDR.Close()
 837:              End If
 838:          Catch ex As Exception
 839:              Dim Y As New ErrForm
 840:              Y.ErrorMessage = "Не удалось записать заказ." & vbCrLf & _
 841:              ex.Message & vbCrLf & _
 842:              _CMD_AddDiskZakaz.Replace(",", "," & vbCrLf)
 843:              Y.ShowDialog()
 844:              Exit Sub
 845:          End Try
 846:      End Sub
 847:   
 848:  End Class
 849:   
 850:  ''' <summary>
 851:  ''' SelectShinaParameters
 852:  ''' </summary>
 853:  Public Class SQL_ShinaParameters
 854:      Inherits SQL_Postgres
 855:   
 856:      Dim _CMD_ЗаводскаяКомплектацияШин As String
 857:      Public ReadOnly Property CMD_ЗаводскаяКомплектацияШин() As String
 858:          Get
 859:              Return _CMD_ЗаводскаяКомплектацияШин
 860:          End Get
 861:      End Property
 862:   
 863:      Dim _ЗаводскаяКомплектацияШин_Count As Integer = 0
 864:      Public ReadOnly Property ЗаводскаяКомплектацияШин_Count() As Integer
 865:          Get
 866:              Return _ЗаводскаяКомплектацияШин_Count
 867:          End Get
 868:      End Property
 869:   
 870:      Dim _ЗаводскаяКомплектацияШин_ПередняяОсь_ПосадочныйДиаметр As String
 871:      Public ReadOnly Property ЗаводскаяКомплектацияШин_ПередняяОсь_ПосадочныйДиаметр() As String
 872:          Get
 873:              Return _ЗаводскаяКомплектацияШин_ПередняяОсь_ПосадочныйДиаметр
 874:          End Get
 875:      End Property
 876:   
 877:      Dim _ЗаводскаяКомплектацияШин_ПередняяОсь_Ширина As String
 878:      Public ReadOnly Property ЗаводскаяКомплектацияШин_ПередняяОсь_Ширина() As String
 879:          Get
 880:              Return _ЗаводскаяКомплектацияШин_ПередняяОсь_Ширина
 881:          End Get
 882:      End Property
 883:   
 884:      Dim _ЗаводскаяКомплектацияШин_ПередняяОсь_Высота As String
 885:      Public ReadOnly Property ЗаводскаяКомплектацияШин_ПередняяОсь_Высота() As String
 886:          Get
 887:              Return _ЗаводскаяКомплектацияШин_ПередняяОсь_Высота
 888:          End Get
 889:      End Property
 890:   
 891:      Dim _ЗаводскаяКомплектацияШин_i As String
 892:      Public ReadOnly Property ЗаводскаяКомплектацияШин_i() As String
 893:          Get
 894:              Return _ЗаводскаяКомплектацияШин_i
 895:          End Get
 896:      End Property
 897:   
 898:      Sub GetЗаводскаяКомплектацияШин(ByVal ToModif As Integer, ByVal Year As Integer)
 899:          CheckConnect()
 900:          _CMD_ЗаводскаяКомплектацияШин = "select * from ""ЗаводскаяКомплектацияШин"" where tomodif=" & ToModif.ToString & "  and ""Год"" like '" & Year.ToString & "%'  order by i desc limit 1"
 901:          Dim RDR1 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_ЗаводскаяКомплектацияШин)
 902:          If RDR1.Read Then
 903:              _ЗаводскаяКомплектацияШин_Count = 1
 904:              _ЗаводскаяКомплектацияШин_ПередняяОсь_ПосадочныйДиаметр = RDR1("ПередняяОсь_ПосадочныйДиаметр").ToString
 905:              _ЗаводскаяКомплектацияШин_ПередняяОсь_Ширина = RDR1("ПередняяОсь_Ширина")
 906:              _ЗаводскаяКомплектацияШин_ПередняяОсь_Высота = RDR1("ПередняяОсь_Высота")
 907:              _ЗаводскаяКомплектацияШин_i = RDR1("i")
 908:          Else
 909:              _ЗаводскаяКомплектацияШин_Count = 0
 910:              Dim Y As New ErrForm
 911:              Y.ErrorMessage = "ЗаводскаяКомплектацияДисков не найдена." & vbCrLf & vbCrLf & _
 912:              "МаркаАвто=" & MainTerminal.МаркаАвто & vbCrLf & _
 913:              "Модель_Наименование=" & MainTerminal.Модель_Наименование & vbCrLf & _
 914:              "ГодВыпуска=" & MainTerminal.ГодВыпуска & vbCrLf & _
 915:              "Модификация_Наименование=" & MainTerminal.Модификация_Наименование & vbCrLf & _
 916:               vbCrLf & vbCrLf & _
 917:              "Служебная информация для техподдержки:" & vbCrLf & _
 918:              "Импорт_i=" & MainTerminal.Импорт_i & vbCrLf & _
 919:              "Модификация_i=" & MainTerminal.Модификация_i & vbCrLf & _
 920:              _CMD_ЗаводскаяКомплектацияШин.Replace(",", "," & vbCrLf).Replace("from", vbCrLf & "from").Replace("where", vbCrLf & "where").Replace("order", vbCrLf & "order")
 921:              Y.ShowDialog()
 922:              Exit Sub
 923:          End If
 924:      End Sub
 925:   
 926:      Dim _ВариантЗаменыШин_i As Collection
 927:      Public ReadOnly Property ВариантЗаменыШин_i() As Collection
 928:          Get
 929:              Return _ВариантЗаменыШин_i
 930:          End Get
 931:      End Property
 932:   
 933:      Dim _ВариантЗаменыШин_ПередняяОсь_ПосадочныйДиаметр As Collection
 934:      Public ReadOnly Property ВариантЗаменыШин_ПередняяОсь_ПосадочныйДиаметр() As Collection
 935:          Get
 936:              Return _ВариантЗаменыШин_ПередняяОсь_ПосадочныйДиаметр
 937:          End Get
 938:      End Property
 939:   
 940:      Dim _ВариантЗаменыШин_ПередняяОсь_Ширина As Collection
 941:      Public ReadOnly Property ВариантЗаменыШин_ПередняяОсь_Ширина() As Collection
 942:          Get
 943:              Return _ВариантЗаменыШин_ПередняяОсь_Ширина
 944:          End Get
 945:      End Property
 946:   
 947:      Dim _ВариантЗаменыШин_ПередняяОсь_Вылет As Collection
 948:      Public ReadOnly Property ВариантЗаменыШин_ПередняяОсь_Вылет() As Collection
 949:          Get
 950:              Return _ВариантЗаменыШин_ПередняяОсь_Вылет
 951:          End Get
 952:      End Property
 953:   
 954:      Dim _ВариантЗаменыШин_Count As Integer
 955:      Public ReadOnly Property ВариантЗаменыШин_Count() As Integer
 956:          Get
 957:              Return _ВариантЗаменыШин_Count
 958:          End Get
 959:      End Property
 960:   
 961:      Dim _CMD_ВариантЗаменыШин As String
 962:      Public ReadOnly Property CMD_ВариантЗаменыДисков() As String
 963:          Get
 964:              Return _CMD_ВариантЗаменыШин
 965:          End Get
 966:      End Property
 967:   
 968:      Sub GetВариантЗаменыШин(ByVal ToModif As Integer, ByVal Year As Integer)
 969:          CheckConnect()
 970:          '
 971:          _ВариантЗаменыШин_i = New Collection
 972:          _ВариантЗаменыШин_ПередняяОсь_ПосадочныйДиаметр = New Collection
 973:          _ВариантЗаменыШин_ПередняяОсь_Ширина = New Collection
 974:          _ВариантЗаменыШин_ПередняяОсь_Вылет = New Collection
 975:          '
 976:          _CMD_ВариантЗаменыШин = "select * from ""ВариантЗаменыШин"" where tomodif=" & ToModif.ToString & "  and ""Год"" like '" & Year.ToString & "%'  order by i desc limit 1"
 977:          Dim RDR1 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_ВариантЗаменыШин)
 978:          If RDR1.Read Then
 979:              _ВариантЗаменыШин_Count = 1
 980:              _ВариантЗаменыШин_i.Add(RDR1("i"))
 981:              _ВариантЗаменыШин_ПередняяОсь_ПосадочныйДиаметр.Add("R" & RDR1("ПередняяОсь_ПосадочныйДиаметр"))
 982:              _ВариантЗаменыШин_ПередняяОсь_Ширина.Add(RDR1("ПередняяОсь_Ширина"))
 983:              _ВариантЗаменыШин_ПередняяОсь_Вылет.Add(RDR1("ПередняяОсь_Вылет"))
 984:          Else
 985:              _ВариантЗаменыШин_Count = 0
 986:              Dim Y As New ErrForm
 987:              Y.ErrorMessage = "ВариантЗаменыДисков не найден." & vbCrLf & vbCrLf & _
 988:              "МаркаАвто=" & MainTerminal.МаркаАвто & vbCrLf & _
 989:              "Модель_Наименование=" & MainTerminal.Модель_Наименование & vbCrLf & _
 990:              "ГодВыпуска=" & MainTerminal.ГодВыпуска & vbCrLf & _
 991:              "Модификация_Наименование=" & MainTerminal.Модификация_Наименование & vbCrLf & _
 992:               vbCrLf & vbCrLf & _
 993:              "Служебная информация для техподдержки:" & vbCrLf & _
 994:              "Импорт_i=" & MainTerminal.Импорт_i & vbCrLf & _
 995:              "Модификация_i=" & MainTerminal.Модификация_i & vbCrLf & _
 996:              _CMD_ВариантЗаменыШин.Replace(",", "," & vbCrLf).Replace("from", vbCrLf & "from").Replace("where", vbCrLf & "where").Replace("order", vbCrLf & "order")
 997:              Y.ShowDialog()
 998:              Exit Sub
 999:          End If
1000:      End Sub
1001:   
1002:   
1003:   
1004:  End Class
1005:   
1006:  ''' <summary>
1007:  ''' SelectShinaModel
1008:  ''' </summary>
1009:  Public Class SQL_ShinaModel
1010:      Inherits SQL_Postgres
1011:   
1012:      Dim _СкладскиеОстаткиШин_ВсегоПодходящихШин As Integer = 0
1013:      Public ReadOnly Property СкладскиеОстаткиШин_ВсегоПодходящихШин() As Integer
1014:          Get
1015:              Return _СкладскиеОстаткиШин_ВсегоПодходящихШин
1016:          End Get
1017:      End Property
1018:   
1019:      Dim _CMD_Count As String
1020:      Public ReadOnly Property CMD_Count() As String
1021:          Get
1022:              Return _CMD_Count
1023:          End Get
1024:      End Property
1025:   
1026:      Dim _CMD_GetShina As String
1027:      Public ReadOnly Property CMD_GetShina() As String
1028:          Get
1029:              Return _CMD_GetShina
1030:          End Get
1031:      End Property
1032:   
1033:      Public Sub GetКоличествоПодходящихШин(ByVal Диаметр As String, ByVal Высота As String, ByVal Ширина As String)
1034:          _CMD_Count = "select ""ShinaCount""('" & Диаметр & "','" & Высота & "','" & Ширина & "');"
1035:          Dim RDR3 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_Count)
1036:          If RDR3.Read Then
1037:              _СкладскиеОстаткиШин_ВсегоПодходящихШин = RDR3("ShinaCount")
1038:              RDR3.Close()
1039:          Else
1040:              _СкладскиеОстаткиШин_ВсегоПодходящихШин = 0
1041:          End If
1042:      End Sub
1043:   
1044:      Dim _СкладскиеОстатки_ReadingRecordsetCount As Integer
1045:      Public ReadOnly Property СкладскиеОстатки_ReadingRecordsetCount() As Integer
1046:          Get
1047:              Return _СкладскиеОстатки_ReadingRecordsetCount
1048:          End Get
1049:      End Property
1050:   
1051:      Dim _СкладскиеОстаткиШин_i As Collection
1052:      Public ReadOnly Property СкладскиеОстаткиШин_i() As Collection
1053:          Get
1054:              Return _СкладскиеОстаткиШин_i
1055:          End Get
1056:      End Property
1057:   
1058:      Dim _СкладскиеОстаткиШин_Атрикул As Collection
1059:      Public ReadOnly Property СкладскиеОстаткиШин_Атрикул() As Collection
1060:          Get
1061:              Return _СкладскиеОстаткиШин_Атрикул
1062:          End Get
1063:      End Property
1064:   
1065:      Dim _СкладскиеОстаткиШин_Наименование As Collection
1066:      Public ReadOnly Property СкладскиеОстаткиШин_Наименование() As Collection
1067:          Get
1068:              Return _СкладскиеОстаткиШин_Наименование
1069:          End Get
1070:      End Property
1071:   
1072:      Dim _СкладскиеОстаткиШин_Kol As Collection
1073:      Public ReadOnly Property СкладскиеОстаткиШин_Kol() As Collection
1074:          Get
1075:              Return _СкладскиеОстаткиШин_Kol
1076:          End Get
1077:      End Property
1078:   
1079:      Dim _СкладскиеОстаткиШин_Цена As Collection
1080:      Public ReadOnly Property СкладскиеОстаткиШин_Цена() As Collection
1081:          Get
1082:              Return _СкладскиеОстаткиШин_Цена
1083:          End Get
1084:      End Property
1085:   
1086:      Dim _СкладскиеОстаткиШин_ЦенаТекст As Collection
1087:      Public ReadOnly Property СкладскиеОстаткиШин_ЦенаТекст() As Collection
1088:          Get
1089:              Return _СкладскиеОстаткиШин_ЦенаТекст
1090:          End Get
1091:      End Property
1092:   
1093:      Dim _ИмпортСкладскихОстатков_i As Integer
1094:      Public ReadOnly Property [ИмпортСкладскихОстатков_i]() As Integer
1095:          Get
1096:              Return _ИмпортСкладскихОстатков_i
1097:          End Get
1098:      End Property
1099:   
1100:      Dim _ИмпортСкладскихОстатков_ДатаИмпорта As String
1101:      Public ReadOnly Property [ИмпортСкладскихОстатков_ДатаИмпорта]() As String
1102:          Get
1103:              Return _ИмпортСкладскихОстатков_ДатаИмпорта
1104:          End Get
1105:      End Property
1106:   
1107:      Dim _СвойстаТовара_РазмерШины As Collection
1108:      Public ReadOnly Property [СвойстаТовара_РазмерШины]() As Collection
1109:          Get
1110:              Return _СвойстаТовара_РазмерШины
1111:          End Get
1112:      End Property
1113:   
1114:      Dim _СвойстаТовара_ВысотаШины As Collection
1115:      Public ReadOnly Property [СвойстаТовара_ВысотаШины]() As Collection
1116:          Get
1117:              Return _СвойстаТовара_ВысотаШины
1118:          End Get
1119:      End Property
1120:   
1121:      Dim _СвойстаТовара_ШиринаШины As Collection
1122:      Public ReadOnly Property [СвойстаТовара_ШиринаШины]() As Collection
1123:          Get
1124:              Return _СвойстаТовара_ШиринаШины
1125:          End Get
1126:      End Property
1127:   
1128:      Dim _СвойстаТовара_ДиаметрШины As Collection
1129:      Public ReadOnly Property [СвойстаТовара_ДиаметрШины]() As Collection
1130:          Get
1131:              Return _СвойстаТовара_ДиаметрШины
1132:          End Get
1133:      End Property
1134:   
1135:      Dim _СвойстаТовара_ТоварКартинка As Collection
1136:      Public ReadOnly Property [СвойстаТовара_ТоварКартинка]() As Collection
1137:          Get
1138:              Return _СвойстаТовара_ТоварКартинка
1139:          End Get
1140:      End Property
1141:   
1142:      Dim _СвойстаТовара_ИндексНагрузкиШины As Collection
1143:      Public ReadOnly Property СвойстаТовара_ИндексНагрузкиШины() As Collection
1144:          Get
1145:              Return _СвойстаТовара_ИндексНагрузкиШины
1146:          End Get
1147:      End Property
1148:   
1149:      Dim _СвойстаТовара_ИндексСкоростиШины As Collection
1150:      Public ReadOnly Property СвойстаТовара_ИндексСкоростиШины() As Collection
1151:          Get
1152:              Return _СвойстаТовара_ИндексСкоростиШины
1153:          End Get
1154:      End Property
1155:   
1156:      Dim _СвойстаТовара_СезонностьШины As Collection
1157:      Public ReadOnly Property СвойстаТовара_СезонностьШины() As Collection
1158:          Get
1159:              Return _СвойстаТовара_СезонностьШины
1160:          End Get
1161:      End Property
1162:   
1163:      Dim _СвойстаТовара_ТипШины As Collection
1164:      Public ReadOnly Property СвойстаТовара_ТипШины() As Collection
1165:          Get
1166:              Return _СвойстаТовара_ТипШины
1167:          End Get
1168:      End Property
1169:   
1170:      Dim _СвойстаТовара_ШинаПовышеннойПроходимости As Collection
1171:      Public ReadOnly Property СвойстаТовара_ШинаПовышеннойПроходимости() As Collection
1172:          Get
1173:              Return _СвойстаТовара_ШинаПовышеннойПроходимости
1174:          End Get
1175:      End Property
1176:   
1177:      Dim _СвойстаТовара_ШинаУсиленная As Collection
1178:      Public ReadOnly Property СвойстаТовара_ШинаУсиленная() As Collection
1179:          Get
1180:              Return _СвойстаТовара_ШинаУсиленная
1181:          End Get
1182:      End Property
1183:   
1184:      Dim _СвойстаТовара_ШинаШипованная As Collection
1185:      Public ReadOnly Property СвойстаТовара_ШинаШипованная() As Collection
1186:          Get
1187:              Return _СвойстаТовара_ШинаШипованная
1188:          End Get
1189:      End Property
1190:   
1191:      Public Sub GetOstatok(ByVal RecordsetOffset As Integer, ByVal Диаметр As String, ByVal Высота As String, ByVal Ширина As String)
1192:          _СкладскиеОстатки_ReadingRecordsetCount = 0
1193:          _СкладскиеОстаткиШин_i = New Collection
1194:          _СкладскиеОстаткиШин_Атрикул = New Collection
1195:          _СкладскиеОстаткиШин_Наименование = New Collection
1196:          _СкладскиеОстаткиШин_Kol = New Collection
1197:          _СкладскиеОстаткиШин_Цена = New Collection
1198:          _СкладскиеОстаткиШин_ЦенаТекст = New Collection
1199:          _СвойстаТовара_РазмерШины = New Collection
1200:          _СвойстаТовара_ВысотаШины = New Collection
1201:          _СвойстаТовара_ШиринаШины = New Collection
1202:          _СвойстаТовара_ДиаметрШины = New Collection
1203:          _СвойстаТовара_ТоварКартинка = New Collection
1204:          _СвойстаТовара_ИндексНагрузкиШины = New Collection
1205:          _СвойстаТовара_ИндексСкоростиШины = New Collection
1206:          _СвойстаТовара_СезонностьШины = New Collection
1207:          _СвойстаТовара_ТипШины = New Collection
1208:          _СвойстаТовара_ШинаПовышеннойПроходимости = New Collection
1209:          _СвойстаТовара_ШинаУсиленная = New Collection
1210:          _СвойстаТовара_ШинаШипованная = New Collection
1211:          CheckConnect()
1212:          _CMD_GetShina = "select * from ""GetShina"" ('" & Диаметр & "','" & Высота & "','" & Ширина & _
1213:           "',7," & RecordsetOffset.ToString & ");"
1214:          Dim RDR3 As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_GetShina)
1215:          While RDR3.Read
1216:              _СкладскиеОстатки_ReadingRecordsetCount += 1
1217:              _ИмпортСкладскихОстатков_i = CInt(RDR3("ИмпортСкладскихОстатков_i"))
1218:              _ИмпортСкладскихОстатков_ДатаИмпорта = RDR3("ИмпортСкладскихОстатков_ДатаИмпо")
1219:              _СкладскиеОстаткиШин_i.Add(RDR3("i"))
1220:              _СкладскиеОстаткиШин_Атрикул.Add(RDR3("ПредложениеАртикул"))
1221:              _СкладскиеОстаткиШин_Наименование.Add(RDR3("ПредложениеНаименование"))
1222:              _СкладскиеОстаткиШин_Kol.Add(RDR3("ОстатокKol"))
1223:              _СкладскиеОстаткиШин_Цена.Add(RDR3("ПредложениеЦенаЗаЕдиницу"))
1224:              _СкладскиеОстаткиШин_ЦенаТекст.Add(RDR3("ПредложениеЦена"))
1225:              _СвойстаТовара_РазмерШины.Add(RDR3("Размер шины"))
1226:              Dim Combo2() As String = _СвойстаТовара_РазмерШины(_СвойстаТовара_РазмерШины.Count).ToString.Split("/")
1227:              If Combo2.Count = 2 Then
1228:                  _СвойстаТовара_ВысотаШины.Add(Combo2(0))
1229:                  _СвойстаТовара_ШиринаШины.Add(Combo2(1))
1230:              Else
1231:                  _СвойстаТовара_ВысотаШины.Add("")
1232:                  _СвойстаТовара_ШиринаШины.Add("")
1233:              End If
1234:              _СвойстаТовара_ДиаметрШины.Add(RDR3("Посадочный диаметр шины (дюйм)"))
1235:              _СвойстаТовара_ТоварКартинка.Add(RDR3("ТоварКартинка"))
1236:              _СвойстаТовара_ИндексНагрузкиШины.Add(RDR3("Индекс нагрузки шины"))
1237:              _СвойстаТовара_ИндексСкоростиШины.Add(RDR3("Индекс скорости шины"))
1238:              _СвойстаТовара_ТипШины.Add(RDR3("Тип шины"))
1239:              If Not IsDBNull(RDR3("Сезонность шины")) Then
1240:                  _СвойстаТовара_СезонностьШины.Add(RDR3("Сезонность шины"))
1241:              Else
1242:                  _СвойстаТовара_СезонностьШины.Add("")
1243:              End If
1244:              If Not IsDBNull(RDR3("Сезонность шины")) Then
1245:                  _СвойстаТовара_ШинаПовышеннойПроходимости.Add(RDR3("Шина повышенной проходимости (M+S)"))
1246:              Else
1247:                  _СвойстаТовара_ШинаПовышеннойПроходимости.Add("")
1248:              End If
1249:              If Not IsDBNull(RDR3("Сезонность шины")) Then
1250:                  _СвойстаТовара_ШинаУсиленная.Add(RDR3("Шина усиленная (C)"))
1251:              Else
1252:                  _СвойстаТовара_ШинаУсиленная.Add("")
1253:              End If
1254:              If Not IsDBNull(RDR3("Сезонность шины")) Then
1255:                  _СвойстаТовара_ШинаШипованная.Add(RDR3("Шипованная шина"))
1256:              Else
1257:                  _СвойстаТовара_ШинаШипованная.Add("")
1258:              End If
1259:          End While
1260:      End Sub
1261:   
1262:   
1263:  End Class
1264:   
1265:  ''' <summary>
1266:  ''' SQL_ZakazEndShina
1267:  ''' </summary>
1268:  Public Class SQL_ZakazEndShina
1269:      Inherits SQL_Postgres
1270:   
1271:      Dim _НомерЗаказа As Integer
1272:      Public ReadOnly Property НомерЗаказа() As Integer
1273:          Get
1274:              Return _НомерЗаказа
1275:          End Get
1276:      End Property
1277:   
1278:      Dim _CMD_AddShinaZakaz As String
1279:      Public ReadOnly Property CMD_AddShinaZakaz() As String
1280:          Get
1281:              Return _CMD_AddShinaZakaz
1282:          End Get
1283:      End Property
1284:   
1285:      Public Sub AddZakaz( _
1286:              ByVal tomodif As Integer, _
1287:              ByVal МаркаАвто As String, _
1288:              ByVal Модель_Наименование As String, _
1289:              ByVal Модификация_Наименование As String, _
1290:              ByVal ГодВыпуска As String, _
1291:              ByVal ВыбраннаяШина_Высота As String, _
1292:              ByVal ВыбраннаяШина_ПосадочныйДиаметр As String, _
1293:              ByVal ВыбранныйШина_Ширина As String, _
1294:              ByVal ИмпортСкладскихОстатков_i As Integer, _
1295:              ByVal ИмпортСкладскихОстатков_ДатаИмпо As String, _
1296:              ByVal СкладскиеОстаткиШин_i As Integer, _
1297:              ByVal СкладскиеОстаткиШин_Атрикул As String, _
1298:              ByVal СкладскиеОстаткиШин_Наименование As String, _
1299:              ByVal СкладскиеОстаткиШин_Kol As String, _
1300:              ByVal СкладскиеОстаткиШин_Цена As String, _
1301:              ByVal СкладскиеОстаткиШин_ЦенаТекст As String, _
1302:              ByVal СвойстаТовара_ВысотаШины As String, _
1303:              ByVal СвойстаТовара_ДиаметрШины As String, _
1304:              ByVal СвойстаТовара_РазмерШины As String, _
1305:              ByVal СвойстаТовара_ШиринаШины As String, _
1306:              ByVal СвойстаТовара_ИндексНагрузкиШины As String, _
1307:              ByVal СвойстаТовара_ИндексСкоростиШины As String, _
1308:              ByVal СвойстаТовара_СезонностьШины As String, _
1309:              ByVal СвойстаТовара_ТипШины As String, _
1310:              ByVal СвойстаТовара_ШинаПовышеннойПроходимости As String, _
1311:              ByVal СвойстаТовара_ШинаУсиленная As String, _
1312:              ByVal СвойстаТовара_ШинаШипованная As String, _
1313:              ByVal Заказ_Количество As Integer, _
1314:              ByVal Заказчик_Tel As String, _
1315:              ByVal Заказчик_АдресДоставки As String, _
1316:              ByVal Заказчик_ФИО As String, ByVal ДатаЗаказа As String)
1317:   
1318:          _CMD_AddShinaZakaz = "select * from ""AddShinaZakaz"" ('" & _
1319:          tomodif & "','" & МаркаАвто & "','" & Модель_Наименование & "','" & Модификация_Наименование & "','" & ГодВыпуска & "','" & _
1320:          ВыбраннаяШина_Высота & "','" & ВыбраннаяШина_ПосадочныйДиаметр & "','" & ВыбранныйШина_Ширина & "','" & _
1321:          ИмпортСкладскихОстатков_i & "','" & ИмпортСкладскихОстатков_ДатаИмпо & "','" & _
1322:          СкладскиеОстаткиШин_i & "','" & СкладскиеОстаткиШин_Атрикул & "','" & СкладскиеОстаткиШин_Наименование & "','" & _
1323:          СкладскиеОстаткиШин_Kol & "','" & СкладскиеОстаткиШин_Цена & "','" & СкладскиеОстаткиШин_ЦенаТекст & "','" & _
1324:          СвойстаТовара_ВысотаШины & "','" & СвойстаТовара_ДиаметрШины & "','" & СвойстаТовара_РазмерШины & "','" & _
1325:          СвойстаТовара_ШиринаШины & "','" & СвойстаТовара_ИндексНагрузкиШины & "','" & _
1326:          СвойстаТовара_ИндексСкоростиШины & "','" & СвойстаТовара_СезонностьШины & "','" & _
1327:          СвойстаТовара_ТипШины & "','" & СвойстаТовара_ШинаПовышеннойПроходимости & "','" & _
1328:          СвойстаТовара_ШинаУсиленная & "','" & СвойстаТовара_ШинаШипованная & "','" & _
1329:          Заказ_Количество & "','" & Заказчик_Tel & "','" & Заказчик_АдресДоставки & "','" & _
1330:          Заказчик_ФИО & "','" & ДатаЗаказа & "');"
1331:          Try
1332:              Dim RDR As Npgsql.NpgsqlDataReader = PG.ExecRDR(_CMD_AddShinaZakaz)
1333:              Dim X As New System.Text.StringBuilder
1334:              If RDR.Read Then
1335:                  _НомерЗаказа = RDR("AddShinaZakaz")
1336:                  RDR.Close()
1337:              End If
1338:          Catch ex As Exception
1339:              Dim Y As New ErrForm
1340:              Y.ErrorMessage = "Не удалось записать заказ." & vbCrLf & _
1341:              ex.Message & vbCrLf & _
1342:              _CMD_AddShinaZakaz.Replace(",", "," & vbCrLf)
1343:              Y.ShowDialog()
1344:              Exit Sub
1345:          End Try
1346:      End Sub
1347:   
1348:   
1349:  End Class
1350:   
1351:   
1352:  ''' <summary>
1353:  ''' SelectMontageJobs
1354:  ''' </summary>
1355:  Public Class SQL_MontageJobs
1356:      Inherits SQL_Postgres
1357:   
1358:  ....

Теперь посмотрим на уровень SQL - к процедурам которого обращается этот фрагментик BLL. Мы посмотрим только на одну из многих SQL-процедур - GetDisk, обращение к которой происходит в строке 694. Это полиморфная SQL-процедура, к тому же пейджинговая. В связи с громоздкостью кода (и авторскими правами на эту коммерческую разработку) я не могу показать все десятки тысяч строк этой моей BLL - и вы видите в этом небольшом фрагменте лишь один способ обращения к этой процедуре. Но в принципе, процедура устроена так, что в зависимости от количества заданных этой полиморфной функции параметров данные процеживаются через более или менее крупное сито. При задании только первого параметра мы получим многие тысячи шин и дисков на складе, одна когда мы зададим все многочисленные параметры дисков, например количество и расстояние отверстий для крепления дисков - мы получим всего несколько подходящих дисков.


   1:  CREATE OR REPLACE FUNCTION "GetDisk"()
   2:    RETURNS SETOF "GET_СкладскиеОстаткиСоСвойствами" AS
   3:  $BODY$
   4:  SELECT * 
   5:  FROM "GET_СкладскиеОстаткиСоСвойствами"
   6:  WHERE "ОстатокЧисловой">4 
   7:    order by i ;
   8:  $BODY$
   9:    LANGUAGE 'sql' VOLATILE
  10:    COST 100
  11:    ROWS 1000;
  12:  ALTER FUNCTION "GetDisk"() OWNER TO postgres;
  13:   
  14:   
  15:   
  16:  CREATE OR REPLACE FUNCTION "GetDisk"("limit" integer DEFAULT 1000, "offset" integer DEFAULT 0)
  17:    RETURNS SETOF "GET_СкладскиеОстаткиСоСвойствами" AS
  18:  $BODY$
  20:  SELECT * 
  21:  FROM "GET_СкладскиеОстаткиСоСвойствами"
  22:  WHERE "ОстатокЧисловой">4 
  23:    order by i limit $1 offset $2 ;
  24:  $BODY$
  25:    LANGUAGE 'sql' VOLATILE
  26:    COST 100
  27:    ROWS 1000;
  28:  ALTER FUNCTION "GetDisk"(integer, integer) OWNER TO postgres;
  29:   
  30:   
  31:   
  32:  CREATE OR REPLACE FUNCTION "GetDisk"("ДиаметрДиска" character varying DEFAULT ''::character varying, "limit" integer DEFAULT 1000, "offset" integer DEFAULT 0)
  33:    RETURNS SETOF "GET_СкладскиеОстаткиСоСвойствами" AS
  34:  $BODY$
  35:  SELECT * 
  36:  FROM "GET_СкладскиеОстаткиСоСвойствами"
  37:  WHERE "ОстатокЧисловой">4 
  38:    and $1="GET_СкладскиеОстаткиСоСвойствами"."ДиаметрДиска"
  39:    order by i limit $2 offset $3 ;
  40:  $BODY$
  41:    LANGUAGE 'sql' VOLATILE
  42:    COST 100
  43:    ROWS 1000;
  44:  ALTER FUNCTION "GetDisk"(character varying, integer, integer) OWNER TO postgres;
  45:   
  46:   
  47:  CREATE OR REPLACE FUNCTION "GetDisk"("ДиаметрДиска" character varying DEFAULT ''::character varying, "ШиринаДиска" character varying DEFAULT ''::character varying, "limit" integer DEFAULT 1000, "offset" integer DEFAULT 0)
  48:    RETURNS SETOF "GET_СкладскиеОстаткиСоСвойствами" AS
  49:  $BODY$
  50:  SELECT * 
  51:  FROM "GET_СкладскиеОстаткиСоСвойствами"
  52:  WHERE "ОстатокЧисловой">4 
  53:    and $1="GET_СкладскиеОстаткиСоСвойствами"."ДиаметрДиска"
  54:    and $2::real+0.5>= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
  55:    and $2::real<= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
  56:    order by i limit $3 offset $4 ;
  57:  $BODY$
  58:    LANGUAGE 'sql' VOLATILE
  59:    COST 100
  60:    ROWS 1000;
  61:  ALTER FUNCTION "GetDisk"(character varying, character varying, integer, integer) OWNER TO postgres;
  62:   
  63:   
  64:   
  65:  CREATE OR REPLACE FUNCTION "GetDisk"("ДиаметрДиска" character varying DEFAULT ''::character varying, "ШиринаДиска" character varying DEFAULT ''::character varying, "limit" integer DEFAULT 1000, "offset" integer DEFAULT 0)
  66:    RETURNS SETOF "GET_СкладскиеОстаткиСоСвойствами" AS
  67:  $BODY$
  68:  SELECT * 
  69:  FROM "GET_СкладскиеОстаткиСоСвойствами"
  70:  WHERE "ОстатокЧисловой">4 
  71:    and $1="GET_СкладскиеОстаткиСоСвойствами"."ДиаметрДиска"
  72:    and $2::real+0.5>= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
  73:    and $2::real<= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
  74:    order by i limit $3 offset $4 ;
  75:  $BODY$
  76:    LANGUAGE 'sql' VOLATILE
  77:    COST 100
  78:    ROWS 1000;
  79:  ALTER FUNCTION "GetDisk"(character varying, character varying, integer, integer) OWNER TO postgres;
  80:   
  81:   
  82:   
  83:  CREATE OR REPLACE FUNCTION "GetDisk"("ДиаметрДиска" character varying DEFAULT ''::character varying, "ШиринаДиска" character varying DEFAULT ''::character varying, "Вылет_ET" character varying DEFAULT ''::character varying, "limit" integer DEFAULT 1000, "offset" integer DEFAULT 0)
  84:    RETURNS SETOF "GET_СкладскиеОстаткиСоСвойствами" AS
  85:  $BODY$
  86:  -- ширина +0,5, и ET на уменьшение -10
  87:  SELECT * 
  88:  FROM "GET_СкладскиеОстаткиСоСвойствами"
  89:  WHERE "ОстатокЧисловой">4 
  90:    and $1="GET_СкладскиеОстаткиСоСвойствами"."ДиаметрДиска"
  91:    and $2::real+0.5>= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
  92:    and $2::real<= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
  93:    and $3::real>= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."Вылет - ET (мм)",',','.')::real-10
  94:    and $3::real<= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."Вылет - ET (мм)",',','.')::real
  95:    order by i limit $4 offset $5  ;
  96:  $BODY$
  97:    LANGUAGE 'sql' VOLATILE
  98:    COST 100
  99:    ROWS 1000;
 100:  ALTER FUNCTION "GetDisk"(character varying, character varying, character varying, integer, integer) OWNER TO postgres;
 101:   
 102:   
 103:   
 104:  CREATE OR REPLACE FUNCTION "GetDisk"("ДиаметрДиска" character varying DEFAULT ''::character varying, "ШиринаДиска" character varying DEFAULT ''::character varying, "Вылет_ET" character varying DEFAULT ''::character varying, "Сверловка-HOLE" character varying DEFAULT ''::character varying, "limit" integer DEFAULT 1000, "offset" integer DEFAULT 0)
 105:    RETURNS SETOF "GET_СкладскиеОстаткиСоСвойствами" AS
 106:  $BODY$
 107:  SELECT * 
 108:  FROM "GET_СкладскиеОстаткиСоСвойствами"
 109:  WHERE "ОстатокЧисловой">4 
 110:    and $1="GET_СкладскиеОстаткиСоСвойствами"."ДиаметрДиска"
 111:    and $2::real+0.5>= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
 112:    and $2::real<= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
 113:    and $3::real>= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."Вылет - ET (мм)",',','.')::real-10
 114:    and $3::real<= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."Вылет - ET (мм)",',','.')::real
 115:    and $4= "GET_СкладскиеОстаткиСоСвойствами"."Сверловка-HOLE"
 116:    order by i limit $5 offset $6   ;
 117:  $BODY$
 118:    LANGUAGE 'sql' VOLATILE
 119:    COST 100
 120:    ROWS 1000;
 121:  ALTER FUNCTION "GetDisk"(character varying, character varying, character varying, character varying, integer, integer) OWNER TO postgres;
 122:   
 123:   
 124:   
 125:  CREATE OR REPLACE FUNCTION "GetDisk"("ДиаметрДиска" character varying DEFAULT ''::character varying, "ШиринаДиска" character varying DEFAULT ''::character varying, "Вылет_ET" character varying DEFAULT ''::character varying, "Сверловка-HOLE" character varying DEFAULT ''::character varying, "Сверловка-PCD" character varying DEFAULT ''::character varying, "limit" integer DEFAULT 1000, "offset" integer DEFAULT 0)
 126:    RETURNS SETOF "GET_СкладскиеОстаткиСоСвойствами" AS
 127:  $BODY$
 128:  SELECT * 
 129:  FROM "GET_СкладскиеОстаткиСоСвойствами"
 130:  WHERE "ОстатокЧисловой">4 
 131:    and $1="GET_СкладскиеОстаткиСоСвойствами"."ДиаметрДиска"
 132:    and $2::real+0.5>= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
 133:    and $2::real<= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
 134:    and $3::real>= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."Вылет - ET (мм)",',','.')::real-10
 135:    and $3::real<= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."Вылет - ET (мм)",',','.')::real
 136:    and $4= "GET_СкладскиеОстаткиСоСвойствами"."Сверловка-HOLE"
 137:    and $5= "GET_СкладскиеОстаткиСоСвойствами"."Сверловка-PCD"
 138:    order by i limit $6 offset $7
 139:      ;
 140:  $BODY$
 141:    LANGUAGE 'sql' VOLATILE
 142:    COST 100
 143:    ROWS 1000;
 144:  ALTER FUNCTION "GetDisk"(character varying, character varying, character varying, character varying, character varying, integer, integer) OWNER TO postgres;
 145:   
 146:   
 147:   
 148:  CREATE OR REPLACE FUNCTION "GetDisk"("ДиаметрДиска" character varying DEFAULT ''::character varying, "ШиринаДиска" character varying DEFAULT ''::character varying, "Вылет_ET" character varying DEFAULT ''::character varying, "Сверловка-HOLE" character varying DEFAULT ''::character varying, "Сверловка-PCD" character varying DEFAULT ''::character varying, "ЦентральноеОтверстие_DIA" character varying DEFAULT ''::character varying, "limit" integer DEFAULT 1000, "offset" integer DEFAULT 0)
 149:    RETURNS SETOF "GET_СкладскиеОстаткиСоСвойствами" AS
 150:  $BODY$
 151:  SELECT * 
 152:  FROM "GET_СкладскиеОстаткиСоСвойствами"
 153:  WHERE "ОстатокЧисловой">4 
 154:    and $1="GET_СкладскиеОстаткиСоСвойствами"."ДиаметрДиска"
 155:    and $2::real+0.5>= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
 156:    and $2::real<= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."ШиринаДиска",',','.')::real
 157:    and $3::real>= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."Вылет - ET (мм)",',','.')::real-10
 158:    and $3::real<= REPLACE("GET_СкладскиеОстаткиСоСвойствами"."Вылет - ET (мм)",',','.')::real
 159:    and $4= "GET_СкладскиеОстаткиСоСвойствами"."Сверловка-HOLE"
 160:    and $5= "GET_СкладскиеОстаткиСоСвойствами"."Сверловка-PCD"
 161:    and $6= "GET_СкладскиеОстаткиСоСвойствами"."Центрально отверстие - DIA (мм)"
 162:    order by i limit $7 offset $8
 163:      ;
 164:  $BODY$
 165:    LANGUAGE 'sql' VOLATILE
 166:    COST 100
 167:    ROWS 1000;
 168:  ALTER FUNCTION "GetDisk"(character varying, character varying, character varying, character varying, character varying, character varying, integer, integer) OWNER TO postgres;

Такую полиморфность можно съимитировать и в менее развитых СУБД. Хотя там нет ни нормального пейджинга с конструкцией LIMIT, ни полиморфизма. Извернутся все-так возможно, например вот так:


   1:  ALTER PROCEDURE [dbo].[FindFotoPage]
   2:  @Start integer = 0,                --новый контент
   3:  @YearID nvarchar(10) = N'нет',
   4:  @CountryID nvarchar(10) = N'нет',
   5:  @KurortID nvarchar(10) = N'нет',
   6:  @OtelID nvarchar(10) = N'нет',
   7:  @Title nvarchar(max)= N'нет',
   8:  @WithBan bit = 0,
   9:  @PageSize as int = NULL,        --10 - размер странички пейждинга (если опущно - пейджинга нету)
  10:  @PageNum as int = NULL            --0 -  текущий номер странички    (если опущно - пейджинга нету) 
  11:  as
  12:  WITH All_Story as
  13:  (
  14:  SELECT ROW_NUMBER() OVER (order by DataInfo.UserData_i desc) as [ROW_NUMBER],* from DataInfo WITH(NOLOCK) 
  15:  join aspnet_Profile WITH(NOLOCK) on UserData_ToUser= aspnet_Profile.UserId 
  16:  WHERE (ContentType_TypeName=N'Фото') and 
  17:  (dbo.GetAspStringProfileProperty(UserData_ToUser,'LoginIsActivate')='True') and 
  18:  (DataInfo.GroupName_YearID   =@YearID or  @YearID   =N'нет' ) and
  19:  (DataInfo.GroupName_CountryID=@CountryID or  @CountryID=N'нет' ) and
  20:  (DataInfo.GroupName_KurortID =@KurortID  or  @KurortID =N'нет' ) and
  21:  (DataInfo.GroupName_OtelID   =@OtelID    or  @OtelID=   N'нет' ) and
  22:  (DataInfo.UserData_Name like '%'+@Title+'%' or DataInfo.GroupName_GroupName like '%'+@Title+'%' or @Title=N'нет') and
  23:  (DataInfo.UserData_i > @Start) and
  24:  ((@WithBan = 0 and UserData_IsModerban is null) or (@WithBan = 1))
  25:  )
  26:  SELECT * from All_Story WITH(NOLOCK)
  27:  WHERE [ROW_NUMBER]>ISNULL(@PageSize,1)*ISNULL(@PageNum,0) and [ROW_NUMBER]<=ISNULL(@PageSize,1)*ISNULL(@PageNum+1,1000)

Теперь посмотрим еще ниже - на уровень вьюшек, одна из которых использована в полиморфной процедуре GetDisk. Вьюшка GET_СкладскиеОстаткиСоСвойствам построена на двух вьшках более низкого уровня GET_ТоварныйКлассификатор и GET_ВсеСвойстваТовара - каждая из которых построена в свою очередь на других вьшках.


   1:  CREATE OR REPLACE VIEW "GET_СкладскиеОстаткиСоСвойствами" AS 
   2:   SELECT "GET_СкладскиеОстатки".i, "GET_СкладскиеОстатки".toimportsclad, 
   3:          "GET_СкладскиеОстатки"."ПредложениеИд", 
   4:          "GET_СкладскиеОстатки"."ПредложениеАртикул", 
   5:          "GET_СкладскиеОстатки"."ПредложениеНаименование", 
   6:          "GET_СкладскиеОстатки"."ПредложениеБазоваяЕдиница", 
   7:          "GET_СкладскиеОстатки"."ПредложениеБазоваяЕдиницаКод", 
   8:          "GET_СкладскиеОстатки"."ПредложениеБазоваяЕдиницаНаимен", 
   9:          "GET_СкладскиеОстатки"."ПредложениеБазоваяМеждународное", 
  10:          "GET_СкладскиеОстатки"."ПредложениеЦена", 
  11:          "GET_СкладскиеОстатки"."ПредложениеЦенаИдТипаЦены", 
  12:          "GET_СкладскиеОстатки"."ПредложениеЦенаЗаЕдиницу", 
  13:          "GET_СкладскиеОстатки"."ПредложениеЦенаВалюта", 
  14:          "GET_СкладскиеОстатки"."ПредложениеЦенаЕдиница", 
  15:          "GET_СкладскиеОстатки"."ПредложениеЦенаКоэффициент", 
  16:          "GET_СкладскиеОстатки"."Остаток", 
  17:          "GET_СкладскиеОстатки"."ОстатокИдСклада", 
  18:          "GET_СкладскиеОстатки"."ОстатокKol", 
  19:          CASE
  20:              WHEN "substring"("GET_СкладскиеОстатки"."ОстатокKol"::text, '^[[:digit:]]*'::text) = ''::text THEN 0::numeric
  21:              ELSE "substring"("GET_СкладскиеОстатки"."ОстатокKol"::text, '^[[:digit:]]*'::text)::numeric
  22:          END AS "ОстатокЧисловой", 
  23:          "GET_СкладскиеОстатки"."ОстатокЕдиница", 
  24:          "GET_СкладскиеОстатки"."ОстатокКоэффициент", 
  25:          "GET_СкладскиеОстатки"."ИмпортСкладскихОстатков_i", 
  26:          "GET_СкладскиеОстатки"."ИмпортСкладскихОстатков_ДатаИмпо", 
  27:          "GET_ВсеСвойстваТовара".totovar, 
  28:          "GET_ВсеСвойстваТовара"."Вылет - ET (мм)", 
  29:          "GET_ВсеСвойстваТовара"."Индекс нагрузки шины", 
  30:          "GET_ВсеСвойстваТовара"."Индекс скорости шины", 
  31:          "GET_ВсеСвойстваТовара"."Посадочный диаметр шины (дюйм)", 
  32:          "GET_ВсеСвойстваТовара"."Размер диска", 
  33:          CASE
  34:              WHEN "substring"("GET_ВсеСвойстваТовара"."Размер диска"::text, '^[[:digit:]]*'::text) = ''::text THEN '0'::character varying
  35:              ELSE "substring"("GET_ВсеСвойстваТовара"."Размер диска"::text, '^[[:digit:]]*'::text)::character varying(10)
  36:          END AS "ДиаметрДиска", 
  37:          CASE
  38:              WHEN "GET_ВсеСвойстваТовара"."Размер диска"::text = ''::text THEN '0'::character varying
  39:              ELSE "substring"("GET_ВсеСвойстваТовара"."Размер диска"::text, "position"("GET_ВсеСвойстваТовара"."Размер диска"::text, '*'::text) + 1)::character varying(10)
  40:          END AS "ШиринаДиска", "GET_ВсеСвойстваТовара"."Размер шины", "GET_ВсеСвойстваТовара"."Сверловка", 
  41:          CASE
  42:              WHEN "substring"("GET_ВсеСвойстваТовара"."Сверловка"::text, '^[[:digit:]]*'::text) = ''::text THEN '0'::character varying
  43:              ELSE "substring"("GET_ВсеСвойстваТовара"."Сверловка"::text, '^[[:digit:]]*'::text)::character varying(10)
  44:          END AS "Сверловка-HOLE", 
  45:          CASE
  46:              WHEN "substring"("GET_ВсеСвойстваТовара"."Сверловка"::text, '^[[:digit:]]*'::text) = ''::text THEN '0'::character varying
  47:              ELSE "substring"("GET_ВсеСвойстваТовара"."Сверловка"::text, "position"("GET_ВсеСвойстваТовара"."Сверловка"::text, '/'::text) + 1)::character varying(10)
  48:          END AS "Сверловка-PCD", "GET_ВсеСвойстваТовара"."Сезонность шины", "GET_ВсеСвойстваТовара"."Тип шины", "GET_ВсеСвойстваТовара"."Цвет", 
  49:          CASE
  50:              WHEN "substring"("GET_ВсеСвойстваТовара"."Центрально отверстие - DIA (мм)"::text, '^[[:digit:]]*'::text) = ''::text THEN '0'::character varying
  51:              ELSE "substring"("GET_ВсеСвойстваТовара"."Центрально отверстие - DIA (мм)"::text, '^[[:digit:]]*'::text)::character varying(10)
  52:          END AS "Центрально отверстие - DIA (мм)", 
  53:          "GET_ВсеСвойстваТовара"."Шина повышенной проходимости (M+S)", 
  54:          "GET_ВсеСвойстваТовара"."Шина усиленная (C)", 
  55:          "GET_ВсеСвойстваТовара"."Шипованная шина", 
  56:          "GET_ТоварныйКлассификатор"."ТоварИд", 
  57:          "GET_ТоварныйКлассификатор"."ТоварКартинка"
  58:     FROM "GET_СкладскиеОстатки"
  59:     JOIN "GET_ВсеСвойстваТовара" ON "GET_СкладскиеОстатки".i = "GET_ВсеСвойстваТовара".totovar
  60:     JOIN "GET_ТоварныйКлассификатор" ON "GET_ТоварныйКлассификатор"."ТоварАртикул"::text = "GET_СкладскиеОстатки"."ПредложениеАртикул"::text;

Устройство одной из этих двух вьюшек, лежащих в основании GET_СкладскиеОстаткиСоСвойствам, а именно GET_ВсеСвойстваТовара - я описал здесь - Выполняем разворот строк в столбцы в MS SQL и PostgreSQL. В основании всей этой пирамиды вьюшек - находятся собственно таблы с данными в высокореляционной форме.


http://mono-net.ru/


Комментарии к этой страничке ( )
ссылка на эту страничку: http://www.vb-net.ru/PostgreSQL/BLL.htm
<На главную>  <В раздел ASP>  <В раздел NET>  <В раздел SQL>  <В раздел Разное>  <Написать автору>  < Поблагодарить>