Как получить раскрывающийся фильтр в информационном канале Spotfire? - PullRequest
0 голосов
/ 31 января 2019

Обычно люди используют опцию по умолчанию, которую дает Spotfire.Подключитесь к БД и извлеките набор необходимых вам столбцов, создайте информационную ссылку и загрузите данные в Spotfire.

Однако я использую SQL Query для извлечения данных в Spotfire.Я создаю таблицу, аналогичную представлениям, и пишу простую хранимую процедуру для извлечения данных:

Create procedure ProcA(In Start_Date date, IN End_Date date, In Site_Name text)
Begin

SELECT * FROM TableA where day between Start_Date and End_Date and
site_name = Site_Name;

Это прекрасно работает, если я не использую фильтрацию имен сайтов.

Информационные ссылкипомогает правильно фильтровать дату.Но когда дело доходит до имени сайта, ничего не работает.

Есть 2 требования:

  1. Можно ли дать раскрывающийся список так же, как фильтр приходит для даты
  2. Как передать несколько имен сайтов, чтобы вытащить только эти сайты в файл Spotfire

1 Ответ

0 голосов
/ 13 февраля 2019

TL; DR: есть лучшие способы сделать это;если это только для имен столбцов, я не думаю, что это стоит того, чтобы выполнить часть 2, поскольку достаточно легко изменить sql в информационной ссылке, но это возможно.

Хорошо, я попробую (читай: не получилось) не слишком затянуто.

1) Можно ли сделать раскрывающийся список дат? Да. Самый простой способсделать это будет вытащить таблицу данных со всеми вашими датами выбора, доступными для конечного пользователя.Вот пример поиска списка лучшего способа создания таблицы месяцев / лет Помните, что при создании выпадающего списка ваше свойство документа должно иметь тип данных «Дата», и тогда вы сможете установить значения свойствачерез Уникальные значения в столбце против вашего столбца даты из новых данных, так же, как вы делали бы это для выпадающего списка строк.

Если у вас есть небольшое подмножество конкретных дат на выбор, это, вероятно, нене так уж плохоЕсли выпадающий список становится длиннее, ваши конечные пользователи могут ввести дату, которую они ищут, чтобы ускорить поиск (хотя, по моему опыту, многие из них будут прокручивать, пока не найдут дату, которую ищут).

Хотя это вполне приемлемо, если вам удобно добавлять javascript, я лично рекомендую использовать всплывающий календарь 1016 * Это довольно просто для конечных пользователей и можетразрешить им использовать календарь или ввести его самостоятельно.(И если они набирают что-то, в чем не указана дата, даже достаточно любезно сообщить им красными буквами и восклицательным знаком, что они не набрали фактическую дату)

2) Какпередать несколько имен сайтов, чтобы вытащить только эти сайты в файл Spotfire

Hoo Boi, с чего начать.

Шаг первый: Как вы хотитевыбрать свой список имен сайтов?Я собираюсь пойти дальше и предположить, что у вас есть таблица данных со списком различных имен сайтов.

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

Когда мне нужно было сделать это, я сделал комбо изтаблица данных и текстовая область, вот что я собираюсь описать здесь.

Я начну с предоставления пользователю текстовой области, отформатированной в «определенный размер» с большей, чем обычно, высотой, чтобы запроситьчто, да, им разрешено набирать несколько строк.Если им известны значения, которые они ищут, они могут ввести их вручную или скопировать вставку из файла Excel и т. Д.

Если они не знают, что ищут, списокИмена сайтов будут отображаться в таблице, отображаемой для пользователя, где они могут затем отметить нужные строки на визуализации и нажать кнопку, которая проведет курсор по списку отмеченных имен сайтов, объединит их вместе и поместит их втекстовое поле, упомянутое ранее (примечание: если вы не хотите, чтобы они вводили свой список вручную, вы можете не указывать текстовую область, объединить следующие два фрагмента кода и выбросить их прямо в SpecialFilterProperty).

Обратите внимание, что курсоры медленные;если у вас есть несколько тысяч строк для циклического перебора, это может остановиться на несколько секунд.

Код кнопки:

from Spotfire.Dxp.Application.Visuals import CrossTablePlot
from Spotfire.Dxp.Data import IndexSet
from Spotfire.Dxp.Data import RowSelection
from Spotfire.Dxp.Data import DataValueCursor
from Spotfire.Dxp.Data import DataSelection

