Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хитрая сортировка 
:(
    Опции темы
Akella
Дата 2.12.2008, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Вот таблица, значение сортировки нужно записать в поле ID2, раньше в него записывалось рэндомное число и объявления сортировались каждый выход газеты тоже рэндомно, все были довольны, теперь хотят по-другому. smile 

Код

CREATE TABLE TREKLAMA (
    ID              "INT" NOT NULL /* "INT" = BIGINT */,
    ID_NAPR         "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_TYPE         "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_RAZDEL       "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_RUBRIKA      "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_REGION       "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_VID          "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_AGENCY       "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_FILIAL       "INT" /* "INT" = BIGINT */,
    ID_METODINPUT   "INT" /* "INT" = BIGINT */,
    SORT_BY_AGENCY  "INT" /* "INT" = BIGINT */,
    INPUT_DATE      DATETIME DEFAULT current_timestamp /* DATETIME = TIMESTAMP */,
    LCD             DATETIME DEFAULT current_timestamp /* DATETIME = TIMESTAMP */,
    TEXT            STR400 COLLATE PXW_CYRL /* STR400 = VARCHAR(400) */,
    START_PUBLIC    DATE1 /* DATE1 = DATE */,
    EXPIREDATE      DATE1 /* DATE1 = DATE */,
    PN              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    VT              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    SR              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    CH              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    PT              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    SB              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    VS              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    IPADDRESS       STR30 COLLATE PXW_CYRL /* STR30 = VARCHAR(30) */,
    PHONE           STR100 COLLATE PXW_CYRL /* STR100 = VARCHAR(100) */,
    USER_NAME       STR30 COLLATE PXW_CYRL /* STR30 = VARCHAR(30) */,

    ID2             "INT" /* "INT" = BIGINT */,

    DELETED         FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    SORT_NAPR       "INT" /* "INT" = BIGINT */,
    SORT_TYPE       "INT" /* "INT" = BIGINT */,
    SORT_RAZDEL     "INT" /* "INT" = BIGINT */,
    SORT_RUBRIKA    "INT" /* "INT" = BIGINT */,
    SORT_REGION     "INT" /* "INT" = BIGINT */,
    SORT_VID        "INT" /* "INT" = BIGINT */,
    PAYMENT         FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    EXCLUSIVE       FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    DATAS           STR1000 COLLATE PXW_CYRL /* STR1000 = VARCHAR(1000) */,
    REC_TO_EXPORT   FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    GUID1           STR40 COLLATE PXW_CYRL /* STR40 = VARCHAR(40) */
);



Добавлено через 1 минуту и 46 секунд
Цитата(Vas @  2.12.2008,  10:59 Найти цитируемый пост)
а почему на сервере не хочешь сделать, насколько я замечал ты с БД дружишь. 

Не могу сообразить как это средствами хранимки (Firebird) сделать. Я и на дельфи-то до конца не могу сообразить.

Осталось совсем чуть чуть, довести до ума этот участок, который выдёргивает записи из массива датасетов и записывает в них значения.

Код

//по количеству записей 
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin
      if q[i].Eof then Continue;//если в каком-то наборе закончились записи....
//наверное нужно внести сюда ещё одну переменную из-за наличие continue
      aSQL := 'update treklama set id2 = ' + intToStr(k1) + ' where id = '+q[i].FBN('ID').AsString;
      dbJDN.Execute(aSQL);
    end;
  end;//for k1 := 0


Добавлено через 2 минуты и 44 секунды
Цитата(Vas @  2.12.2008,  10:59 Найти цитируемый пост)
3. Тоже объявляем курсор и внутри курсора апдейтим записи по порядку.

в PSQL Firebird`а нет возможности объявлять массив курсоров

Добавлено через 3 минуты и 37 секунд
Кофе закончился.  smile 

/*ушёл просить кофе у бухгалтеров

Добавлено через 5 минут и 20 секунд
Наверное забыл про q[i].next  smile 

PM MAIL   Вверх
vladimir74
Дата 2.12.2008, 11:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 28.11.2006

Репутация: 2
Всего: 3



так у тебя в таблице много рекламодателей?
а новый ID  должен быть сквозным или отдельным для каждого?
Цитата(Akella @  2.12.2008,  08:52 Найти цитируемый пост)
нет, намудрил я здесь
Код

aSQL := 'update treklama set id2 = ' + intToStr(k1) + ' where id = '+q[i].FBN('ID').AsString


ты тут присваеваешь id2 значение верхнего цикла т.е. для всех трех записей у тебя будет одно и тоже значение..., лучше ввести отдельную переменную ....

Добавлено через 4 минуты и 42 секунды
Цитата(Vas @  2.12.2008,  08:52 Найти цитируемый пост)
А если не три разных наименования, а n-ое количество, причем заранее не известное

ну тогда надо сразу делать масив квери...
кажется Akella именно это и сделал. Я просто в начале прочитал массив и решил что хотят работать с простыми массивами...

Добавлено через 8 минут и 53 секунды
Цитата(Akella @  2.12.2008,  09:03 Найти цитируемый пост)
//наверное нужно внести сюда ещё одну переменную из-за наличие continue

ИМХО нужно просто счетчик сделать отдельной переменной...

Добавлено через 9 минут и 42 секунды
Цитата(Akella @  2.12.2008,  09:03 Найти цитируемый пост)
Наверное забыл про q[i].next 

и это тоже....
--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
Akella
Дата 2.12.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(vladimir74 @  2.12.2008,  11:12 Найти цитируемый пост)
так у тебя в таблице много рекламодателей?

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

Добавлено @ 11:36
Цитата(vladimir74 @  2.12.2008,  11:12 Найти цитируемый пост)
Цитата(Akella @  2.12.2008,  08:52 Найти цитируемый пост)
нет, намудрил я здесь
Выделить всёкод Pascal/Delphi
1:
    
aSQL := 'update treklama set id2 = ' + intToStr(k1) + ' where id = '+q[i].FBN('ID').AsString


ты тут присваеваешь id2 значение верхнего цикла т.е. для всех трех записей у тебя будет одно и тоже значение..., лучше ввести отдельную переменную ....

точно... ты прав, надо подумать ещё

Добавлено @ 11:41
Переделал на 
Код

  j := 0;
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin
      if q[i].Eof then Continue;
      aSQL := 'update treklama set id2 = ' + intToStr( j ) + ' where id = '+q[i].FBN('ID').AsString;
      dbJDN.Execute(aSQL);
      q[i].next;
      Inc(j);
    end;
  end;//for k1 := 0


тестирую, о результатах отпишусь

Это сообщение отредактировал(а) Akella - 2.12.2008, 11:42
PM MAIL   Вверх
Deniz
Дата 2.12.2008, 14:35 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Akella, есть одна мысль, сейчас попробую объяснить.
Допустим есть запрос:
Код
select name, count(*) 
from treklama 
where id_sort is null 
group by name
order by в нужном порядке
который выдает всех рекламодателей (РД) с их объявами (О).
СчетчикСтарт:=0;
Далее, находим минимальное кол-во объяв (обозначим М) и кол-во записей в запросе ( Cnt )
Далее цикл типа такого:
Код
for i:=0 to M-1 do begin
  Sort_Num:=i * cnt + DataSet.RecNo;
  // Выбор записи (только одной) для обновления у текущего Клиента
  update treklama set Sort_ID = :Sort_Num where ...
end;

Аналогично со вторым, третьим и т.д.
Когда прошли всех РД в запросе, делаем переоткрытие запроса, и продолжаем с начала. Значение СчетчикСтарт := max(Sort_ID) + 1;
Делаем пока основной запрос возвращает данные.
Надеюсь понятно объяснил.

Это сообщение отредактировал(а) Deniz - 2.12.2008, 14:37


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 2.12.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Deniz @  2.12.2008,  14:35 Найти цитируемый пост)
where id_sort is null 

будет всегда 0 записей, т.к. в базе не бывает записей, где id_sort может быть пустым, это регулируется триггерами  smile

Добавлено через 1 минуту и 23 секунды
Цитата(Deniz @  2.12.2008,  14:35 Найти цитируемый пост)
select name, count(*) 
from treklama 


treklama - это таблица, где хранятся сами объявления, а рекламодатели хранятся в tagency
или я недопонял ход твоих мыслей
PM MAIL   Вверх
Deniz
Дата 2.12.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Akella @  2.12.2008,  18:17 Найти цитируемый пост)
будет всегда 0 записей, т.к. в базе не бывает записей, где id_sort может быть пустым, это регулируется триггерами
ты в это поле записываешь ключ сортировки, и что там было до этого не важно, я так думаю.
Можно поменять запрос на where id_sort = тот признак, при котором надо делать обновление, предполагаю что 0

Цитата(Akella @  2.12.2008,  18:17 Найти цитируемый пост)
treklama - это таблица, где хранятся сами объявления, а рекламодатели хранятся в tagency
или я недопонял ход твоих мыслей 
значит я плохо объясняю.
Как я понял нужно выбрать всех рекламодателей и напечатать по 1 объяве из каждого, потом еще по одной и т.д.
Так вот мысль была такая:
Запросом отбираем, именно из treklama, всех РД и кол-во их объявлений.
Кол-во записей в этом наборе есть шаг приращения Sort_ID, а М это минимальное кол-во объявлений, которое есть у всех.
т.е. если взять первый пост с примером, то
Код
квартал 4
аверс 2
жидн 1
этот запрос дает те объявления, в которых надо обновить сортировку.
Мин = 1
Cnt = 3
Идем по циклу от 0 до М-1, пока 1 раз, получаем по всем РД, Счетчик дорос до 3 (3 записи) и увеличиваем его на 1.
Код
квартал1
аверс2
жидн3
далее переоткрываем запрос, жидн пропадает из результата, его уже обновили, получаем
Код
квартал 3
аверс 1
Мин = 1
Cnt = 2, опять тоже самое, как в первый раз не совсем удачный пример получился.
результат:
Код
квартал4
аверс5

На след итерации останется только
Код
квартал 2
Мин = 2
Cnt = 1
Сейчас нет времени писать код на Delphi, но если не поймешь, может завтра попробую соорудить что-то.



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
  Дата 2.12.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Deniz @  2.12.2008,  15:54 Найти цитируемый пост)
ты в это поле записываешь ключ сортировки, и что там было до этого не важно, я так думаю.

правильно


Цитата(Deniz @  2.12.2008,  15:54 Найти цитируемый пост)
Как я понял нужно выбрать всех рекламодателей и напечатать по 1 объяве из каждого, потом еще по одной и т.д.

ну да


дальше не до конца понял, туплю, разбираюсь в твоём алгоритме

Добавлено через 6 минут и 16 секунд
Всё, вроде получилось  smile , вот окончательный код:

Код

procedure TDM.SortByAgency();
Var
 q: array of TpFIBDataSet;
 i, k, k1, j, trCount: integer;
begin

  tAgSort.Open;
  tAgSort.First;
  i := 0;
  //создаём нужное число НД (наборов данных)
  while not tAgSort.Eof do begin
    SetLength(q, i+1);
    q[i]                                    := TpFIBDataSet.Create(nil);
    q[i].Database                           := dbJDN;
    q[i].Transaction                        := trRead;
    q[i].UpdateTransaction                  := trUpdate;
    q[i].SelectSQL.Add('select id from treklama where id_agency = '+ tAgSort.FBN('ID').AsString);
    q[i].Open;
    q[i].First;
    k := k + q[i].RecordCountFromSrv;
    inc(i);
    tAgSort.Next;
  end;//while not tAgSort.Eof do begin

  if not SP_SET_ID2.Transaction.InTransaction then SP_SET_ID2.Transaction.StartTransaction;

  j := 0;
  trCount := 0;
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin
      if q[i].Eof then Continue;
      //записываем нужному объявлению значение для сортировки в поле ID2
      SP_SET_ID2.ParamByName('in_id').Value := q[i].FBN('ID').AsInteger;
      SP_SET_ID2.ParamByName('in_id2').Value := j;//
      SP_SET_ID2.ExecProc;

      //обрабатываем транзакцию, каждые 5000 подтверждаем
      Inc(trCount);
      if trCount = 5000 then begin
        if SP_SET_ID2.Transaction.InTransaction then SP_SET_ID2.Transaction.Commit;
        trCount := 0;
      end;

      q[i].next;
      Inc(j);
    end;//For i := 0 to High(q) do begin
  end;//for k1 := 0

  if SP_SET_ID2.Transaction.InTransaction then SP_SET_ID2.Transaction.Commit;

  //высвобождаем ресурсы
  For i := 0 to High(q) do Freel(q[i]);
  SetLength(q, 0);
end;


Всем большое спасибо!!  smile  smile 

Отдам юзерам, пусть теперь они мучаются  smile

Добавлено через 7 минут и 52 секунды
Но я пока что не ставлю вопрос, как решённый.  smile 
"От этих пчёл всего можно ожидать". (с) smile 
PM MAIL   Вверх
Akella
Дата 9.12.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



мда  smile  алгоритм дал сбой, в некоторых места идут записи не поочереди, а подряд  smile  
/*ушёл думать дальше
PM MAIL   Вверх
Deniz
Дата 10.12.2008, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Akella, мой вариант попробуй, может получится  smile 


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 10.12.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Deniz @  2.12.2008,  15:54 Найти цитируемый пост)
Запросом отбираем, именно из treklama, всех РД и кол-во их объявлений.

ну я же так и делаю
Код

  while not tAgSort.Eof do begin
//отбираем из главной таблицы только записи, которые пойдут в публикацию, т.е. с FLAG1 = 1
    aSQL := 'select id from treklama where FLAG1 = 1 and id_agency = '+ tAgSort.FBN('ID').AsString +
                          ' order by sort_napr, sort_type, sort_razdel, sort_rubrika, sort_region, sort_vid';
    v := dbJDN.QueryValueAsStr(aSQL, 0);
    if v = '' then begin
      tAgSort.Next;
      continue;
    end;

    SetLength(q, i+1);
    q[i]                                    := TpFIBDataSet.Create(nil);
    q[i].Database                           := dbJDN;
    q[i].Transaction                        := trRead;
    q[i].UpdateTransaction                  := trUpdate;
    q[i].SelectSQL.Add(aSQL);
    q[i].Open;
    q[i].First;
    k := k + q[i].RecordCountFromSrv;
    inc(i);
    tAgSort.Next;
  end;//while not tAgSort.Eof do begin


Вот получился у меня массив из трёх НД (наборов данных). В одном 10 записей, во - втором 116 и в третьем - 350.

Цитата(Deniz @  2.12.2008,  15:54 Найти цитируемый пост)
Кол-во записей в этом наборе есть шаг приращения Sort_ID, а М это минимальное кол-во объявлений, которое есть у всех.

M = 10 для всех, так?
Приращение для каждого своё: 10, 116 и 350. Так?


Цитата(Deniz @  2.12.2008,  14:35 Найти цитируемый пост)
Далее, находим минимальное кол-во объяв (обозначим М) и кол-во записей в запросе ( Cnt )
Далее цикл типа такого:
Код

for i:=0 to M-1 do begin
  Sort_Num:=i * cnt + DataSet.RecNo;
  // Выбор записи (только одной) для обновления у текущего Клиента
  update treklama set Sort_ID = :Sort_Num where ...
end;



вместо моего?

Код

  j := 0;
  trCount := 0;
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin

      if q[i].Eof then Continue;//вот это меня смущает..... здесь нужно что-то добавить или переделать

      SP_SET_ID2.ParamByName('in_id').Value  := q[i].FBN('ID').AsInteger;
      SP_SET_ID2.ParamByName('in_id2').Value := j;//
      SP_SET_ID2.ExecProc;

      //обрабатываем транзакцию, каждые 5000 подтверждаем
      Inc(trCount);
      if trCount >= 5000 then begin
        if SP_SET_ID2.Transaction.InTransaction then SP_SET_ID2.Transaction.Commit;
        trCount := 0;
      end;

      q[i].next;
      Inc(j);
    end;//For i := 0 to High(q) do begin
  end;//for k1 := 0


PM MAIL   Вверх
Deniz
Дата 10.12.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Akella @  10.12.2008,  12:26 Найти цитируемый пост)
Приращение для каждого своё: 10, 116 и 350. Так?
нет
Для всех приращение = кол-во записей в наборе (в моем select)
Цитата(Akella @  10.12.2008,  12:26 Найти цитируемый пост)
В одном 10 записей, во - втором 116 и в третьем - 350.
т.е., по моему select получается:
Код

id_agency1: 10
id_agency2: 116
id_agency3: 350
приращение 3, далее расчет
Код

id_agency1: 1, 4, 7, 10, 13, ..., 31
id_agency2: 2, 5, 8, 11, 14, ..., 32
id_agency3: 3, 6, 9, 12, 15, ..., 33
и так до мин кол-ва из поля select у нас 10, 
переоткрываем запрос и получаем:
Код

id_agency2: 106
id_agency3: 340
id_agency1 нет в наборе, потому как ее объявления уже отсортировали, приращение 2 (кол-во записей), счетчик с прошедшего останова = 33, ему +1, в итоге
Код

id_agency2: 34, 36, 38, 40, 42, ..., 
id_agency3: 35, 37, 39, 41, 43, ..., 
и так 106 раз (мин кол-во в select)
Будет желание напишу код на Delphi


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 10.12.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



попробую  smile 
PM MAIL   Вверх
uranpro
Дата 10.12.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



Заинтересовался))))

*ушел кодить*


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
uranpro
Дата 10.12.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



такс)...

создал таблицу
w_test:
FName varchar(50)
ID_Sort int

добавил записи только в fname
a
a
a
a
b
b
b
c
c
d

Delphi>>

Код


Glb, Upd :TADOQuery;

Glb.sql.text :='
SELECT     fname, COUNT(*) AS Qty
FROM         w_TEST
WHERE     (ID_Sort IS NULL)
GROUP BY fname
ORDER BY fname'


Upd.sql.text :='
updete TOP 1 w_test set
ID_Sort = :pID
where 
    (ID_Sort is null) and
    (FName = :pName) '



Код

procedure TForm1.Sort;
var
  Qry:TADOQuery;
  i:integer;
begin

  Qry:=TADOQuery.Create(Self);
  Qry.Connection:=SQLCon;
  with Qry.SQL do begin
    Clear;
    Add('update w_test set id_sort = null'); //очищаем id_sort
    end;
  Qry.ExecSQL;
  Qry.Free;

  Glb.Close; Glb.Open;  i:=1;
  while Glb.RecordCount<>0 do begin
    Glb.First;
    while not Glb.Eof do begin
      with Upd.Parameters do begin
        Items[0].Value:=i;
        Items[1].Value:=Glb.FieldByName('FName').Value;
        end;
      Upd.ExecSQL;
      inc(i);
      Glb.Next;
      end;
    Glb.Close;
    Glb.Open;
    end;
  end;
end;


Добавлено @ 12:49
работает на mssql2005
будет работать на др серверах, если реализовать функцию в UPDATE -> TOP 1

Это сообщение отредактировал(а) uranpro - 10.12.2008, 12:53


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Akella
Дата 10.12.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Попью кофе - попробую.  smile 

В любом случае всем большое спасибо за помощь!!
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1270 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.