Od czasu do czasu, po kolejnym grzebnięciu w kodzie pojawiają się dziwne komunikaty błędów. Praktycznie za każdym razem przypominam sobie, że miałem z czymś takim do czynienia, że znalazłem rozwiązanie, ale już nie pamiętam. Następuje proces przeszukiwania Google, który jak zwykle charakteryzuje się tym, że niby tematów podobnych jest mnóstwo, ale to tylko takie „akademickie” pitolenie, z którego niewiele wynika.
Najchętniej znalazłbym własną odpowiedź: jak sobie poradziłem poprzednim razem. I temu służy ten wpis.
Błąd (01S01) czyli SQL fractional truncation, występuje w przypadku moich programów gdy pobieram typ DATE (w dct) z SQL gdzie jest on DateTime i w cześć bitów zawierającej Time są wartości rożne od 0. Najczęściej występuje to wtedy gdy dokonam update tej daty w SQL np funkcja getdate(), bez przycięcia części związanej z czasem:
Wtedy wystarczy zwykły update:
update[RejestrZdarzen]
set data = cast(cast(data as int) as datetime)
where data <> cast(cast(data as int) as datetime)
i pozamiatane. Oczywiście można dyskutować , że skoro w SQL jest DateTime, to w DCT tez tak powinno być, ale to rozwiązanie ma też kilka wad, które irytują mnie niekiedy bardziej niz powyższe.
Okazuję się, że w przypadku samego pola typu Time w clarionie, w SQL po konwersji np FM3 to pole tez jest DateTime i tez jest mały problem bo SQL potrafi zapamiętać tam więcej niż clarion, co w konsekwencji też wywoła powyższy błąd w aplikacji clarionowej.
prostowanie polega na wycięciu części z tysiecznymi np tak:
update[RejestrZdarzen]
set czas = cast(czas as char(19))
where ...
Może się jednak przekonam na używanie grup DateTime …