cro-logo      
Добро пожаловать, Гость. Пожалуйста, выберите Вход или Регистрация

 
 
  ГлавнаяСправкаПоискВходРегистрация  
 
Переключение на Главную Страницу Страниц: 1
Послать Тему Печать
Что не так в формуле? (Прочитано 364 раз)
Пытливый
Профи
****
Вне Форума



Сообщений: 210
Что не так в формуле?
16.05.2018 :: 01:35:56
 
Создает новую запись, заполняет СВ1 правильным значением и собственно все, далее уходит в бесконечный цикл. Почему не идет присвоение в СВ2_ЛИ ? Почему не удаляется из списка последнее значение? Где-то я туплю, но не пойму где Улыбка
Код:
if ValCount(СВ2_ЛИ) > 2
then (@LinkID := СВ1;
        @MasterID := СВ2_ЛИ(1);
	while ValCount(СВ2_ЛИ) > 2
	do (@SlaveID := СВ2_ЛИ(ValCount(СВ2_ЛИ))
	      AddRecord(СВ{0}, СВ1 := @LinkID; СВ2_ЛИ := @MasterID << @VALUESEPARATOR << @SlaveID)
	     СВ2_ЛИ := DeleteVal(СВ2_ЛИ, ValCount(СВ2_ЛИ))
       )
		)	 


Несколько улучшает ситуацию введение промежуточного массива, куда помещаю записи связанного поля. Цикл отрабатывает, но СВ2_ЛИ все равно не заполняется.
Код:
@AItems := СВ2_ЛИ
if ValCount(@AItems) > 2
then (@LinkID := СВ1;
         @MasterID := @AItems(1);
	 while ValCount(@AItems) > 2
	 do (@SlaveID := @AItems(ValCount(@AItems))
	       AddRecord(СВ{0}, СВ1 := @LinkID; СВ2_ЛИ := @MasterID << @VALUESEPARATOR << @SlaveID)
	      @AItems := DeleteVal(@AItems, ValCount(@AItems))
	      )
         СВ2_ЛИ := @AItems
) 


Наверх
 
 
IP записан
 
Leo
Бета-тестер
Вне Форума


Мое поколение...

Сообщений: 1 537
Калуга
Re: Что не так в формуле?
Ответ #1 - 16.05.2018 :: 12:22:11
 
Существует ряд ограничений по работе с полями связи.
Попробуйте объяснить свою задачу, чтобы понять куда мы идет.
Разберем Ваши ошибки:

- как рекомендация : используйте переменные, а не значения полей, с ними легче и проще проводить операции. (@col:=ValCount(СВ2_ЛИ))

- со сложными полями так поступать нельзя : СВ2_ЛИ := DeleteVal(СВ2_ЛИ, ValCount(СВ2_ЛИ))
ЛЦ202_РТ(155):= 0; /* разорвать связь с записью базы РТ с системным номером 155 */
Аналогично идентификатору простого поля, идентификатор связи сложного поля может содержать системный номер записи корневой базы, заключенный в фигурные скобки:

<Мнемокод_корневой_базы><Номер_поля>_<Мнемокод_связанной_базы> { <Системный_номер> }

Фактически значением идентификатора связи является массив всех системных номеров записей базы с мнемокодом <Мнемокод_связанной_базы>, связанных с записью корневой базы по заданному сложному полю.

Однако правила работы с динамическими массивами применимы к идентификатору связи только в том случае, если в выражении он стоит справа от оператора присваивания (т.е. выполняется чтение соответствующего значения сложного поля).

Например:

@A := ДК02_ЛЦ; /* переменной @A присвоены значения всех системных номеров записей базы ЛЦ, связанных с текущей записью базы ДК по полю №2 */

@B := ДК02_ЛЦ(1); /* переменной @B присвоено значение системного номера 2-й записи базы ЛЦ из числа связанных с текущей записью базы ДК по полю №2 */

Слева от оператора присваивания идентификатор связи может использоваться только в специальных выражениях, предназначенных для создания или разрыва связи между записями. Эти выражения имеют вид, внешне схожий с обычными операциями присваивания:

<Идентификатор_связи> := <Системный_номер>

и

<Идентификатор_связи> (<Системный_номер>) := 0

Первое выражение создает связь с одной или несколькими записями, системные номера которых заданы операндом <Системный_номер>. При этом все ранее установленные связи сохраняются.

Например:

ДК02_ЛЦ := 123; /* запись базы ЛЦ с системным номером 123 связана с текущей записью базы ДК по полю №2 этой базы*/

ДК02_ЛЦ := 456; /* с текущей записью базы ДК связана еще одна запись базы ЛЦ – с системным номером 456 */

// ДК02_ЛЦ (3):= 789 /* это НЕВЕРНОЕ выражение ! Связь с записью базы ЛЦ с системным номером 789 установлена не будет! */

@A := ДК02_ЛЦ; /* переменной @A присвоен массив из двух значений: 123 и 456 */

Второе выражение разрывает связи с записями, системные номера которых заданы операндом <Системный_номер>. Внешне запись операнда в левой части выражения напоминает обращение к элементу динамического массива, но вместо индекса (порядкового номера) элемента указывается системный номер записи, с которой должна быть разорвана связь.

Например:

