WEB-приложение Сведение отчетности- Разработка скриптов загрузки  (раздел целиком)  (26.04.2024)
Разработка скриптов загрузки
Скрипты - загрузчики разрабатываются на языке VBscript . В скрипте загрузки вы можете использовать следующие интерфейсные элементы:
  • Процедура Message (Text: string) передает строковый аргумент пользователю в протокол загрузки отчета.
  • Процедура DebugString (Text: string) передает строковый аргумент в отладочный монитор.
  • Переменная FileName : string (только для чтения) содержит имя загруженного пользователем файла.
  • Переменная xml : Object содержит объект MSXML DOM Document . Во время исполнения скрипта этот документ пуст. Ожидается, что скрипт наполнит его узлами в соответствии с информацией, доступной скрипту их загруженного файла. Именно этот документ будет в дальнейшем загружаться в базу данных. Структура этого документа достаточно подробно описана здесь.
    Совет
    Вы можете вывести текст сформированного документа в отладочный монитор оператором
    DebugString xml.xml
          
  • Переменная InvalidData : BOOL содержит результат разбора файла скриптом. Если ваш скрипт "признал файл своим", присвойте этой переменной значение True, если нет, то присвойте ей значение False.
    Важно!
    Переменная InvalidData по умолчанию имеет значение False. Скрипт, который "забудет" присвоить значение этой переменной, "захватит" любой проходящий через него файл.
  • Функция SessionValue (Name: string) : string возвращает сохраненное в сессии значение с именем, определяемым параметром Name.

Ниже будут рассмотрены особенности загрузчиков файлов различных типов, и даны соответствующие примеры.


1. Загрузка текстовых файлов
В дополнение к ранее описанным объектам, скрипт загрузки текстового файла имеет доступ к следующему:
  • Переменная StringCount : Integer (только для чтения) содержит количество строк в загружаемом текстовом файле.
  • Функция Strings(Index: Integer) : string возвращает строку загружаемого файла с номером Index. Строки нумеруются с нуля. Попытка обратиться к несуществующей строке приведет к ошибке.
