TinyTds - integer w formie 0.01e2

Hej

Korzystam z gemu https://github.com/rails-sqlserver/tiny_tds aby łączyć się z serwerem MSSQL (WAPRO wf-mag). Zapytania zwracają mi coś w stylu:

"ID_DOKUMENTU_HANDLOWEGO"=>0.290943e6, "ID_MAGAZYNU"=>0.33e2

gdzie powinno być 290943 i 33. Zapewne kwestia jakiejś dziwnej konfiguracji, ale nie mam pomysłu jakiej.

Przerabiał ktoś z Was ten problem?

Ktoś już miał ten problem https://github.com/rails-sqlserver/tiny_tds/issues/131

No właśnie widziałem ten wpis, ale nic mi on nie wyjaśnił :slight_smile:

kiedy wpinałem się do M$ pomógł dopiero MS SQL Debugger Podejrzyj debugerem klienta windows jakie flagi ustawia przy połączeniu z bazą - wszytkie fazy - uruchamianie aplikacji + wlogowywanie użytkownika X - ustaw takie same flagi w tinytds przykład (skrócony bo nie łączyłem się akurat z WAPRO :slight_smile: tylko inną rakietą magazynowo/księgową):

    def db_conn
      @db_conn ||= ::TinyTds::Client.new(
        username: 'top_secret',
        password: 'even_more_secret',
        host: '192.168.x.y',
        port: 666,
        database: 'myDb',
        ecoding: 'encoding_of_the_db'
      ).tap do |client|
        client.execute('SET ANSI_NULLS ON').do
        client.execute('SET ANSI_PADDING ON').do
        client.execute('SET ANSI_WARNINGS ON').do
        client.execute('SET CONCAT_NULL_YIELDS_NULL ON').do
        client.execute('SET QUOTED_IDENTIFIER ON').do
        # [...]
        # inne flagi ktore debugger pokaze :)
        # potrafi być tego naprawdę sporo
      end
    end

zajrzyj też czy nie ma czegoś dziwnego w /etc/freetds/freetds.conf jakichś nadmiarowych ustawień które by wpływały na to jak są traktowane liczby “by default” bo widać że zrzuca wszystko do wartości z przecinkiem czy trzeba czy nie trzeba
Może to nie jest wina freetds/tinytds a ustawień domyślnych bazy WAPRO aplikacja windows może zestawia połączenie tuż przed akcją na danych manipulując przy tym flagami zależnie od potrzeby chwili debugger powinien sprawę wyjaśnić

Dzięki za informację.

Chyba nie będę tak kombinował, bo widzę, że wystarczy to co zwraca baza potraktować przez .to_i (gdyż jest to BigDecimal i konwersja działa) a wyszukiwanie WHERE ID= działa wyśmienicie na tradycyjnych integerach (na tych 0.1e1 też).

2.2.0 :001 > require 'bigdecimal'
 => true
2.2.0 :002 > BigDecimal.new('0.012e3').to_i
 => 12
1 Like

Hmm,

Łączę się z MSSQL tylko że z subiektem, więc przechodziłem wszystkie etapy.
To o czym piszesz to nie błąd tylko forma zapisu. Zapytanie zwraca to jako BigDecimal. W konsoli jak chcesz po ludzku zobaczyć to metodami to_s najlepiej.
A w widokach i tak używam number_with_precision(), więc sam to formatuje.
Jak miałbyś jakieś problemy to mogę spróbować pomóc.