Separator dziesiętny

Problem z przecinkiem. Usiłuję skorzystać z RFPDF i pojawił się problem, że tworzone pliki pdf były nie do odczytu (adobe reader zgłasza bład 110). Po analizie binarnej zawartości pliku doszedłem do tego, ze przyczyną jest to, ze w miejsce gdzie powinny być separatory dziesiętne w postaci kropki wpisane zostały przecinki. Sytuacja ta ma miejsce tylko w określonych momentach, mianowicie po połączeniu za pomocą odbc z baza (do której muszę sięgać po pewne dane, a która nie jest explicite wspierana przez activerecord-odbc). Wygląda to w ten sposób, ze połączenie takie powoduje globalna zmianę separatora dziesiętnego na “,” przywrócenie ‘.’ następuje dopiero po restarcie serwera. O ile w innych sytuacjach potrafię jakoś przeżyć z niekompatybilnością dostępu do tej egzotycznej bazy (muszę robić jawna konwersja znaków z cp1250 na utf-8) to ten problem stał się dla mnie realnym ograniczeniem, czy ktoś może mi poradzić w jaki sposób mogę przywrócić globalnie prawidłowy separator dziesiętny?
(Ruby 1.8.7)

Nie jest to chyba problem Ruby tylko twoja baza i/lub sterownikiem ODBC są źle skonfigurowane. Próbowałeś zmienić ustawienia regionalne na serwerze gdzie stoi baza ? :slight_smile:

Ta egzotyczna baza to jest pervasive sql, wszelkie ustawienia na serwerze sql dostępu do bazy nie maja wpływu, w samej konfiguracji odbc tez nie wiele mogę zmienić. Baza jest na serwerze windows i dane zapisywane są w cp12500 (zresztą z separatorem “,”) i nie mam na to wpływu - jedynie sięgam po dane, główna baza to lokalna mysql z utf8. Mogę domyślać się, że przyczyna leży gdzieś po stronie AR-odbc (ta baza nie jest explicite wspierana, jak juz wspomniałem). Zmiany w bibliotekach ar-odbc i stworzenie nowego interfejsu odbc dla tej bazy to trochę za duże wyzwanie dla mnie. Chciałem na razie jakoś obejść problem i znaleźć sposób na przywracanie ustawienia separatora na “.” po wykryciu takiej sytuacji.
Moja instalacja developerska jest w tej chwili na win, produkcyjna na Debianie. Pewne przesłanki wskazują, ze na linuxie sytuacja się powtórzy.

Ale dlaczego uważasz że to wina AR-odbc ?

Nie mam doświadczenia z tą bazą żadnego, ale intuicyjnie to problem po stronie bazy danych.

Wystarczy chwile poszukać…

http://docs.pervasive.com/products/database/psqlv11/sqlref/syntaxref.3.74.html

SET DECIMALSEPARATORCOMMA=OFF powinno pomóc napewno dało by się też zrobić konfersje cp1250-utf8 jeszcze zanim dane trafią do ar (pomiędzy bazą a ODBC)

Nie mam pewności, ale tak jak wspomniałem, psql nie jest na liście obsługiwanych baz - więc mam prawo przypuszczać, ze jakaś specyfika komunikatów z psql może powodować taką sytuację (tzn. nie “obwiniam” AR-odbc bo on tu niczego nie obiecuje :)) ) . Nie wykluczam żadnej możliwości ale w tym momencie wystarczy mi obejście w postaci detekcji tej sytuacji i przywrócenia “.” jako separatora i to chciałbym zrobić dopóki nie dotrę do prawdziwej przyczyny.

Takie rzeczy jak decimal separator to raczje kwestia konfiguracji danych wyjściowych z bazy, ODBC nie robi z danymi domyślnie nic, chyba że się go zmusi. Najwyraźniej ty go jakoś zmuszasz :slight_smile:

Chyba nawet nie myszę go zmuszać. Tak jak napisałem dane w bazie zapisane są już z separatorem “,”. Raczej musiałbym go zmusić, żeby je zmienił na “.”. Ale nie wiem jak. To jeden problem. Drugi problem to jak przywrócić globalny “.”?

Problem pierwszy: A jaki typ kolumny w bazie masz? Jeśli to real RTFM!
Problem drugi: RTFM!!!

