Создание показа карточки напоминает создание SQL – сценария, хотя и имеет некоторые отличия вызванные необходимостью возвращать в качестве результата код HTML-страницы. Пример такого кода задан в самой карточке по умолчанию. Две особенности, которые следует учитывать.
--переменная _NUMBER_CONTACTS_ номер контакта --переменная _CSS_DIRECT_ папка CSS файла --переменная _PROGRAM_IMAGE_FOLDER_ папка IMAGE При исполнении сценария кодовые слова заменяются соответствующими числовыми значениями или строковыми, далее полученный SQL-сценарий исполняется на MS SQL сервере, который возвращает необходимый набор строк. Далее строки "склеиваются программой" и интерпретируются для показа в виде html-страницы.
Количество строк = (длина текста / 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 (это строго обязательно), строки отсортированы в порядке их добавления. Далее программа сама их склеит в виде одной строки и представит в виде страницы. |