Строка вставки базы данных прогресса OpenEdge - новичок

мне нужно вставить новые строки в мою базу данных.

    OUTPUT TO c:\temp\SMLeiste_bearbeiten.csv.
DEFINE VARIABLE size AS CHARACTER NO-UNDO FORMAT "x(3)"
  LABEL "Size".
for each S_Artikel
where S_Artikel.Selektion matches "KSE*"
or S_Artikel.Selektion matches "ZSE*"
or S_Artikel.Selektion matches "SSE*",
EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
     AND BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
  EXCLUSIVE-LOCK.

 ASSIGN BS_Zuord.Merkmal = "Größe".

 PUT UNFORMATTED
   'First Loop - set row with Merkmal "Größe"' + '|' + STRING(BS_Zuord.Owning_Obj) + '|' + String(S_Artikel.S_Artikel_Obj)
SKIP.
END.

Итак, проблема в том, что я не знаю, как добавить строку с размером, не просматривая каждый элемент из "BS_Zuord"

один объект S_Artikel имеет несколько объектов BS_Zuord

Я просто хочу запросить, какой S_Artikel соответствует моим критериям, а затем добавить BS_Zuord с равным Owning_Obj = S_Artikel_Obj

Я думаю, мне, возможно, придется присоединиться к столам или что-то в этом роде, но я понятия не имею, как это сделать в процессе

Заранее спасибо!

редактировать:

Мне нужно заменить

EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
     AND BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
  EXCLUSIVE-LOCK.

 ASSIGN BS_Zuord.Property = "Size".

с участием

CREATE BS_Zuord.
BS_Zuord.OwningObj = S_Artikel_Obj.
ASSIGN BS_Zuord.Property = "Size".

**

Новейшая версия полного кода

**

    OUTPUT TO c:\temp\SMLeiste_bearbeiten.csv.
DEFINE VARIABLE groesse AS CHARACTER NO-UNDO FORMAT "x(7)"
  LABEL "Groesse".
for each S_Artikel
where S_Artikel.Selektion matches "KSE*"
or S_Artikel.Selektion matches "ZSE*"
or S_Artikel.Selektion matches "SSE*",

EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
     AND BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
  EXCLUSIVE-LOCK.

 ASSIGN BS_Zuord.Merkmal = "Size". 

 PUT UNFORMATTED
   'Erste Schleife - Größe anlegen' + '|' + STRING(BS_Zuord.Owning_Obj) + '|' + String(S_Artikel.S_Artikel_Obj)
SKIP.
END.


for each S_Artikel
where S_Artikel.Selektion matches "KSE*"
or S_Artikel.Selektion matches "ZSE*"
or S_Artikel.Selektion matches "SSE*",
EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
     AND BS_Zuord.Merkmal = "Größe"
     AND BS_Zuord.Owning_Obj = S_Artikel_Obj 
  EXCLUSIVE-LOCK.
    IF SUBSTRING(STRING(S_Artikel.Selektion),8,1) = "/" THEN groesse = SUBSTRING(STRING(S_Artikel.Selektion),5,7).
        ELSE groesse = SUBSTRING(STRING(S_Artikel.Selektion),5,3).

    BS_Zuord.Auspr = groesse.

        PUT UNFORMATTED 
        'Zweite Schleife - Größe ausfüllen' + '|' + string(S_Artikel.Artikel) + '|' + string(S_Artikel.Selektion) + '|' + STRING(groesse) + '|' + STRING(BS_Zuord.SMLeiste) + '|' + STRING (BS_Zuord.Merkmal) + '|' + STRING(BS_Zuord.Auspr)
        SKIP.    
END.

Если я заменю ту часть, где написано

,
EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
     AND BS_Zuord.Merkmal = "Größe"
     AND BS_Zuord.Owning_Obj = S_Artikel_Obj 
  EXCLUSIVE-LOCK.
    IF SUBSTRING(STRING(S_Artikel.Selektion),8,1) = "/" THEN groesse = SUBSTRING(STRING(S_Artikel.Selektion),5,7).
        ELSE groesse = SUBSTRING(STRING(S_Artikel.Selektion),5,3).

    BS_Zuord.Auspr = groesse.

с твоим

/ * находим соответствующий BS_Zuord, если он существует * /

exclusive-lock.
  find BS_Zuord where BS_Zuord.SMLeiste = "SE" and BS_Zuord.Owning_Obj =      S_Artikel.S_Artikel_Obj no-error.

  /* if it does not already exist create it and initialize the key */
  if not available BS_Zuord then   
    do:
      create BS_Zuord.
      assign
        BS_Zuord.SMLeiste = "SE"
        BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
      .
    end.
  /* set the property field */
  BS_Zuord.Property = "Size".

и прокомментируйте вторую для каждого выхода

