Как сделать запрос с динамическими переменными?

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Ответить
bex007
Сообщения: 14
Зарегистрирован: Сб 13 июн 2015 14:19

Как сделать запрос с динамическими переменными?

Сообщение bex007 » Сб 13 июн 2015 14:34

Помогите пожалуйсто! Я хочу обновить статус одновременно на нескольких записей где после where будет массив или строки из memo. Может это делается в цикле? но главная чтоб имена одновременно обновился все.

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

myquery1.SQL.Text:='UPDATE tickets SET status:=1 WHERE seat IN (array);

ViktorV
Devart Team
Сообщения: 202
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Как сделать запрос с динамическими переменными?

Сообщение ViktorV » Пн 15 июн 2015 10:12

Для решения задачи вы можете использовать макросы. Например:

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

var
  ArrayStr: string;
  i: integer;
begin
  MyQuery1.SQL.Text := MyQuery1.SQL.Text := 'UPDATE tickets SET status = 1 WHERE seat IN (&ARRAY)';
  ArrayStr := '';
  for i := 0 to Memo.Lines.Count - 1 do begin
    if ArrayStr <> '' then
      ArrayStr := ArrayStr + ',';
    ArrayStr := ArrayStr + QuotedStr(Memo.Lines[i]);
  end;
  MyQuery1.MacroByName('ARRAY').Value := ArrayStr;
  MyQuery1.Execute;
end;
Более подробную информацию об использовании макросов вы можете получить по ссылке: http://www.devart.com/mydac/docs/#work_macros.htm

bex007
Сообщения: 14
Зарегистрирован: Сб 13 июн 2015 14:19

Re: Как сделать запрос с динамическими переменными?

Сообщение bex007 » Вт 16 июн 2015 10:51

спасибо за ответ, но к сожалению этот код выдает ошибки:

[dcc32 Error] Unit2.pas(1883): E2010 Incompatible types: 'string' and 'procedure, untyped pointer or untyped parameter'

[dcc32 Warning] Unit2.pas(1952): W1057 Implicit string cast from 'AnsiString' to 'string'

[dcc32 Warning] Unit2.pas(2072): W1019 For loop control variable must be simple local variable

[dcc32 Warning] Unit2.pas(2971): W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'

ViktorV
Devart Team
Сообщения: 202
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Как сделать запрос с динамическими переменными?

Сообщение ViktorV » Вт 16 июн 2015 12:07

Прошу прощение за неточность в примере приведенном в предыдущем посте. Для корректной работы примера, пожалуйста, замените строку

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

  MyQuery1.SQL.Text := MyQuery1.SQL.Text := 'UPDATE tickets SET status = 1 WHERE seat IN (&ARRAY)';
на следующую

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

  MyQuery1.SQL.Text := 'UPDATE tickets SET status = 1 WHERE seat IN (&ARRAY)';

bex007
Сообщения: 14
Зарегистрирован: Сб 13 июн 2015 14:19

Re: Как сделать запрос с динамическими переменными?

Сообщение bex007 » Вт 16 июн 2015 15:34

Так все отлично работает, Огромное вам спасибо 8)

ViktorV
Devart Team
Сообщения: 202
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Как сделать запрос с динамическими переменными?

Сообщение ViktorV » Ср 17 июн 2015 09:58

Обращайтесь к нам, если у Вас возникнут вопросы по MyDAC.

bex007
Сообщения: 14
Зарегистрирован: Сб 13 июн 2015 14:19

Re: Как сделать запрос с динамическими переменными?

Сообщение bex007 » Пн 22 июн 2015 22:02

у меня еще один вопрос , у меня есть такой код

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

try
MyQuery1.close;
MyQuery1.SQL.Clear;
MyQuery1.SQL.Text:='INSERT INTO tickets (`id`, `seat`, `sector`) VALUES (NULL, :seat, NULL)';
MyQuery1.Prepare; 
 if not MyConnection1.InTransaction then
    MyConnection1.StartTransaction;
  try
    for i := 1 to 795 do begin
         MyQuery1.ParamByName('seat').AsString := IntToStr(i);
        MyQuery1.Execute;
        end;
 MyConnection1.Commit;
  except
    MyConnection1.Rollback;
    raise;
  end;

   except
on E: exception do
showmessage(E.Message);
end;
и я хочу чтоб в sector в цикле заходил данные вот так:

если seat больше 20 тогда в сектор записался B
если seat меньше 20 тогда в сектор записался A

ViktorV
Devart Team
Сообщения: 202
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Как сделать запрос с динамическими переменными?

Сообщение ViktorV » Вт 23 июн 2015 09:29

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

bex007
Сообщения: 14
Зарегистрирован: Сб 13 июн 2015 14:19

Re: Как сделать запрос с динамическими переменными?

Сообщение bex007 » Вт 23 июн 2015 17:10

С этим я уже разобрался! мне интересно как распечатать в цикле содержимое myquery1

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

try
myquery1.close;
myquery1.SQL.Clear;
myquery1.SQL.Text:='SELECT `id`, `date`, `time`,  FROM tickets WHERE seat IN (&ARRAY)';
ArrayStr := '';
  for i:= 0 to Memo1.Lines.Count - 1 do begin
    if ArrayStr <> '' then
      ArrayStr := ArrayStr + ',';
    ArrayStr := ArrayStr + QuotedStr(Memo1.Lines[i]);
  end;
  MyQuery1.MacroByName('ARRAY').Value := ArrayStr;
  myquery1.open;

frxreport1.PrepareReport;
FrxReport1.PrintOptions.ShowDialog:=false;
frxreport1.Print;

except
on E: exception do
showmessage(E.Message);
end;
так печатает только первое значение :?

ViktorV
Devart Team
Сообщения: 202
Зарегистрирован: Чт 31 июл 2014 09:52

Re: Как сделать запрос с динамическими переменными?

Сообщение ViktorV » Чт 25 июн 2015 10:47

Данный вопрос относится к функциональности FastReport, а не к MyDAC. Для его решения, пожалуйста, обратитесь к документации FastReport.

Ответить