Как связать две таблицы, используя текущую временную таблицу

Я новичок в Progress 4gl. Я хочу получить данные двух таблиц в одной таблице, используя временные критерии. У меня есть две таблицы ih_hist и sod1_det, я хочу добиться 2,2 столбца из каждой таблицы. Из столбцов ih_hist, которые мне нужны, это ih_nbr и ih_inv_nbr, а из столбцов sod1_det — sod1_nbr и sod1_shipfrom_ctry. Пожалуйста, помогите мне. заранее спасибо


person Riyaz    schedule 25.11.2015    source источник
comment
я могу создать временную таблицу только из 1 существующей таблицы, но как связать 2 таблицы вместе?   -  person Riyaz    schedule 25.11.2015
comment
Опубликуйте свои определения временной таблицы!   -  person Jensd    schedule 25.11.2015


Ответы (1)


Поскольку вы не публикуете никакой информации о своих временных таблицах, я предполагаю, что они связаны друг с другом полем с именем «id». Я также предполагаю, что ih_hist является «главной» таблицей, а sod1_det содержит подробности. Это вполне может быть ошибкой — вам нужно сообщить нам больше о ваших данных!

Есть несколько частей, которые вам нужно сделать правильно: прежде всего, объединение двух временных таблиц. Это сильно зависит от ваших определений временной таблицы, содержания временной таблицы и того, что вы действительно хотите. Есть ли у вас отношение «один ко многим», «один к одному» или, возможно, даже «многие ко многим»? Основано ли отношение на одном поле (внешнем ключе) или на множестве разных полей? Временные таблицы (как и фактические поля в базе данных Progress) не содержат отношение — отношение обрабатывается кодом!

Это базовый пример, который может помочь вам начать работу!

DEFINE TEMP-TABLE ih_hist NO-UNDO
    FIELD id         AS INTEGER
    FIELD ih_nbr     AS INTEGER
    FIELD ih_inv_nbr AS INTEGER.

DEFINE TEMP-TABLE sod1_det NO-UNDO
    FIELD id                 AS INTEGER
    FIELD sod1_nbr           AS INTEGER
    FIELD sod1_shipfrom_ctry AS CHARACTER.

DEFINE TEMP-TABLE ttNewTempTable NO-UNDO
    FIELD ih_nbr     AS INTEGER
    FIELD ih_inv_nbr AS INTEGER
    FIELD sod1_nbr           AS INTEGER
    FIELD sod1_shipfrom_ctry AS CHARACTER.

FOR EACH ih_hist, EACH sod1_det WHERE sod1_det.id = ih_hist.id:
    CREATE ttNewTempTable.
    BUFFER-COPY ih_hist TO ttNewTempTable.
    BUFFER-COPY sod1_det TO ttNewTempTable.
END. 

Я могу использовать BUFFER-COPY, потому что имена полей совпадают в исходной и целевой временных таблицах и не перекрываются (т. е. ни одно имя в id_hist не соответствует полю в sod1_det, но содержит разные данные — например, поле имени в обеих). В противном случае вы также можете выполнить ASSIGN или комбинацию BUFFER-COPY и ASSIGN.

Пример только с ASSIGN:

FOR EACH ih_hist, EACH sod1_det WHERE sod1_det.id = ih_hist.id:
    CREATE ttNewTempTable.
    ASSIGN 
      ttNewTempTable.ih_nbr             = ih_hist.ih_nbr
      ttNewTempTable.ih_inv_nbr         = ih_hist.ih_inv_nbr
      ttNewTempTable.sod1_nbr           = sod1_det.sod1_nbr
      ttNewTempTable.sod1_shipfrom_ctry = sod1_det.sod1_shipfrom_ctry.
END. 

Пример с ASSIGN и BUFFER-COPY:

FOR EACH ih_hist, EACH sod1_det WHERE sod1_det.id = ih_hist.id:
    CREATE ttNewTempTable.
    BUFFER-COPY ih_hist TO ttNewTempTable
        ASSIGN 
           ttNewTempTable.sod1_nbr           = sod1_det.sod1_nbr
           ttNewTempTable.sod1_shipfrom_ctry = sod1_det.sod1_shipfrom_ctry.
END. 

Судя по вашему комментарию, предложение WHERE должно выглядеть примерно так:

FOR EACH ih_hist, EACH sod1_det WHERE sod1_det.sod1_nbr = ih_hist.ih_nbr:
person Jensd    schedule 25.11.2015
comment
спасибо за ваше решение. Я забыл вам сказать, что ih_nbr и sod1_nbr — это поля, через которые должны быть связаны обе таблицы. - person Riyaz; 26.11.2015
comment
Обновлен ответ, чтобы отразить ваш комментарий об именах полей. - person Jensd; 26.11.2015
comment
Вы правы, проблема была в домене, я успешно решил ее. Спасибо за поддержку :-) - person Riyaz; 26.11.2015