Array-Werte vor Wechsel eines Wertes ausgeben (mehrdimensionales Array)

rince1984

Mitglied
Hallo zusammen,

ich bin gerade dabei ein JavaScript-Macro für ein spezielles Programm zu schreiben (PrintShop Mail) und komme dabei einfach nicht weiter. Ich möchte einen bestimmten Eingabewert (kommt aus einer geladenen "Datenbank" bzw. "Datenquelle") in einem mehrdimensionalen Array speichern und ausgeben bevor die nächste ID kommt.

Software PrintShop Mail:
PrintShop Mail ist eine Druckproduktionssoftware zur Personalisierung. Man kann dort eine Datenbank laden (Excel-, Access-, CSV-, TXT-Dateien sind die am häufigsten genutzten Formate) und die Datenbankfelder als Variablen in seinem Layout platzieren. Diese Variablen werden dann datensatzweise mit dem jeweiligen Datenfeldwert befüllt.
Es ist möglich JavaScript-Macros einzubinden (.js Datei, wird im Programmverzeichnis abgelegt) und diese als Funktion innerhalb von PrintShop Mail zu verwenden.

Beispiel-Aufbau eines PrintShop Mail Macros:
Javascript:
_counter = 0;

function psmCOUNT_CHANGED(wechsel,datensatz) {

    if(datensatz == 1) {
        _counter = 1;
    }

    if(wechsel) {
        _counter = _counter + 1;
    }
           
    return _counter;
}

Bei diesem Macro wird anhand von Eingabewerten ein Zähler um 1 erhöht, wenn ein Wechsel eines bestimmten Wertes erfolgt. Wobei die hier ausgewiesene Variable "wechsel" ein True oder False liefert, weil in PrintShop Mail eine andere Funktion verwendet wird die bei einem Wertwechsel True oder False ausgibt.
In PrintShop Mail wird bei jedem Datensatz der aktuelle der Wert der Variablen _counter ausgegeben.


Gegebenheiten:
Ich habe eine .xls-Datei als Datenbank/-quelle für mein Programm mit folgendem Aufbau.

Kunde | ID | Zaehler | Farbe
Thomas | 1 | 0 | Blau
Thomas | 1 | 1 | Rot
Thomas | 1 | 2 | Gelb
Michael | 2 | 0 | Grün
Marco | 3 | 0 | Orange
Marco | 3 | 1 | Rot

excel.JPG


Anforderung:
Ich möchte alle Farben zu einer ID in einem Array speichern und diese Werte ausgeben, sobald die letzte Zeile dieser ID erreicht wurde, wobei jede ID unterschiedlich viele Werte haben kann.

Beispiel:
Bei Datensatz 5 (Zeile 4) sollen die Farben Blau, Rot, Gelb ausgegeben werden.
Bei Datensatz 6 (Zeile 5) soll die Farbe Grün ausgegeben werden.
Bei Datensatz 8 (Zeile 7) sollen die Farben Orange, Rot ausgegeben werden.

Bisheriger Ansatz:
Ich habe aktuell folgenden Code geschrieben in dem ich einen mehrdimonsianelen Array erschaffe und mit meinen Werten befülle. Sobald der Wert der Variablen readwrite „READ“ ist werden die zum Datensatz passenden Array-Werte ausgegeben.