Spróbuję gdzieś ustawić SET DECIMALSEPARATORCOMMA=OFF przed pobraniem danych. Kolumny są różne, m in. dane finansowe tzn. typ double w psql (wyglada na odpowiednik decimal).

Double też obsługuje tą opcje.

http://docs.pervasive.com/products/database/psqlv11/sqlref/wwhelp/wwhimpl/common/html/wwhelp.htm#context=sqlref&file=syntaxref.3.74.html

Tu masz opisane wszystkie scenariusze.

Wiem, że (prawie)wszystko jest w podręcznikach, tylko co z tego? Czy stać kogoś na przeczytanie, interpretacje i sprawdzenie wszystkich opcji opisanych w podręcznikach? Nie po to pytam, odwołuję się do czyjegoś doświadczenia. Na razie “problem drugi” jak przywrócić globalny “.”? Komunikacja z psql z AR-odbc jest kulawa nie tylko z tego powodu, jest też problem z zapisem danych w psql.
Póki co zgodbnie z radą spróbuję wymusić SET DECIMALSEPARATORCOMMA=OFF w operacjach AR, na razie nie mam jeszcze dobrego sposobu, nie wiem też, czy to ustawienie jest trwałe, czy trzeba je ponawiać przy każdym wywołaniu.

[quote=kx2]Wiem, że (prawie)wszystko jest w podręcznikach, tylko co z tego? Czy stać kogoś na przeczytanie, interpretacje i sprawdzenie wszystkich opcji opisanych w podręcznikach? Nie po to pytam, odwołuję się do czyjegoś doświadczenia. Na razie “problem drugi” jak przywrócić globalny “.”? Komunikacja z psql z AR-odbc jest kulawa nie tylko z tego powodu, jest też problem z zapisem danych w psql.
Póki co zgodbnie z radą spróbuję wymusić SET DECIMALSEPARATORCOMMA=OFF w operacjach AR, na razie nie mam jeszcze dobrego sposobu, nie wiem też, czy to ustawienie jest trwałe, czy trzeba je ponawiać przy każdym wywołaniu.[/quote]
Wydaje mi się że standardowo przy każdym nowym połączeniu.

Nie wiem jeszcze gdzie wepchać tę frazę. Jeśli przy każdym połączeniu to znaczy przy każdym zapytaniu, które używa łączy się z jakimkolwiek polem psql? Nie wiem czy w AR połaczenie = zapytanie, tzn czy przy każdym zapytaniu jest otwierany, a potem zamykany dostęp do bazy i w zwiazku z tym wszystkie ustawienia (w tym i to tracą wazność) czy może przy starcie serwera ustanawiane jest połaczenie z psql? Prawdopodobne jest też to, ze pierwsze zapytanie AR otwiera połączenie.
A czy możesz mi powiedzieć (jeśli wiesz) jak zmieniać globalne ustawienie separatora? (w końcu to na razie [póki nie sprawdzę] hipoteza, że SET DECI… w psql poskutkuje).

[quote=kx2]Nie wiem jeszcze gdzie wepchać tę frazę. Jeśli przy każdym połączeniu to znaczy przy każdym zapytaniu, które używa łączy się z jakimkolwiek polem psql? Nie wiem czy w AR połaczenie = zapytanie, tzn czy przy każdym zapytaniu jest otwierany, a potem zamykany dostęp do bazy i w zwiazku z tym wszystkie ustawienia (w tym i to tracą wazność) czy może przy starcie serwera ustanawiane jest połaczenie z psql? Prawdopodobne jest też to, ze pierwsze zapytanie AR otwiera połączenie.
A czy możesz mi powiedzieć (jeśli wiesz) jak zmieniać globalne ustawienie separatora? (w końcu to na razie [póki nie sprawdzę] hipoteza, że SET DECI… w psql poskutkuje).[/quote]
Musisz zrobic monkey patching adaptera odbc i do metody configure_connection dodać execute(“SET DECIMALSEPARATORCOMMA=OFF”). MysqlAdapter robi to samo dla SET NAMES zobacz https://github.com/smartinez87/rails/blob/master/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb#L861 Nie wiem tylko czy ActiveRecord-odbc posiada takie metody, zajrzyj w kod, na to nie znajdziesz gotowca, musisz już pokombinować.