TextFltr = ""

crossSource = Document.Data.Tables["Distinct_SiteNames"]

##Get a Row Count
rowCount = Document.Data.Tables["Distinct_SiteNames"].RowCount

##Index Set of all our rows

rowIndexSet=Document.ActiveMarkingSelectionReference.GetSelection(Document.Data.Tables["Distinct_SiteNames"]).AsIndexSet()

allRows = IndexSet(rowCount,True)

if rowIndexSet.IsEmpty != True:
    allRows = rowIndexSet

colCurs = DataValueCursor.CreateFormatted(crossSource.Columns["Site_Name"])

##Optional: Loop through to determine average value
colTotal = ''
for row in crossSource.GetRows(allRows, colCurs):
    colTotal += ', ' + colCurs.CurrentValue

if TextFltr == "":
    TextFltr += colTotal[2:]
else:
    TextFltr += colTotal

Document.Properties["SelectedSiteNames"] = TextFltr 

from System.Collections.Generic import Dictionary
from Spotfire.Dxp.Application.Scripting import ScriptDefinition
import clr
scriptDef = clr.Reference[ScriptDefinition]()
Document.ScriptManager.TryGetScript("Change Special Filter Value", scriptDef)
params = Dictionary[str, object]()
Document.ScriptManager.ExecuteScript(scriptDef.ScriptCode, params)

Внизу она ссылаетсявторой сценарий;это скрипт, прикрепленный к кнопке, которая анализирует текстовую область, когда пользователь хочет отправить свои выборы и обновить таблицу данных.

Здесь используется общий код, который называется «Изменить специальный фильтр».Значение », которая позволяет разделять символами новой строки, табуляции, запятых, кавычек и некоторых других.Не стесняйтесь добавлять или вычитать здесь, в зависимости от потребностей вашей пользовательской базы.

strVals = Document.Properties["SelectedSiteNames"]

lst = ""

cnt = 0

x = 0
y = 0
z = 0
for letter in strVals:
    if y == 1:
        if letter == " ":
            lst = lst + "'" + strVals[x:z] + "', "
            y = 0
        elif letter == ",":
            lst = lst + "'" + strVals[x:z] + "', "
            y = 0
        elif letter == "\n":
            lst = lst + "'" + strVals[x:z] + "', "
            y = 0
        elif letter == "\r":
            lst = lst + "'" + strVals[x:z] + "', "
            y = 0
        elif letter == "'":
            lst = lst + "'" + strVals[x:z] + "', "
            y = 0
        elif letter == '"':
            lst = lst + "'" + strVals[x:z] + "', "
            y = 0
        elif letter == '\t':
            lst = lst + "'" + strVals[x:z] + "', "
            y = 0
    else:
        if letter <> " " and letter <> "," and letter <> "\n" and letter <> "\r" and letter <> "'" and letter <> '"' and letter <> "\t":
            if y == 0:
                cnt += 1
            print letter
            x = z
            y = 1
    z += 1
if y == 1:
    lst = lst + "'" + strVals[x:z] + "', "

print lst
lst = lst.upper()
if len(lst) > 0:
    lst = lst[1:len(lst) - 3]
    Document.Properties["SpecialFilterValue"] = lst

Шаг первый теперь завершен!У вас есть список всех выбранных вами имен сайтов в свойстве, которые вы теперь можете передать своей хранимой процедуре.

Примечание. Я считаю, что количество символов, которые Spotfire может передавать через строковое значение, ограничено.В моем предыдущем тестировании, я думаю, что это было более 500 000 символов (это было какое-то время, поэтому я точно не помню), поэтому у вас есть много возможностей, но они существуют, и в зависимости от того, какой источник данных вы используете, может быть и ниже.

Шаг второй: измените хранимую процедуру

Ваша хранимая процедура в основном будет выглядеть примерно так:

Create procedure ProcA(In Start_Date date, IN End_Date date, In Site_Name text)
Begin

    DECLARE @Script nvarchar(max) =
    N'
    Select * from TableA where day between Start_Date and End_Date and Site_Name in (' + @Site_Name + ') '

    EXECUTE (@Script)

Просто легко в сравнении!(В конце концов, без цикла! Причудливый случай использования, который я запомнил, здесь не применим, если только вы не используете базу данных, которая не позволяет передавать параметры напрямую ...)

...