Find

Question
· Aug 14

ZenPage Table not Updating

Hi all,

I’m running into an issue with a %ZEN.Component.tablePane in a Zen page.

We have:

  • A fully styled table with all columns defined
  • A backend query (SearchMessages) that accepts multiple filter parameters
  • A set of input fields at the top of the page for filtering (text, date, and checkboxes)

We’re trying to run the query from a button click using a client-side method (runSearch()) that collects the filter values, sets them as parameters, and calls executeQuery().

The problem is that the table does not update at all. Old rows remain, or sometimes nothing appears. I am struggling to debug this issue and anyone with experience making zen tables and updating them using queries would be extremely helpful. Below is a bit of my code

<!-- Filters -->
    <hgroup id="filtersContainer">
      <group id="filter-group-documents">
        <text label="DocumentID:" id="filterDocumentID"/>
        <text label="DocumentSource:" id="filterDocumentSource"/>
      </group>
 
      <group id="filter-group-session-message">
        <text label="SessionID:" id="filterSessionID"/>
        <text label="MessageControlID:" id="filterMessageControlID"/>
      </group>
 
      <group id="filter-group-person-facility">
        <text label="PersonID:" id="filterPersonID"/>
        <text label="SourceFacility:" id="filterSourceFacility"/>
      </group>
 
      <group id="filter-group-event-encounter">
        <text label="EventType:" id="filterEventType"/>
        <text label="EncounterNumber:" id="filterEncounterNumber"/>
      </group>
 
      <group id="filter-group-message-date">
        <dateText label="Message Date From:" id="filterMessageDateFrom"/>
        <dateText label="Message Date To:" id="filterMessageDateTo"/>
      </group>
 
      <group id="filter-group-send-time">
        <dateText label="Send Time From:" id="filterSendTimeFrom"/>
        <dateText label="Send Time To:" id="filterSendTimeTo"/>
      </group>
 
    <!-- Active / Duplicate -->
    <group id="filter-group-checkboxes">
        <checkbox label="Is Active" id="filterIsActive"/>
        <checkbox label="Is Duplicate" id="filterIsDuplicate"/>
    </group>
 
    <!-- Last Update -->
    <group id="filter-group-last-update">
        <dateText label="Last Update From:" id="filterLastUpdateFrom"/>
        <dateText label="Last Update To:" id="filterLastUpdateTo"/>
    </group>
    <group id="filter-group-message-id">
        <text label="OriginalMessageID:" id="filterOriginalMessageID"/>
    </group>
    <group id="filter-group-search">
        <button caption="Search" onclick="zenPage.runSearch();"/>
    </group>
    </hgroup>
 
    <!-- Results Table -->
    <tablePane id="resultsTable"
               autoExecute="true"
               queryClass="MD.UI.MessageTrackingQuery"
               queryName="SearchMessages">
        <column colName="DocumentID" cellTitle="DocumentID" filterQuery="SearchMessages"/>
        <column colName="DocumentSource" cellTitle="DocumentSource" filterQuery="SearchMessages"/>
        <column colName="SessionID" cellTitle="SessionID" filterQuery="SearchMessages"/>
        <column colName="MessageControlID" cellTitle="MessageControlID" filterQuery="SearchMessages"/>
        <column colName="PersonID" cellTitle="PersonID" filterQuery="SearchMessages"/>
        <column colName="SourceFacility" cellTitle="SourceFacility" filterQuery="SearchMessages"/>
        <column colName="EventType" cellTitle="EventType" filterQuery="SearchMessages"/>
        <column colName="EncounterNumber" cellTitle="EncounterNumber" filterQuery="SearchMessages"/>
        <column colName="MessageDate" cellTitle="MessageDate" filterQuery="SearchMessages"/>
        <column colName="SendTime" cellTitle="SendTime" filterQuery="SearchMessages"/>
        <column colName="IsActive" cellTitle="IsActive" filterQuery="SearchMessages"/>
        <column colName="IsDuplicate" cellTitle="IsDuplicate" filterQuery="SearchMessages"/>
        <column colName="LastUpdateTime" cellTitle="LastUpdateTime" filterQuery="SearchMessages"/>
        <column colName="OriginalMessageID" cellTitle="OriginalMessageID" filterQuery="SearchMessages"/>
    </tablePane>
 
