Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Запрос не срабатывает в Делфи


Автор: Rodman 16.10.2007, 08:42
Дароф. 

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

может есть у кого нить какие то идеи?

передача кода записи не подходит!

Сенкс

Автор: Savek 16.10.2007, 13:27
Кто-нибудь смог прочитать присоединенный файл? У меня одни крякозяблики

Автор: Rodman 16.10.2007, 15:09
Код

object Form1: TForm1
  Left = 192
  Top = 109
  Width = 870
  Height = 169
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object DBGrid1: TDBGrid
    Left = 304
    Top = 0
    Width = 537
    Height = 129
    DataSource = DataSource1
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
  end
  object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString = 
      'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Test.mdb;Mode=ReadW' +
      'rite;Persist Security Info=False'
    LoginPrompt = False
    Mode = cmReadWrite
    Provider = 'Microsoft.Jet.OLEDB.4.0'
    Left = 64
    Top = 32
  end
  object ADOQuery1: TADOQuery
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    Parameters = <>
    SQL.Strings = (
      
        'SELECT Sum(ProjestList.ProjectPrice) AS [Sum-ProjectPrice], Sum(' +
        'CurrentMaker.ProjectSalary) AS [Sum-ProjectSalary], Sum([Projest' +
        'List]![ProjectPrice]-[CurrentMaker]![ProjectSalary]) AS asdas, [' +
        'MonthName]![NameMonth] & "-" & [ProjestList]![ProjectYear] AS '#1042#1099 +
        #1088#1072#1078#1077#1085#1080#1077'1, CurrentStatus.NameStatus'
      
        'FROM (MonthName INNER JOIN (CurrentStatus INNER JOIN ProjestList' +
        ' ON CurrentStatus.CodeStatus=ProjestList.CurrentStatus) ON Month' +
        'Name.CodeMonth=ProjestList.CodeMonth) INNER JOIN (Makers INNER J' +
        'OIN CurrentMaker ON Makers.CodeMaker=CurrentMaker.CodeMaker) ON ' +
        'ProjestList.CodeList=CurrentMaker.CodeProject'
      
        'GROUP BY [MonthName]![NameMonth] & "-" & [ProjestList]![ProjectY' +
        'ear], CurrentStatus.NameStatus, ProjestList.ProjectYear'
    
        'HAVING (((CurrentStatus.NameStatus) Like "*" & "asd" & "*") AND ' +
        '((ProjestList.ProjectYear)=2007));')
    Left = 120
    Top = 32
  end
  object DataSource1: TDataSource
    DataSet = ADOQuery1
    Left = 176
    Top = 32
  end
end

сам запрос
Код

SELECT Sum(ProjestList.ProjectPrice) AS [Sum-ProjectPrice], Sum(CurrentMaker.ProjectSalary) AS [Sum-ProjectSalary], Sum([ProjestList]![ProjectPrice]-[CurrentMaker]![ProjectSalary]) AS asdas, [MonthName]![NameMonth] & "-" & [ProjestList]![ProjectYear] AS Выражение1, CurrentStatus.NameStatus FROM (MonthName INNER JOIN (CurrentStatus INNER JOIN ProjestList ON CurrentStatus.CodeStatus=ProjestList.CurrentStatus) ON Month Name.CodeMonth=ProjestList.CodeMonth) INNER JOIN (Makers INNER JOIN CurrentMaker ON Makers.CodeMaker=CurrentMaker.CodeMaker) ON ProjestList.CodeList=CurrentMaker.CodeProjectGROUP BY [MonthName]![NameMonth] & "-" & [ProjestList]![ProjectYear], CurrentStatus.NameStatus, ProjestList.ProjectYearHAVING (((CurrentStatus.NameStatus) Like "*" & "asd" & "*") AND ((ProjestList.ProjectYear)=2007));

Автор: MetalFan 16.10.2007, 15:13
хм... а разве в LIKE не "%" используется в качестве "*"

Автор: Rodman 16.10.2007, 15:17
MetalFan, пробовал оба варианта!

Автор: ALeXandrK 16.10.2007, 16:03
А почему бы не использовать TADOStoredProc? 
... ну это как вариант...

Автор: Savek 16.10.2007, 16:45
Запрос приведенный на форуме

Цитата(Rodman @  16.10.2007,  15:09 Найти цитируемый пост)
'HAVING (((CurrentStatus.NameStatus) Like "*" & "asd" & "*") AND ' +

