Examples: query, "exact match", wildcard*, wild?ard, wild*rd
Fuzzy search: cake~ (finds cakes, bake)
Term boost: "red velvet"^4, chocolate^2
Field grouping: tags:(+work -"fun-stuff")
Escaping: Escape characters +-&|!(){}[]^"~*?:\ with \, e.g. \+
Range search: properties.timestamp:[1587729413488 TO *] (inclusive), properties.title:{A TO Z}(excluding A and Z)
Combinations: chocolate AND vanilla, chocolate OR vanilla, (chocolate OR vanilla) NOT "vanilla pudding"
Field search: properties.title:"The Title" AND text
Beantwortet
Subtable Zellen/Spalten via JS löschen/inaktivieren

Hallo zusammen,
ich möchte gerne mit Hilfe eines Skriptes je nach Bedingung eine Untertabellen Spalte einblenden bzw. ausblenden, eingegebene Werte ggf. wieder löschen, und die Zelle ggf. wieder inaktiv schalten. Da es sich um Werte einer Untertabelle handelt gehe ich davon aus, dass mein Befehl über alle potentielle Zeilen "geloopt" werden muss. Leider hakt es mit der Umsetzung.

Was ich gerne möchte (in Worten):
WENN checkbox JA, DANN erlaube die Bearbeitung der Untertabellen Spalte UND zeige Spalte dem Nutzer an.
WENN checkbox NEIN, DANN lösche vorhandene Spalteneinträge UND deaktiviere Bearbeitung der Untertabellen Spalte UND verberge Untertabellen Spalte.

Ich könnte mir vorstellen, dass das Skript in etwa grob so aussieht.. allerdings ist der Syntax sicherlich nicht richtig.

function Test() {
jr_loop_table('SUBVName', function (subtable, rowId) {
if (jr_get_value('checkbox') == 1) {
jr_set_disabled(#SUBV_Column#, false);
jr_show_subtable_column(subtable, 'SUBV_Column');
}
else if (jr_get_value('checkbox') === 0) {
jr_set_subtable_display_value(subtable, rowId, 'SUBV_Column', '');
jr_hide_subtable_column(subtable, 'SUBV_Column');
jr_set_disabled(#SUBV_Column#, true);
}
});
}

Erklärungen zu: #SUBV_Column# - Da mir der technische Name der Zelle nicht bekannt ist habe ich oben diesen Platzhalter verwendet.
Wenn die Namensgebung der Logik wie bei SQL Befehlen folgt müsste der Name in der Theorie 'SUBVName_SUBV_Column' sein...scheint allerdings nicht zu funktionieren.

Über etwaige Tipps und Hilfestellungen freue ich mich sehr! :)
Beste Grüße,
Karim

  
  
Gepostet vor 3 Jahren
Stimmen Neuste

Antworten 5


Hallo Karim,

eine Frage hierzu: Soll es eine Checkbox geben für die komplette Untertabelle oder möchtest du das Ganze zeilenweise steuern? Sprich in jeder Untertabellenzeile eine Checkbox und davon in Abhängigkeit die Spalte?

Viele Grüße
Jan

  
  
Gepostet vor 3 Jahren
Bearbeitet vor 3 Jahren
pic
Gelöschter Benutzer

Hallo Jan, das Erstere. Eine Checkbox, deren Auswahl dann die gesamte Untertabelle steuern soll.

Viele Grüße,
Karim

  
  
Gepostet vor 3 Jahren

Hallo Karim,

anbei eine Funktion die deine Anforderung abdecken sollte. Einfach dann bei der Checkbox als OnChecked und OnUnchecked die Funktion subtableControl('show') bzw subtableControl('hide') ausführen und im Skript den SubtableView Namen und den Spaltennamen ändern :-)

