Frage

Mirth ist ein Makler mit medizinischer Anwendung HL7 Nachricht Integration zu helfen.

Meine Frage ist, über sich selbst die Mühe das Speichern Ihrer eigenen Datenspeicher jedes Mal zu schlagen Sie in der HL7 enthielt einen Nachschlag auf einige Daten tun möchten.

Szenario: für jede Nachricht durch den Kanal empfangen, möchte ich der Einrichtung der mnemonic / Code / ID und erhalten den vollständigen Namen der Anlage finden. Leider kann ich nicht den Absender der HL7-Nachricht bitten, es für mich in der Nachricht zu senden zusammen. So habe ich meine eigene DB Zugangscode zu schreiben, um eine gespeicherte Prozedur aufrufen, übergeben in der ID und erhalten den vollständigen Namen.

Jede Idee, wie ein Cache von Daten in Mirth erstellen, so dass Sie die Suche von einem beliebigen Kanal zugreifen können, Quelle, Ziel, Transformator oder filtern?

War es hilfreich?

Lösung

Sie könnten versuchen, ein globales Skript mit zwei Funktionen zu schreiben:

1) Auffüllen ein Java hastable oder ähnliches Konstrukts mit den Daten, die Sie für

suchen

2) Verwenden Sie den Parameter, den Sie als Schlüssel für die Hash-Tabelle passieren in und gibt die Daten in der Hash-Tabelle enthalten ist, zu diesem Schlüssel entspricht.

Link zur Verwendung von Java in Mirth ( link )

Andere Tipps

In unserem Fall, wo wir Nachschlagewerte aus einer Datenbank geladen werden mussten, lösten wir dies wie folgt:

  1. Haben Sie einen Kanal deploy-Skript, das Nachschlagewerte lädt, wenn der Kanal in der Weltkarte eingesetzt wird.
  2. Haben Sie eine globale Vorlage Funktion, die Sie Werte aus dieser globalen Karte zum Nachschlagen ermöglicht.
  3. Verwenden Sie die globale Vorlage Funktion in Filtern und übersetzt.

Hinweis: In unserem Fall jeder Schlüssel könnte zwei Werte hat mit ihm verbunden ist. Wenn wir nicht verwenden beide setzen wir einfach die zweite in der Abfrage aus der Datenbank auf null.

Um die globale Karte Ort dies in Ihrem deploy Skript Ihres Kanals laden (bei Bedarf anpassen):

// This script executes once when the mule engine is started
// You only have access to the globalMap here to persist data 

var sqlDBDriver   = 'net.sourceforge.jtds.jdbc.Driver';
var sqlDBName     = 'jdbc:jtds:sqlserver://databaseserver/databasename';
var sqlDBDUser    = 'username';
var sqlDBPassword = 'password';

function PopulateLookup ( sqlQuery, globalMapName )
{
    logger.info('Loading lookup table values in the deploy script: ' + globalMapName);

    var dbConn = DatabaseConnectionFactory.createDatabaseConnection( sqlDBDriver, sqlDBName, sqlDBDUser, sqlDBPassword );
    var rs = dbConn.executeCachedQuery( sqlQuery );
    dbConn.close();

    var arr = new Array();
    while(rs.next())
    {
        var obj = new Object();
        obj.LeftValue   = rs.getString('LeftValue');
        obj.RightValue1 = rs.getString('RightValue1');
        obj.RightValue2   = rs.getString('RightValue2');
        arr.push(obj);
    } 
    globalMap.put( globalMapName, arr );
}

PopulateLookup( 'SELECT keyColumn as LeftValue, Value1 as RightValue1, Value2 as RightValue2 FROM tableName', 'GlobalMapName' );

// Repeat above line as needed for each lookup you need

return;

Um diese Werte zugreifen, die Sie die folgende Funktion als globale Vorlage verwenden.

function FindLookupValueWithDefault ( LookupGlobalMapName, LeftValue, DefaultValue1, DefaultValue2 ){
    /***********************************************************************************************
    DESCRIPTION: Retrieves lookup table values from the global map and uses the input values to return output values

     PARAMETERS:
       LookupGlobalMapName - name of the lookup table in the Global Map
       LeftValue - The value to look up
       DefaultValue1 - the first default value if a match was not found
       DefaultValue2 - the second default value if a match was not found

    RETURNS:
       An object containing the replacement value and associated OID if applicable

    REMARKS: 
    ************************************************************************************************/
        // Retrieve the previously matched item from the globalmap
        //    We do this to save time and not look through a huge lookup table tons of times
        //    unless we absolutely have to
        var prevItem = globalMap.get(LookupGlobalMapName + '-Previous');

        // This is the same item requested for this globalmap name - just return the previous value
        if ( prevItem != null && prevItem.LeftValue == LeftValue) {
            return prevItem;
        }

        //
        // If we reach this point the previous item either did not exist or did not match 
        //

        // Retrieve the array with lookup objects from the globalmap and search for the matching value
        var arr = globalMap.get(LookupGlobalMapName);
        var obj = new Object();
        obj.LeftValue = LeftValue;
        obj.RightValue1 = DefaultValue1;
        obj.RightValue2   = DefaultValue2; 
        for each ( item in arr )
        {
            var pattern=new RegExp("^" + item.LeftValue + "$");
            var result = pattern.test(LeftValue );

            if ( pattern.test(LeftValue ) )
            {
                obj = item;
                break;
            } 
        }

        // Store the previous value in the globalmap
        globalMap.put( LookupGlobalMapName + '-Previous', obj );

        // Return the object we found or created
        return obj;
    }

Eine Probe von Code, um die Werte für den Zugriff auf:

var myObject = FindLookupValueWithDefault('GlobalMapName', 'LookupValue', 'DefaultValue1', 'DefaultValue2');

if ( myObject != null )
{

      var value1 = myObject.RightValue1;
      var value2 = myObject.RightValue2;
}

Leistung kann unterschiedlich sein ... aber das hat für uns bisher gearbeitet haben.

Danke, Frans de Wet

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top