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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2009, 03:35   #1
MargoNik
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 32
Печаль Проблемы с выполнением ХП в Delphi 2009

Здравствуйте,
у меня возникла проблема с выполнением хранимой процедуры(MS SQL Server 2005) в Delphi 2009.
Подключаюсь к ХП через ADOCommand, прописываю параметры, после запуска программы во временной таблице SQL результат появляется, но ХП процедура отрабатывает не до конца. ХП должна показать состав изделия. Например, у конкретного изделия 511 составляющих, в таблице же появляется 14 составляющих. При каждом следующем запуске программы появляются ещё 14 и так далее. Попросила проверить работу процедуры в Visual Basic 6 - все работает отлично, в Visual Basic 2008 - при каждом запуске программы появляется по 11 изделий, в Delphi 7 тоже всё работает правильно. У меня Delphi 2009. Важно делать именно в 2009 Delphi. В чем может быть проблема, может кто-нибудь уже сталкивался?
MargoNik вне форума Ответить с цитированием
Старый 21.05.2009, 02:50   #2
MargoNik
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 32
По умолчанию

Ребята, ну может у кого-нибудь есть предположения почему так происходит? очень нужна помощь.
MargoNik вне форума Ответить с цитированием
Старый 21.05.2009, 11:42   #3
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

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

единственное что стоит проверить - это запустить вашу ХП из-под какого-нибудь GUI - да хоть из SQLExplorer-а (ну или что у вас там доступно) и проверить - появится ли такой косяк при таком доступе?
если косяка нет, то копать настройки адо-шных компонентов или пробовать через тот же 2009-й дельфи получить данные из ХП через другие компоненты (опять таки в целях понять - это косит ХП или все-таки АДО)

Последний раз редактировалось soleil@mmc; 21.05.2009 в 11:46.
soleil@mmc вне форума Ответить с цитированием
Старый 26.05.2009, 03:43   #4
MargoNik
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 32
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
а без ХП из вашей базы не получится селектом выбрать что-нить подходящее?
После долгих попыток запустить ХП, решила попробовать извлечь нужную информацию сама, но возникли проблемы с запросом.

Пишу запрос:
Код:
ADOQuery1.Close;
ADOQuery1.SQL.CLEAR;
ADOQuery1.SQL.ADD('SELECT КБД1.Что,КБД1.Куда,КБД1.Кол_во,SPRAV1.Пр_техн3 INTO Разузл FROM SPRAV1 INNER JOIN КБД1 ON SPRAV1.Decim=КБД1.Что WHERE (([Что]<>[Куда]) AND КБД1.Куда="'+Trim(DBLookupComboBox1.Text+'")'));
ADOQuery1.ExecSQL;
С помощью этого запроса в таблицу Разузл попадают составляющие конкретного изделие, но только из первого подъуровня
(т.е. изделие состоит из деталей, которые в свою очередь тоже состоят из каких-нибудь деталей).
Теперь чтобы получить составляющие деталей, попавших в таблицу Разузл пишу следущий запрос:
Код:
ADOQuery1.Close;
ADOQuery1.SQL.CLEAR;
ADOQuery1.SQL.ADD('SELECT КБД1.Что,КБД1.Куда,КБД1.Кол_во,SPRAV1.Пр_техн3 INTO Разузл1 FROM SPRAV1 INNER JOIN КБД1 ON SPRAV1.Decim=КБД1.Что WHERE (([Что]<>[Куда]) AND КБД1.Куда=Разузл.Что)');
ADOQuery1.ExecSQL;
Выдает ошибку: Параметр Разузл.Что не имеет значения по умолчанию.
Пробовала использовать вложенный подзапрос,т.е. вместо Разузл.Что писала:
Код:
(SELECT Что From Разузл)
Выдает ошибку: Данный подчинённый запрос должен возвращать не более одной записи.

Помоги, пожалуйста, справиться с этим запросом.

Последний раз редактировалось MargoNik; 26.05.2009 в 03:55. Причина: Недописала до конца сообщение
MargoNik вне форума Ответить с цитированием
Старый 26.05.2009, 06:30   #5
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Попробуйте так:

Код:
SELECT КБД1.Что,
           КБД1.Куда,
           КБД1.Кол_во,
           SPRAV1.Пр_техн3
   INTO Разузл1
  FROM SPRAV1 INNER JOIN
          КБД1 ON SPRAV1.Decim=КБД1.Что