Jakbyś przeczytał dokumentacje to byś wiedział że te ustawienia są zależe od uswaień regionalnych systemu. Client ma odzielnie, server odzielnie. Domyślnie powinno być OFF dla USA ale pewnie jest w PL więc masz ON. Nie wiem jak masz skonfigurowany datasource, nie wiem na jakiej platformie, zakładam że skoro masz ON jak się lączysz przez rails to masz windows i te ustawienia pobiera ci z ustawień regionalnych systemu.

Wyśil się troche i poczytaj dokumentacje, zadajesz ciągle te same pytania na które masz już odpowiedzi od praktycznie pierwszych minut dyskusji.

Zadaję ciągle pytanie jak przywrócić “.” po zamianie na “,” - nie widzę w tym pytaniu niczego niestosownego, a otrzymuję odpowiedzi na inne pytania, ok może doprowadzą do rozwiązania, na co liczę. Cieszę się, że się ktoś zainteresował moim problemem, ale chyba nie po to, żeby się na mnie wyżywać? Dość się “nawysilałem” z szukaniem odpowiedzi samemu dlatego pytam na forum, nie mam zwyczaju pytac za kazdym razem jak czegos nie wiem. Nie mam w tej chwili czasu, żeby systematycznie zgłebić wszystkie szczegóły lokalizacji RoR. Tak jak napisałem system mam na win i na Linuxie. A zewnetrzna bazę do której sięgam na win (bo lokalna tam gdzie RoR). W administratorze DS odbc jest mało do ustawiania i nie mają wpływu.
Dzięki, ta opcja z patchem do sterownika wydaje mi się ciekawa.

Dalej nie przeczytałeś dokumentacji. Nie mówie o całej tylko o linkach ktore ci podesłałem.

Ja nie pomagam harytatywnie po to aby ktoś czuł się osobiście dotknięty tą pomocą. Zazwyczaj robie się agresywy dopiero gdy ktoś przejawia dużą dawke ignoracji.

Przestań się już tłumaczyć po prostu przeczytaj dokumentacje poskładaj wszystko do kupy w głowie i będziesz miał rozwiązanie.

[quote=kx2]Nie mam w tej chwili czasu, żeby systematycznie zgłebić wszystkie szczegóły lokalizacji RoR. Tak jak napisałem system mam na win i na Linuxie. A zewnetrzna bazę do której sięgam na win (bo lokalna tam gdzie RoR). W administratorze DS odbc jest mało do ustawiania i nie mają wpływu.
Dzięki, ta opcja z patchem do sterownika wydaje mi się ciekawa.[/quote]
Ustawienia regionalne… lub SET DECIMALSEPARATORCOMMA=OFF i będzie wszystko działać. Pisze to poraz czwarty.

Tu masz implementacje initialize dla ODBC jeśli dodasz tam gdzieś jeszcze @connection.run(“SET DECIMALSEPARATORCOMMA=OFF”) dostaniesz to czego potrzebujesz.

A po co takie osobiste wycieczki? Z niczego się nie tłumaczę. Mam problem do rozwiązania. Wątek SET DECIMALSEPARATORCOMMA=OFF rokuje jakieś nadzieje i akurat przeczytałem to co mi podesłałeś na ten temat. Problem w tym, że psql nie ma swojego adaptera w ruby więc nie wiem, czy osiagnę oczekiwany efekt ale bede próbował.
Mnie chodziło o ustawienia regionalne separatora dziesiętnego, jak je przywrócić bez restartu? Po prostu nie wiem, dlatego pytam. Próbowałem na kilka sposobów ale bezskuteczniel. Może ktoś kto wie i odpowie mi bez odsyłania do dokumentacji.

Przejrzałem jeszcze raz dyskusję i olśniło mnie dlaczego Cobroo Comanderze uparcie mówisz o jednej sprawie. Bo dla mnie sa to dwie sprawy. Co prawda jedna jest przyczyną drugiej ale mnie wystarcza usunięcie skutku. Bo to co napisałem, może niezbyt wyraźnie, już w pierwszym poście polega na tym, że zapytanie do obcej bazy powoduje globalna zmianę separatora w RoR. I w RoR chciałbym go przywrócić do “.”. wszystko działa dobrze do momentu dopóki przynajmniej raz nie wykonam zapytania do tej nieszczęsnej bazy. Potem wszystko (czy w każdym razie niektóre operacje, np tworzenie pdf - będące bez zwiazku z tantymi danymi) zaczyna działać nieprawidłowo, podczas gdy przedtem było ok. Czy teraz to jest jasny opis sytuacji?