Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL - Генерация HTML: options  [new]
ART-CODE
Member

Откуда:
Сообщений: 1082
Может собрать все способы генерации HTML в один пост?

Вот здесь я нашел немного про таблицы:
https://www.sql.ru/Forum/actualthread.aspx?tid=683100&pg=1&hl=?

А когда мне понадобилось создать на форме выпадающий список, то сваял
хранимку: (предлогаю попробовать и написать свои замечания)
CREATE procedure [dbo].[hta_GetOptionList]  
(
@SQLQuery nvarchar(max),  
@FieldValue varchar(100),    -- имя поля, значения которого записываются в value
@FieldText varchar(100),     -- имя поля, значения которого отображаются как видимый пользователем текст
@SelectedField varchar(100), -- имя поля, значение которого будем проверять для установки selected
@SelectedValue varchar(100) ,--  значение для установки selected
@OrderBy nvarchar(max) ,    -- задаем сортировку
@Options  nvarchar(max) OUT
)
AS
BEGIN
	set nocount on;
-------------------------
declare @StrReturnValue nvarchar(max)
set @Options=''
set @StrReturnValue=''
set @SQLQuery='select @StrReturnValue=@StrReturnValue+''<option '''+'+(case when ['+@SelectedField
+']='+@SelectedValue +' then '' selected'' else '''' end)+'+''' value="''+dbo.Text2HTML(['+@FieldValue
+'])+'''+'">''+dbo.Text2HTML(['+@FieldText+'])'+'+''</option>''+char(13)+char(10) from ('+@SQLQuery+') tmp '+@OrderBy
exec sp_executesql @SQLQuery,N'@StrReturnValue varchar(max) out',@StrReturnValue=@StrReturnValue out
set @Options=@StrReturnValue
-------------------------- 
END
пример вызова
declare @StrR as nvarchar(max)
set @StrR=''
exec hta_GetOptionList 'select  FIO, idcust from customers where idcust<20' , 'idcust','FIO','idcust','12','order by FIO ',@StrR out
select '<SELECT ID="S1"  SIZE=1  > ' +@StrR +'</SELECT>'as [html_select]
как видим, хранимка позволяет строить выпадающий список на основе произвольного запроса
при этом можно указать - какие поля будут Value, а какие Текст и можно задать условие , по
которому определенное значение будет selected.

