wie vergleiche ich xmin und txid\_current () nach dem umlauf der transaktions-id?
<p>neben den regulären spalten stehen in postgres-tabellen auch verschiedene <a href="https://www.postgresql.org/docs/current/static/ddl-system-columns.html">systemspalten</a> zur verfügung. einer von ihnen, <code>xmin</code>, speichert die transaktions-id, die zum erstellen einer zeile verwendet wird. sein datentyp ist <code>xid</code>, eine 4-byte-ganzzahl, die sich irgendwann umschließt (d. h. nicht unbedingt eindeutig). die funktion <code>txid\_current()</code> gibt wiederum die aktuelle transaktions-id zurück, jedoch als <code>bigint</code>, da sie "um einen" epoch "-zähler erweitert wird, damit sie während der laufzeit einer installation nicht umbrochen wird." (um das <a href="https://www.postgresql.org/docs/current/static/functions-info.html#functions-txid-snapshot">handbuch</a> zu zitieren).</p><p>wenn der umlauf der transaktionen noch nicht stattgefunden hat, scheinen beide werte übereinzustimmen:</p><pre><code># create table test (label text); create table # insert into test values ('test') returning txid\_current(); txid\_current  674500 (1 row) insert 0 1 # select xmin from test; xmin  674500 (1 row) </code></pre><p>aber ich frage mich: sind diese beiden werte immer vergleichbar? soweit ich weiß, liefert <code>txid\_current()</code> nach dem umlauf der transaktions-id (höchstens 2 ^ 32 transaktionen) weiterhin eindeutige werte, und <code>xmin</code> beginnt bei null. dies bedeutet, dass beide an diesem punkt unterschiedliche werte zurückgeben.</p><p>und wenn dies zutrifft, gibt es eine möglichkeit, reguläres <code>xid</code> eines <code>txid\_current()</code> -ergebnisses so zu extrahieren, dass es mit <code>xmin</code> -einträgen in einer tabelle übereinstimmt (z. b. casting <code>txid\_current()</code> zur ganzen zahl)?</p><p><strong> bearbeiten </strong>: machen sie klarer, dass es mir wichtig ist, was nach einem umlauf der transaktions-id passiert, was sehr wahrscheinlich lange vor 2 ^ 32 transaktionen geschieht. vielen dank an daniel vérité, der dies in den kommentaren erwähnt hat.</p>
<p>sie können die hinzugefügte epoche entfernen, um dem wert in <code>xmin</code> zu entsprechen, d. h. das 4-byte <code>integer</code> aus dem <code>bigint</code> extrahieren. da <code>xmin</code> vom typ <code>xid</code> und nicht (signiert!) <code>integer</code> ist, vergleichen wir stattdessen die darstellung <code>text</code>:</p><pre><code>select * from test where xmin::text = (txid\_current() % (2^32)::bigint)::text; </code></pre><p>ausführliche erklärung:</p><ul> <li> <a href="https://dba.stackexchange.com/questions/123145/how-to-view-tuples-changed-in-a-postgresql-transaction/123183#123183">wie werden in einer postgresql-transaktion geänderte tupel angezeigt?</a> </li> </ul>
Am besten einen Vergleich machen. Wenn eine Spalte in der Datenbank nullfähig ist, hat die Ergebnisklasse auch eine nullfähige Eigenschaft. 

 Wenn beispielsweise eine `Order` eine `Datetime` Spalte mit dem Namen `CreatedDate` , sieht die resultierende `Order` Klasse in etwa wie folgt aus: 


```
public partial class Order: EntityObject
{
  ...
  private DateTime? _createdDate;
  ...
}

```
  Wenn \_ `createdDate` keinen Wert hat, wenn Sie `ObjectContext.SaveChanges()` aufrufen, wird eine `System.DBNull` automatisch als Teil des Befehls insert oder update an die Datenbank gesendet. 

 Hoffe das hilft Alex das ist immer der wert, mit dem du in den tag startest. 
in dein fall kommt die nacht absenkung ja von sonntag auf montag, somit stimmt das was dir angezeigt wird. <p>ein standard-fortschrittsbalken und eine anzahl von karten wären wahrscheinlich ausreichend. ich bin jedoch der meinung, dass dies etwas ist, bei dem sie ein bisschen kreativ sein könnten: der effekt eines streudiagramms könnte nizza sein, sie könnten auch die neuesten pixel am hellsten machen und die älteren verblassen lassen.</p><p>wenn sie das generierte pixelplot in bezug auf die leistung speichern, sodass es nicht jedes mal berechnet werden muss, wenn es angezeigt wird, sollte dies wirklich kein problem sein. ich denke, ich würde nicht das canvas-tag verwenden, sondern ein vom server generiertes image. die aktualisierungsaktion selbst sollte nicht zu kompliziert sein: sie müssen nur das bild abrufen, das sie bereits haben, und das letzte update (oder aktualisierungen seit dem letzten rendern des bildes) abrufen und genau diese pixel ändern. wenn sie sie nach zeit verblassen möchten, verblassen sie zuerst das bereits vorhandene bild und fügen sie dann den neuesten zeitstempel der überblendungsaktion hinzu, sodass sie dies nur einmal am tag oder einmal pro stunde oder was auch immer tun. (sie können es auch bei jedem schritt tun.)</p><p>jetzt ist es weitaus komplexer als nötig, um nur fortschrittsinformationen bereitzustellen. aber es könnte eine sehr nette funktion sein und interessant zu bauen sein! und ich denke, es ist sehr machbar, es so zu implementieren, dass es ihre ressourcen nicht belastet.</p> hi thomas, genau den mist habe ich auch seit ca. einer woche und vermute, dass das eine meiner apps seit einen update macht. leider konnte ich noch nicht herausfinden, welche app es ist und tappe noch im dunkeln. kannst du mir sagen, wo genau dir diese zeile aufgefallen ist und mit welchem logviewer? ich nehme an, die uid, die in deinem fall die 10159 ist, ist die der app, die einen intent sendet, um diese livemobilesearch. com seite in einem neuen firefox tab zu öffnen. du kannst herausfinden, welche app der uid zugeordnet ist, siehe z.b. hier (wie du muss ich auch leerzeichen in der url einfügen): android. stackexchange. com/questions/8452/how-can-i-find-app-name-by-uid
vermutlich hilft dann nur, die app zu deinstallieren und sich mit einer bewertung im play store zu beschweren, dass die app ungefragt irgendwelche dubiosen seiten im firefox öffnet. 
ich hoffe, ich kann damit helfen, bitte gib mir auch das feedback, wie du den log-eintrag gefunden hast, damit ich auch weiter komme. 
gruss, 
erik <p>die standardmethode für die angabe des objekttyps ist entweder <a href="http://search.cpan.org/perldoc?perlfunc#ref"><code>ref</code></a> oder <a href="http://search.cpan.org/perldoc?scalar::util"><code>scalar::util</code></a> <code>::blessed</code>. wenn sie<em> wissen </em>das objekt gesegnet ist, geben sie dieselbe information zurück. </p><pre><code>my $class1 = blessed( $obj ); my $class2 = ref $obj; </code></pre><p><code>ref</code> gibt jedoch auch 'hash' für nicht gesegnete hashes zurück, während <code>blessed</code> dieses spiel ablehnt. </p><p>für eine liste von methoden ist es für den gesegneten zeigerstil eines perl-objekts einfach, eine davon selbst zu codieren. der folgende code funktioniert ziemlich gut für mich. es gibt die namen der funktionen (diejenigen, die den &quot;code-slot&quot; des angegebenen namens annehmen) zurück, die dem paket zugeordnet sind, das sie definiert. </p><pre><code>sub class\_methods { use class::isa; my $obj = shift; return unless ref( $obj ); my %meth\_names; foreach my $anc ( class::isa::self\_and\_super\_path( ref $obj ), 'universal' ) { my $stash = \%{"$anc\::"}; my @funcs = grep { m/^[\_\p{alpha}]/ # begins with \_ or alpha &amp;&amp; !exists $meth\_names{$\_} # no clobbering &amp;&amp; defined *{$stash-&gt;{$\_}}{code} # has a filled code slot } keys %$stash ; # assign to the "hash slice", keyed by all the entries in @funcs # the value of $anc repeated as many times as elements in @funcs. @meth\_names{@funcs} = ( $anc ) x @funcs; } return %meth\_names; } </code></pre><ul> <li><p>dies funktioniert auch für relativ komplexe objekte, aber wenn das besitzende paket eine menge generierten codes enthält, ist es nicht besonders hilfreich zu wissen, in welchem ​​paket die generatoren den code-pointer stecken. es wird mehr bedeuten, welches paket zu finden ist generiert den code. </p></li> <li><p>ist dies der fall, erhalten sie<em> might </em>den code aus der ausführung ihres codes, einschließlich <a href="http://search.cpan.org/perldoc?data::dumper"><code>data::dumper</code></a> und setzen von <code>$data::dumper::deparse</code> auf 1 wie folgt: (<code>local $data::dumper::deparse = 1;</code>) und dann den code-zeiger wie folgt: <code>say dumper( $code\_ref );</code></p></li> <li><p>es<em> won't </em>funktioniert für gültige methoden, die noch mit einer beliebigen <code>autoload</code>-methode erstellt werden müssen. wenn sie diese in der liste sehen, macht das objekt möglicherweise mehr, aber was es alles tut, wissen sie nicht.</p></li> <li><p>die &quot;basisklasse&quot; <code>universal</code> ist enthalten, da diese klasse verhalten enthält, das vom objekt verwendet werden kann. </p></li> </ul><p>viel glück.</p> <p>sie können das meiste davon tun, indem sie eine login.sql verwenden. login.sql wird während der - überraschenden - anmeldung ausgeführt und aus ihrem sqlpath oder dem aktuellen verzeichnis geladen. für die beispiele, die sie gegeben haben, haben sie wirklich den schlimmsten fall gewählt.</p><p>problem ist der sqlterminator. was auch immer sie dort eingeben, der schrägstrich wird als kostenloser sql-minator beibehalten. daneben sucht sqlplus zuerst nach dem sqlterminator und führt dies vor dem scannen zum string-terminator durch. ein fehler, wenn sie mich fragen. der schrägstrich kann in einer zeichenfolge verwendet werden, solange er nicht allein in einer separaten zeile steht. sobald sqlplus das als sqlterminator angegebene zeichen findet, ignoriert es alles andere und hört auf zu lesen.</p><p>der schrägstrich kann behandelt werden, solange er nicht alleine in einer zeile steht.</p><p>login.sql enthält:</p><pre><code>prompt run login.sql show sqlterminator show sqlblanklines set sqlblanklines on set sqlterminator ';' show sqlterminator show sqlblanklines prompt ready login.sql set echo on </code></pre><p>leigh.sql enthält:</p><pre><code>insert into t1 values ('fail bc semicolon a;a / '); insert into t1 values ('fail bc solo / aa / '); insert into t1 values ('ok / not solo aa /a '); delete from t1 where a = 'c a/ '; </code></pre><p>führen sie das skript aus:</p><pre><code>sqlplus leigh/leigh@orcl @leigh sql*plus: release 10.2.0.4.0 - production on thu aug 9 22:36:20 2012 copyright (c) 1982, 2007, oracle. all rights reserved. connected to: oracle database 11g enterprise edition release 11.2.0.3.0 - 64bit production with the partitioning, real application clusters, automatic storage management, olap, data mining and real application testing options run login.sql sqlterminator ";" (hex 3b) sqlblanklines off sqlterminator ";" (hex 3b) sqlblanklines on ready login.sql sql&gt; insert into t1 values ('fail bc semicolon 2 a;a 3 / error: ora-01756: quoted string not properly terminated sql&gt; '); sp2-0042: unknown command "')" - rest of line ignored. sql&gt; sql&gt; insert into t1 values ('fail bc solo / 2 3 4 aa 5 / error: ora-01756: quoted string not properly terminated sql&gt; '); sp2-0042: unknown command "')" - rest of line ignored. sql&gt; sql&gt; insert into t1 values ('ok / not solo 2 3 4 aa 5 /a 6 '); 1 row created. sql&gt; sql&gt; delete from t1 where a = 'c 2 3 4 a/ 5 '; 0 rows deleted. </code></pre><p>sie müssen nicht mit start-/endblöcken herumspielen. der befehl sqlterminator innerhalb des befehls kann nicht verarbeitet werden, unabhängig davon, wo er sich in einer zeichenfolge befindet oder nicht. er kann keine zeilen mit schrägstrich allein in einer zeile in einer zeichenfolge verarbeiten.</p> Sehr geehrter Herr Müller,  

  

es ist leider etwas schwierig das Problem genau nachvollziehen zu können, ohne einen näheren Blick darauf zu werfen, da dies generell problemlos funktionieren sollte. Ich habe auch die von Ihnen beschriebene Situation gerade nochmal bei mir simuliert und konnte keine Probleme feststellen. Man müsste nun wissen, ob eventuell eine unbefristete Primärsollzeit definiert ist, evtl. eine Abwesenheit für den betreffenden Zeitraum eingetragen ist oder andere Umstände zu diesem Problem führten.  

  

 Generell werden Sollzeiten, mit Ausnahme während Abwesenheiten oder an Feiertagen, direkt gegen das Saldo gerechnet, wenn sie also eine neue Sollzeit definieren, sollte diese auch direkt gegengerechnet werden.  

  

 Im Zweifelsfall müssten Sie sich dann doch an unseren Support wenden.  

  

mit freundlichen Grüßen,   

  

Thomas Zollmann Hallo Sammys, Hallo Gromio  
Es tut mir leid (ich bin Steuerberater) dass die Aussage von Gromio nicht richtig ist. Das Kassenbuch muss täglich nachgeführt werden, alle täglichen Einnahmen und alle täglichen Ausgaben zeigen (auch Privatentnahmen oder Privateinlagen, kann auch mal sein) und den täglichen Bestand (Saldo) ausweisen. Das hat steuerrechtliche Gründe: Ein so geführtes Kassenbuch darf nie einen negativen Bestand ausweisen. Denn da würde die Steuerbehörde sehen, dass entweder Einnahmen fehlen (nicht eingetragen wurden, vielleicht aus Absicht?) oder Privateinlagen fehlen. Woher die Privateinlagen kommen, müsste dabei - bei vilelen oder grösseren Einlagen - erklärbar sein.


Bei einem nicht so geführten Kassenbuch könnte man das ganze Jahr über nur Ausgaben eintragen und am Ende Jahr eine Privateinlage eintragen, welche den Saldo wieder kurz über Null bringt (was keine Steuern auslösen würde). 


Regelmässig sollte auch der Bestand laut Kassenbuch mit dem wirklichen Geldbestand verglichen werden und - falls nötig und wenn der Fehler nicht gefunden wird - eine Korrektur-Eintragung vorgenommen werden. (Kassensturz). Ich hoffe das hilft. Ein gut geführtes Kassenbuch kannst Du mit einer Gratis-Software oder mit einer Excel-Tabelle erstellen.


Ich hoffe, das hilft


Thomas <p>wenn dies meine entwurfsentscheidung wäre, würde ich wahrscheinlich eher eine option c (modifizierte option a) wählen.</p><h3>erstens, warum nicht 'option b':</h3><p>zum einen gefällt mir die klarheit, dass jedes produkt seinen eigenen tisch hat. wenn es sich nur um eine große tabelle mit einem feld zur bestimmung des typs handelt, ist die beziehung nicht so klar.</p><p>zum anderen würde die indizierungsstrategie immer erfordern, dass dieses typfeld aufgelistet wird. da es sich nur um 4 typen handelt, ist die indexkardinalität extrem niedrig (<code>select * from product\_table where type='x'</code> führt im grunde sowieso einen vollständigen tabellenscan durch)</p><h3>option c.</h3><ul> <li>erstellen sie eine übergeordnete tabelle, die nur die spalten enthält, die alle typen gemeinsam nutzen</li> <li>erstellen sie jeden produkttyp als eigene tabelle mit ihren einzelnen spalten, mit einem zusätzlichen: ein link zur übergeordneten tabelle</li> <li>erstellen sie jede 'link'-tabelle: product\_option, model\_option usw. mit links zu den jeweiligen schlüsseln.</li> <li>für diejenigen mit wechselseitigen links (model\_option, option\_model) erstellen sie auch diese tabellen. dies erhöht die klarheit ihrer joins für alle, die sich das ansehen.</li> </ul><p>der nachteil ist die komplexität, sicherzustellen, dass waisen vermieden werden, wenn dinge aktualisiert/gelöscht werden, und zunächst die abfragen zu entwerfen, die diese tabellen verwenden.</p>