/// JS to run the search
ClientMethod runSearch() [ Language = javascript ]
{
    function normalize(value) {
        return (value === "" || value === undefined) ? null : value;
    }
 
    function normalizeDate(value, endOfDay) {
        if (!value) return null;
        // Otherwise append start or end of day
        return endOfDay ? value + " 23:59:59" : value + " 00:00:00";
    }
 
    var params = {
        DocumentID:        normalize(zenPage.getComponentById('filterDocumentID').getValue()),
        DocumentSource:    normalize(zenPage.getComponentById('filterDocumentSource').getValue()),
        SessionID:         normalize(zenPage.getComponentById('filterSessionID').getValue()),
        MessageControlID:  normalize(zenPage.getComponentById('filterMessageControlID').getValue()),
        PersonID:          normalize(zenPage.getComponentById('filterPersonID').getValue()),
        SourceFacility:    normalize(zenPage.getComponentById('filterSourceFacility').getValue()),
        EventType:         normalize(zenPage.getComponentById('filterEventType').getValue()),
        EncounterNumber:   normalize(zenPage.getComponentById('filterEncounterNumber').getValue()),
        MessageDateFrom:   normalizeDate(zenPage.getComponentById('filterMessageDateFrom').getValue(), false),
        MessageDateTo:     normalizeDate(zenPage.getComponentById('filterMessageDateTo').getValue(), true),
        SendTimeFrom:      normalizeDate(zenPage.getComponentById('filterSendTimeFrom').getValue(), false),
        SendTimeTo:        normalizeDate(zenPage.getComponentById('filterSendTimeTo').getValue(), true),
        IsActive:          zenPage.getComponentById('filterIsActive').getValue() ? 1 : null,
        IsDuplicate:       zenPage.getComponentById('filterIsDuplicate').getValue() ? 1 : null,
        LastUpdateFrom:    normalizeDate(zenPage.getComponentById('filterLastUpdateFrom').getValue(), false),
        LastUpdateTo:      normalizeDate(zenPage.getComponentById('filterLastUpdateTo').getValue(), true),
        OriginalMessageID: normalize(zenPage.getComponentById('filterOriginalMessageID').getValue())
    };
 
    console.log("Starting to get results");
    console.log("Filters:");
    console.log("------------------------");
    for (var key in params) {
        if (params[key] != null && params[key] !== "") {
            console.log(key + ": " + params[key]);
        }
    }
 
    // Assign to tablePane parameters and run query
    var table = zenPage.getComponentById('resultsTable');
    table.parameters = params;
    console.log(table.parameters);
    table.executeQuery(true, true);
    console.log(table.getColumnFilters());
}
Query SearchMessages(DocumentID, DocumentSource, SessionID, MessageControlID, PersonID, SourceFacility, EventType, EncounterNumber, MessageDateFrom, MessageDateTo, SendTimeFrom, SendTimeTo, IsActive, IsDuplicate, LastUpdateFrom, LastUpdateTo, OriginalMessageID) As %SQLQuery
{
    SELECT DocumentID, DocumentSource, SessionID, MessageControlID, PersonID, SourceFacility, EventType, EncounterNumber, MessageDate, SendTime,
           IsActive, IsDuplicate, LastUpdateTime, OriginalMessageID
    FROM MD.MessageTracking
    WHERE (DocumentID = :DocumentID OR :DocumentID IS NULL)
      AND (DocumentSource = :DocumentSource OR :DocumentSource IS NULL)
      AND (SessionID = :SessionID OR :SessionID IS NULL)
      AND (MessageControlID = :MessageControlID OR :MessageControlID IS NULL)
      AND (PersonID = :PersonID or :PersonID IS NULL)
      AND (SourceFacility = :SourceFacility or :SourceFacility IS NULL)
      AND (EventType = :EventType or :EventType IS NULL)
      AND (EncounterNumber = :EncounterNumber or :EncounterNumber IS NULL)
      AND (MessageDate >= :MessageDateFrom OR :MessageDateFrom IS NULL)
      AND (MessageDate <= :MessageDateTo OR :MessageDateTo IS NULL)
      AND (SendTime >= :SendTimeFrom OR :SendTimeFrom IS NULL)
      AND (SendTime <= :SendTimeTo OR :SendTimeTo IS NULL)
      AND (IsActive = :IsActive OR :IsActive IS NULL)
      AND (IsDuplicate = :IsDuplicate OR :IsDuplicate IS NULL)
      AND (LastUpdateTime >= :LastUpdateFrom OR :LastUpdateFrom IS NULL)
      AND (LastUpdateTime <= :LastUpdateTo OR :LastUpdateTo IS NULL)
      AND (OriginalMessageID = :OriginalMessageID OR :OriginalMessageID IS NULL)
}


 
Discussion (0)1
Log in or sign up to continue
Discussion (0)1
Log in or sign up to continue
Article
· Aug 14 3m read

InterSystems IRIS for Health : la solution la plus rapide pour optimiser les données de santé

Les données sont au cœur de la transformation numérique qui bouleverse le secteur de la santé. Ce changement radical nécessite de nouvelles bases pour gérer les énormes besoins en données des soins de santé modernes.

Le délai de mise sur le marché est crucial pour développer les prochaines avancées thérapeutiques, les connaissances génomiques et les flux de travail cliniques intelligents. Vous devez les mettre en œuvre dès maintenant.