Javascript:
function psmSCHLEIFE_tut(ID,Zaehler,Farbe,readwrite) {

    schleife[ID] = new Array();


    if ( Zaehler == 0) {
        schleife[ID][0] = speicherwert;
        ds1 = schleife[ID][0];
        x = ds1;
    }
    if ( Zaehler == 1) {
        schleife[ID][1] = speicherwert;
        ds2 = schleife[ID][1];
        x = ds1 + "_" + ds2;
    }
    if ( Zaehler == 2) {
        schleife[ID][2] = speicherwert;
        ds3 = schleife[ID][2];
        x = ds1 + "_" + ds2 + "_" + ds3;
    }
    if ( Zaehler == 3) {
        schleife[ID][3] = speicherwert;
        ds4 = schleife[ID][3];
        x = ds1 + "_" + ds2 + "_" +ds3 + "_" + ds4;
    }
    if ( Zaehler == 4) {
        schleife[ID][4] = speicherwert;
        ds5 = schleife[ID][4];
        x = ds1 + "_" + ds2 + "_" +ds3 + "_" + ds4 + "_" + ds5;
    }

    return x;


Ausgabe-Beispiel:
Datensatz 1 ergibt: Blau
Datensatz 2 ergibt: Blau_Rot
Datensatz 3 ergibt: Blau_Rot_Gelb
Datensatz 4 ergibt: Grün
Datensatz 5 ergibt: Orange
Datensatz 6 ergibt: Orange_Rot

Das wäre für mich auch schon in Ordnung wenn ich nun bei dem letzten Datensatz einer ID (in diesem Fall z.B. Datensatz 3) eine zusätzliche Markierung hätte die ich dann in meinem Programm abfragen kann.

Hilfreiche Ausgabe:
„_Ende“ hinter jeden Ausgabestring einer letzten ID-Zeile.

Datensatz 1 ergibt: Blau
Datensatz 2 ergibt: Blau_Rot
Datensatz 3 ergibt: Blau_Rot_Gelb_Ende
Datensatz 4 ergibt: Grün_Ende
Datensatz 5 ergibt: Orange
Datensatz 6 ergibt: Orange_Rot_Ende


Vielleicht hat hier ja jemand eine Idee oder gar eine Lösung für mein Problem?

Vielen Dank bereits vorab für alle die sich die Zeit nehmen meinen Beitrag zu lesen, sich Gedanken machen und mir Ansätze oder sogar eine Lösung geben!

LG
rince
 
Kennt irgendjemand eine Lösung festzustellen wann ein mehrdimensionales Array gefüllt ist und die nächste Ebene anfängt?
Das könnte mir schon sehr weiterhelfen.
 
Hallo rincer1984

Ein Array ist nie gefüllt. In der aktuellen Situation, die du schilderst gibt es keine Lösung, die nicht darauf beruht, dass es deine Lösung gar nicht mehr braucht. Du bist in einer komplett kontextfreien Umgebung, hast keine Ahnung wie viele Einträge pro ID es gibt, usw.

Die einfachste Möglichkeit - vorausgesetzt deine Funktion wird strikt in der gleichen Reihenfolge aufgerufen wie die Datensätze definiert sind - ist es einen Dummywert am Ende zu haben, der auch immer in die Funktion eingespiesen wird. Zum Besipiel mit der ID -1. Wenn du bei dem Eintrag angelangt bist gibst du einfach alle Elemente in "schleife" entsprechend aus.

Grüsse
Cromon
 
Hallo Cromon,

vielen Dank für deine Antwort. Ich habe befürchtet, dass so eine Antwort kommt. Ich kann leider im Vorfeld keinen Dummywert am Ende setzen, ansonsten wäre es einfach. Deshalb war meine Frage ob man das in JavaScript bewerkstelligen kann.

Ich bin gerade am überlegen ob ich nicht mit einer Schleife alle Datensätze durchgehe, alle Werte in meinem mehrdimensionalen Array speichere und die Werte dann nach und nach abrufe wie ich es brauche.
Javascript:
var schleife = new Array();

function psmSCHLEIFE(zaehler,zaehler_zwei,speicherwert,recordcount) {

    schleife[zaehler] = new Array();

    for ( i = 0; i <= recordcount; i++ ) {
   
        if ( zaehler_zwei == 0) {
            schleife[zaehler][0] = speicherwert;
            ds1 = schleife[zaehler][0];
            x = ds1;
        }
        if ( zaehler_zwei == 1) {
            schleife[zaehler][1] = speicherwert;
            ds2 = schleife[zaehler][1];
            x = ds1 + "\n" + ds2;
        }
        if ( zaehler_zwei == 2) {
            schleife[zaehler][2] = speicherwert;
            ds3 = schleife[zaehler][2];
            x = ds1 + "\n" + ds2 + "\n" + ds3;
        }
        if ( zaehler_zwei == 3) {
            schleife[zaehler][3] = speicherwert;
            ds4 = schleife[zaehler][3];
            x = ds3 + "\n" + ds4;
        }
        if ( zaehler_zwei == 4) {
            schleife[zaehler][4] = speicherwert;
            ds5 = schleife[zaehler][4];
            x = ds4 + "\n" + ds5;
        }

        if ( i == recordcount ) {
            y = "ok";
        }
    }

    if ( y = "ok" ) {

        z = schleife[zaehler][zaehler_zwei].length;
       
        return z;
    }
}

Dabei müsste es ja möglich sein die Länge des befüllten Arrays abzufragen und wenn der letzte Wert eines Arrays erreicht ist eine Markierung mitzugeben. Leider bekomme ich die Array-Länge auf Grund meines mehrdimensionalen Arrays nicht ermittelt. Wenn ich die Methode .length anwende, wird mir die Zeichenlänge des im Array gespeicherten Wertes ausgegeben, nicht aber die Anzahl der Elemente im Array.

Nachdem die zweite Dimension ein Zähler ist der aus der Datenbank kommt wäre es möglich den Wechsel der ID in JavaScript zu prüfen?

LG rince
 
Kriterium dafür, dass es die letzte ID ist bzw. dass "das Array gefüllt ist", ist dass die nächste ID anders ist. Ich bin mir nicht sicher, ob ich dich richtig verstanden habe, aber ich meine, es müsste so gehen:
Code:
var ID_note = "";
var arr = [];
function psmSCHLEIFE_tut(ID,Zaehler,Farbe,readwrite) {
    if (ID != ID_note) {
        if (ID_note != "") // arr[ID_note].join("_") ausgeben
        arr[ID] = [];
        ID_note = ID;
    }
    arr[ID].push(Farbe);
}
// arr[ID_note].join("_") ausgeben
 
Zuletzt bearbeitet:
Hi Sempervivum,

danke für deine Antwort. Das bringt mich zumindest einen kleinen Schritt weiter, nachdem es ja leider in JavaScript keine eigene Changed() Funktion gibt.
Javascript:
var ID_note = "";
var arr = new Array();

function psmAAA(ID,datensatz) {

        if ( datensatz == 1 ) {
            ID_note = "";
        }

        if ( ID_note == "" ) {
                a = "";
                ID_note = ID;
              
                return ID_note + a;
        }

        if ( ID_note != ID ) {
            a = "hinweis";
            ID_note = ID;
          
            return ID_note + a;  
        }  
}

Damit kann ich nun den Wertwechsel meiner ID bestimmen und eine Markierung mit ausgeben.

Jetzt muss ich mir die push() Methode in Kombination mit meinem mehrdimensionalen Array nochmal genauer anschauen. Ich bekomme es leider noch nicht so hin wie ich will bzw. das Programm in dem das Macro ausgeführt wird ist da etwas eigen. Wenn ich eine for-Schleife einbaue die alle Datensätze durchsuchen soll macht er das scheinbar nicht.

Ich habe mal exemplarisch am Anfang meiner Funktion folgenden Code gesetzt:

Javascript:
for ( i = 0; i <= 5; i++ ) {
    arr[i] = ID;
    if ( i == 5 ) {
        ende = "OK";
    }
}

if ( ende == "OK" ) {
    return arr[4];
}

Meiner Logik nach sollte die Schleife anfangs komplett alles durchlaufen und in Registern ablegen. Die Variable ende sollte also sofort mit "OK" befüllt sein und gleich beim ersten Datensatz das Register 4 auslesen. Wenn ich aber das Programm öffne wird erst dann der Wert ausgegeben wenn ich auch bei dem entsprechenden Datensatz angekommen bin. Das deutet für mich darauf hin, dass er die Schleife nicht vorher ausführt.
Gibt es dafür vielleicht noch einen Trick?

EDIT: Mein Ziel ist es ja den Hinweis zum Wertwechsel auszugeben bevor der Wechsel passiert.

Beispiel: Datensätze 1 - 3 haben die ID 1, Datensätze 4 - 5 haben die ID 2 >> nach Datensatz 3 würde also der Wertwechsel passieren und aktuell würde mein Hinweis dann bei Datensatz 4 ausgegeben. Ich möchte den Hinweis aber bei Datensatz 3 haben.

LG rince
 
Zuletzt bearbeitet:
Ich habe jetzt nochmal einen weiteren Test im Programm gemacht um dessen Verhalten bezüglich Schleifen zu untersuchen.
Vielleicht hilft es meinen Helfern weiter...

Ich binde folgenden Code ein:
Javascript:
var datensatz = 0;

function psmAAA(ID,Speicher) {

datensatz++;

return datensatz;
}

Ausgabe beim ersten Datensatz: 1

Im Programm kann ich nun per Klick jeweils einen Datensatz weiterschalten und meine Ausgabe erhöht sich dann auch jeweils um 1.

Für mich sieht es also so aus, als würde das Programm selbst wie eine Schleife arbeiten die pausiert bis man per Klick einen Datensatz weiterschaltet.

Wenn ich im Programm dann Datensätze zurückgehe (per Klick) wird die Ausgabe auch um 1 erhöht.
 
nach Datensatz 3 würde also der Wertwechsel passieren und aktuell würde mein Hinweis dann bei Datensatz 4 ausgegeben. Ich möchte den Hinweis aber bei Datensatz 3 haben.
Dafür sehe ich leider keine Lösung. Den Wechsel kannst Du erst erkennen, wenn der neue, andere Datensatz bearbeitet wird.
 
Trotzdem vielen Dank für die Hilfe! Dann muss ich wohl doch wieder die Excel-Datei im Vorfeld per VBA bearbeiten.
 

Neue Beiträge

Zurück