появится это сообщение: В нем написано "для свойства (в моем случае Merkmal)" Größe "нет" Ausprägung "(это фактическое значение свойства" Merkmal ". Значение '' недопустимо. http://i.stack.imgur.com/FDL4S.png

Итак, 1 S_Artikel имеет несколько BS_Zuord с разными "Merkmal". Каждый «Меркмал» имеет несколько ценностей.

Если я запускаю рабочий код, он запускается для каждого раза S_Artikel x-Merkmal и говорит, что если, например, S_Artikel имеет 6 «Merkmal», он создает правильный «Merkmal» со ​​значением «Größe», а затем пытается в 5 раз больше создать его, но он говорит, что он существует. Затем второй для каждого авто создает значения, которые будут заполнены в BS_Zuord.Auspr.

Надеюсь, вы поняли, что я пытаюсь вам сказать. Английский не мой родной язык :(


person Guardian    schedule 16.06.2015    source источник


Ответы (2)


Я думаю, это то, что вы пытаетесь сделать:

/* loop through S_Artikel records matching criteria */

for each S_Artikel no-lock where
   where S_Artikel.Selektion matches "KSE*"
      or S_Artikel.Selektion matches "ZSE*"
      or S_Artikel.Selektion matches "SSE*":

  /* find the appropriate BS_Zuord if it exists */

  find BS_Zuord exclusive-lock where BS_Zuord.SMLeiste = "SE" and BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj no-error.

  /* if it does not already exist create it and initialize the key */

  if not available BS_Zuord then   
    do:
      create BS_Zuord.
      assign
        BS_Zuord.SMLeiste = "SE"
        BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
      .
    end.

  /* set the property field */

  BS_Zuord.Property = "Size".

end.  /* end of loop */

(Предполагается, что BS_Zuord.SMLeiste и BS_Zuord.Owning_Obj образуют уникальный ключ.)

person Tom Bascom    schedule 16.06.2015
comment
Я думаю, что это поможет, но я все время говорю, что для параметра «Размер свойства» нет значения. Если я попытаюсь добавить значение параметра с помощью BS_Zuord.Auspr = 400, например, он все равно будет говорить мне, что его не существует. Я уже пытался создать его через графический интерфейс, и это сработало. Я могу изменить значение BS_Zuord.Auspr на BS_Zuord.Auspr = 400. для уже существующей записи. Любые идеи? - person Guardian; 18.06.2015
comment
Какое точное сообщение об ошибке? Покажите полный текст .. Я подозреваю, что у вас нет поля под названием BS_Zuord.property. Судя по вашему комментарию, возможно, у вас есть один под названием BS_Zuord.size, и вам действительно нужно кодировать BS_Zuord.size = 400. но я не могу сказать из имеющейся в настоящее время информации. - person Tom Bascom; 18.06.2015
comment
Я перевел на английский. Таблица - это BS_Zuord. Поля - Owning_Object, SMLeiste и Merkmal (которые я перевел в размер). Owning_Object и SMLeiste образуют уникальный ключ для идентификации одной строки. Я редактирую свой исходный пост, чтобы добавить свой код в том виде, в котором он есть сейчас. - person Guardian; 19.06.2015
comment
Это сообщение означает, что присваиваемое вами значение недействительно. Вероятно, он создается триггером базы данных, который proAlpha определил для этой таблицы. - person Tom Bascom; 19.06.2015
comment
Большое тебе спасибо! Они не скажут мне, как это вызвать. Итак, я собираюсь использовать свой первый код. Это создает некоторые накладные расходы, но работает в тестовой БД. - person Guardian; 22.06.2015

Точно. Удалить

EACH BS_Zuord
     where BS_Zuord.SMLeiste = "SE"
       AND BS_Zuord.Owning_Obj = S_Artikel.S_Artikel_Obj
     EXCLUSIVE-LOCK.
ASSIGN BS_Zuord.Property = "Size". 

поскольку это изменит значение ВСЕХ записей BS_Zuord, которые соответствуют критериям цикла. Кроме того, второй КАЖДЫЙ будет циклически повторять записи, которые у вас уже есть. Поскольку вы хотите создать новый, CREATE и ASSIGN, которые вы опубликовали последними, должны помочь. Если первичный ключ и обязательные поля в таблице указаны соответственно, но при условии, что вам просто нужен pk из вашего кода, этот код, который вы предоставили, похоже, делает то, что вы хотите, в соответствии с вашим объяснением.

person bupereira    schedule 16.06.2015
comment
Я думаю, что это поможет, но я все время говорю, что для параметра «Размер свойства» нет значения. Если я попытаюсь добавить значение параметра с помощью BS_Zuord.Auspr = 400, например, он все равно будет говорить мне, что его не существует. Я уже пытался создать его через графический интерфейс, и это сработало. Я могу изменить значение BS_Zuord.Auspr на BS_Zuord.Auspr = 400. для уже существующей записи. Любые идеи? - person Guardian; 18.06.2015