На главную страницу RastrWin

Работа с SQL


Этот скрипт был разработан для ПО ActOpus для ввода данных из SQL базы данных (с помощью ADO). Может использоваться в качестве примера взаимодействия с SQL БД.

 


 

Скрипт "Загрузка графиков с SQL" предназначен для ввода данных по графикам конечных потребителей в ПО Актуализации "ActOpus".

Для работы скрипта в ПО должен быть загружен файл БД актуализации за требуемые сутки. При работе скрипт анализирует содержимое поля "Код макета" в таблице "Потребители2"  и по данному коду обеспечивает загрузку графиков потребителей в таблицу "Графики нагрузок", выполняя необходимое индексирование по номерам точек и номерам потребителей. Для работы скрипта требуется возможность связи с БД SQL. Доступ к БД скрипт осуществляет с помощью ADO.

Скрипт должен быть расположен в подкаталоге Macro в каталоге установки ПО Актуализации.

Запуск скрипта осуществляется с помощью команды "Выполнить" меню "Расчеты". Кроме того, возможен запуск скрипта с помощью оболочки макро - команда "Макро..." меню "Расчеты". При выполнении скрипта выводится окно выбора даты, за которую из БД будут введены графики нагрузки потребителей.

При загрузке графиков скрипт в отношении каждого потребителя действует по следующему алгоритму:

По окончании работы скрипт может вывести до трех окон сообщений: 

  1. Список потребителей, по которым график успешно загружен. Выводится при наличии успешно введенных графиков.
  2. Список потребителей, по которым график присутствовал в таблице "Графики нагрузок" и пользователь отказался от его обновления из БД SQL. Выводится при наличии потребителей, по которым график не был обновлен.
  3. Список потребителей, по которым отсутствовали базовые нагрузки. Выводится при наличии таких потребителей.

В данных окнах отображаются только потребители, которые имели график в БД SQL на выбранную пользователем дату.

При обращении к базе скрипт использует один  запрос для каждого потребителя по таблице PDG_h:

     strSQLquery="SELECT * FROM PDG_h WHERE (kpo_obj='" & MktCode &_
                 "') And (data='" & strDate & "') And (id_pok=33)"

При этом подразумевается, что код показателя "Заявка на почасовой график потребления" имеет номер 33 (id_pok=33).

' Скрипт позволяет загрузить в БД ActOpus данные из БД SQL-server
' по графикам потребителей. Использует ADO.
' (С) Машалов Е. ОДУ Урала, 2003


' Создаем объекты доступа к данным
Set ADO = CreateObject("ADODB.Connection")
Set RS  = CreateObject("ADODB.Recordset")

' Описываем параметры соединения с БД
DSN = "Driver=SQL Server;UID=user;PWD=letmein;SERVER=sqlserver;DATABASE=Graphic;Mode=Read"
' Открываем БД SQL
ADO.Open(DSN)

' Выполняем запрос даты, за которую нужно ввести данные по графикам
strDate = Rastr.SendCommandMain(7,"","",0) 

' Строим строку даты для SQL-запроса
DateDD  = Left(strDate,2)
DateYY  = Right(strDate,2)
DateMM  = Mid(strDate,3,2)
strDate = DateMM & "." & DateDD & "." & DateYY


' Инициализируем списки отчетов
LoadedList = vbCrLf
RejectedList = vbCrLf
PresentList = vbCrLf

' Подключаемся к таблицам "Потребители2" и "График нагрузки" в БД ActOpus
Set ConsumerTable = Rastr.Tables("Consumer2")
Set PLoadTable    = Rastr.Tables("Pload")

' Ищем графики потребителей в БД-SQL

for ConsNdx = 0 to ConsumerTable.Size-1
    ConsNum  = ConsumerTable.Cols("Num").Z(ConsNdx)
    MktCode  = ConsumerTable.Cols("MktCode").Z(ConsNdx)
    ConsName = ConsumerTable.Cols("Name").Z(ConsNdx)
    ConsPmax = ConsumerTable.Cols("Pmax").Z(ConsNdx)
    ConsPmid = ConsumerTable.Cols("Pmid").Z(ConsNdx)
    ConsPmin = ConsumerTable.Cols("Pmin").Z(ConsNdx)


' Готовим и выполняем SQL-запрос по коду макета из таблицы "Потребители2"
    strSQLquery="SELECT * FROM PDG_h WHERE (kpo_obj='" & MktCode &_
                 "') And (data='" & strDate & "') And (id_pok=33)"
     RS.Open strSQLquery,ADO


' Проверяем наличие графика для данного потребителя 
     If Not RS.EOF Then         
        PLoadTable.SetSel("Num=" & ConsNum)
            Answ = vbYes

    ' Если график для данного потребителя уже есть в БД ActOpus, спрашиваем пользователя:
    ' "Следует ли обновить график ?"

            if PLoadTable.Count > 0 Then
                Answ = MsgBox ("По потребителю " & ConsNum & " [" & ConsName & "] график уже" &_
 " загружен. Обновить ?", vbYesNo)
                if Answ = vbYes Then 
    ' Если пользователь хочет обновить график, стираем существующий график в БД ActOpus

                    PLoadTable.DelRows
                End if
            End if
    ' Если пользователь отказался от обновления графика, переходм к следующему
          If Answ = vbYes Then
    ' Если пользователь хочет обновить график, проверяем есть ли у потребителя базовые нагрузки

          if ConsPmax <> 0 Or ConsPmin <> 0 Or ConsPmin <> 0 Then
               PLoadTable.SetSel("")
    ' Загружаем график в таблицу "Графики нагрузок"

    ' Весь график помещаетcя в одной записи, в полях h0 - h23
    ' Поэтому мы выбираем поля для объекта RS (recordset) динамически
               RS.MoveFirst
               While Not RS.EOF 
                    For i=1 To 24 
                         If i<=9 Then
                              RetVal=RS.Fields("h0"&i).Value
                         Else

                              RetVal=RS.Fields("h"&i).Value
                         End If
    ' Добавляем новую запись к таблице "Графики нагрузок" и заполняем ее
                        PLoadTable.AddRow
                        PLNdx = PLoadTable.Size-1
                        PLoadTable.Cols("Num").Z(PLNdx)     = ConsNum
                        PLoadTable.Cols("NPoint").Z(PLNdx)     = i
                        PLoadTable.Cols("P").Z(PLNdx)        = RetVal
                        PLoadTable.Cols("Q").Z(PLNdx)        = 0

                    Next
                    RS.MoveNext
                Wend
                LoadedList = LoadedList + CStr(ConsNum) + " [" + ConsName + "]" + vbCrLf
           Else

                RejectedList = RejectedList + CStr(ConsNum) + " [" + ConsName + "]" + vbCrLf
       End if
       Else
             PresentList = PresentList + CStr(ConsNum) + " [" + ConsName + "]" + vbCrLf
       End If

    End If
    RS.Close
Next
' После завершения работы закрываем БД и информируем 
' пользователя о проделанной работе
ADO.Close

if Len(LoadedList) > 2 Then
    MsgBox "Графики загружены для :" & LoadedList
End if

if Len(RejectedList) > 2 Then
    MsgBox "Не имеют базовых нагрузок :" & RejectedList

End if

if Len(PresentList) > 2 Then
    MsgBox "Уже имеют график нагрузки:" & PresentList
End if


Работает на «Битрикс: Управление сайтом» © «Битрикс», 2001-2006