C'est pourquoi nous avons étendu la puissance de notre plateforme de données InterSystems IRIS afin de répondre aux spécificités des informations de santé. InterSystems IRIS for Health est la première et la seule plateforme de données au monde conçue spécifiquement pour le développement rapide d'applications de santé afin de gérer les données les plus critiques au monde.

Aucun fournisseur de gestion de données n'offre un engagement plus important envers le secteur de la santé ni une expérience aussi pertinente. À l'échelle mondiale, plus d'un milliard de dossiers médicaux sont gérés par des solutions basées sur notre technologie. Les laboratoires utilisant InterSystems traitent chaque jour près de la moitié des échantillons aux États-Unis. Les prestataires de soins de santé privés et publics les plus sophistiqués s'appuient sur des appareils, des dossiers et des technologies de l'information optimisés par InterSystems.

InterSystems IRIS for Health vous offre tout ce dont vous avez besoin pour développer rapidement des applications de santé riches en données.

DU TABLEAU BLANC À LA PRODUCTION, RAPIDEMENT

InterSystems IRIS for Health offre toutes les fonctionnalités nécessaires à la création d'applications complexes, critiques et gourmandes en données. Cette plateforme complète couvre la gestion des données, l'interopérabilité, le traitement des transactions et l'analyse, et est conçue pour accélérer la rentabilisation.

CONÇU POUR LES GRANDES VOLUMÉTRIES

Le volume et la diversité des informations médicales sont incroyablement importants et connaissent une croissance exponentielle. InterSystems IRIS for Health permet aux applications d'évoluer efficacement, verticalement et horizontalement, pour gérer de manière rentable les charges de travail, les données et les utilisateurs, quelle que soit leur ampleur.

ACCÉLÉRER LES CONNEXIONS

Une santé véritablement connectée nécessite un flux d'informations interchangeable entre toutes les sources, modernes et traditionnelles. InterSystems IRIS for Health prenant en charge nativement FHIR et toutes les principales normes mondiales de messagerie médicale, les applications peuvent rapidement ingérer, normaliser et partager les informations.

UNE INTELLIGENCE PLUS PROFONDE

L'intelligence artificielle et l'apprentissage automatique déterminent leur succès ou leur échec en fonction de la qualité des données sous-jacentes. InterSystems IRIS for Health offre des capacités avancées de préparation des données pour créer des modèles de santé transformateurs et optimiser l'efficacité des solutions d'apprentissage.

CONNAISSANCE APPROFONDIE

L'aide à la décision clinique, la médecine du laboratoire au chevet du patient et les attentes croissantes des consommateurs exigent des réponses en temps réel. InterSystems IRIS for Health excelle dans le traitement transactionnel/analytique hybride (HTAP) et propose des solutions qui répondent à ces exigences croissantes.


Plus d'articles sur le sujet :

Source: InterSystems IRIS for Health

Discussion (0)1
Log in or sign up to continue
Discussion
· Aug 14

Best practices for Streams in Interoperability

I would like to know which are the best practices of using Streams in Interoperability messages.

I have always use %Stream.GlobalCharacter properties to hold a JSON, or a base64 document, when creating messages. This is fine and I can see the content in Visual Trace without doing anything, so I can check what is happening and resolve issues if I have, or reprocess messages if something went wrong, because I have the content.

But I think this is not the best way of using Streams. After a couple of years, I ussually have space problems: messages seems not to purge correctly (I don't know yet if it's because the use of %Stream.GlobalCharacter, or it's just a coincidence).

I have asked InterSystems, and they recomended me to use QuickStream instead of %Stream.GlobalCharacter. But if I choose this way, I loose visibility on Visual Trace (unless I write the content with a $$$LOGINFO or something like that, which doesn't convince me), and I think I have read somewhere that QuickStream content dissapear after ending the process (I mean, it's not persistent, which is fine to avoid space problems, but not to resolve issues).

So, I want to ask the community: which are the best practices? What you recomend me?

Thank you in advance :) 

8 Comments
Discussion (8)4
Log in or sign up to continue
Question
· Aug 13

On Windows, what is your approach for managing the size of Structured Logging output?

The operations manager in our company was using structured logging in IRIS to tail information to an on-prem monitoring tool and started to get concerned with the ever-growing size of the output file. He just leaned across the aisle here and informed me that the output file has no mechanism for rolling this file over at a certain point for archival or disposal. Sure enough, I can't find any documentation to refute this. If we were on Linux, I suppose we could get around this by using syslog or even taking advantage of the fact that the filesystem does not always to a lock on the output file like Windows -- but we're on Windows.

Anybody out there have an approach to managing the ongoing size of this file on a Windows installation that does not involve taking the IRIS engine offline?

Cordially,

Jonathan

1 Comment
Discussion (1)2
Log in or sign up to continue