Пример
Ниже приведен откомментированный пример скрипта загрузки текстового файла:
001'Так можно и нужно анализировать строки пришедшего текстового файла.
002'Количество строк - StringCount, строка с номером I - Strings(I), нумерация с 0.
003
004'Фактически здесь написано: если на четвертой (с номером 3) строке написано что-то,
005'отличное от "Форма 160/128q", то это не "наш" текстовый файл, его не надо обрабатывать.
006if StringCount < 4 then
007  'Количество строк меньше четырех. Это точно не "нащ" файл.
008  InvalidData = True
009elseif Strings(3) <> "Форма 160/128q" then
010  'Текстовый файл не признан "своим".
011  InvalidData = True
012else
013  'Следите за отступами.
014
015  Message("Анализируем файл.") 'Сообщение пользователю в протокол загрузки.
016
017  '1. Создание корневого элемента REPORTS
018  set xml.documentElement = xml.createElement("REPORTS")
019
020  '2. Создание элемента-отчета. Повторять столько раз, сколько нужно отчетов.
021  with xml.documentElement.appendChild(xml.createElement("REPORT"))
022
023    '3. Атрибуты отчета
024
025    .appendChild(xml.createElement("AGENT")).appendChild(xml.createTextNode("Мнемокод контрагента"))
026    .appendChild(xml.createElement("FORM")).appendChild(xml.createTextNode("Мнемокод формы"))
027    .appendChild(xml.createElement("BDATE")).appendChild(xml.createTextNode("Дата в формете YYYY-MM-DD"))
028    .appendChild(xml.createElement("NOTE")).appendChild(xml.createTextNode("Примечание!!!"))
029    .appendChild(xml.createElement("KIND")).appendChild(xml.createTextNode("0")) '0-первичный, 1-сводный
030
031    'Также можно установить дополнительные атрибуты отчета:
032    '.appendChild(xml.createElement("CATALOG")).appendChild(xml.createTextNode("Наименование каталога"))
033    '.appendChild(xml.createElement("CHECKED")).appendChild(xml.createTextNode("1"))
034    '.appendChild(xml.createElement("STATE")).appendChild(xml.createTextNode("2"))
035    '.appendChild(xml.createElement("SENT")).appendChild(xml.createTextNode("1"))
036
037    '4. Список подотчетов
038    with .appendChild(xml.createElement("SUBREPORTS"))
039
040      '5. Главный подотчет (без мнемокода)
041      with .appendChild(xml.createElement("SUBREPORT"))
042
043        '6. Список значений
044        with .appendChild(xml.createElement("VALUES"))
045
046          'Создать столько значений, сколько нужно.
047          '7. Значение числового показателя
048          with .appendChild(xml.createElement("VALUE"))
049            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод числового показателя"))
050            .appendChild(xml.createElement("NVAL")).appendChild(xml.createTextNode("100.10"))
051          end with
052
053          '8. Значение строкового показателя
054          with .appendChild(xml.createElement("VALUE"))
055            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод строкового показателя"))
056            .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
057          end with
058
059          '9. Значение показателя типа "дата".
060          with .appendChild(xml.createElement("VALUE"))
061            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод показателя типа дата"))
062            .appendChild(xml.createElement("DVAL")).appendChild(xml.createTextNode("2020-01-01"))
063          end with
064
065        end with
066
067        '10. Таблицы показателей - если редакция содержит таблицы показателей.
068        with .appendChild(xml.createElement("TABLES"))
069
070          '11. Таблица. Повторять столько раз, сколько нужно таблиц.
071          with .appendChild(xml.createElement("TABLE"))
072
073            '12. Наименование таблицы
074            .appendChild(xml.createElement("NAME")).appendChild(xml.createTextNode("Наименование таблицы"))
075
076            '13. Строки таблицы
077            with .appendChild(xml.createElement("ROWS"))
078
079              '14. Строка таблицы
080              with .appendChild(xml.createElement("ROW"))
081
082                '15. Значение строкового показателя
083                with .appendChild(xml.createElement("VALUE"))
084                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Показатель в составе талицы"))
085                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
086                end with
087
088                with .appendChild(xml.createElement("VALUE"))
089                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Другой показатель в составе талицы"))
090                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
091                end with
092
093              end with
094
095              '16. Строка таблицы
096              with .appendChild(xml.createElement("ROW"))
097
098                '17. Значение строкового показателя
099                with .appendChild(xml.createElement("VALUE"))
100                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Показатель в составе талицы"))
101                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
102                end with
103
104                with .appendChild(xml.createElement("VALUE"))
105                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Другой показатель в составе талицы"))
106                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
107                end with
108
109              end with
110
111            end with
112
113          end with
114
115        end with
116
117      end with
118
119      '18. Подотчет. Повторять столько раз, сколько нужно подотчетов.
120      with .appendChild(xml.createElement("SUBREPORT"))
121
122        '19. Мнемокод разреза подотчета
123        .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод разреза"))
124
125        '20. Список занчений
126        with .appendChild(xml.createElement("VALUES"))
127
128          'Создать столько значений, сколько нужно.
129          '21. Значение числового показателя
130          with .appendChild(xml.createElement("VALUE"))
131            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод числового показателя"))
132            .appendChild(xml.createElement("NVAL")).appendChild(xml.createTextNode("100.10"))
133          end with
134
135          '22. Значение строкового показателя
136          with .appendChild(xml.createElement("VALUE"))
137            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод строкового показателя"))
138            .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
139          end with
140
141          '23. Значение показателя типа "дата".
142          with .appendChild(xml.createElement("VALUE"))
143            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод показателя типа дата"))
144            .appendChild(xml.createElement("DVAL")).appendChild(xml.createTextNode("2020-01-01"))
145          end with
146
147        end with
148
149        'Создать таблицы, если они нужны.
150
151      end with
152
153    end with
154  end with
155end if
  

2. Загрузка рабочих книг Excel
В дополнение к ранее описанным объектам, скрипт загрузки рабочей книги Excel имеет доступ к следующему:
  • Переменная WorkBook : ExcelWorkBook (только для чтения) содержит объект-рабочую книгу. Через эту переменную вы можете обращаться к любым свойствам и методам объектной модели Microsoft Excel.
