как включить случайное формирование nrec в БД на MS SQL?

Администрирование баз данных (Pervasive.SQL, MS SQL, Oracle, утилита Support)

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

как включить случайное формирование nrec в БД на MS SQL?

Сообщение Darikon »

Народ, поможите! )
как переключить последовательный инкремент на псевдослучайное формирование nrec в БД на MS SQL?
делал сам когда то (года четыре назад и именно на MS SQL ). сейчас или не помню откуда делал или убрали из функционала, не пойму.
очень нужно. :|
spark
Местный житель
Сообщения: 478
Зарегистрирован: 19 окт 2005, 13:38
Контактная информация:

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение spark »

Darikon писал(а):Народ, поможите! )
как переключить последовательный инкремент на псевдослучайное формирование nrec в БД на MS SQL?
делал сам когда то (года четыре назад и именно на MS SQL ). сейчас или не помню откуда делал или убрали из функционала, не пойму.
очень нужно. :|
На сколько я понимаю, есть два случая формирования nrec: средствами галактики и внешними средствами.

В первом случае Nrec выдает Nap Server.
Во втором триггеры.

Для первого случая, как я понимаю, в конфиге в секции DataBase можно прописать RandomSurrKeys=ON.
Во втором случае надо смотреть как работает триггер.
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение Darikon »

Для первого случая, как я понимаю, в конфиге в секции DataBase можно прописать RandomSurrKeys=ON.
Во втором случае надо смотреть как работает триггер.
меня вот в этом ключе RandomSurrKeys остановило то, что в документации везде прописано, что это только для первазива, да и у самого в памяти осталось так, что вроде переключал через фейсы какие то. :???:
а как работает второй случай - я знаю )
spark
Местный житель
Сообщения: 478
Зарегистрирован: 19 окт 2005, 13:38
Контактная информация:

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение spark »

Darikon писал(а):меня вот в этом ключе RandomSurrKeys остановило то, что в документации везде прописано, что это только для первасива
Точно... извинтиляюсь =)
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение n0where »

Код: Выделить всё

BlaBLa.nRec := 0; // или GetNextNRec, но лучше не юзать
Так не работает чтоле?
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
LaaLaa

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение LaaLaa »

Алгоритм случайной генерации Nrec-ов мог быть влкючен только в драйвере Первасива.
В MS SQL, Oracle (теперь еще и в PostgreSQL) только по порядку.
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение Darikon »

LaaLaa писал(а):Алгоритм случайной генерации Nrec-ов мог быть влкючен только в драйвере Первасива.
В MS SQL, Oracle (теперь еще и в PostgreSQL) только по порядку.
спасибо за ответ. а жаль.. удобный генератор был ))
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение edward_K »

пользуйтесь номером офисса - в nrec он присутсвует. В конце концов в любой базе вы можете работать от имени пользователя другого офисса.
LaaLaa

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение LaaLaa »

А вам, что просто функция генерации случайных чисел нужна?
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение Darikon »

нужен длинный шестнадцатеричный код. цель заказчика - видеть его в фейсе и в квитанции(числом и штрихкодом). чтобы значит, проверять честность плательщика. говорят, были инциденты.
чтобы не заморачиваться своим кодом и местом хранения, хотел воспользоваться стандартным функционалом ))
именно длинный и шестнадцатеричный хочет заказчик.
LaaLaa

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение LaaLaa »

Возможно вам пригодится объектный интерфейс для генерации псевдослучайных значений

RandomGenerator.vih

Код: Выделить всё

#ifndef __RandomGenerator_vih__
#define __RandomGenerator_vih__


ObjInterface ObjRandomGenerator;

  property LastRandomCounter: comp;

  function NextRandomNumber(Range: longInt): longInt;
  function NextRandomDate(DateBegin: date; DateEnd: date): date;
  function NextRandomCode(CodeLength: longInt): string;
  function NextRandomWord: string;
  function NextRandomText: string;

End;

VipInterface RandomGenerator Implements ObjRandomGenerator;

#endif
RandomGenerator.vip

Код: Выделить всё

#include RandomGenerator.vih

Interface RandomGenerator;

var LastRandomCntr: comp; //счетчик псевдослучайной последовательности

const
  ConsonantLetters: string = 'сркмпнлтвдхбгшзфжцйчщ';//'сртмпблвкзлхдвнсдстчктбцпчнггйрмцжкврбпнйфзхзщлдфшгшмжщйхшцжчфщ'; //массив согласных букв (каждой по 3)
  VowelLetters: string = 'оаеиуяёюэы';//'оиаюаоэиюеяиоэыеэеяяуёуюаыёуёы'; //массив гласных букв (каждой по 3)
  Symbols: string = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789'; //массив букв и цифр
end;


//свойство для чтения и записи счетчика псевдослучайной последовательности
property LastRandomCounter: comp absolute LastRandomCntr;

