Вопрос по программированию…


Главная Форумы IBM i (OS/400) Вопрос по программированию…

В этой теме 6 ответов, 3 участника, последнее обновление  _KIRill 6 года/лет назад.

  • Автор
    Сообщения
  • #14240

    Jevgeni Astanovski
    Участник

    Если конечно здесь не только железячники B)
    Есть простенькая программка на С «HOWMANY», открывает файл, читает записи по очереди и считает их:
    [code]
    fd = _Ropen(«ABC», «rr») ;
    rfd = _Rreadf(fd, &Record, sizeof(Record), __DFT) ;
    while (rfd->num_bytes == sizeof(Record))
    {
    i++ ;
    rfd = _Rreadn(fd, &Record, sizeof(Record), __DFT) ;
    }
    _Rclose(fd) ;
    printf(«%d records on filen», i) ;
    [/code]
    Теперь я пытаюсь ее извне заставить читать не весь файл, а только часть его.
    Пытаюсь для этого использовать OVRDBF и OPNQRYF — по книжке:
    [code]
    OVRDBF FILE(ABC) SHARE(*YES)
    OPNQRYF FILE((ABC *FIRST ABCR)) OPTION(*ALL) +
    QRYSLT(‘FIELD1 > »350000»’) +
    OPNSCOPE(*ACTGRPDFN)
    CALL PGM(JOHN/HOWMANY)
    CLOF OPNID(ABC)
    DLTOVR FILE(ABC)
    [/code]
    В теории и в книжке (насколько я ее понял) — программка должна считать только те записи, у которых FIELD1 > ‘350000’.
    На практике — хрен. :sick:

    Если бы просто читать, я бы мог сделать OVERRIDE на фрагмент копии исходного файла с FIELD1>’350000′, но этот вариант не подходит, так как в конце концов мне надо не только читать, но и модифицт=ировать файл…

    Может кто подскажет?

  • #14242

    Sever
    Участник

    Вызываемая программа каждый раз читает весь файл целиком без учета выборки?
    Если это так, то причина в том, что вызывающая и вызываемая программы работают в разных активационных группах.

    http://www.ibm.com/developerworks/forums/thread.jspa?threadID=370622&tstart=45

  • #14244

    Jevgeni Astanovski
    Участник

    Вот полезно все-таки поговорить с умным человеком.
    Крутилось у меня в мозгах что-то такое. А сейчас когда прочитал — подумал, что если компилировать программу на С с помощью CRTBNDC (как я это делал), то она всегда будет в новой активационной группе (*NEW). А *CALLER можно указать только если компилировать через CRTMOD.
    Попробую. Похоже на истину.

  • #14246

    Sever
    Участник

    Если сишный кусок компилируется как модуль, то CLный имеет смысл аналогично получить в виде модуля CLLE и окончательно собрать программу с помощью CRTPGM. Внешний вызов CALL нужно заменить на CALLPRC.

  • #14247

    Jevgeni Astanovski
    Участник

    1. Когда С-шная программа откомпилирована с активационной группой *CALLER, все работает.
    2. Спасибо!
    3. Мне не интересно компилировать CL и C в один модуль — тут дело было просто в эксперименте, Хотел посмотреть, работает ли (возможен ли) такой подход. Оказалось, что да.
    4. Теперь можно попробовать поэкспериментировать с установками активационной группы в OPNQRYF и OVDBF. Может там можно что-то еще сделать чтоб не обязательно было-бы компилировать С-шную программу в 2 фазы.
    5. Еще раз спасибо.
    :cheer:

  • #14248

    Jevgeni Astanovski
    Участник

    Просто для завершения темы:
    Вот в таком варианте CL-ной программы:
    [code]
    PGM
    OVRDBF FILE(ABC) OVRSCOPE(*JOB) SHARE(*YES)
    OPNQRYF FILE((ABC *FIRST ABCR)) OPTION(*ALL) +
    QRYSLT(‘FIELD1 > »350000»’) +
    KEYFLD(*FILE) OPNSCOPE(*JOB)
    CALL PGM(JOHN/HOWMANY)
    CLOF OPNID(ABC)
    DLTOVR FILE(ABC) LVL(*JOB)
    EXIT: ENDPGM
    [/code]
    все работает корректно также и при однофазном компилировании С-шной программы.
    И это понятно, так как оверрайд имеет скоп джоба…

    Во как красиво по-русски выразился!
    🙂

  • #14249

    _KIRill
    Хранитель

    все работает корректно также и при однофазном компилировании С-шной программы.
    И это понятно, так как оверрайд имеет скоп джоба…

    Потрясающе! В пятницу вечером эта фраза выносит мозг на раз. 🙂
    :blink:

    ---As If, But Not---

Для ответа в этой теме необходимо авторизоваться.