Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2016, 11:58   #1
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию Чудеса SQL

Всем доброго времени суток.

Имеется вот такой код:
Код:
    with ADOQuery1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('declare @prod varchar(255) set @prod = :parm1');
      ADOQuery1.Parameters.ParamByName('parm1').Value := AStr;
      SQL.Add('select _id, _product');
      SQL.Add('from vwObjects');
      SQL.Add('where _product = @prod');
      Open;
    end;
В случае, когда AStr = '1-01-0002/0 2016' - результат имеется.
В случае, когда AStr = '3-01-8613/0 2016' - результата нет.

Но весь прикол в том, что если вручную в БД используя оба этих значения - результат будет для обоих.

В чем может быть проблема?
nactyx вне форума Ответить с цитированием
Старый 24.05.2016, 12:02   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Наверно не в чудесах, а в корявостях программы. Не? И зачем declare, set? Параметр можно прямо в запросе задать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.05.2016, 12:05   #3
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Параметр можно прямо в запросе задать
Как именно можно изменить код? Я уже с этими вариациями запутался.

И что за корявость такая может быть: строка передается в нужном виде, но в одном случае результат есть, а в другом - нет. Куда копать?
nactyx вне форума Ответить с цитированием
Старый 24.05.2016, 12:09   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
  ADOQuery1.SQL.Text:='select _id, _product from vwObjects where _product = :parm1';
  ADOQuery1.Parameters.ParamByName('parm1').Value := AStr;
Корявость какая не знаю, нет полного кода
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.05.2016, 12:16   #5
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Копируется столбец из Excel, активным делаем нашу программу и по нажатию на ctrl + v на форму в грид добавляются значения из Excel. _product - это AStr, _id - из БД подтягивается для дальнейших действий.

Код:
procedure TfRepLoadStans.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
var
  S: string;
  I, N: Integer;
  AStr: String;
begin
  if Msg.CharCode = Ord('V') then
  if (GetKeyState(VK_CONTROL) < 0) then
    begin
      Handled := True;
  if (Clipboard.HasFormat(CF_TEXT)) and (Clipboard.AsText <> '') then
  begin
    s := Clipboard.AsText;
    s := StringReplace(s, #$D#$A, '!', [rfReplaceAll]);
    n := 1;
    i := 1;
    while i <= length(s) do
    begin
      if (s[i] = '!') and (s[i+1] <> '!') then
      begin
        AStr := copy(s, n, i-n);
        if AStr[Length(AStr)] = '!' then AStr := copy(AStr, 1, Length(AStr)-1);


    with ADOQuery1 do
    begin
      Close;
      SQL.Clear;
      ADOQuery1.SQL.Text := 'select _id, _product from vwObjects where _product = :parm1';
      ADOQuery1.Parameters.ParamByName('parm1').Value := AStr;
      Open;
    end;
        AddOrder2(ADOQuery1.FieldByName('_id').AsString, AStr);
        n := i+1;
        inc(i);
      end
      else
        inc(i);
    end;
  end
  else
    MessageDlg('В буфере обмена ничего нет', mtInformation, [mbOK], 0);
    end;
end;
Процедура AddOrder2:
Код:
procedure TfRepLoadStans.AddOrder2(a, b: string);
var
  order, orderName : string;
  I, J : Integer;
begin
  if(not ADOQuery1.IsEmpty) then
  begin
    order := a;
    orderName := b;
    SetLength (OrderMas, Length(OrderMas) + 1);
    I := 0;
    while (I<Length(OrderMas)) do
    begin
      if OrderMas[I] = order then
      begin
        I := Length(OrderMas);
        raise Exception.Create('Этот заказ уже выбран!');
      end;
      I := I + 1;
    end;
    OrderMas[Length(OrderMas)-1] := order;
    if (ADOQuery2.IsEmpty) then
    with ADOQuery2 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('create table #tmp15 (orderNO VarChar(255), orderName VarChar(255))');
      SQL.Add('insert into #tmp15 values(''' + order + ''' ,''' + orderName + ''')');
      SQL.Add('select * from #tmp15');
      Open;
      cxButton4.Enabled := True;
      cxButton5.Enabled := True;
    end
    else
    with ADOQuery2 do
    begin
     SQL.Clear;
     SQL.Add('insert into #tmp15 values(''' + order + ''' ,''' + orderName + ''')');
     SQL.Add('select * from #tmp15');                                                              // and (_id <> '')
     Open;
    end;
    with ADOQuery1 do
    begin
      SQL.Text := SQLText;
      for J := 1 to Length(OrderMas) do
      begin
        SQL.Add('and (_id <> ''' + OrderMas[J-1] + ''')');
        cxTextEdit1PropertiesChange(nil);
      end;
    end;
  end
end;
nactyx вне форума Ответить с цитированием
Старый 24.05.2016, 12:50   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
    else begin
     ADOQuery2.SQL.Clear;
     ADOQuery2.SQL.Add('insert into #tmp15 values(''' + order + ''' ,''' + orderName + ''')');
     ADOQuery2.SQL.Add('select * from #tmp15');                                                              // and (_id <> '')
     ADOQuery2.Open;//НЕ ОКАЗЫВАЕТ ВЛИЯНИЯ так как ОН УЖЕ ОТКРЫТ (забыли закрыть ДО )
    end;
как результат имеем СТАРЫЙ набор данных (от предыдущего вызова)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 24.05.2016 в 12:53.
evg_m вне форума Ответить с цитированием
Старый 24.05.2016, 13:25   #7
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
    else begin
     ADOQuery2.SQL.Clear;
     ADOQuery2.SQL.Add('insert into #tmp15 values(''' + order + ''' ,''' + orderName + ''')');
     ADOQuery2.SQL.Add('select * from #tmp15');                                                              // and (_id <> '')
     ADOQuery2.Open;//НЕ ОКАЗЫВАЕТ ВЛИЯНИЯ так как ОН УЖЕ ОТКРЫТ (забыли закрыть ДО )
    end;
как результат имеем СТАРЫЙ набор данных (от предыдущего вызова)
Допустим в этом проблема. Тогда почему отдельно один работает, отдельно второй не работает? Не смотря на этот кусок кода. Потому что когда только одно значение (одна ячейка) - в это место даже не попадает компилятор. Так что проблема остается. Я уже голову сломал почему. Одно работает, второе нет. Непосредственно в БД работают оба.
nactyx вне форума Ответить с цитированием
Старый 24.05.2016, 13:41   #8
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Почему здесь _ID находит:

А в программе _ID не может найти
nactyx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Творит чудеса!!! Nibelyng Общие вопросы Delphi 2 06.05.2015 02:10
Чудеса с printf BrookBond Общие вопросы C/C++ 9 10.03.2013 23:28
Чудеса c DBGrid'ом The_Immortal C++ Builder 3 05.05.2012 03:01
Чудеса Vikenty Свободное общение 10 14.10.2010 20:27
Чудеса в Borland C++ 3.1 LightWarrior Общие вопросы C/C++ 5 06.01.2010 03:37