ДК02_ЛЦ(456) := 0; /* разорвать связь с записью базы ЛЦ с системным номером 456 */

// ДК02_ЛЦ(-1) := 0; /* это НЕВЕРНОЕ выражение ! В данном случае с идентификатором связи нельзя работать как с динамическим массивом! */

@A := ДК02_ЛЦ; ДК02_ЛЦ(@A) := 0 /* разорвать связь со всеми записями базы ЛЦ, связанными с текущей записью базы ДК по полю №2 */


Работающий код, исходя из того, что я понял
@col:=ValCount(ДТ3_ЛЦ)

if (@col > 2)
then (@LinkID := ДТ4;
           @MasterID := ДТ3_ЛЦ(1);
           while @col > 2
                 do (@SlaveID := ДТ3_ЛЦ(@col);                  
           @sn:=AddRecord(ДТ{0},ДТ4:=@LinkID);
           USERECORD ( ДТ{@sn}, ДТ4:=@LinkID;
                                   ДТ3_ЛЦ := @MasterID<< @VALUESEPARATOR << @SlaveID
                              )

           ДТ3_ЛЦ(@SlaveID) :=0
         @col:=@col-1;      
              )
     ) 

Необходимо сначала записать новую запись, а затем добавлять значения в поля связи. Текстовое поле можно не перезаписывать, я в результате отладки оставил.
Наверх
 

Леонтьев Ю. Ю.
 
IP записан
 
Пытливый
Профи
****
Вне Форума



Сообщений: 210
Re: Что не так в формуле?
Ответ #2 - 16.05.2018 :: 14:00:39
 
Спасибо за очень полезную информацию. Помогло, но я несколько в непонятках почему не получается ограничится вызовом AddRecord? Почему надо еще и UseRecord использовать? Ведь согласно описания функции AddRecord все то, что я делаю в UseRecord, должно так-же выполнятся и в AddRecord, а по факту этого не происходит. Баг?

ПС: И еще вопрос в догонку. Я для упрощения работы с множественным полем загоняю его в переменную:
@AItems := СВ2_ЛИ
далее провожу некие операции с этой переменной, например такие:
@AItems := DeleteVal(@AItems, ValCount(@AItems))
и на последнем шаге пытаюсь загнать обратно измененное значение в множественное поле:
СВ2_ЛИ := @AItems
и это не работает.
А если я сделаю для последнего шага вот этак:
UseRecord(СВ2{@sn}, СВ2_ЛИ := @AItems)
Уже сработает?
Наверх
 
 
IP записан
 
Leo
Бета-тестер
Вне Форума


Мое поколение...

Сообщений: 1 537
Калуга
Re: Что не так в формуле?
Ответ #3 - 16.05.2018 :: 15:55:25
 
Пробуйте и истина Вас настигнет.  Подмигивание
Мне кажется, запись должна сохраниться, а потом можно со сложными полями оперировать. Наверное есть какие то ограничения.
Наверх
 

Леонтьев Ю. Ю.
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 352
Санкт-Петербург
Re: Что не так в формуле?
Ответ #4 - 16.05.2018 :: 22:43:15
 
Цитата:
... почему не получается ограничится вызовом AddRecord? Почему надо еще и UseRecord использовать?

Связи можно устанавливать только между существующими записями. AddRecord оперирует с простыми полями. Т.е. создает и сохраняет запись с заполненными значениями простых полей. Связи заполнить, пока запись не сохранена, нельзя.  Поэтому нужно после использования AddRecord для установления связей использовать UseRecord или другие способы.
Можно привести аналогию с листом бумаги, на котором Вы записали какие то данные. А чтобы эти данные связать с другими требуется вшить листок в книгу и только тогда в ней установить ссылки на другие страницы.
Наверх
 
 
IP записан
 
Пытливый
Профи
****
Вне Форума



Сообщений: 210
Re: Что не так в формуле?
Ответ #5 - 16.05.2018 :: 23:20:24
 
Теперь понятно, почему я не смог найти ни одного примера использования сложных полей в AddRecord()
Но вообще это как-то неправильно. Если читать документацию по этой функции, с примером:
Цитата:
@sn := ADDRECORD( ЛЦ{0}, ЛЦ1:="Иванов"; ЛЦ2:="Иван"; ЛЦ3:="Иванович" );
Этот код выполняет те же действия, что и приведенный ниже:
@sn := new ( ББ10_ЛЦ ); /* создать новую запись базы ЛЦ */
USERECORD ( ЛЦ{@sn}, ЛЦ1:="Иванов"; ЛЦ2:="Иван"; ЛЦ3:="Иванович"); /* записать значения в поля созданной записи */

то вывод получается однозначный  - AddRecord заменяет две функций New() и UseRecord(). А оно вон че оказывается  Печаль
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 2 352
Санкт-Петербург
Re: Что не так в формуле?
Ответ #6 - 17.05.2018 :: 00:18:24
 
Дело в том, что ранее AddRecord не было. Создавать можно было только связанные с существующей записью через функцию New и работать с ней через UseRecord. Потом функционал расширился и упростился, о чем и было сказано, но не учтены ограничения на работу со связанными записями.
Наверх
 
 
IP записан
 
Переключение на Главную Страницу Страниц: 1
Послать Тему Печать