En el evento onInitialization del Canvas/Application:
Opcion A: con getResultSet() (todas las dimensiones)
// Limpiar primero para evitar duplicados si onInitialization se ejecuta mas de una vez
Dropdown_Product.removeAllItems();
var resultSet = Table_1.getDataSource().getResultSet();
for (var i = 0; i < resultSet.length; i++) {
Dropdown_Product.addItem(resultSet[i]["Product"].id, resultSet[i]["Product"].description);
}Opcion B: con getMembers() (una dimension)
// Limpiar primero para evitar duplicados
Dropdown_Product.removeAllItems();
var members = Table_1.getDataSource().getMembers("Product");
for (var i = 0; i < members.length; i++) {
Dropdown_Product.addItem(members[i].id, members[i].description);
}Diferencia clave:
getResultSet()devuelve filas con TODAS las dimensiones → accedes conrow["DimName"].idgetMembers("Dim")devuelve solo miembros de UNA dimension → accedes conmember.id
En el evento onSelect del Dropdown:
var selected = Dropdown_Product.getSelectedKey();
Table_1.getDataSource().setDimensionFilter("Product", selected);| Metodo | Que hace |
|---|---|
addItem(key, text) |
Anade un item |
removeAllItems() |
Limpia todos los items |
getSelectedKey() |
Devuelve el key seleccionado |
getSelectedText() |
Devuelve el texto seleccionado |
setSelectedKey(key) |
Selecciona un item por key |
setVisible(bool) |
Muestra/oculta |
setEnabled(bool) |
Habilita/deshabilita |
Patron clasico: al seleccionar en un dropdown "padre", se actualizan los items del dropdown "hijo" para mostrar solo los valores validos.
Ejemplo: Publisher → Game Name (al elegir Publisher, solo aparecen sus juegos)
var resultSet = Table_1.getDataSource().getResultSet();
var yearMembers = Table_1.getDataSource().getMembers("Year");
// Poblar dropdowns de dimensiones del result set
for (var i = 0; i < resultSet.length; i++) {
Dropdown_Name.addItem(resultSet[i]["Name"].id, resultSet[i]["Name"].description);
Dropdown_Publisher.addItem(resultSet[i]["Publisher"].id, resultSet[i]["Publisher"].description);
}
// Poblar dropdown de Year con getMembers
for (var z = 0; z < yearMembers.length; z++) {
Dropdown_Year.addItem(yearMembers[z].id, yearMembers[z].description);
}// 1. Quitar filtros para obtener datos completos
Table_1.getDataSource().removeDimensionFilter("Name");
Table_1.getDataSource().removeDimensionFilter("Publisher");
// 2. Obtener result set sin filtros
var resultSet = Table_1.getDataSource().getResultSet();
var selectedPublisher = Dropdown_Publisher.getSelectedKey();
// 3. Limpiar dropdown hijo
Dropdown_Name.removeAllItems();
// 4. Repoblar con solo los items que pertenecen al publisher seleccionado
for (var i = 0; i < resultSet.length; i++) {
if (resultSet[i]["Publisher"].id === selectedPublisher) {
Dropdown_Name.addItem(resultSet[i]["Name"].id, resultSet[i]["Name"].description);
}
}
// 5. Aplicar filtro a la tabla
Table_1.getDataSource().setDimensionFilter("Publisher", selectedPublisher);var selectedName = Dropdown_Name.getSelectedKey();
Table_1.getDataSource().setDimensionFilter("Name", selectedName);1. Quitar filtros de las dimensiones afectadas
2. Leer datos sin filtrar (getResultSet)
3. Limpiar dropdown hijo (removeAllItems)
4. Loop: si el item coincide con la seleccion padre → addItem al hijo
5. Aplicar filtro del padre al datasource
Cuando un chart o tabla filtra a otros widgets al hacer clic:
// Obtener la seleccion del usuario en el chart
var selections = Chart_Region.getSelections();
if (selections.length > 0) {
var selectedRegion = selections[0]["Region"].id;
// Aplicar como filtro a otros widgets
Table_Detail.getDataSource().setDimensionFilter("Region", selectedRegion);
Chart_Revenue.getDataSource().setDimensionFilter("Region", selectedRegion);
Chart_Cost.getDataSource().setDimensionFilter("Region", selectedRegion);
}Crear un ScriptObject Utils con funcion linkedFilter:
// En ScriptObject "Utils", funcion "linkedFilter"
// Parametros: sourceDimension (string), sourceValue (string)
function linkedFilter(sourceDimension, sourceValue) {
// Lista de widgets a filtrar
Table_Detail.getDataSource().setDimensionFilter(sourceDimension, sourceValue);
Chart_Revenue.getDataSource().setDimensionFilter(sourceDimension, sourceValue);
Chart_Cost.getDataSource().setDimensionFilter(sourceDimension, sourceValue);
KPI_Total.getDataSource().setDimensionFilter(sourceDimension, sourceValue);
}Llamar desde cualquier widget:
// En onSelect del Chart
var selections = Chart_Region.getSelections();
if (selections.length > 0) {
Utils.linkedFilter("Region", selections[0]["Region"].id);
}// onClick del boton "Limpiar filtros"
var ds = Table_1.getDataSource();
ds.removeDimensionFilter("Account");
ds.removeDimensionFilter("Region");
ds.removeDimensionFilter("Product");
ds.removeDimensionFilter("Date");
// Resetear dropdowns a "Sin seleccion"
Dropdown_Account.setSelectedKey("");
Dropdown_Region.setSelectedKey("");
Dropdown_Product.setSelectedKey("");
Application.showMessage(ApplicationMessageType.Info, "Filtros eliminados");Cuando aplicas muchos filtros seguidos, la tabla se refresca en cada uno. Pausar el refresco evita renders intermedios:
var ds = Table_1.getDataSource();
// Pausar
ds.setRefreshPaused(PauseMode.On);
// Aplicar todos los filtros sin render intermedio
ds.setDimensionFilter("Account", Dropdown_Account.getSelectedKey());
ds.setDimensionFilter("Region", Dropdown_Region.getSelectedKey());
ds.setDimensionFilter("Product", Dropdown_Product.getSelectedKey());
ds.setDimensionFilter("Date", Dropdown_Date.getSelectedKey());
// Reactivar (renderiza una sola vez con todos los filtros)
ds.setRefreshPaused(PauseMode.Off);Tip adicional: En el Builder, configura los widgets como "Refresh active Widgets Only" para que solo se refresquen los widgets visibles.