Informix 4GL, как печатать?

У меня есть столбец (chgkey) с 17 строками записи. Как я могу напечатать первые 3 записи в одной строке (например, raw1, raw2, raw3). Теперь я могу без проблем распечатать raw1. Любая помощь будет оценена по достоинству. ниже мой код.

    let rpt.chgkey =  null
      select * into z_charge.* from charge where charnum in
          (select shtwrd_no from crbookid where
               crbookid.book_no = rpt.book_no and crbookid.line_no = rpt.line_no )

    let scratch = z_charge.chgkey
    let rpt.chgkey = scratch
         call make_charge_section(scratch) returning rpt.chgkey
    print
        column   1, ESC, "(s0p12h0s3b4099T", ESC, "&a0.5R"
    print
    print  ESC,"&a15.1R", ESC,"&a15C", rpt.chgkey

person MJJ3    schedule 31.08.2012    source источник
comment
Вы должны быть яснее в том, что у вас есть. Неясно, есть ли у вас 3 столбца в таблице charge с именами raw1, raw2 и raw3, или у вас есть один столбец raw, и вы хотите распечатать информацию из записей 1, 2 и 3 в строке 1, а затем информацию из записей 4. , 5, 6 в строке 2 и так далее. Я предполагаю последнее в своем ответе. Вы так и не объяснили свои иероглифы управляющего кода.   -  person Jonathan Leffler    schedule 31.08.2012


Ответы (2)


Если инструкция SELECT (теперь с предложением INTO) возвращает более одной строки, вы получите ошибку времени выполнения, если только не завернете ее в цикл FOREACH.

Если у вас есть цикл FOREACH внутри функции REPORT, то с ним довольно легко справиться; если данные предоставляются через отдельные операторы OUTPUT TO REPORT, это сложнее.

Предполагая, что жизнь проста, тогда:

DECLARE c CURSOR FOR
    SELECT * INTO z_charge.*
      FROM charge
     WHERE charnum IN
           (SELECT shtwrd_no FROM crbookid
            WHERE crbookid.book_no = rpt.book_no AND crbookid.line_no = rpt.line_no
           )

LET i = 0
FOREACH c
    PRINT COLUMN (i * 20 + 1), z_charge.raw;
    LET i = i + 1
    IF i MOD 3 = 0 THEN PRINT END IF
END FOREACH
IF i MOD 3 != 0 THEN PRINT END IF

Цикл печатает значение в z_charge.raw в соответствующем столбце (вы можете выполнять вычисления с такими номерами столбцов). Конечно, это предполагает, что необработанные данные умещаются в пределах 20 символов.


DECLARE c CURSOR FOR
    SQL
    SELECT FIRST 3 * INTO z_charge.*
      FROM charge
     WHERE charnum IN
           (SELECT shtwrd_no FROM crbookid
            WHERE crbookid.book_no = rpt.book_no AND crbookid.line_no = rpt.line_no
           )
    END SQL
person Jonathan Leffler    schedule 31.08.2012
comment
Извините, не три строки, я имею в виду, что у меня есть один столбец в таблице с 17 строками записей, из этой записи мне нужны только первые 3 записи для печати. - person MJJ3; 31.08.2012
comment
ВЫБЕРИТЕ ПЕРВЫЕ 3... ЗАКАЗАТЬ ПО...? Единственная хитрость заключается в том, что в I4GL вам нужно будет написать этот SELECT в блоке SQL ... END SQL. - person Jonathan Leffler; 01.09.2012

Используйте точку с запятой в конце оператора печати, чтобы скрыть символ конца строки.

Однако если вы завершаете оператор PRINT точкой с запятой, вы подавляете неявный символ LINEFEED в конце строки.

ПЕЧАТЬ

person James Allman    schedule 31.08.2012