Невозможно обновить файл После SQL вставьте SQLRPGLE - PullRequest
0 голосов
/ 24 октября 2018

Good Day all,

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

Проблема заключается в том, что после запуска вставки каждый раз, когда я пытаюсь обновить файл, я получаю сообщение об ошибке записи или файла в использовании.

Я пробовал обновлять его программно с помощью sqlrpgle и с функциями чтения и установки ввода / вывода, и я даже пытался просто обновить файл в STRSQL после запуска программы, и все я сталкиваюсь с одной и той же ошибкой.

Я подозреваю, что не закрываю что-то правильно, но я не уверен, что.

Код выглядит следующим образом:

// Assign SQL Query

    sqlstmt = 'insert into jallib/orhsrpt ('+
              'oacctd, oacmp, oaord, oacust, o8type, ' +
              'o8text, o8date, o8time ) ' +
              'select oacctd, oacmp, oaord, oacust, ' +
              'o8type, o8text, o8date, o8time ' +
              'from r50files.vcohead ' +
              'join r50files.vcopkct ' +
              'on oacmp = o8cmp and oaord = o8ord ' +
              'where oacmp = 1 ' +
              'and o8type not in (' +
              '''C'',''a'',''H'',''E'',''F'', '+
              '''A'',''1'',''N'',''M'') ' +
              'and oacctd = ' + curdate +
              ' order by oaord, o8time ';

    // Prepare for multiple sql statements 

    exec sql
        Set Option Commit = *NONE; 

    // Clear output file before executing SQL

    exec sql
        Delete from jallib/orhsrpt;

    if sqlcode < *zeros; 
        errmsg = 'Delete of file failed'; 
    endif; 

    // Execute SQL Insert statement

    exec sql prepare sqlsel from :sqlstmt;
    exec sql execute sqlsel;

    if sqlcode < *zeros; 
        errmsg = 'Insert of file failed'; 
    endif;

    // Update file data

    exec sql
        Set Option clossqlcsr = *ENDMOD; 

    exec sql  
        Update jallib/orhsrpt 
        set o8text = 'Order Invoiced' 
        where o8type = 'I' 

Ошибка STRSQL заключается в следующем

Строка или объект ORHSRPT в типе JALLIB * Используемый файл.

1 Ответ

0 голосов
/ 24 октября 2018

Быстрый ответ: вставка не закрыта, потому что ваш модуль не завершился в соответствии с Set Option, который вы указали.Тем не менее, правильный ответ здесь заключается в том, что у вас нет причин использовать динамические операторы SQL вообще.Они медленнее и чаще подвержены ошибкам, и вы сталкиваетесь с такими проблемами, как эта.Вместо этого вам следует использовать обычный встроенный оператор SQL, как показано ниже:

exec sql
    set option commit = *NONE; 

// Clear output file before executing SQL

exec sql
    delete from jallib/orhsrpt;

if sqlstate <> *zeros; 
    errmsg = 'Delete of file failed'; 
endif; 

exec sql
    insert into jallib/orhsrpt (
        oacctd, oacmp, oaord, oacust,
        o8type, o8text, o8date, o8time )
    select oacctd, oacmp, oaord, oacust, o8type,
           o8text, o8date, o8time
    from r50files.vcohead join r50files.vcopkct
        on oacmp = o8cmp and oaord = o8ord
    where oacmp = 1 and o8type not in (
              'C','a','H','E','F', 'A','1','N','M') and
          oacctd = :curdate
    order by oaord, o8time;

exec sql  
    update jallib/orhsrpt 
    set o8text = 'Order Invoiced' 
    where o8type = 'I' 

Это лучшая практика, и она должна решить вашу проблему.

...