Пример
Ниже приведен откомментированный пример скрипта загрузки рабочей книги Excel:
001'Так можно и нужно анализировать ячейки рабочей книги Excel.
002'WorkBook - объект рабочей книги.
003
004'Фактически здесь написано: если на листе "Лист 1" в ячейке D13 содержится значение,
005'отличное от "Форма 160/128q", то это не "наша" рабочая книга, ее не надо обрабатывать.
006
007if WorkBook.WorkSheets("Лист 1").Range("D13").Value <> "Форма 160/128q" then
008  'Текстовый файл не признан "своим".
009  InvalidData = True
010else
011  'Следите за отступами.
012
013  Message("Анализируем файл.") 'Сообщение пользователю в протокол загрузки.
014
015  '1. Создание корневого элемента REPORTS
016  set xml.documentElement = xml.createElement("REPORTS")
017
018  '2. Создание элемента-отчета. Повторять столько раз, сколько нужно отчетов.
019  with xml.documentElement.appendChild(xml.createElement("REPORT"))
020
021    '3. Атрибуты отчета
022
023    .appendChild(xml.createElement("AGENT")).appendChild(xml.createTextNode("Мнемокод контрагента"))
024    .appendChild(xml.createElement("FORM")).appendChild(xml.createTextNode("Мнемокод формы"))
025    .appendChild(xml.createElement("BDATE")).appendChild(xml.createTextNode("Дата в формете YYYY-MM-DD"))
026    .appendChild(xml.createElement("NOTE")).appendChild(xml.createTextNode("Примечание!!!"))
027    .appendChild(xml.createElement("KIND")).appendChild(xml.createTextNode("0")) '0-первичный, 1-сводный
028
029    'Также можно установить дополнительные атрибуты отчета:
030    '.appendChild(xml.createElement("CATALOG")).appendChild(xml.createTextNode("Наименование каталога"))
031    '.appendChild(xml.createElement("CHECKED")).appendChild(xml.createTextNode("1"))
032    '.appendChild(xml.createElement("STATE")).appendChild(xml.createTextNode("2"))
033    '.appendChild(xml.createElement("SENT")).appendChild(xml.createTextNode("1"))
034
035    '4. Список подотчетов
036    with .appendChild(xml.createElement("SUBREPORTS"))
037
038      '5. Главный подотчет (без мнемокода)
039      with .appendChild(xml.createElement("SUBREPORT"))
040
041        '6. Список значений
042        with .appendChild(xml.createElement("VALUES"))
043
044          'Создать столько значений, сколько нужно.
045          '7. Значение числового показателя
046          with .appendChild(xml.createElement("VALUE"))
047            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод числового показателя"))
048            .appendChild(xml.createElement("NVAL")).appendChild(xml.createTextNode("100.10"))
049          end with
050
051          '8. Значение строкового показателя
052          with .appendChild(xml.createElement("VALUE"))
053            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод строкового показателя"))
054            .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
055          end with
056
057          '9. Значение показателя типа "дата".
058          with .appendChild(xml.createElement("VALUE"))
059            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод показателя типа дата"))
060            .appendChild(xml.createElement("DVAL")).appendChild(xml.createTextNode("2020-01-01"))
061          end with
062
063        end with
064
065        '10. Таблицы показателей - если редакция содержит таблицы показателей.
066        with .appendChild(xml.createElement("TABLES"))
067
068          '11. Таблица. Повторять столько раз, сколько нужно таблиц.
069          with .appendChild(xml.createElement("TABLE"))
070
071            '12. Наименование таблицы
072            .appendChild(xml.createElement("NAME")).appendChild(xml.createTextNode("Наименование таблицы"))
073
074            '13. Строки таблицы
075            with .appendChild(xml.createElement("ROWS"))
076
077              '14. Строка таблицы
078              with .appendChild(xml.createElement("ROW"))
079
080                '15. Значение строкового показателя
081                with .appendChild(xml.createElement("VALUE"))
082                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Показатель в составе талицы"))
083                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
084                end with
085
086                with .appendChild(xml.createElement("VALUE"))
087                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Другой показатель в составе талицы"))
088                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
089                end with
090
091              end with
092
093              '16. Строка таблицы
094              with .appendChild(xml.createElement("ROW"))
095
096                '17. Значение строкового показателя
097                with .appendChild(xml.createElement("VALUE"))
098                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Показатель в составе талицы"))
099                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
100                end with
101
102                with .appendChild(xml.createElement("VALUE"))
103                  .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Другой показатель в составе талицы"))
104                  .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
105                end with
106
107              end with
108
109            end with
110
111          end with
112
113        end with
114
115      end with
116
117      '18. Подотчет. Повторять столько раз, сколько нужно подотчетов.
118      with .appendChild(xml.createElement("SUBREPORT"))
119
120        '19. Мнемокод разреза подотчета
121        .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод разреза"))
122
123        '20. Список занчений
124        with .appendChild(xml.createElement("VALUES"))
125
126          'Создать столько значений, сколько нужно.
127          '21. Значение числового показателя
128          with .appendChild(xml.createElement("VALUE"))
129            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод числового показателя"))
130            .appendChild(xml.createElement("NVAL")).appendChild(xml.createTextNode("100.10"))
131          end with
132
133          '22. Значение строкового показателя
134          with .appendChild(xml.createElement("VALUE"))
135            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод строкового показателя"))
136            .appendChild(xml.createElement("SVAL")).appendChild(xml.createTextNode("Строковое значение"))
137          end with
138
139          '23. Значение показателя типа "дата".
140          with .appendChild(xml.createElement("VALUE"))
141            .appendChild(xml.createElement("CODE")).appendChild(xml.createTextNode("Мнемокод показателя типа дата"))
142            .appendChild(xml.createElement("DVAL")).appendChild(xml.createTextNode("2020-01-01"))
143          end with
144
145        end with
146
147        'Создать таблицы, если они нужны.
148
149      end with
150
151    end with
152  end with
153end if