-- Keine Vertragsänderung über nichts -- -- Gemeldet im Test vom 29.09. (H.06): jedes Speichern in „Daten ändern" -- erzeugte zusätzlich eine Vertragsänderung „Wochenstunden 30.0 → 30", auch -- wenn niemand die Stunden angefasst hatte. -- -- Der Vergleich läuft über Text. Die Spalte ist numeric(4,1), also liefert -- `v_old.weekly_hours::text` den Wert „30.0". Das Formular schickt die Zahl -- 30, und `('30')::numeric::text` ergibt „30" — numeric merkt sich die -- Nachkommastellen der Eingabe. Zwei verschiedene Zeichenketten für dieselbe -- Zahl. -- -- Der Kommentar an dieser Zeile sagt „Über ::numeric::text, damit 38.50 und -- 38.5 gleich zählen" — die Absicht stimmte, nur reicht `::numeric` dafür -- nicht. Die Umwandlung muss auf **die Genauigkeit der Spalte** gehen, dann -- steht auf beiden Seiten dieselbe Schreibweise. -- -- Folgen bisher: Historie und der Ereignisbericht „Vertragsänderung" füllten -- sich mit Einträgen über nichts, und im Nachtlauf hing an jeder solchen -- Änderung ein geplanter Vorgang, der nichts tat. do $migration$ declare v_alt constant text := $anker$(nullif(v_contract->>'weekly_hours','')::numeric)::text$anker$; v_neu constant text := $anker$(nullif(v_contract->>'weekly_hours','')::numeric(4,1))::text$anker$; v_def text; v_anzahl int; begin select pg_get_functiondef(p.oid) into v_def from pg_proc p join pg_namespace n on n.oid = p.pronamespace where n.nspname = 'public' and p.proname = 'change_employee_data' and p.prokind = 'f'; if v_def is null then raise exception 'change_employee_data ist nicht vorhanden.'; end if; v_anzahl := (length(v_def) - length(replace(v_def, v_alt, ''))) / length(v_alt); if v_anzahl <> 1 then raise exception 'Der Vergleich der Wochenstunden kommt % mal vor, erwartet einmal.', v_anzahl; end if; execute replace(v_def, v_alt, v_neu); end $migration$; -- Selbstprüfung: das Neue und das, was an dieser Funktion schon einmal -- verlorengegangen ist. do $$ declare v_def text; begin select pg_get_functiondef(p.oid) into v_def from pg_proc p join pg_namespace n on n.oid = p.pronamespace where n.nspname = 'public' and p.proname = 'change_employee_data' and p.prokind = 'f'; if v_def not like '%::numeric(4,1))::text%' then raise exception 'change_employee_data vergleicht die Wochenstunden weiter ohne Genauigkeit.'; end if; if v_def not like '%''Hay-Grade''%' then raise exception 'change_employee_data protokolliert den Hay-Grade nicht mehr.'; end if; if v_def not like '%nullif(v_person->>''email'', '''')%' then raise exception 'change_employee_data hat die Leerstring-Behandlung verloren.'; end if; if v_def not like '%cornerstone_id%' then raise exception 'change_employee_data hat die Cornerstone-ID verloren.'; end if; if v_def not like '%require_hr_admin()%' then raise exception 'change_employee_data prueft die Rechte nicht.'; end if; if v_def not like '%search_path%' then raise exception 'change_employee_data hat keinen festen search_path.'; end if; raise notice 'Wochenstunden werden mit der Genauigkeit der Spalte verglichen.'; end $$;