2015-09-18 1 views
2

У меня есть три таблицы. usertag и user_tag. Первичный user: iduser + client, номер tag: idtag + client. Теперь я хочу создать внешние ключи для таблицы user_tag для этих двух первичных ключей , не имея при этом клиента дважды.Как создать два сложных внешних ключа в ABAP

Как я могу это сделать? Как это отображается в справке Entry/check (есть только одно происхождение для ввода, и client имеет два происхождения)?

Вот пример:

client|idtag  client|iduser 
------------- ------------- 
    1 | 1   1 | 3 
    1 | 2   1 | 4 
    2 | 1   2 | 3  

Возможные значения для моей новой таблицы:

client|idtag|iduser 
-------------------- 
    1 | 1 | 3 
    1 | 1 | 4  
    1 | 2 | 3 
    1 | 2 | 4 
    2 | 1 | 3  

Теперь в моем CHECKTABLE я хочу проверили мои ключи в этой таблице. Если я не проверять клиента, я бы больше возможностей я не хочу (не согласующиеся):

client|idtag|iduser 
-------------------- 
    2 | 1 | 4  
    2 | 2 | 3 
    2 | 2 | 4 
+0

Не уверен, что я полностью понимаю, что вы имеете в виду, но клиент имеет только одно происхождение, которое является текущим клиентом, и ваша программа выполняется, поэтому нет необходимости иметь его дважды. Это не поле, которое вы обычно устанавливаете вручную. – andreas

+0

@andreas, так что я ничего не избегаю, чтобы добавить ключ, недоступный под конкретным клиентом? – inetphantom

+0

Почему вы не хотите иметь клиента в двух внешних ключах в первом месте? Он используется для обеспечения ссылочной целостности в среде с несколькими клиентами. – vwegert

ответ

1

Просто думать о CLIENT (или MANDT), как о чем-то, что подразумевается и как она не существует и просто укажите свой внешний ключ как IDTAG, IDUSER, как если бы вы делали это для базы данных, такой как MySQL или Postgres.

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

+0

Итак, среда проверяет, что у меня нет таких случаев, как показано в моем добавленном примере, и я могу просто игнорировать его? – inetphantom

+0

Я не уверен, но вы имеете в виду под «проверкой окружения».В SAP, даже если вы определяете контрольную таблицу, внешние ключи в любом случае не распространяются на базу данных. Поэтому, если в клиенте 1 вы делаете следующую вставку 'DATA: ls_rel TYPE zrel. zrel-idtag = 1. zrel-iduser = 5. INSERT zrel FROM ls_rel.', где пользователь с номером 5 не существует в таблице пользователя, вы вообще не получите никакого исключения, и запись будет вставлена ​​в базу данных в любом случае и это не имеет никакого отношения к клиенту в таком случае. Попробуйте это! Вы должны сами следить за проверкой соответствия на уровне сервера приложений. – Jagger

1

Просто, чтобы объяснить это с другой точки зрения: при входе в SAP ваш логин зависит от клиента.

Когда вы пишете отборное как

SELECT * FROM USER. 
... 
ENDSELECT. 

вы получите только записи с фактическим клиентом. Система ограничивает выделение явным на фактическом клиенте.

Если вы хотите независимый от клиента выбор, вы должны использовать добавление CLIENT SPECIFIC в свой оператор select.

Другими словами: при нормальных обстоятельствах нет никакой смеси данных от разных клиентов. Таким образом, также нет проблем, если ваш user_tag имеет только один клиентский ключ.

Смежные вопросы