Конференция "Базы" » Интересная вещь в ADO [D7]
 
  • Patrick1968 © (26.07.11 16:27) [0]
    Не пойму в чем причина, написал запрос
    select count(*)  from mytable where article='100' and propid='40'
    при открытии ADOQuery, выходит сообщение, что "групповая функция не является одногруппной", хотя в SQL Plus'e всё проходит на "ура". Что-то непонятно? Может кто сталкивался?
  • MsGuns © (26.07.11 16:35) [1]
    select article, propid, count(*)
     from mytable
     where article='100' and propid='40'
     group by article, propid
  • b z (26.07.11 16:40) [2]
    Никто не сталкивался.
    Кстати а что за субд?
  • Patrick1968 © (26.07.11 16:45) [3]
    Понял,спасибо
  • Patrick1968 © (26.07.11 16:50) [4]
    А в этом случае ошибка, что выражение не является выражением GROUP BY
  • Игорь Шевченко © (26.07.11 17:01) [5]

    > при открытии ADOQuery, выходит сообщение, что "групповая
    > функция не является одногруппной",


    так прямо и выходит ?

    подробности для вопроизведения будут ?


    >  хотя в SQL Plus'e всё проходит на "ура".


    везде должно проходить на ура
  • SQLEXPRESS (26.07.11 17:03) [6]

    > Кстати а что за субд?

    +1

    такие простые агрегатные штуки должны работать

    в oracle, работает
    select
    count(*)
    from t_users U
    where U.NAME like 'МЕЛ%' and U.STREET_ID = 0

    в MSSQL, работает
    SELECT count(*)
     FROM [InterStart].[dbo].[vCTVConstSVCDeactivate]
    where [INFO] = 'NotActive' and ID_SVC = 55

    в Access, работает
    SELECT
    count(*)
    FROM Answert
    where Answert.[IdQuest] = 10 and Answert.[Value] = 0
  • Patrick1968 © (26.07.11 17:03) [7]
    про это и речь, поэтому и интересные вещи а какие подробности?
  • Patrick1968 © (26.07.11 17:08) [8]
    может свойства query какие-то на это влияют?
  • SQLEXPRESS (26.07.11 17:27) [9]
    параметры есть? parse их?
  • MsGuns © (26.07.11 17:32) [10]
    Есть подозрение что в этой СУБД (клиенте ?) нет такой функции 'count' или не допускается выражение 'count(*)'
  • Patrick1968 © (26.07.11 17:32) [11]
    Все параметры по дефолту
  • MsGuns © (26.07.11 17:32) [12]
    Вот тольуо адо тут совершенно сбоку
  • MsGuns © (26.07.11 17:34) [13]
    А так ?
    select count(A.*) from
     (select article,propid from mytable where article='100' and propid='40') A
  • Patrick1968 © (26.07.11 17:35) [14]
    Это как-так в оракле нет count?
  • Игорь Шевченко © (26.07.11 17:40) [15]

    > Это как-так в оракле нет count?


    ну вот нет
  • SQLEXPRESS (26.07.11 17:41) [16]
    Ну а парсишь их?
    Query.Parameters.ParseSQL ?
  • SQLEXPRESS (26.07.11 18:03) [17]
    да, не работает, так и пишет
    не сингл группа функция, к Ораклу

    select count(*) from debtor
    where REG_ID = :RI

    с параметрами надо играть.
    Cheked, Prepare, PARse
    у меня заработало, короче

    А к MSSQL это не обязательно, и так работает :)
  • Игорь Шевченко © (26.07.11 18:35) [18]
    У вас ADO кривое (или что-то еще)

    object Form1: TForm1
     Left = 0
     Top = 0
     Caption = 'Form1'
     ClientHeight = 293
     ClientWidth = 426
     Color = clBtnFace
     Font.Charset = DEFAULT_CHARSET
     Font.Color = clWindowText
     Font.Height = -11
     Font.Name = 'Tahoma'
     Font.Style = []
     OldCreateOrder = False
     PixelsPerInch = 96
     TextHeight = 13
     object Button1: TButton
       Left = 332
       Top = 252
       Width = 75
       Height = 25
       Caption = 'Button1'
       TabOrder = 0
       OnClick = Button1Click
     end
     object db: TADOConnection
       ConnectionString =
         'Provider=OraOLEDB.Oracle.1;Password=bar;Persist Security I' +
         'nfo=True;User ID=foo;Data Source=sles10'
       Provider = 'OraOLEDB.Oracle.1'
       Left = 32
       Top = 24
     end
     object ds: TADODataSet
       Connection = db
       CommandText = 'SELECT COUNT(*) FROM arg_city WHERE country_code = '#39'RU'#39
       Parameters = <>
       Left = 128
       Top = 24
     end
    end



    procedure TForm1.Button1Click(Sender: TObject);
    begin
     db.Connected := true;
     ds.Open;
     try
       ShowMessageFmt('count = %s', [ds.Fields[0].AsString]);
     finally
       ds.Close;
     end;
    end;



    результат вполне адекватен
  • SQLEXPRESS (26.07.11 19:05) [19]

    > Parameters = <>

    а глючит, когда они есть
  • Игорь Шевченко © (26.07.11 20:54) [20]

    > а глючит, когда они есть


    object Form1: TForm1
     Left = 0
     Top = 0
     Caption = 'Form1'
     ClientHeight = 293
     ClientWidth = 426
     Color = clBtnFace
     Font.Charset = DEFAULT_CHARSET
     Font.Color = clWindowText
     Font.Height = -11
     Font.Name = 'Tahoma'
     Font.Style = []
     OldCreateOrder = False
     PixelsPerInch = 96
     TextHeight = 13
     object Button1: TButton
       Left = 332
       Top = 252
       Width = 75
       Height = 25
       Caption = 'Button1'
       TabOrder = 0
       OnClick = Button1Click
     end
     object db: TADOConnection
       Connected = True
       ConnectionString =
         'Provider=OraOLEDB.Oracle.1;Password=bar;Persist Security I' +
         'nfo=True;User ID=foo;Data Source=sles10'
       Provider = 'OraOLEDB.Oracle.1'
       Left = 32
       Top = 24
     end
     object ds: TADODataSet
       Connection = db
       CommandText = 'SELECT COUNT(*) FROM arg_city WHERE country_code = :CC'
       Parameters = <
         item
           Name = 'CC'
           DataType = ftString
           Size = -1
           Value = Null
         end>
       Left = 128
       Top = 24
     end
    end



    procedure TForm1.Button1Click(Sender: TObject);
    begin
     db.Connected := true;
     ds.Parameters.ParamByName('CC').Value := 'RU';
     ds.Open;
     try
       ShowMessageFmt('count = %s', [ds.Fields[0].AsString]);
     finally
       ds.Close;
     end;
    end;



    И с параметрами не глючит. Это у тебя ADO кривое (или еще что)
  • SQLEXPRESS (26.07.11 20:59) [21]
    теперь ты их в дизайне определил, а глючит, когда не до определишь в рантайме
    да и не глючит, а аккуратнее надо быть просто.
    У нас изначально какой вопрос был? Как автор такого добился. Я нашел как - именно если параметры в where не до определены.
  • Игорь Шевченко © (26.07.11 21:42) [22]

    > У нас изначально какой вопрос был?


    У автора параметров изначально не было вообще. Ву компрене ?


    >  Как автор такого добился.


    автору давно пофиг, на вопрос в [5] ответа нет и не будет.

    Но, включив телепатор, могу предположить, что у автора кривой/не тот провайдер, кривое ADO или кривое то, что у программистов обычно из задницы растет.

    Более того, изменив пример на ADOQuery (вдруг местные последователи ислама правы в своих нападках на TADOQuery? )
    я получил точно такой же результат, как с ADODataSet

    object Form1: TForm1
     Left = 0
     Top = 0
     Caption = 'Form1'
     ClientHeight = 293
     ClientWidth = 426
     Color = clBtnFace
     Font.Charset = DEFAULT_CHARSET
     Font.Color = clWindowText
     Font.Height = -11
     Font.Name = 'Tahoma'
     Font.Style = []
     OldCreateOrder = False
     PixelsPerInch = 96
     TextHeight = 13
     object Button1: TButton
       Left = 340
       Top = 224
       Width = 75
       Height = 25
       Caption = 'Button1'
       TabOrder = 0
       OnClick = Button1Click
     end
     object Button2: TButton
       Left = 340
       Top = 260
       Width = 75
       Height = 25
       Caption = 'Button2'
       TabOrder = 1
       OnClick = Button2Click
     end
     object db: TADOConnection
       ConnectionString =
         'Provider=OraOLEDB.Oracle.1;Password=bar;Persist Security I' +
         'nfo=True;User ID=foo;Data Source=sles10'
       Provider = 'OraOLEDB.Oracle.1'
       Left = 32
       Top = 24
     end
     object ds: TADODataSet
       Connection = db
       CommandText = 'SELECT COUNT(*) FROM arg_city WHERE country_code = :CC'
       Parameters = <
         item
           Name = 'CC'
           DataType = ftString
           Size = -1
           Value = Null
         end>
       Left = 128
       Top = 24
     end
     object q: TADOQuery
       Connection = db
       Parameters = <>
       SQL.Strings = (
         'SELECT COUNT(*)
    FROM arg_city WHERE country_code = '
    #39'RU'#39)
       Left = 204
       Top = 24
     end
    end



    unit main;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, DB, ADODB, StdCtrls;

    type
     TForm1 = class(TForm)
       db: TADOConnection;
       ds: TADODataSet;
       Button1: TButton;
       q: TADOQuery;
       Button2: TButton;
       procedure Button1Click(Sender: TObject);
       procedure Button2Click(Sender: TObject);
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     db.Connected := true;
     ds.Parameters.ParamByName('CC').Value := 'RU';
     ds.Open;
     try
       ShowMessageFmt('count = %s', [ds.Fields[0].AsString]);
     finally
       ds.Close;
     end;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
     db.Connected := true;
     q.Open;
     try
       ShowMessageFmt('count = %s', [q.Fields[0].AsString]);
     finally
       q.Close;
     end;
    end;

    end.



    число записей одинаковое.
 
Конференция "Базы" » Интересная вещь в ADO [D7]
Есть новые Нет новых   [134431   +10][b:0][p:0.004]