отличается от того, что приведен в проекте:
Код

HAVING (((CurrentStatus.NameStatus) Like "*" & "а" & "*") AND

так вот, последний у меня заработал если изменить так:

Код

HAVING (((CurrentStatus.NameStatus) Like "%a%") AND


Автор: ALeXandrK 16.10.2007, 18:16
Savek: да верно, ошибка была именно там.
Проверил TADOStoredProc - тоже не работает.
Интересная штука получается... значит запрос при вызове из Delphi <> вызову из Access...

Автор: Anark1 16.10.2007, 18:34
Цитата(ALeXandrK @ 16.10.2007,  18:16)
значит запрос при вызове из Delphi <> вызову из Access...

Только если запрос отличается или неверно настроено соединение. Недавний пример с Alca  smile 

Автор: ALeXandrK 16.10.2007, 19:26
Цитата(Anark1 @ 16.10.2007,  18:34)
Цитата(ALeXandrK @ 16.10.2007,  18:16)
значит запрос при вызове из Delphi <> вызову из Access...

Только если запрос отличается или неверно настроено соединение. Недавний пример с Alca  smile

Я скопировал ровно тот же запрос, что и в Access (см. приложение 3го поста) в Delphi, но
он тоже не выполнился, хотя в Access выполняется правильно...

Автор: Anark1 16.10.2007, 19:57
Цитата(ALeXandrK @ 16.10.2007,  19:26)
Я скопировал ровно тот же запрос, что и в Access (см. приложение 3го поста) в Delphi, но
он тоже не выполнился, хотя в Access выполняется правильно...

И что ? ALeXandrK, сам то подумай. Откуда бы запрос не выполнялся это одно и то же (разница только в привелегиях).
Я не знаю Access, может быть там можно выполнять какие то запросы с синтаксисом, понятным только Access`y. То есть существует некая прослойка между сервером и средой разработки (хотя и это врядли), которая бы обрабатывала данный запрос. Нужно просто перенастроить ADO.

Автор: Rodman 17.10.2007, 08:44
Цитата(Anark1 @  16.10.2007,  19:57 Найти цитируемый пост)
Нужно просто перенастроить ADO. 

настройки работают во всей проге одни и теже... т.е. остальные запросы правильно срабатывают...
Цитата(Savek @  16.10.2007,  16:45 Найти цитируемый пост)
так вот, последний у меня заработал если изменить так:

что значит заработал? у меня не работает!
Цитата(ALeXandrK @  16.10.2007,  19:26 Найти цитируемый пост)
Я скопировал ровно тот же запрос, что и в Access (см. приложение 3го поста) в Delphi, но
он тоже не выполнился, хотя в Access выполняется правильно... 

вот у меня таже фигня!

Автор: Savek 17.10.2007, 10:21
вот рабочий проект

Автор: Anark1 17.10.2007, 13:37
Rodman, скажи мне пожалуйста разницу в выполнении запроса из Access и выполнении из любого другого места ? Он обрабатывается как то по другому ? Или результат разный ? Это бред.
Синтаксически верный запрос будет выполняться из любых мест.

Автор: Rodman 17.10.2007, 13:57
Anark1, честно говоря я сам не пойму почему он не хочет срабатывать. За все время что я пишу - подобные запросы работали... а тут что то не объяснимое.

Если найду причину - отпишусь!

Автор: Savek 17.10.2007, 14:11
Цитата(Anark1 @  17.10.2007,  13:37 Найти цитируемый пост)
Синтаксически верный запрос будет выполняться из любых мест.

Звучит логично, хотя на практике синтаксически правильный запрос
Код

select * from Table where Field like ("*")

в аксесе вернет все записи, а при попытке выполнить из делфи НД будет пустой, для восстановления работоспособности придется * заменить на %.
 Случай у Rodman, конечно требует исследования, но похоже тоже доказывает обратное 

Автор: Anark1 17.10.2007, 15:52
Savek, я не работал в среде MS Access, но уверен, что там а-ля Visual FoxPro повышенная интеграция языка для работы с БД. Ну то есть, напрмиер, в SQL запросы, выполняемые из Access можно вставлять переменные и т.д. То есть фактически Access перерабатывает данный запрос. Вполне естественно, что ADO не выполняет то, что выполняет среда (что именно написал выше). Так почему бы не писать все запросы на нормальном чистом SQL ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)