для корректного отображения html еще требуется функция
CREATE function [dbo].[Text2HTML] 
(
@sText varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
return Replace( Replace( Replace( Replace( @sText, '&','&'),'"','"'  ),'<','<'  ) ,'>','>'  )
END

Наверняка все это можно сделать и иначе, интересно будет узнать как..
17 дек 09, 13:47    [8080410]     Ответить | Цитировать Сообщить модератору
 Re: SQL - Генерация HTML: options  [new]
ART-CODE
Member

Откуда:
Сообщений: 1082
Ах, да, забыл: MS SQL Server 2005
17 дек 09, 13:49    [8080437]     Ответить | Цитировать Сообщить модератору
 Re: SQL - Генерация HTML: options  [new]
ART-CODE
Member

Откуда:
Сообщений: 1082
Поврежден код функции Text2HTML
вот правильный вариант
return Replace( Replace( Replace( Replace( @sText, '&','&amp;'),'"','&quot;'  ),'<','&lt;'  ) ,'>','&gt;'  )
17 дек 09, 14:26    [8080735]     Ответить | Цитировать Сообщить модератору
 Re: SQL - Генерация HTML: options  [new]
ART-CODE
Member

Откуда:
Сообщений: 1082
нет, лучше так:
CREATE function [dbo].[Text2HTML] 
(
@sText varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
return (select @sText [data()] for xml path(''))
END
17 дек 09, 15:04    [8081138]     Ответить | Цитировать Сообщить модератору
 Re: SQL - Генерация HTML: options  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Никакой безопастности, прозрачности и структурности кода. Одним словом быдлокодство.

1. Генерация HTML и всего подобного на сервере - использование не по назначению.
СУБД плохо масштабируемы.
Разве что поиграться, для внутреннего проектика, с ограниченным числом пользователей.

2. Если начали пользоваться FOR XML, зачем это спагетти кода - чёрт ногу сломит разобраться в итак почти нулевом функционале.

3. Не надо универсализировать код, когда его использование занимает ещё больше кода. Не говоря о его сомнительной оптимальности.
Нафиг эти @FieldValue, @FieldText, @SelectedField. Банальное требование - обязательное наличие колонок [value] и [option] и [selected] в @SQLQuery.
SELECT [select].*,IDCust [@value],CASE WHEN IDCust = 12 THEN 'selected' END [@selected],FIO [data()]
FROM (SELECT 'S1',1)[select](id,[size]) CROSS JOIN dbo.Customers [option]
WHERE IDCust < 20 ORDER BY FIO FOR XML Auto

4. Совершенное непонимание того факта, что этот подход забивает на корню возможность нахождения: ошибок и нахождения узких/неоптимальных мест работы. Как только у вас начнёт что-то "тормозить" или выпадать валидация. Легче проект полностью убить, и написать нормально заново.

5. Абсолютное непонимание того что использование процедурного подхода (EXEC):
- забивает на корню половина возможностей использования этого функционала
- отсутствия контроля доступа к данным
- полный запрет серверу самому оптимизировать запросы (в зависимости от смены статистики данных, например)
Очень просто - Stored Proc в основном для изменении данных (или оконечных вызовов), а запросы / представления (параметризованные) / табличные функции для получения данных]

Не надо такого поста - незачем людей пугать и предлагать забивать гвозди микроскопом.
Возмите хотябы последний Visual Studio и набросайте в более дружественном интерфейсе вашу домашнюю страничку.
Или если не хотите "лишних компонентов" тогда нормально покурите доки по вебу. CSS, XSLT, JS. Тогда поймёте, что генерировать нативный код страниц нас сервере, да ещё и в недружественной среде - глупо.
17 дек 09, 23:34    [8083785]     Ответить | Цитировать Сообщить модератору
 Re: SQL - Генерация HTML: options  [new]
ART-CODE
Member

Откуда:
Сообщений: 1082
Mnior,
Спасибо за набросок кода, я с запросами типа for xml второй день - как знаком, поэтому пока не
вьехал как они грамотно пишутся.
Жаль, только что по Вашему коду получается это:
<select id="S1" size="1">
  <option _x0040_value="17" data_x0028__x0029_="Петров Василий Иванович" />
  <option _x0040_value="12" _x0040_selected="selected" data_x0028__x0029_="Василий Петроивч Иванов" />
  <option _x0040_value="11" data_x0028__x0029_="ЗАО "Петрович"" />
  <option _x0040_value="18" data_x0028__x0029_="Иванов Петр Васильевич" />
</select>
вместо этого
<select id="S1" size="1">
  <option value="17" >Петров Василий Иванович</option >
  <option value="12" selected >Василий Петроивч Иванов </option >
  <option value="11" >ЗАО "Петрович" </option >
  <option value="18" >Иванов Петр Васильевич </option >
</select>
Разница ощутимая...

Про архтектуру и знание CSS /Script ets... - это в данном случае немного лишнее, с архитектурой проекта все нормально, она соответсвует масштабу и целям задачи. В свое время несколько сайтов сделал, писал и на php и на JavaScript/VBS и Cgi делал на C++ , так, что все это осознанный выбор человека, который делал тоже самое моного раз на разных ЯП. Просто с запросам FOR XML надо мне еще потренироваться чтобы писать более грамотно...
18 дек 09, 10:57    [8085079]     Ответить | Цитировать Сообщить модератору
 Re: SQL - Генерация HTML: options  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
ART-CODE
Разница ощутимая...
Я б посмотрел на вас, когда вы в голом gedit (под Ubuntu) напишите запросец за 5 минут не глядя в BOL. А сами в обнимку с сервером наверное сидите - так каждый сможет.
Вот попытка номер следующая:
SELECT 'S1' @id, 1 [@size], (
	SELECT IDCust [@value], CASE WHEN IDCust = 12 THEN 'selected' END [@selected],FIO [*]
	FROM dbo.Customers WHERE IDCust < 20 ORDER BY FIO FOR XML Path('option'),Type
) FOR XML Path('select')
19 дек 09, 01:56    [8089928]     Ответить | Цитировать Сообщить модератору
 Re: SQL - Генерация HTML: options  [new]
ART-CODE
Member

Откуда:
Сообщений: 1082
Mnior,
Благодарю за помощь, все замечательно работает!
(не считая мелкой опечатки: должно быть [@id] вместо просто @id)
22 дек 09, 10:57    [8099809]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить