Я новичок в Progress 4gl. Я хочу получить данные двух таблиц в одной таблице, используя временные критерии. У меня есть две таблицы ih_hist и sod1_det, я хочу добиться 2,2 столбца из каждой таблицы. Из столбцов ih_hist, которые мне нужны, это ih_nbr и ih_inv_nbr, а из столбцов sod1_det — sod1_nbr и sod1_shipfrom_ctry. Пожалуйста, помогите мне. заранее спасибо
Как связать две таблицы, используя текущую временную таблицу
Ответы (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: