Formularelementtyp Zahl - geeignete Kandidaten finden

Aus kvwmap
Version vom 27. Mai 2013, 11:36 Uhr von Markus Hentschel (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

--Markus Hentschel 12:36, 27. Mai 2013 (CEST) Seit der Version 1.11 gibt es den Formularelementtyp Zahl, der für die bessere Anzeige der Zahl Tausendertrennzeichen einfügt. Aber welche Attribute aus den - möglicherweise Hunderten von - bereits vorhandenen Layern sind denn überhaupt Kandidaten für diesen Formularelementtyp?

Ich habe mir ein zweistufiges Abfrageverfahren ausgedacht, an dessen Ende eine überschaubare Liste von Attributen steht, die genauer betrachtet werden können. Es wird nach allen Attributen gesucht, die smallint, int oder bigint sind, dabei mindestens vier Stellen im maximalen Wert ausweisen, vom Formularelementtyp "Text" sind und nicht offensichtlich keine Zahlen sind wie z.B. IDs, Schlüssel, Jahreszahlen usw.

  • Abfrage in der MySQL:
SELECT CONCAT(
 'SELECT ''',
 l.Layer_ID,
 ''' as layer_id, ''',
 l.Name,
 ''' as layer_name, ''',
 CASE `schema` WHEN '' THEN 'public' ELSE `schema` END, 
 ''' as schema, ''',
 tablename,
 ''' as tabelle, ''',
 real_name,
 ''' as attribut, cast(max(',
 real_name, 
 ') as text) as hoechsterwert FROM ',
 CASE `schema` WHEN '' THEN 'public' ELSE `schema` END, 
 '.',
 tablename,
 ' UNION'
 ) as query
 FROM layer_attributes a, layer l
 WHERE a.layer_id = l.Layer_ID
 AND tablename != ''
 AND real_name != ''
 AND l.schema != 'lung'
 AND type like 'int%'
 AND form_element_type = 'Text'
 AND real_name NOT LIKE '%id'
 AND real_name NOT LIKE '%schl%'
 AND real_name NOT LIKE '%nummer'
 AND real_name NOT LIKE '%jahr%'
 AND real_name != 'objart'
 AND real_name NOT LIKE '%plz%'
 AND real_name != 'bezirk'
 AND real_name != 'gemarkung'
 AND real_name != 'gemeinde'
  • Die Treffer werden anschließend in eine CSV-Datei exportiert. Jede Zeile der CSV-Datei enthält eine SQL-Abfrage für die PostgreSQL. Bei mir tauchen noch Anführungsstriche am Anfang und Ende jeder Zeile auf. Die müssen natürlich weg, ebenso das allerletzte UNION. Über der ersten Zeile wird eingefügt:
select * from (

Unter die letzte Zeile wird eingefügt:

) as q where cast(q.hoechsterwert as integer) >= 1000
order by cast(q.hoechsterwert as integer)
  • Das Ganze in der PostgreSQL ausführen. Es kommen Fehlermeldungen, die auf fehlerhafte Pfad-Statements hinweisen (eine schöne Überprüfung im Vorbeigehen...). Die entsprechenden Zeilen habe ich bei mir auskommentiert.
  • Wenn keine Fehlermeldungen mehr kommen, erhält man eine bereits sehr übersichtliche Trefferliste, die man jetzt abarbeiten kann.
  • Möglicherweise taucht aber noch gehäuft ein Attributname auf, von dem klar ist, dass er nicht als Zahl in Betracht kommt. Diesen Attributnamen kann man in die obige Abfrage noch als real_name-Ausschlusskriterium einfügen und einen zweiten Durchlauf starten.