Interactive grid oszlopának eltűntetése, ha null a mező értéke (Oracle APEX)
2022-07-13T10:40:20+02:00
2022-07-19T08:08:18+02:00
2022-08-08T07:55:29+02:00
ordell10
Sziasztok!

A probléma a következő. Adva van egy Function body-val egy interactive grid, amiben változnak a selectek. Van ahol 2 oszlopt szeretnék megjeleníteni, de van ahol 4-et is. Van egy PAGE_ITEM, mondjuk "P1_TIP" ami ezt egyértelműen megmondja.

A kérdéses oszlopon van egy Server condition, ami így néz ki, ám mégsem működik, a page_item pedig látszik. Gondolom client és server condition között kell valamit mókolni, azért nem látja, de itt nincs client condition a mezőknél. Hogy csináljam, hogy működjön?

begin if :P1_TIP = 'MIAMI' then return false; else return true; end if; end;
Köszönöm!
Mutasd a teljes hozzászólást!
Úgy néz ki, grid esetén a refresh() nem tölti újra a grid konfigurációját, csak az adatokat. Riport esetén újratölti.

Elvileg itt megoldották:
APEX IG Cookbook Update for 19.2 – HardLikeSoftware

https://community.oracle.com/tech/developers/discussion/4273501/ig-i..

