FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Модератор: Модераторы

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение Vadim » 31.07.2009 08:24:39

mak
Если ты страшно занят своими делами - занимайся ими и не парься.

Добавлено спустя 1 минуту 37 секунд:
alexs
Понятно. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение mak » 31.07.2009 10:42:45

Vadim писал(а):Если ты страшно занят своими делами - занимайся ими и не парься.

"Не парься" - это о чем? Кроме отправки архива ничего тебе не предлагал.
Архив, кстати, лежит, ждет твоего мейла.
Аватара пользователя
mak
новенький
 
Сообщения: 24
Зарегистрирован: 26.11.2008 18:14:07
Откуда: г.Обнинск

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение Vadim » 31.07.2009 12:53:28

mak
Ну спасибо, раз так... :)
_вадим (ухо) инбокс точка ру. Только по англицки.. (спамеров боюсь). :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение mak » 31.07.2009 13:20:23

Ушло полмега в зипе.
Аватара пользователя
mak
новенький
 
Сообщения: 24
Зарегистрирован: 26.11.2008 18:14:07
Откуда: г.Обнинск

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение Vadim » 31.07.2009 14:37:06

mak
Получил, спасибо.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение alexs » 06.08.2009 21:03:53

mak писал(а):Проблема с отображением в гриде больших целых чисел (INT64).
Если в числе 18 цифр или меньше, то все нормально.
Если в числе 19 цифр, то число отображается с экспонентой.
Т.е. вместо 1234567890123456789
отображается 1,23456789012346E18

Разобрался. Прямого решения нет. Но сделал в параметрах FBDataSet-а флжок - не присваивать форматы по умолчанию для числовых полей. Должно помочь.

Суть проблемы - это глюк пришедший из дельфина в FPC, а именно - нет функции форматированного вывода целого числа. Для такого вывода используется функция FormatFloat. Т.е. если в LargeIntField (из модуля DB) указана маска вывода то текст числа формируется через FormatFloat, если не указана маска - то обычной процедурой Str.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение mak » 07.08.2009 11:39:36

Привет, Alexs! Спасибо, что нашел время.
Хорошо бы этому флажку по умолчанию TRUE присвоить :)

Вопрос: если написать правильную ф-ю форматирования целого, можно кардинально поправить ситуацию в рамках FBDataset'a ?
Или для форматирования 19 цифр все равно придется событие OnGetText использовать?
Аватара пользователя
mak
новенький
 
Сообщения: 24
Зарегистрирован: 26.11.2008 18:14:07
Откуда: г.Обнинск

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение alexs » 07.08.2009 22:09:10

mak писал(а):если написать правильную ф-ю форматирования целого, можно кардинально поправить ситуацию в рамках FBDataset'a ?

Можно - с тебя функция, а её потом обернём в наследника TLargeInt
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение mak » 10.08.2009 13:49:20

alexs писал(а):Можно - с тебя функция, а её потом обернём в наследника TLargeInt

Договорились. Напишу в первый дождливый выходной.
Следите за погодой :) http://www.gismeteo.ru/city/daily/11449/
Аватара пользователя
mak
новенький
 
Сообщения: 24
Зарегистрирован: 26.11.2008 18:14:07
Откуда: г.Обнинск

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение mak » 11.08.2009 20:34:41

Не стал я дождя ждать.
Вот тебе функция. Тестировал на Delphi 7.
Код: Выделить всё
function FormatInt64(const Format: string; N: Int64): string;
// The function formats long integers (Int64).
// It uses FormatFloat function to format less than 19-digit numbers.
// RESTRICTION: only first section of Format will work for 19-digits numbers
//             (about sections see FormatFloat help).
// WARNING: if the function finds any error or strangeness in Format string
//          then it uses the standard IntToStr function, without formatting.
// Author: Mikhail Korolev <mialko@mail.ru>
// Created: 11.08.2009 for Aleksey Lagunov's FBDataset.
// Last modified: 11.08.2009
const POWER_10_18: Int64 = 1000000000000000000; // 18 zeroes
type TFmtStr = AnsiString;
     TFmtChar = AnsiChar;
