Наверно в выходные надо отдыхать

Модераторы: kdv, CyberMax

Ответить
AndrewVL
Сообщения: 33
Зарегистрирован: 24 авг 2005, 16:14

Наверно в выходные надо отдыхать

Сообщение AndrewVL » 01 ноя 2009, 16:40

Привет.

есть такая табличка

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

CREATE TABLE SP_BOM ( - справочник материалов, комплектующих и готовых изделий
    C          INTEGER,
    PART_ID    INTEGER,
    COMP_ID    INTEGER,
    COMP_TYPE  INTEGER,
    PART_QTY   NUMERIC(15,5),
    COMP_QTY   NUMERIC(15,5));

CREATE TABLE MRP (   - потребнось в материалах и запчастях
    C         INTEGER,
    COMPTYPE  INTEGER,
    LOWLEVEL  INTEGER,
    ITEM_ID   INTEGER,
    QTY       INTEGER,
    ST        INTEGER);
есть процедурка

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

 CREATE PROCEDURE FILL_MRP 
returns (
    name char(100) character set win1251,
    comptype integer,
    lowlevel integer,
    item_id integer,
    qty integer,
    st integer,
    global_id integer)
as
declare variable n integer;
begin
  n=0;
  global_id=0;
  while ( exists(select item_id from mrp where st = 0)) do
  begin
       /*потребность в материалах*/
       for select 1 ,:n, b.comp_id,b.comp_qty*p.qty/b.part_qty,1,sp_parts.name from mrp p
       inner join sp_bom b on b.part_id = p.item_id
       left join sp_parts on sp_parts.c = b.comp_id
       where p.st = 0 and b.comp_type = 1 into :comptype,:lowlevel,:item_id,:qty,:st,:name do
       begin
       insert into mrp(comptype,lowlevel,item_id,qty,st)  values (:comptype,:lowlevel,:item_id,:qty,:st) ;
       suspend;
       end

       /*потребность в комплектующих*/

       for        select 2,:n+1,b.comp_id,b.comp_qty*p.qty/b.part_qty,0,sp_parts.name
       from mrp p inner join sp_bom b on b.part_id = p.item_id
       left join sp_parts on sp_parts.c = b.comp_id
       where p.st = 0 and b.comp_type = 2 into :comptype,:lowlevel,:item_id,:qty,:st,:name do
       begin

       insert into mrp(comptype,lowlevel,item_id,qty,st) values (:comptype,:lowlevel,:item_id,:qty,:st) ;
       suspend;
       global_id=global_id+1;
       end

       update mrp set st=1 where lowlevel = :n;
       n = n+1;
  end

end
запускаю в эксперте отладчик процедуры. прогоняю. выдает требуемое кол-во значений
запускаю просто селектом - почемуто больше значений чем надо.

Почему так она себя ведет? :-)

АНдрей

AndrewVL
Сообщения: 33
Зарегистрирован: 24 авг 2005, 16:14

Re: Наверно в выходные надо отдыхать

Сообщение AndrewVL » 01 ноя 2009, 17:48

хм.

Схемку брал из mssql. Там процедура работает правильно.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Наверно в выходные надо отдыхать

Сообщение kdv » 02 ноя 2009, 08:03

1. не делайте столько переводов строк, плохо читать (слишком длинно)
2. используйте тег code
3. зачем процедура сделана с suspend, и вообще, зачем выбирать из процедуры, если ее цель - вставить данные в mrp? это какой-то контроль? Или наоборот, если процедура и так выдает данные, то зачем их вставлять в mrp? именно поэтому "видно", что из ms sql. В FB обычно так не делают.
4. "отладчик процедур" в IBExpert парсит текст процедуры, и выполняет получившиеся запросы отдельно, т.е. "кусками". Соответственно, результат выполнения процедуры в "отладчике" может не совпадать с тем, что делает процедура.

убедитесь, что запросы в процедуре выдают столько записей, сколько нужно. Потом, меня сильно смущает цикл while с exists вначале процедуры. Обычно там должен быть или for select, или while без запросов. И еще - две инкрементируемые переменные, одну их которых (может солепу) вижу как только возвращаемую из процедуры. Она зачем нужна, если есть n?

AndrewVL
Сообщения: 33
Зарегистрирован: 24 авг 2005, 16:14

Re: Наверно в выходные надо отдыхать

Сообщение AndrewVL » 02 ноя 2009, 10:31

suspend делается только для контроля того что вставляется в MRP. Чтоб не коммитить и не очищать потом таблицу.


в почему в мускуле то все ок?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Наверно в выходные надо отдыхать

Сообщение kdv » 02 ноя 2009, 11:27

suspend делается только для контроля
ну и ладно.
в почему в мускуле то все ок?
в таких делах обычно виноваты кривые руки, а не сервер. Сервер выполняет что написано в процедуре, не более того.

AndrewVL
Сообщения: 33
Зарегистрирован: 24 авг 2005, 16:14

Re: Наверно в выходные надо отдыхать

Сообщение AndrewVL » 02 ноя 2009, 11:39

брал отсюда

http://www.sql.ru/forum/actualthread.aspx?tid=328684


Проверял процедурку в MSSQL - все корректно отрабатыват

AndrewVL
Сообщения: 33
Зарегистрирован: 24 авг 2005, 16:14

Re: Наверно в выходные надо отдыхать

Сообщение AndrewVL » 02 ноя 2009, 13:27

kdv писал(а): Потом, меня сильно смущает цикл while с exists вначале процедуры. Обычно там должен быть или for select, или while без запросов. И еще - две инкрементируемые переменные, одну их которых (может солепу) вижу как только возвращаемую из процедуры. Она зачем нужна, если есть n?
Exists я так понимаю тут присутствует, т.к. проверка идет в том числе по данным, которые процедура в процессе работы вставляет в mrp.
Изначально в mrp 1 зхапись, которая идентифицирует само изделие, которое надо разузловать

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Наверно в выходные надо отдыхать

Сообщение kdv » 02 ноя 2009, 23:52

я бы не был так уверен, что процедура, написанная на одном сервере, будет работать абсолютно идентично на другом сервере.
Возможно, что-то идет не так. Вы меня извините, конечно, разбираться с Вашей процедурой мне неинтересно, может кто другой посмотрит (а данные Вы не дали), но факт остается фактом - если результат выполнения кода не тот что ожидался, значит код написан неверно. Посмотрите еще раз на код, внимательно. Прокрутите, что должно быть в таблицах в каждый конкретный момент. Попробуйте выполнить процедуру частями, например сначала закомментировать все кроме первого for, потом раскомментировать insert и посмотреть соответствует ли то что видите на выходе процедуры, тому что в таблице, потом раскомментируйте второй for, и так далее.

Ну что я Вам объясняю, как на самом деле надо отлаживать процедуры...

Ответить