WHERE (([Что]<>[Куда])
    AND КБД1.Куда in 
              (SELECT Что 
                   From Разузл)
edgy вне форума Ответить с цитированием
Старый 26.05.2009, 12:37   #6
MargoNik
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 32
По умолчанию

Спасибо вам, всё заработало. Вы просто спаситель, очень помогли мне!

Ещё хочу озадачить вас одним вопросом: а как реализовать цикл, что если значение Что из таблицы Разузл равно значению Куда из КБД1, то ещё раз делать выборку и записывать новые значения в таблицу Разузл. Другими словами делать проверку на наличие ещё подъуровней и если надо разузловывать их?
MargoNik вне форума Ответить с цитированием
Старый 26.05.2009, 18:46   #7
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от MargoNik Посмотреть сообщение
Другими словами делать проверку на наличие ещё подъуровней и если надо разузловывать их?
Т.е. по сути вам нужно получить все составляющие одного изделия ( или какой-либо части изделия ) ?

Не зная структуры вашей таблицы и как хранятся данные, а также основываясь исключительно на предположениях - приведу следующее решение:

Код:
-- Создадим для тестов временную таблицу - наверное, что-то типа вашей "КБД1"
create table #Item          
   ( parent numeric ( 9 ),  --  изделия
     child numeric ( 9 )    --  составляющие
   )

-- тестовые данные
insert into #Item values(1,2)
insert into #Item values(1,3)
insert into #Item values(1,4)
insert into #Item values(2,5)
insert into #Item values(2,6)
insert into #Item values(3,8)
insert into #Item values(8,9)
insert into #Item values(8,10)
insert into #Item values(4,7)
insert into #Item values(7,11)
insert into #Item values(11,12)
insert into #Item values(11,13)


declare @parent_element numeric ( 9 ), -- элемент, с которого начинаем поиск подузлов
        @level numeric ( 5 )           -- уровень вложенности

set @parent_element = 3    -- это значение передается с клиента
set @level = 0       


-- Создадим вспомогательную временную таблицу
create table #temp 
     ( parent numeric ( 9 ) null,
       child numeric ( 9 ) null,
       level numeric ( 5 )
     )


insert into #temp
select *, @level
  from #Item
 where parent = @parent_element

while @@rowcount > 0
begin

set @level = @level + 1

insert into #temp
select t.child,
       coalesce( t.parent, w.parent),
       @level
  from #temp w left join
       #Item t on w.parent = t.parent
 where w.level = @level - 1
   and w.parent is not null

end

select distinct child
  from #temp

drop table #Item
drop table #temp
Если я правильно вас понял, и это то, что нужно, то преобразуйте этот код относительно вашей структуры и оформите в виде хранимой процедуры. В процедуру передавайте параметр @parent_element - id изделия, для которого нужно найти все составляющие.
edgy вне форума Ответить с цитированием
Старый 28.05.2009, 04:39   #8
MargoNik
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 32
По умолчанию

engy, спасибо вам, хороший пример, вы всё правильно поняли.
А я вот все думаю, нельзя ли как-нибудь в цикле делать что-то наподобии изначального запроса, т.е. обойтись без создания хранимой процедуры?
MargoNik вне форума Ответить с цитированием
Старый 28.05.2009, 08:27   #9
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

MargoNik, а чем вас смущают хранимые процедуры?

Мне кажется, что в данном случае как раз будет лучше и практичнее один раз вызвать хранимку, чем в цикле несколько раз вызывать один и тот же запрос.
edgy вне форума Ответить с цитированием
Старый 01.06.2009, 03:44   #10
MargoNik
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 32
По умолчанию

Была в кратковременном отпуске, временно забыв о всех рабочих проблемах
Цитата:
Сообщение от edgy Посмотреть сообщение
а чем вас смущают хранимые процедуры?
Честно говоря, никогда их сама не создавала..
Извините меня, я наверно уже достала вас своими вопросами, но так уж получается..
Пишу вроде простой цикл для того, чтобы получить состав всех изделий из Form2.ADOQuery1, но получаю лишь состав первого изделия(т.е. значения первой записи из ADOQuery)
<CODE>
repeat
Form3.ADOQuery1.Close;
Form3.ADOQuery1.SQL.CLEAR;
Form3.ADOQuery1.SQL.ADD('SELECT КБД1.Что,КБД1.Куда,КБД1.Кол_во,SPRA V1.Пр_техн3 FROM SPRAV1 INNER JOIN КБД1 ON SPRAV1.Decim=КБД1.Что WHERE (([Что]<>[Куда]) AND КБД1.Куда="'+Form2.ADOQuery1Децимал ь_изд.AsString+'")');
Form2.ADOQuery1.Next;
until Form2.ADOQuery1.Eof;
Form3.ADOQuery1.Open;
</CODE>
Поможете разобраться с проблемой в цикле?
MargoNik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WaitForSingleObject в Delphi 2009 Хамяг Win Api 11 03.12.2009 09:06
ActiveX в Delphi 2009 euronymous Общие вопросы Delphi 2 10.05.2009 15:11
Delphi 2009 и ADO Хитрец БД в Delphi 2 07.02.2009 12:12