РЕЛАЦИИ В Б4  - релационен пренос между два файла

Синтаксиса на релационната команда е

РЕЛ име(к11,к12,к13,к01,к02,р1,р2 [,код[,рр1,рр2]])
Пренася данни от таблица-източник (посочена от "име")
към таблица-приемник (текущата таблица).
Виж По-подробно описание и Илюстрация

Индексите в скобите определят два участъка:

1. Участък от таблицата-източник (таблицата, посочена с "име")
   - колони к11,к12,к13 -водеща, начална и крайна;
   - редове рр1..рр2 или цялата, ако рр1 и рр2 не са зададени;

2. Участък от таблицата-приемник (текущата таблица)
   - колони к01 и к02 - водеща и начална
   - редове р1 и р2.

-----------------------------------------------------------------------------
код е цяло число - разклонител на действието. 
Ако не е зададен, се подразбира код=0.
Всички релационни кодове (с изключение на контрапроцесора 103) пренасят данни
в посока от източника към приемника.
Следва опис на действията според релационните кодове.
-----------------------------------------------------------------------------

Код=0 : //relCodeFree
(по подразбиране)
- Свободен пренос по еднакви елементи (най-бавен)
  Преносът става при съвпадение на текстовете във водещите колони;

Код=10 : //relCodeMinus
(инверсия - работи инверсно на код 0 -при различни елементи във водещите колони) 

Код=1 : // relCodeRN  {пренос към посочен ред}/: RelToRowNumber
- Най-прост (и най-бърз) пренос по зададен номер-
  водещата колона на източника съдържа номер на ред във
  файла-приемник.

Код=3 : //relCodeToSorted RelToSorted
Код=200 синоним на код 3
- Пренос към сортиран приемник
  Работи по-бързо от свободния (код 0) но очаква таблицата-
  приемник (текущата таблица) да е азбучно сортирана в
  работния участък (р1..р2) по водещата колона к01.

Код=100 : //relCodeAddToSorted
- Вмъкващ пренос към сортиран приемник. /виж по-долу код 102
  Очаква се таблицата- приемник (текущата таблица) да е азбучно сортирана в
  работния участък (р1..р2) по водещата колона к01.
  Предполага се, че в колоните за пренос /к12..к13 и к02... к02+к13-к12
  са записани числа.

  Има две действия:
  Първо-
  При съвпадение на водещ елемент прочетените числа от
  източника - к12..к13 се прибавят почленно към числата
  в колоните на приемника к02... к02+к13-к12.

  Второ -
  Ако търсения елемент от източника не се намира в текущата таблица,
  Той ще бъде вмъкнат на мястото където се полага по азбучен ред.
  
Код=104 : relAFormOnly
- Пресмята дясната страна на счетоводна форма като pozi/nega дс+до-(кс+ко)
  Работят само индексите р1, к02, рр1.
  Пресмята се товар т=рр1 mod 10; (обикновено т=1 или т=2)
  Текущата таблица трябва да има поне к02+2т+2т+2т колони.
  Да означим с к числото в колона к

  За всеки ред в текущата таблица се смята и записва колона к6/к7 като счетоводна форма.
  Числата се форматират до четвърти десетичен знак C:4 където C е ширината на колона к02+1


  при товар 1
   к6=  pozi (к2+к4-(к3+к5))
   к7= -nega (к2+к4-(к3+к5))

  при товар 2 действието е аналогично, но с двойни колони
   к10=  pozi (к2+к6-(к4+к8))
   к11=  pozi (к3+к7-(к5+к9))

   к12= -nega (к2+к6-(к4+к8))
   к13= -nega (к3+к7-(к5+к9))

Код=101:  relAccount
- Натрупва обороти към салдова таблица.
  Това е първата част от производството на цяла счетоводна форма;
  Виж по-долу код 102.

Код=102 : relAccForm //счетоводен процесор

- Построява счетоводна форма по салдо плюс протокол.
  Текущата таблица трябва да е счетоводна салдова таблица.
  Посочената с име таблица трябва да е счетоводен протокол.
  Тази процедура предполага две СЪСЕДНИ водещи колони в източника и една в приемника.
  освен това тя преполага двойна поредица на колоните-приемници в текущия файл
  Всъщност тя е предназначена да прибави числовата колонка
  от счетоводен протокол пряко в таблица на състоянието (за цели-синтетични сметки)
  c1 е колонка за дебит в протокола-източник;
  c1+1            кредит

  пример за единичен товар /от SPRO_0.PRG:
  рел p00(кол_дт,кол_ст,кол_ст,1,4,1,countrr(0),102,3,бп)

  пример за двоен товар /от SPRO_2.PRG:
  рел p01(кол_дт,кол_ко,кол_ст,1,6,1,countrr(0),102,1,бп)

  Всъщност този код е еквивалент на
  последователно повикване на двата кода 101 и 104
  върху същите две таблици.

Код=103 : relAccState{счетоводен статус}/ AccountState //счетоводен контрапроцесор
- Построява пълен счетоводен статус (всички натрупвания с един пас) по салдов описател-задание
  плюс протокол. В действителност тук преносът е на данни е с
  обратна посока - данните се четат от текущата таблица(протокол)
  и се записват в множество таблици-приемници посочени в салдовия комплект (задание).
  Заданието е малка таблица с три колони от следния тип:

  SALDO_C                      ! 0   !
  SALDO_MONO_C                 ! 1   !
  SALDO_DOUBLE_C               ! 2   !
  SALDO_MATER_C                ! 3   !
  SALDO_MIX_C                  ! 4   !
  SALDO_F2_C                   ! 5   !
  4010                         ! 1   ! 12
  453@                         ! _сд ! ддс
  3030                         ! 2   ! 14

  В първата колона е име на салдова таблица или конкретна сметка за специална партида.
  Втората колона съдържа тип сметка или суфикс за специалнo разделяне
  Трета колона съдържа ширина на партида или алтернативен суфикс за специалнo разделяне
  Тъй като става дума за счетоводен формат, сметките, тоест 
  водещите елементи от протокола/статус таблиците са ограничени по ширина до 30 символа.

  Ето пример от BUILD_A_STATE.PRG:
  ........
  MAKE_INITIAL_COMPLECT.PRG (комплект=кт_момент)
  PODGOTVI_ZADANIE.PRG
  : следва пас 103
  база @протокол
  общо_реда countrr(0)
  ако общо_реда>2 то рел ZADANIE(1,4,4,4,10,3,общо_реда,103,3,0)
  : следва превъртане на начания статус в ляво
  FINISH_ALL_STATE.PRG
  ........

Код=110 : relPromoState{ценови статус}/ AddPromoState
  Тази процедура прави слага промоционална добавка към текущия ценоразпис.
  - Очаква само една колона за пренос. 
    Съседните отдясно две колони се използуват за начална и крайна 
    дата на промоцията.
  - Следователно очаква една колона след зададената колона за данни в източника и приемника
  - Очаква в клетка на първи ред в колона c3 да е записана опорна дата.
  - Ако там няма дата, се взема текущата дата.
  - В колони c3 и c3+1 трябва да са записани дати д1 и д2.
  Ако опорната дата е в интервала д1..д2, 
  Първо записва прочетеното от източника в колоната-приемник c3
  Второ записва крайната дата в колона c3+1.

  Пример от FAST_PRICE.PRG:
  .........
  база @изходен
  поле (1,4)=към_дата
  рел @преоценки(3,4,4,1,2,3,countrr(0),100,3,0)
  рел @промоции(3,4,5,1,3,3,countrr(0),110,3,0)
  ........

===================край=====================