Bankir.Ru
5 декабря, понедельник 15:36

Объявление

Свернуть

Третья ежегодная конференция-консилиум «ИТ-бюджет банка - 2017»

Показать больше
Показать меньше

Long Raw

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Long Raw

    Поля типа Long Raw

    Капаясь тут давеча в кредитном модуле обнаужил такую экзотику как поля Long Raw в таблице CrMemo. Сам ORACLE однозначно описывает этот тип данных как оставленный для совместимости с версией 7 своей БД.

    После некоторых изысканий для работы с этим типом данных "родил" вот такой код:



    // Читает строку из поля типа Long Raw
    // ptr - указатель на поле
    // wPos - количество уже считанных символов 0 - начало
    // ptNum - возвращает номер последней считанной позиции
    // ptNum - wPos = кол-во считанных байтов
    Function LongRaw2String(ptr : Pointer; wPos : Word; ptNum : ^Word) : String;
    Var
    wLen : Word; // Количество символов в поле
    sBuf : String; // Сюда помещаем строку
    i,j,k : Word; // Счетчики
    ch : Byte;

    {
    sBuf := '';
    Result := sBuf;
    i := 0; // Кол-во считанных байтов
    j := 2 + wPos; // Позиция, с которой начинаем чтение данных
    ptNum^ := Word(i);

    wLen := Word((@ptr^)^) ;

    if wLen = 0 Exit; // Пустая строка
    if wLen = wPos Exit; // Уже все считали

    While ( TRUE )
    Do { ch := Byte(Pointer(LongInt(@ptr^) + j)^);
    j := j + 1; i := i + 1;

    // Перенос строки
    if ch = 13
    { ch := Byte(Pointer(Longint(@ptr^) + j)^);
    if ch = 10 { j := j + 1; i := i + 1; };
    ptNum^ := wPos + i; // Перенос строки
    break;
    };

    sBuf := sBuf + chr(ch);

    if ( i = 256 ) // считали 255 символов
    { ptNum^ := wPos + i;
    break;
    };

    if ( j - 2 >= wLen ) // все уже прочитали
    { ptNum^ := 0;
    break;
    };

    };

    Result := sBuf;
    Exit;

    }


    Вызывается это так:

    ptNum := 0;
    sTmp := LongRaw2String(Pointer(@CrMemo.TextInfo), ptNum, @ptNum );


  • #2
    Хочется добавить, что в Бтривовской версии также есть аналогичное поле CrMemo.TextInfo, которое имеет хитрый тип "LVar[20000]" (кажется еще где-то видел такие поля). И предложенная RedPank процедура в этом случае тоже должна подойти.

    Комментарий


    • #3
      А может кто-нибудь подскажет технологию записи в поле такого типа?

      Комментарий

      Пользователи, просматривающие эту тему

      Свернуть

      Присутствует 1. Участников: 0, гостей: 1.

      Обработка...
      X