Создание HTML-карточки

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

Две особенности, которые следует учитывать.

  1. В качестве переменных в SQL-сценарии можно использовать следующие кодовые слова:

--переменная _NUMBER_CONTACTS_      номер контакта

--переменная _CSS_DIRECT_      папка CSS файла

--переменная _PROGRAM_IMAGE_FOLDER_ папка IMAGE  

При исполнении сценария кодовые слова заменяются соответствующими числовыми значениями или строковыми, далее полученный SQL-сценарий исполняется на MS SQL сервере, который возвращает необходимый набор строк. Далее строки "склеиваются программой" и  интерпретируются для показа в виде html-страницы.

  1. В качестве выходных данных (напоминаем что в данном случае выходные данные – это по сути страница HTML) необходимо использовать переменную с именем Res длиной до 4000 символов, либо набор строк длиной до 4000 символов выведенный в виде столбца с именем Res. Таким образом если полученный HTML-код превышает 4000 символов, необходимо разбить его на строки по 4000 символов и возвращать количество строк:

Количество строк = (длина текста / 4000) – если деление произошло без остатка.

Количество строк = (длина текста / 4000)+1, где +1 – если деление не целочисленное и будет остаток.

Строки должны быть собраны в таблицу и столбец с результатами должен иметь наименование Res.

Самый простой пример из всех возможных, не требует практически никаких знаний. В общем-то он показывает как вставлять свой запрос и выводить текст.

Нажимаете кнопку SQL и в открывшемся окне пишете:

Select '<b><u>Это тестовый пример, и так он выглядит ! </u></b>' as RES

Далее сохраняете нажатием на кнопку Сохранить и нажимаете иконку обновить на карточке (можно просто переоткрыть карточку).

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

Как известно, MS SQL сервер поддерживает расширение SQL называемое Transact-Sql, именно на нем пишут хранимые процедуры, запросы и функции для MS SQL. 

 

Таким образом, входящий в A-Number CRM пример написан на Transact-SQL, в котором  номер контакта и пути к папкам заменены соответствующими переменными.

Краткие комментарии к примеру.

1. Сначала объявляем переменные. 

declare @VarHtml nvarchar(4000), @bitTextComment bit, @bitBigText bit, @TextComment nvarchar(1000),@x nvarchar(1000),@WWW varchar(250)

2. В переменную  @VarHtml  записываем начало будущей HTML страницы.

set @VarHtml=     '<html>'+

                  '<head>'+

                  '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">'+

                  '</head>'

3. Первая строка будущей страницы – с номером контакта

set @VarHtml=@VarHtml+@VarHtml+'<p><u><b><font color="blue">Контакт №:_NUMBER_CONTACTS_</font></b></p></u>'

4. Создаем курсор, в котором пробегаем поля таблицы контактов. В принципе, большого значения данный код не имеет и рассматривать его построчно не имеет смысла, так как тут мог быть любой код на Transact-SQL. В переменную @VarHtml записываем будущую HTML страницу. Надо иметь в виду – код исключительно демонстрационный, поэтому не учтено что размер страницы может оказать больше 4000 символов.

--переменные для курсора

declare @SQL nvarchar(4000), @curVal varchar(250), @Res varchar(250)

SET NOCOUNT ON

DECLARE @Field_Name varchar(250), @Field_Value varchar(250), @Guide bit

--создаем курсор по запросу select Field, Field_Name, Guide from Field_Name

DECLARE WebCard_Cursor CURSOR FOR select Field, Field_Name, Guide from Field_Name

OPEN WebCard_Cursor

FETCH NEXT FROM WebCard_Cursor INTO @Field_Name, @Field_Value, @Guide

WHILE @@FETCH_STATUS = 0

BEGIN

--находим значение поля из таблицы контактов

      set @SQL='select '+@Field_Name+' from contacts where id_contacts=_NUMBER_CONTACTS_'

      create table #prom_sql (val varchar(250)) insert #prom_sql exec sp_executesql @SQL

      set @curVal=(select val from #prom_sql)

      drop table #prom_sql

--если поле справочное смотрим значение справочника

      if isnull(@Guide,0)=1

       begin

         if isnumeric(@curVal)=1

           begin

             set @Res=(select dbo.multiGuideForContacts(cast(@curVal as int)))

             set @Res=isnull(@Res,'')

           end else set @Res='' 

-- вносим справочное значение в будущую страницу с цветом BROWN и тэгом BR переходим на строку ниже

            set @VarHtml=@VarHtml+'<font color="Brown">'+@Field_Value+' '+'</font>'+@Res+'<BR>'

       end

--если не поле не справочное сразу вносим значение в будущую страницу с цветом BROWN и тэгом BR переходим на строку ниже

      if isnull(@Guide,0)=0  set @VarHtml=@VarHtml+'<font color="Brown">'+@Field_Value+' '+'</font>'+isnull(cast(@curVal as varchar(250)),'')+'<BR>'

-- двигаемся к следующей записи в курсоре

 FETCH NEXT FROM WebCard_Cursor INTO @Field_Name, @Field_Value, @Guide

END

--закрываем курсор и чистим память

CLOSE WebCard_Cursor

DEALLOCATE WebCard_Cursor

5.  Закрываем начальный ТЭГ

set @VarHtml=@VarHtml+'</html>'

6. Собственно выводим результат:

select @VarHtml as Res

7. Особенности вывода результатов. В случае если страница будет больше 4000 символов (это весьма вероятно, особенно если используется много тэгов) следует позаботиться о разбиении строки на подстроки и записи в промежуточную таблицу. Это можно сделать например так:

--где нибудь в начале скрипта создаем таблицу для будущих результатов

if object_id('tempdb..#TableForRes') is not null drop table #TableForRes

create table #TableForRes ([id] int identity(1,1), Res varchar(4000))

- в циклах и прочих критических местах вставляем например такой код со смыслом: если длина строки превысила 3000 символов далее не рискуем и записываем строку в промежуточную таблицу, а саму строку обнуляем.

if datalength(@VarHtml)>3000

begin

insert #TableForRes (Res)

values(@VarHtml)

set @VarHtml=''

end

- В конце выводим результаты:

select Res from #TableForRes order by [id] asc

Столбец с результатами называется RES (это строго обязательно), строки отсортированы в порядке их добавления. Далее программа сама их склеит в виде одной строки и представит в виде страницы.

 
© 2005 - 2015 A-Number Software. Все права защищены                          Написать письмо