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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильная передача перечисления для Firebird 
:(
    Опции темы
Matrex
Дата 7.10.2016, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго дня коллеги!

Есть функция для удаления строк из БД Firebird 2.5 по идентификатору:

Код

function DEL(const ID: string; IBT: TIBTransaction): Integer;
begin
  fIBS_D := TIBSQL.Create(nil);
  fIBS_D.Transaction := IBT;
  fIBS_D.Database := IBT.DefaultDatabase;
  fIBS_D.SQL.ADD('DELETE FROM SR_USER WHERE id in (:id)');
  fIBS_D.Prepare;
  fIBS_D.ParamByName('id').Value := ID;
  fIBS_D.ExecQuery;
  result := 0;
end;


Если удалять по одной записи:
DEL('10'; fIBT) – все работает

Если удалять серию записей через перечисление:
DEL('10,11,12,13'; fIBT)– функция не работает – просто записи не удаляются.

Я так понимаю необходимо правильно передавать перечисление в качестве параметра – вопрос как это сделать?


PM MAIL   Вверх
Matrex
Дата 7.10.2016, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Похоже что никак. См
http://www.ibase.ru/ibfaq/#inparam
PM MAIL   Вверх
Alexeis
Дата 7.10.2016, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11720
Регистрация: 12.10.2005
Где: Молдова, Кишинев

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



Не встречался с такой задачей. Обычно групповое удаление идет каскадно. Т.е. удаление группы записей объединенных общим ключом. Удаляешь мастер запись и каскадно труртся все зависимости. Если стоит вопрос производительности, то можно попробовать написать хранимую процедуру.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Matrex
Дата 7.10.2016, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дело не в каскадном удалении. Задача стоит следующая: пользователь в гриде выделяет несколько записей и удаляет их одновременно...
PM MAIL   Вверх
mixxxa
Дата 8.10.2016, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А так пробовали?
Код

function DEL(const ID: string; IBT: TIBTransaction): Integer;
begin
  fIBS_D := TIBSQL.Create(nil);
  fIBS_D.Transaction := IBT;
  fIBS_D.Database := IBT.DefaultDatabase;
  fIBS_D.SQL.ADD('DELETE FROM SR_USER WHERE id in ('+ID+')');
  fIBS_D.Prepare;
  fIBS_D.ExecQuery;
  result := 0;
end;


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
mixxxa
Дата 8.10.2016, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А так пробовали?
Код

function DEL(const ID: string; IBT: TIBTransaction): Integer;
begin
  fIBS_D := TIBSQL.Create(nil);
  fIBS_D.Transaction := IBT;
  fIBS_D.Database := IBT.DefaultDatabase;
  fIBS_D.SQL.ADD('DELETE FROM SR_USER WHERE id in ('+ID+')');
  fIBS_D.Prepare;
  fIBS_D.ExecQuery;
  result := 0;
end;


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
mixxxa
Дата 8.10.2016, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А так пробовали?
Код

function DEL(const ID: string; IBT: TIBTransaction): Integer;
begin
  fIBS_D := TIBSQL.Create(nil);
  fIBS_D.Transaction := IBT;
  fIBS_D.Database := IBT.DefaultDatabase;
  fIBS_D.SQL.ADD('DELETE FROM SR_USER WHERE id in ('+ID+')');
  fIBS_D.Prepare;
  fIBS_D.ExecQuery;
  result := 0;
end;


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
mixxxa
Дата 8.10.2016, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А так пробовали?
Код

function DEL(const ID: string; IBT: TIBTransaction): Integer;
begin
  fIBS_D := TIBSQL.Create(nil);
  fIBS_D.Transaction := IBT;
  fIBS_D.Database := IBT.DefaultDatabase;
  fIBS_D.SQL.ADD('DELETE FROM SR_USER WHERE id in ('+ID+')');
  fIBS_D.Prepare;
  fIBS_D.ExecQuery;
  result := 0;
end;


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
mixxxa
Дата 8.10.2016, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А так пробовали?
Код

function DEL(const ID: string; IBT: TIBTransaction): Integer;
begin
  fIBS_D := TIBSQL.Create(nil);
  fIBS_D.Transaction := IBT;
  fIBS_D.Database := IBT.DefaultDatabase;
  fIBS_D.SQL.ADD('DELETE FROM SR_USER WHERE id in ('+ID+')');
  fIBS_D.Prepare;
  fIBS_D.ExecQuery;
  result := 0;
end;


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Akella
Дата 10.10.2016, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Передавать нужно в скобках + закавычить, т.к. это же текстовый параметр.
И сделайте лучше без параметра, сразу сгенерируйте запрос.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Akella
Дата 10.10.2016, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Передавать нужно в скобках + закавычить, т.к. это же текстовый параметр.
И сделайте лучше без параметра, сразу сгенерируйте запрос.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Akella
Дата 10.10.2016, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Передавать нужно в скобках + закавычить, т.к. это же текстовый параметр.
И сделайте лучше без параметра, сразу сгенерируйте запрос.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Akella
Дата 10.10.2016, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Передавать нужно в скобках + закавычить, т.к. это же текстовый параметр.
И сделайте лучше без параметра, сразу сгенерируйте запрос.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Akella
Дата 10.10.2016, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Передавать нужно в скобках + закавычить, т.к. это же текстовый параметр.
И сделайте лучше без параметра, сразу сгенерируйте запрос.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Akella
Дата 10.10.2016, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Ещё можно создать процедуру UNLIST

Код

SET TERM ^ ;

create or alter procedure UNLIST (
    STRING varchar(2048),
    SEPARATOR varchar(1))
returns (
    ROW varchar(20))
as
begin
  Separator = coalesce(Separator, ';');
  if (Separator = '') then Separator = ';';
  Row = '';

  while (String != '') do
  begin
    if (substring(String from 1 for 1) != Separator) then
      Row = Row || substring(String from 1 for 1);
    else
    begin
      if (Row != '') then suspend;
      Row = '';
    end
    String = substring(String from 2);

  end
  if (Row != '') then suspend;
end^

SET TERM ; ^


использовать потом так:

Код

SELECT P.TEL, P.ID FROM PHONES P
INNER JOIN UNLIST(:ID, ',') UL ON P.ID = UL.ROW


в ID передаём текст в виде чисел через запятую

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Google
  Дата 23.9.2017, 03:17 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1022 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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