function subtableControl(action)
{
    const subtableView = 'Z_JM_TEST_STV';                                       // Name der Untertabellenansicht, nicht des Dialogelements
    const subtableColumn = 'txbColumn2';                                        // Spalte, welche ein und ausgeblendet werden soll
    const subtableViewIds = jr_get_subtable_row_ids(subtableView);              // Sämtliche IDs der Untertabellenansicht ermitteln
    const fieldCount = subtableViewIds.length;                                  // Anzahl der IDs für for-Schleife 
    
    if(action == 'show')                                            
    {
        jr_show_subtable_column(subtableView, subtableColumn);                    // Zeige die Untertabellenspalte
        for(let i = 0; i < fieldCount; i++)
        {
            jr_set_disabled(subtableView + '_' + subtableColumn + '_' + subtableViewIds[i], false); // Aktiviere die Untertabellenspalte 
        }
    }
    
    if(action == 'hide')
    {
        jr_hide_subtable_column(subtableView, subtableColumn);                    // Blende die Untertabellenspalten aus
        for(let i = 0; i < fieldCount; i++)
        {
            jr_reset_value(subtableView + '_' + subtableColumn + '_' + subtableViewIds[i]);    // Setze den Wert in der Spalte in jeder Zeile zurück
            jr_set_disabled(subtableView + '_' + subtableColumn + '_' + subtableViewIds[i]);   // Deaktiviere die Untertabellenspalte
        }
    }
}

Viele Grüße
Jan

1
1
Gepostet vor 3 Jahren
pic
Gelöschter Benutzer

so schlecht sieht das ja nicht aus, dir fehlt ja nur die id

id für Untertabellenzellen setzt sich aus

const columnId = `${subtable}_${column}_${rowId}`;

zusammen.
jr_hide_subtable_column/jr_show_subtable_column solltest du natürlich nicht im loop aufrufen, das reicht auch einmalig

Hier dein Beispiel entsprehend abgeändert

function Test() {
    const checked = jr_get_value('checkbox');

    if (checked) {
        jr_show_subtable_column('SUBVName', 'SUBV_Column');
    } else {
        jr_hide_subtable_column('SUBVName', 'SUBV_Column');
    }

    jr_loop_table('SUBVName', function (subtable, rowId) {
        const columnId = `${subtable}_SUBV_Column_${rowId}`;
        if (checked) {
            jr_set_disabled(columnId, false);
        } else {
            jr_set_subtable_value(subtable, rowId, 'SUBV_Column', '');
            jr_set_disabled(columnId, true);
        }
    });
}

besser wäre natürlich die funktion gleich so aufzubauen, so dass man sie auch wiederverwenden kann

function ShowOrHideSubtableColumn(subtable, column, hide = false) {
    if (hide) {
        jr_hide_subtable_column(subtable, column);
    } else {
        jr_show_subtable_column(subtable, column);
    }

    const rowIds = jr_get_subtable_row_ids(subtable);
    rowIds.forEach(rowId => {
        const columnId = `${subtable}_${column}_${rowId}`;

        jr_set_disabled(columnId, hide);
        if (hide) {
            jr_set_subtable_value(subtable, rowId, column, '');
        }
    });
}

aufrufen könntest du dies dann mit

ShowOrHideSubtableColumn("SUBVName", "SUBV_Column", jr_get_value("checkbox"));

oder indem du

ShowOrHideSubtableColumn("subview", "testField", true);

in das OnChecked und

ShowOrHideSubtableColumn("subview", "testField", false);

in das OnUnChecked Skipting Feld der Checkbox einfügst


Hallo Jan, Hallo Dominic,
wow, einfach Klasse - so lob ich mir ein Forum; daran sollte sich die JR Academy ein Beispiel nehmen.

Vielen lieben Dank an euch beide!! Sowohl für die schnelle Unterstützung als auch die ausführlichen Erklärungen :) Beide Antworten funktionieren einwandfrei; auch wenn der mitgelieferte JobRouter Code Editor erst versucht hat mir etwas anderes weis zu machen haha.. (Unexpected 'const'.)
Damit habt ihr mir nicht nur sehr in diesem konkreten Fall geholfen, sondern durch eure Beispiele konnte ich nun die nötige Struktur hinter den Untertabellen verstehen und kann dies in Zukunft für ähnliche Anforderungen anwenden – auch dafür Danke!

Ich wünsche euch frohe und besinnliche Weihnachten, schöne Feiertage und einen guten Rutsch ins Neue Jahr :)
Beste Grüße, Karim

1
1
Gepostet vor 3 Jahren
  
  

Der editor von JR kennt nur ES5?. Zu der Zeit gab es noch kein const man könne const auch einfach in var ändern dann würde er das zumindest nicht anmeckern :D. Wenn aber keine veralteten Browser genutzt werden sollte es kein Problem sein.

Dominic Kanehl   vor 2 Jahren Melden
5K Ansichten
5 Antworten
vor 3 Jahren
vor 3 Jahren
Stichwörter