Frage

Ich habe ein großes "Auftragsformular" XPage, das 99 Zeilen mit 3 Texteingangsfeldern in jeder Zeile anzeigt. Um Änderungen zu erfassen, habe ich einen Aufruf an eine SSJS -Funktion im Ereignis "Onchange" jedes Eingabegleiters gestellt. Der Anruf sendet einfach die Produkt -ID, die Art der Änderung (welche Spalte) und die Menge. Die SSJS -Funktion bewahrt dann diese Änderungen in einer Sessionscope -Variablen (java.util.hashMap). Mit der Änderung ist keine Aktualisierung verbunden.

Die Änderungen werden massenhaft verarbeitet, wenn der Benutzer auf die Schaltfläche "Senden" klickt. Dies ist eine weitere SSJS-Funktion, die einfach alle Änderungen in der Back-End-Domino-Datenbank schreibt.

Das alles scheint gut zu funktionieren und hat es seit ein paar Jahren getan. Es scheint jedoch, dass meine Benutzer mit der Anwendung zu effizient werden und schneller tippen, als sie mithalten können.

Mein Debug -Code schreibt jede Änderung in die Konsole des Servers, und ich kann sehen, wo einige Änderungen einfach ignoriert werden, wenn der Benutzer in der schnellen Nachfolge Änderungen vornimmt (sie haben einfach die Registerkarte zwischen den Eingabefelfen). Es ist fast so, als ob der Server zu beschäftigt ist, die vorherige Änderung zu verarbeiten, und überspringt eine, um zu einem anderen zu übergehen. Manchmal werden ganze Änderungenblöcke übersehen, und dann nimmt die Anwendung zurück, wenn sie kann.

Verwende ich die falsche Technik, um die Änderungen zu erfassen? Kann ich etwas tun, um sicherzustellen, dass die Anwendung jedes Mal das Onchange -Ereignis initiiert?

Ich habe dies mit IE8/9 & FF24 getestet. Ich habe mir andere solche Beiträge angesehen, die stattdessen das "Onkeyup" -Event verwenden. Ich glaube nicht, dass das in meinem Fall funktionieren würde, da die Benutzer zweistellige Mengen bestellen können.

Alle/alle Vorschläge wären dankbar geschätzt!

War es hilfreich?

Lösung

Terry, Sie müssen die Architektur erneut besuchen. Wenn die Updates auf Senden verarbeitet werden, warum sollten Sie sich die Mühe machen, sie einzeln an den Server zu senden -, wie Tim gut betonte. Was ich tun würde:

  • Erstellen Sie 2 Java -Klassen: eine "Order" One "LineItem"
  • Lassen Sie die Bestellklasse die Karte der Kartenschnittstelle implementieren
  • Verwenden Sie die Auftragsklasse für Ihre Wiederholungssteuerung (Sie erhalten die Taste jeder Linienbilder als Wiederholungsvariable).
  • Binden Sie die Felder in die Wiederholung, um [Wiederholung] zu bestellen .Fieldname
  • Verwenden Sie die Reihenfolge in einer Objektdatenquelle
  • Implementieren Sie die Speichernmethode in der Bestellklasse und rufen Sie sie in der Speichernmethode der Objektdatenquelle auf

Sehr geschwungener Umriss, lassen Sie mich wissen, ob Sie mich näher erläutern müssen. Das Java -Sammlungs -Framework ist Ihr Freund.

Es ist einfacher als es aussieht:

   public class LineItem {

private String unid;
private String partno;
private int quantity;
private long unitprice;

/**
 * Constructor for new items
 */
public LineItem() {
    this.unid = null;
}

/**
 * Constructor for existing items
 */
public LineItem(Document doc) {
    this.unid = doc.getUniversalId();
    // more here
}


/**
 * @return the unid
 */
public String getUnid() {
    return this.unid;
}

/**
 * @return the partno
 */
public String getPartno() {
    return this.partno;
}
/**
 * @param partno the partno to set
 */
public void setPartno(String partno) {
    this.partno = partno;
}
/**
 * @return the quantity
 */
public int getQuantity() {
    return this.quantity;
}
/**
 * @param quantity the quantity to set
 */
public void setQuantity(int quantity) {
    this.quantity = quantity;
}
/**
 * @return the unitprice
 */
public long getUnitprice() {
    return this.unitprice;
}
/**
 * @param unitprice the unitprice to set
 */
public void setUnitprice(long unitprice) {
    this.unitprice = unitprice;
}

public void save(Database db) {
    Document doc = null;
    if (this.unid == null) {
        doc = db.createDocument();
        doc.replaceItem("Form", "LineItem");
    }
    doc.replaceItem("PartNo", this.partno);
    // More here
    doc.save();
}
}

und für die Bestellung - vermutet, dass Sie aus einer Dokumentsammlung geladen werden.

public class Order implements Map<String, LineItem> {

// You might want to have a stack here to keep order
private final Map<String, LineItem> backingMap          = new LinkedHashMap<String, LineItem>();
private final Set<String>           deletedItemKeys     = new HashSet<String>();

// The key we use for new items when unid is null
private int                         lastNewItemNumber   = 0;

@Override
public int size() {
    return this.backingMap.size();
}

@Override
public boolean isEmpty() {
    return this.backingMap.isEmpty();
}

@Override
public boolean containsKey(Object key) {
    return this.backingMap.containsKey(key);
}

@Override
public boolean containsValue(Object value) {
    return this.backingMap.containsValue(value);
}

@Override
public LineItem get(Object key) {
    return this.backingMap.get(key);
}

@Override
public LineItem put(String key, LineItem value) {
    // Here it gets a little special
    // We need to prevent null keys
    if (key == null) {
        key = String.valueOf(this.lastNewItemNumber);
        lastNewItemNumber++;
    }
    this.deletedItemKeys.remove(key);
    return this.backingMap.put(key, value);
}

@Override
public LineItem remove(Object key) {
    this.deletedItemKeys.add(key.toString());
    return this.backingMap.remove(key);
}

@Override
public void putAll(Map<? extends String, ? extends LineItem> m) {
    for (Map.Entry<? extends String, ? extends LineItem> me : m.entrySet()) {
        this.put(me.getKey(), me.getValue());
    }
}

@Override
public void clear() {
    this.deletedItemKeys.addAll(this.backingMap.keySet());
    this.backingMap.clear();
}

@Override
public Set<String> keySet() {
    return this.backingMap.keySet();
}

@Override
public Collection<LineItem> values() {
    return this.backingMap.values();
}

@Override
public Set<java.util.Map.Entry<String, LineItem>> entrySet() {
    return this.backingMap.entrySet();
}

public void load(NotesDocumentCollection dc) throws NotesException {
    Document doc = dc.getFirstDocument();
    Document nextDoc;
    while (doc != null) {
        nextDoc = dc.getNextDocument(doc);
        LineItem li = new LineItem(doc);
        this.put(doc.getUniversalId(), li);
        doc.recycle();
        doc = nextDoc;
    }

    doc.recyle();
}

public void save(Database db) {
    for (LineItem item : this.backingMap.values()) {
        item.save(db);
    }

    // Now kill the left overs - needs error handling
    for (String morituri : this.deletedItemKeys) {
        Document delDoc = db.getDocumentByUnid(morituri);
        if (delDoc != null) {
            delDoc.remove(true);
        }
    }       
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top