var LeftN, RightN: Int64;
    Fmt, LeftFmt, RightFmt: TFmtStr;
    DPArr: array [1..255] of byte; // array of digit position in Format
    DPCnt: integer;
    DecPointPos: integer;
    SeparateThousands: boolean;
    BadFormat: boolean;
    FirstSectionLength: integer;
    LastWholeDPCnt: integer;
    index19: integer;
    i: integer;
    FS: TFormatSettings;

    procedure ParseFmt;
    // Parse Format string and fill external vars
    var i: integer;
        ch: TFmtChar;
        QCh: TFmtChar;
        InQ: boolean;
    begin //ParseFmt
       QCh:= #0; // Anti-warning
       InQ:= FALSE;
       DPCnt:= 0;
       DecPointPos:= 0;
       SeparateThousands:= FALSE;
       BadFormat:= FALSE;
       FirstSectionLength:= length(Format);
       LastWholeDPCnt:= 0;

       for i:= 1 to length(Format) do begin
          ch:= Format[i];
          if InQ then begin // Process "in quota" case separately
             if ch = QCh then // text end
                InQ:= FALSE;
             CONTINUE; // for cycle
          end;
          case ch of
             '"','''': begin // Quotation mark - text begin
                QCh:= ch;
                InQ:= TRUE;
             end;
             '#','0': begin // Digit position
                inc(DPCnt);
                DPArr[DPCnt]:= i;
             end;
             '.': begin // Decimal point
                if DecPointPos <> 0 then begin
                   BadFormat:= TRUE;
                   BREAK; // from for cycle
                end;
                DecPointPos:= i;
                LastWholeDPCnt:= DPCnt;
             end;
             ',': begin// Thousand separator
                SeparateThousands:= TRUE;
             end;
             'E','e': begin// Scientific notation
                BadFormat:= TRUE;
                BREAK; // from for cycle
             end;
             ';': begin // Sections separator
                FirstSectionLength:= i-1;
                BREAK; // from for cycle
             end;
             else begin // Unknown char
                BadFormat:= TRUE;
                BREAK; // from for cycle
             end;
          end;//case
       end;//for
       if LastWholeDPCnt = 0 then
          LastWholeDPCnt:= DPCnt;
       if InQ then
          BadFormat:= TRUE;
    end;(*ParseFmt*)
   (*-------------*)

begin //FormatInt64
   if ((N > -POWER_10_18) and (N < POWER_10_18)) or // <= 18 digits in N
      (length(Format) > 255)                        // Too long format
   then begin
      result:= FormatFloat(Format, N);
      EXIT;
   end;
   // 19 digits in N
   ParseFmt; // Parse Format string
   if BadFormat or (FirstSectionLength = 0) or (DPCnt = 0) then begin
      result:= IntToStr(N);
      //result:= FormatFloat(Format, N);  // It is the variant, too.
      EXIT;
   end;

   // Numbers
   LeftN:= N div POWER_10_18;
   RightN:= N mod POWER_10_18;
   if RightN < 0 then
      RightN:= -RightN;

   // Formats
   Fmt:= copy(Format, 1, FirstSectionLength); // First section only
   if LastWholeDPCnt > 18 then begin // enough digit positions for 19 digits
      index19:= LastWholeDPCnt-18;
      LeftFmt:= copy(Fmt, 1, DPArr[index19]); // to 19th from right dig, inclusive
      for i:= index19+1 to LastWholeDPCnt do
         Fmt[DPArr[i]]:= '0';
      RightFmt:= copy(Fmt, DPArr[index19]+1, 999);
   end
   else begin // 18 or less digit positions in Format
      LeftFmt:= copy(Fmt, 1, DPArr[1]); // Use upto 1st from left digit placeholder
      for i:= 1 to LastWholeDPCnt do
         Fmt[DPArr[i]]:= '0';
      SetLength(RightFmt, 18-LastWholeDPCnt);
      if length(RightFmt) > 0 then
         FillChar(RightFmt[1], length(RightFmt), '0');
      RightFmt:= RightFmt + copy(Fmt, DPArr[1], 999);
   end;
   if SeparateThousands then
      RightFmt:= RightFmt + ',';

   // Result
   result:= FormatFloat(LeftFmt, LeftN);
   if SeparateThousands then begin
      GetLocaleFormatSettings(0, FS);
      result:= result + FS.ThousandSeparator;
   end;
    result:= result + FormatFloat(RightFmt, RightN);
end;(*FormatInt64*)
(*---------------*)

Аватара пользователя
mak
новенький
 
Сообщения: 24
Зарегистрирован: 26.11.2008 18:14:07
Откуда: г.Обнинск

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение alexs » 11.08.2009 21:02:54

посмотрим.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение Attid » 26.08.2009 14:44:49

alexs на сайте уибов http://www.progdigy.com/?page_id=5 висит ссылка на датасет на твой сайт http://alexs75.narod.ru/fpc/fbdataset/ а там старая версия и нету линка на свн добавил бы .

Добавлено спустя 1 час 10 минут 46 секунд:
а свн у мну не собирается

Код: Выделить всё
function GetDataSize: {$IFDEF FPC}Word;{$ELSE}Integer;{$ENDIF} override;

fbcustomdataset.pas(125,16) Error: There is no method in an ancestor class to be overridden: "TFBAnsiField.GetDataSize:Word;"


вот так и заканчиваются добрые начинания =) хотел сегодня перевести все на свн и не сложилось :D
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение alexs » 26.08.2009 19:05:39

я как всегда работаю в текущем fpc/lazarus - может в это дело?
у меня все ок.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение Attid » 28.08.2009 09:02:31

тоесть ты предлагаешь перейти на свн версию фпц ? =(
как-то меня такая перспектива не очень радует.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: FBDataSet (библиотека доступа к данным FireBird/Interbase.)

Сообщение alexs » 28.08.2009 19:08:01

хоятбы на фриз 2.4
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Пред.След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru