Project

General

Profile

Feature #18491

Updated by Carsten Rose 3 months ago

Mitunter veraendert sich der Inhalt einer itemList.  

 Beispiel: Ein Student macht einen Vortrag bei einem Studentenseminar und wird als Sprecher erfasst. In der Auswahlliste sind nur aktuell eingeschriebene Studenten enthalten. Ein Jahr spaeter, der Student hat sein Studium abgeschlossen und ist kein Student mehr, steht die Person in der Auswahlliste nicht mehr zur Verfuegung. Wird der Vortragsrecord nun geoeffnet und gespeichert, wird die Person ├╝berschrieben - typischerweise wird die erste Person in der Auswahlliste eingetragen. Diese Veraenderung faellt oft nicht auf. 

 Das Verhalten ist ein Bug - bisher muss aufwendig explizit programmiert werden damit dieser Fall abgefangen wird. 

 3) QFQ Standardverhalten: Wenn eine aktuell gespeicherte ID nicht mehr in der Itemlist als ID vorhanden ist erkennt QFQ das. Der User koennte bei der ersten versuchten Aenderung im Form darauf hingewiesen werden und kann nicht speichern - z.B. in dem der Save Button disabled wird, mit einem Hinweis das sonst Daten verloren gehen (Angabe des Feldes).  


 0) Neu gibt es eine Option @missingItem = auto (default)|warn|error|ignore@ 

 * auto: Es wird mit 1,2 versucht den Eintrag zu ermitteln. Gelingt das wird die Auswahlliste um den alten Eintrag erweitert und bei einem Save bleibt der Eintrag unveraendert. 
 * warn: Der User wird darauf hingewiesen (beim laden des Forms), kann aber speichern und verliert damit den alten Eintrag. 
 * error: Der User wird darauf hingewiesen (beim laden des Forms), kann aber nicht speichern (Form im Read Only Mode). 
 * ignore: QFQ ignoriert das Problem, der alte Eintrag wird beim save ├╝berschrieben. 
  
 1) Neu kann eine explizite SQL Query angegeben werden, die den alten Wert in der Auswahlliste hinzufuegt (falls nicht vorhanden): 

 <pre> 
 oldItem = {{!SELECT p.id AS id, p.name AS label FROM Person AS p WHERE p.id={{p_id:R0}} }} 
 </pre> 

 Die Query wird nur gefeuert falls der bestehende Wert nicht in der ItemList gefunden wird.  

 Ist kein @oldItem@ definiert, geht es mit 2,3 weiter. 


 2) Mithilfe der bestehenden SQL itemlist Query wird automatisiert versucht den alten Wert zu laden.  

   * Die weiteren Schritte werden nur gemacht wenn festgestellt wird, das der gespeicherte Wert nicht mehr in der itemList vorkommt. 
   * QFQ analysiert die itemList Query und baut daraus eine neue Query. 
   * Die 'id' Spalte zeigt auf die Tabelle (Table Alias, ohne Tablename, ggfs. mehrere Tables - dann nach der Spalte in der Tabelle suchen) aus der der Record kommt. 
   * Den Record laden - dabei die Definition der 'label' Spalte ├╝bernehmen (in der Regel ist das nur eine Spalte oder ein CONCAT). Sollten Spalten von weiteren Tabellen in dem CONCAT stehen: diese Spalten aus dem duplizierten Concat entfernen. 
   * Die WHERE Bedinung enhaelt nur ein @id=<value>@ 
   * Sollte die Query kein Ergebnis oder einen SQL Fehler liefern (es wird keine Fehlermeldung ausgegeben),    wird mit 3 weiter gemacht. 

Back