A fórum szerint a példa alkalmazásban a 16-os page-en van dinamikus oszlop elrejtés.
Mutasd a teljes hozzászólást!

  • Szia,

    nem értem, mi a kapcsolat a kérdésed tartalma és a címe ("ha null a mező értéke") között.
    A a "P1_TIP" null-sága érdekel, akkor azt kellene vizsgálnod:

    return :P1_TIP is null;
     
    esetleg

    return nvl(:P1_TIP,'x') <> 'MIAMI';
    Fentiek esetén a Server Side Condition típusa "PL/SQL function body".
    De ilyen egyszerű vizsgálathoz van külön SSC típus, pl.: "Item is NULL", "Item is NOT NULL", stb.

    Az alapproblémád valúszínűleg az, hogy a ":P1_TIP = 'MIAMI'" feltétel akkor is hamis, ha a "P1_TIP" értéke NULL, mivel a NULL értékkel történő összehasonlítások hamis eredményt adnak (kivéve varchar bizonyos esetekben). Ezért kell a NULL értéket vagy külön vizsgálni, vagy NVL() használatával valódi értékre váltani összehasonlítás előtt.
    Mutasd a teljes hozzászólást!
  • Még arra is figyelj, hogy Oracle-ben az üres string értéke NULL. Tehát:

    '' is null -> true
    Mutasd a teljes hozzászólást!
  • Igen, a cím után még próbálkoztam és értékkel írtam be a kódot.

    A probléma nem az, hogy nullos-e a mező, hanem, hogy teljesen hatástalan ez az egész PL/SQL function body. A lap betöltésnél még működik, de egy sima interactive grid refreshre nem változik. Az pedig, hogy villogtassam a lapot minden egyes ilyen változásnál az ugye kizárt.

    Amikkel próbálkoztam:
    - Hide/Show páros interactive grid esetében not supported.
    - Item is not null teljesen hatástalan, szintúgy, mint a korábban leírt megoldás
    - PL/SQL server condition szintén hatástalan dinamikusan

    Ha újraindítom az appot, akkor mindig a korábbi érték szerint viselkedik, azaz megjeleníti vagy sem. Ezt szeretném, hogy ne kelljen az egész oldalra reload-ot kiadni vagy újraindítani. Ha változik a page_item értéke, akkor változzon a grid oszlopszerkezete is.

    Értéket java blokkból kap a page item, amikor egy másik gridben lépkedünk

    if(this.data != null){ if ('selectedRecords' in this.data) { if(this.data.selectedRecords[0]!= null){ selected_DGRM_ID = this.data.selectedRecords[0][1]; $s("P1_TIP", selected_DGRM_ID); selected_ID = this.data.selectedRecords[0][0]; $s("P1_TIP_ID", selected_ID); } } }
    Mutasd a teljes hozzászólást!
  • Tehát az eltűntendő/megjelenítendő mező server condition-je csak egyszer hajtódik végre, amikor indítom az appot vagy frissítem az egész lapot.
    Mutasd a teljes hozzászólást!
  • A "$s()" függvény csak a kliens oldali Javascript kódban változtatja meg az item értékét. Hogy a szerver oldali feltételbe kerüljön, ahhoz el kell juttatni a szerverre.

    Szerencsére az interaktív grid ezt kapásból tudja: Interactive grid region / Source / Page Items to Submit - itt megadod a P1_TIP-et, meg amit még kell. Ezután a gridre kiadott refresh() automatikusan küldi a szervernek ezeket az értékeket, így akár az SSC-ben, akár a where feltételben érvényesülni tudnak.
    Mutasd a teljes hozzászólást!
  • Ez ott volt, nekem egyébként a page_item-en sem jelenik meg a felületen a value.

    Tehát a java-s értékadás után van egy execute server-side code ami:

    begin
    null;
    end;

    és az items to submit értékben benne van a page_item P1_TIP.

    Ennek ellenére nem képes fogadni, csak a reload után.
    Mutasd a teljes hozzászólást!
  • "page_item-en sem jelenik meg a felületen a value."

    Az baj. Milyen típusú item ez? Engeded kliens oldalról módosítani, tehát nem protected, nem read only, nincs rá session state protection?

    Lehet még konkurrencia problémád is, tehát előbb küldesz a szerverre adatot, minthogy értéket kapna, így mindig NULL lesz. Vagy előbb hívsz refresh()-t, minthogy értéket kapna az item.
    A böngésző dev konzoljából (F12) ki tudod egyenként adni a szükséges parancsokat egymás után, úgy jó lesz a sorrend.

    Ami megoldást írtam, azt kipróbáltam, működik. Nálad is kellene. Rakj össze egy új oldalt egy  griddel és egy itemmel, és tesztelj ott.

    (És nem Java, hanem Javascript, vagy JS)
    Mutasd a teljes hozzászólást!
  • Csináltam egy másik tesztet, és úgy tűnik, az interactive report esetén jól működnek a SSC-ök, de az interactive grid tényleg nem azt csinálja, amit kellene. Az item értéke átmegy a szerver oldalra, a select-ben meg is jelenik, de nem lesz hatással az oszlopok láthatóságára.
    Mutasd a teljes hozzászólást!
  • Sima text field típusú.

    Csináltam egy tök új appot az előző elvén.

    Első grid, dynamic action change selectionban

    - execute JavaScript :

    if(this.data != null){ if ('selectedRecords' in this.data) { if(this.data.selectedRecords[0]!= null){ selected_DGRM_ID = this.data.selectedRecords[0][1]; $s("P1_TIP", selected_DGRM_ID); } } }
    - execute server-side

    begin null; end;
    items to submit: P1_TIP

    - refresh a második grid regiójára, ami után villan egyet a grid

    A második grid mezőjén van a server side condition, hogy ha a page_item (P1_TIP = 1), akkor true, ha 0 akkor false. Ez:

    begin insert into a(a) values ('P1_TIP: '||:P1_TIP); commit; if :P1_TIP = 1 then return true; else return false; end if; end;
    A page_itemen megjelenik a felületen az 1-es vagy a 0.
    A második grid mezőjének server side conditionjába beletettem egy insert intot, ahogy fent is látszik, hogy logoljam mikor fut le.

    Nem jó. Csak egyszer hajtódik végre. És csak akkor, ha
    - Reloadolom az oldalt
    - Vagy rányomok a frissítés gombra a böngészőben

    Mást nem állítottam. Látom, a netes fórumokból is, hogy ennek működnie kellene, de mégsem teszi.


    Csináltam egy másik új appot, ahol csak egy page_item van, egy button, ami:
    - Items to subumittal átadja a szervernek a page_item értékét
    - Refresh a grid regiojára.

    Dettó. Csak egyszer fut le. Amikor elindítom az oldalt és annyi. Ha nyomogatom a gombot semmit nem tol bele az "A" táblába.

    Ez nem valami globális, akár apex szinten, akár oracle db szinten beállítás?
    Mutasd a teljes hozzászólást!
  • Úgy néz ki, grid esetén a refresh() nem tölti újra a grid konfigurációját, csak az adatokat. Riport esetén újratölti.

    Elvileg itt megoldották:
    APEX IG Cookbook Update for 19.2 – HardLikeSoftware

    https://community.oracle.com/tech/developers/discussion/4273501/ig-i..

    A fórum szerint a példa alkalmazásban a 16-os page-en van dinamikus oszlop elrejtés.
    Mutasd a teljes hozzászólást!
  • Igen, azt néztem, hogy ireport esetében a Show és Hide is működik. Csak nekem ez a fránya IG is kell, master detail miatt, de lehet célszerűbb lenne áttenni interactive reportra és akkor function bodyban változtatni a where feltételt a page itemmel.

    Köszi, már csak holnap csekkolom, megnézem a linket.
    Mutasd a teljes hozzászólást!
  • Nem nagyon találtam erre vonatkozó megoldást, sajnos több időt sem tudok erre fordíteni 2 napnál, dynamic total IG van.. Szerintem el is engedem ezt a dolgot.  IR nem jó IG helyett, maradnak a nullos oszlopok... Azért köszönöm szépen a segítséget!
    Mutasd a teljes hozzászólást!
  • Közben sikerült! :) Köszi!
    Mutasd a teljes hozzászólást!
  • Örülök neki :)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd