Фрагмент реальной BLL на PostgeSQL
Это небольшой фрагмент совершенно реальной BLL, выполненный мною на MONO, использующий вот эту низкоуровневую обвязку коннекта к PostgreSQL и используется на формах cозданного мною терминала примерно вот так.
Классы наследуются от базового класса и добавляют новые методы и свойства:
Это наиболее простой пример BLL из представленных на моем сайте фрагментов выполненных мною BLL. Для меня его ценность в том, что я выполнил его впервые на бесплатном, переносимом на Unix и Windows SQL-сервере PosrgreSQL. С более сложными концепециями построения BLL вы можете познакомится тут:
- Бизнес-объекты на базе типизированных спецколлекций
- Классические Business Logic Layer
- Бизнес-обьекты с плагинной архитектурой
Итак, посмотрим на код этой моей несложной обвязки для работы с данными. Я мог бы выполнить ее в любой технике, например вот в такой Практическое применение наследования, полиморфизма, интерфейсов, дженериков и делегатов на примерах в 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. В основании всей этой пирамиды вьюшек - находятся собственно таблы с данными в высокореляционной форме.
|