Automatisch aktualisiertes Datums- und Uhrzeitfeld in QGIS erstellen?

8

Ich möchte ein Feld mit Datum und Uhrzeit aktualisieren, während ich ein Attributfeld in diesem Format bearbeite. JJJJ-MM-TT 00:00:00 (= 2016-05-08 11:04:00) - mein lokales Datum / meine lokale Uhrzeit. Die Daten befinden sich in einem QGIS 2.14-Shapefile und Vektorlinien als Screenshot unten.

Wenn eine Funktion als NULL im Feld ‚Name‘, möchte ich für die Straße einen Namen einzugeben und die ‚mod‘ Feld muss de empfangen mod ified Datum / Uhrzeit wie ‚2016.05.08 15.16.00‘.

Ich habe bereits einige Optionen ausprobiert und bin gescheitert. Ich brauche Hilfe, um von vorne zu beginnen.

  1. Ich erstelle ein neues Feld, einen Datums- / Uhrzeittyp, bleibe aber nach der Bearbeitung im Feld "Name" oder in der Funktion selbst mit dem Wert NULL.
  2. Ich habe auch den Ausdruck now () verwendet, bleibe aber nach der Bearbeitung beim NULL-Wert.

Hinweis: Das dort angezeigte Datum, 14.04.2016, ist der erste Wert, der mit "Feldrechner" erstellt wurde.

Geben Sie hier die Bildbeschreibung ein

Ich verwende QGIS 2.14.

Carlos Pires
quelle
Bitte bearbeiten Sie Ihre Frage, um das Datenformat und die verwendeten Softwareversionen anzugeben. Sie sollten auch den Datentyp der Zielspalte angeben (da Datumsfelder keine Formate haben)
Vince
Bitte bearbeiten Sie die Frage , um die angeforderten Informationen zu enthalten. Sie sollten Detail ein, was Sie versucht haben, und genau , wie es ist fehlgeschlagen. Auf diese Weise können unsere Freiwilligen verstehen, was Sie erreichen möchten. Derzeit gibt es nicht genügend Informationen, um eine Lösung zu erraten. Ich stelle mir vor, dass eine Spalte zum automatischen Ausfüllen in DB2 nicht Ihren Anforderungen entspricht.
Vince
Klingt für mich, wenn Sie den Zeitstempel der letzten Bearbeitung / Aktualisierung eines Features in einem Attribut speichern möchten. Habe ich Sie richtig verstanden? So etwas wie das, was ESRI als "Editor-Tracking" bezeichnet?
Jochen Schwarze
2
Also, welche Art von Datenprovider verwenden Sie (Form, Postgis, ...) und übrigens: Ist der dreistellige Monat ein Tippfehler oder benötigen Sie so etwas wie 2016-Mai-08? Vielleicht ist es erfolgreich, das ´beforeCommitChanges´-Signal eines ´QgsVectorLayer´ oder eines ´UPDATE´-Triggers in postgesql zu fangen.
Jochen Schwarze
1
Shapefile ist ein miserables Datenformat für Zeitstempel, da dBase nur die Tagesauflösung unterstützt (NULLs werden auch nicht wirklich unterstützt). Sie müssen eine Zeichenspalte für diese Informationen verwenden (die dann für jede weitere Verwendung analysiert werden müssten)
Vince

Antworten:

12

Sie können den folgenden Code verwenden, der das attributeValueChangedEreignis mit einer Funktion verbindet, die wir definieren können und die die Ergebnisse des $nowAusdrucks einfügt . Markieren Sie Ihre Ebene und kopieren Sie Folgendes in die Python-Konsole :

layer = qgis.utils.iface.activeLayer()

def update():
    field = layer.fieldNameIndex('mod')
    e = QgsExpression( " $now " )
    e.prepare( layer.pendingFields() )
    for feat in layer.selectedFeatures():
        feat[field] = e.evaluate( feat )
        layer.updateFeature( feat )

layer.attributeValueChanged.connect(update)

Wählen Sie das Feature aus, indem Sie auf die Zeilennummer (im roten Feld im Bild angezeigt) oder auf der Kartenoberfläche klicken und ein beliebiges Attribut für dieses Feature bearbeiten . Das Attribut in Ihrem modFeld sollte aktualisiert werden:

Ergebnis


Hinweis: Ich habe ein Zeichenfolgenfeld anstelle des Datums verwendet, um die Uhrzeit abzurufen. Andernfalls zeichnet das Datumsfeld nur JJJJ-MM-TT auf .

Joseph
quelle
@CarlosPires - Herzlich willkommen! Hoffe es hilft :)
Joseph
Also habe ich ein neues Textzeichenfolgenfeld (20) 'mod' erstellt (siehe 1) . Ich habe Ihren Code in die Python-Konsole eingefügt (nach Strg-Alt-P) und den Namen der Straße 'Name' eingefügt (siehe 2) . hat den Datensatz verlassen, aber das Feld ist immer noch NULL (siehe 3), wie Sie in der Bildschirmaufnahme sehen. ! [ScreenshotTry] ( i.stack.imgur.com/lGR2D.png ).
Carlos Pires
2
Jetzt funktioniert es! Da ich kein Programmierer bin, wusste ich nicht, dass wir den Code zuerst ausgeführt hatten !! :( Entschuldigung. Hinweis : Es funktioniert mit dem Auswahlwerkzeug. Wenn das Attributfeld mit dem Info-Werkzeug bearbeitet wird (Feature identifizieren), funktioniert es nicht.
Carlos Pires
2
@CarlosPires Hierfür können Sie das AutoFields- Plugin verwenden. In diesem Video finden Sie ein Beispiel für die automatische Berechnung von Datum und Uhrzeit. Ich denke, es sollte auch funktionieren, wenn Sie das Identifizierungswerkzeug verwenden, um Ihre Werte zu aktualisieren. Könnten Sie dies bitte überprüfen?
Germán Carrillo
1
@ GermánCarrillo, es scheint eine gute Wahl zu sein. Ich werde es später versuchen. Vielen Dank.
Carlos Pires
3

Ich bin auf diese Fragen und Antworten gestoßen, als ich nach einer Möglichkeit gesucht habe, Datums- / Zeitstempeländerungen vorzunehmen, die ich mithilfe eines Plugins an Aufzeichnungen vorgenommen habe. Ich habe eine leicht modifizierte Version des Codes in das Plugin eingefügt, um Datum und Uhrzeit in den von mir geänderten Datensätzen automatisch zu aktualisieren:

""" Prepare Change Date/Time Stamp"""
e = QgsExpression( " $now " )
cDate = e.evaluate()

"""" Identify column(s) to change and new value(s) to assign"""
attrs = { 10 : newStat, 20 : cDate }

""" Make record change and capture date/time of change'''
layer.dataProvider().changeAttributeValues({ fid : attrs })
rLogan
quelle
Technisch gesehen scheint dies keine Antwort zu sein, aber ich denke, dass diese "Antwort" für einen zukünftigen Leser als Teil der Fragen und Antworten einen gewissen Wert haben kann, und deshalb lasse ich sie an Ort und Stelle. Es muss mehr formatiert werden, als es die Konvertierung in einen Kommentar zulässt. Ich bin froh, überstimmt zu werden, wenn jemand, der dem Schreiben von QGIS-Plug-Ins näher steht als ich, hier in Kommentaren einen Fall machen und mich oder einen anderen Moderator anpingen möchte.
PolyGeo