//функция генерации следующего числа псевдослучайной последовательности
//результат - случайное число от 0 до Range-1
function NextRandomNumber(Range: longInt): longInt;
{
  LastRandomCntr := 1664525*LastRandomCntr + 1013904223 - ((1664525*LastRandomCntr + 1013904223) / 2147483647)*2147483647;
  result := longInt(abs(LastRandomCntr - (LastRandomCntr/Range)*Range));
}

//функция генерации случайной даты между датами DateBegin и DateEnd включительно
function NextRandomDate(DateBegin: date; DateEnd: date): date;
{
  result := Add_Day(DateBegin, NextRandomNumber(longInt(DateEnd) - longInt(DateBegin) + 1));
}

//функция генерации случайной последовательности
//букв русского алфавита и цифр длиною CodeLength
function NextRandomCode(CodeLength: longInt): string;
{
  var SymbolNum: longInt;
  var ResultCode: string;

  ResultCode := '';

  for(SymbolNum := 1; SymbolNum <= CodeLength; SymbolNum++)
    ResultCode := ResultCode + Symbols[NextRandomNumber(Length(Symbols)) + 1];

  result := ResultCode;
}

//функция генерации случайной буквы русского алфавита
//если LetterType = 0 генерируется случайная гласная буква
//если LetterType = 1 генерируется случайная согласная буква
function NextRandomLetter(LetterType: integer): char;
{
  case LetterType of
    0: result := VowelLetters[NextRandomNumber(NextRandomNumber(Length(VowelLetters)) + 1) + 1];
    1: result := ConsonantLetters[NextRandomNumber(NextRandomNumber(NextRandomNumber(Length(ConsonantLetters)) + 1) + 1) + 1];
    else result := Chr(0);
  end;
}

//функция генерации слога из случайных букв
//если SyllableType = 0, то слог будет двухбуквенный
//в 30% случаев он будет вида гс (где г - гласная буква, с - согласная),
//в 70% случаев - вида сг.
//если SyllableType = 1, то слог будет трехбуквенный вида сгс
function NextRandomSyllable(SyllableType: integer): string;
{
  case SyllableType of
    0:
    {
      case NextRandomNumber(100000) mod 10 of
        0..2: result := NextRandomLetter(0) + NextRandomLetter(1);
        3..9: result := NextRandomLetter(1) + NextRandomLetter(0);
      end;
    }
    1: result := NextRandomLetter(1) + NextRandomLetter(0) + NextRandomLetter(1);
    else result := '';
  end;
}

//функция генерации слова из слогов
//с разными вероятностями генерируются слова из двух слогов (4-, 5- либо 6-буквенные)
//или из трех слогов (6- либо 7-буквенные)
function NextRandomWord: string;
{
  case longInt(abs(NextRandomNumber(100000))) mod 100 of
    0..11: result := NextRandomSyllable(0) + NextRandomSyllable(0);
    12..23: result := NextRandomSyllable(1) + NextRandomSyllable(0) + NextRandomSyllable(0);
    24..44: result := NextRandomSyllable(0) + NextRandomSyllable(1);
    45..52: result := NextRandomSyllable(0) + NextRandomSyllable(1) + NextRandomSyllable(0);
    53..73: result := NextRandomSyllable(1) + NextRandomSyllable(0);
    74..85: result := NextRandomSyllable(0) + NextRandomSyllable(0) + NextRandomSyllable(1);
    86..91: result := NextRandomSyllable(1) + NextRandomSyllable(1);
    92..99: result := NextRandomSyllable(0) + NextRandomSyllable(0) + NextRandomSyllable(0);
  end;
}

//функция генерации предложения из слов
//количество слов в предложении - случайное число от 1 до 40.
function NextRandomText: string;
{
  var WordCount: longInt;
  var WordNum: longInt;
  var ResultText: string;

  ResultText := '';
  WordCount := NextRandomNumber(40) + 1;

  for(WordNum := 1; WordNum <= WordCount; WordNum++)
    ResultText := ResultText + NextRandomWord + ' ';

  result := ResultText;
}

End.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение m0p3e »

Насчет GUID-ов это очень хорошая идея.
В MSSQL есть функция NEWID(). Вызыввые прямым скулем и пользуемся результатом.
Darikon
Постоянный обитатель
Сообщения: 188
Зарегистрирован: 17 июн 2008, 17:07
Откуда: Москва
Контактная информация:

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение Darikon »

m0p3e писал(а):Насчет GUID-ов это очень хорошая идея.
В MSSQL есть функция NEWID(). Вызыввые прямым скулем и пользуемся результатом.
взял на вооружение вашу идею.
Alpiton
Посетитель
Сообщения: 40
Зарегистрирован: 18 апр 2006, 09:19

Re: как включить случайное формирование nrec в БД на MS SQL?

Сообщение Alpiton »

У меня есть DLL (7 kb), с помощью которой можно вызвать паскалевские randomize и random. Если надо, могу выслать.
Ответить