LsFusion рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛

рдЫрд╡рд┐

рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдЕрдХреНрд╕рд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдПрдХ рд╢реНрд░реЗрдгреАрдмрджреНрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдореВрд╣реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рд╕рдореВрд╣ рдЧрддрд┐рд╢реАрд▓ рдЧрд╣рд░рд╛рдИ рдХрд╛ рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рддрдм рдиреЗрд╡рд┐рдЧреЗрд╢рди, рдбреЗрдЯрд╛ рдПрдХрддреНрд░реАрдХрд░рдг рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЦреБрд▓реЗ рдФрд░ рдореБрдХреНрдд lsFusion рдордВрдЪ рдореЗрдВ рдЗрд╕ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рддрд░реНрдХ рд▓реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рдЧрд╣рд░рд╛рдИ рдХрд╛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдорд╛рди рдХреЛ рдкреЗрдбрд╝ рдХреЗ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдиреЛрдб рд╕реЗ рдмрд╛рдВрдзрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рдирдХ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЙрддреНрдкрд╛рдж рд╕рдореВрд╣ рдЗрдХрд╛рдИ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлреНрд▓реИрдЯ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдкрд╛рджрди рдкреНрд░рдкрддреНрд░ рдФрд░ рдПрдХ рд╕реВрдЪреА рд╣реЛ:
CLASS Group '' ;
name '' = DATA ISTRING [ 50 ] (Group);

FORM group ''
OBJECTS g = Group PANEL
PROPERTIES (g) name

EDIT Group OBJECT g
;

FORM groups ''
OBJECTS g = Group
PROPERTIES (g) READONLY name
PROPERTIES (g) NEWSESSION NEW , EDIT , DELETE

LIST Group OBJECT g
;

NAVIGATOR {
NEW groups;
}

рдЕрдм рд╕рдореВрд╣ рд╕реЗ рдмрд╛рд╣рд░ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рд╕рдореВрд╣ рдХрд╛ рд▓рд┐рдВрдХ рд╣реЛрдЧрд╛:
parent = DATA Group (Group);
nameParent ' ' (Group g) = name(parent(g));

рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рджреЛ рд╕рдореВрд╣реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЛ рдкреБрди: рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛:
level '' (Group child, Group parent) =
RECURSION 1l IF child IS Group AND parent = child
STEP 2l IF parent = parent($parent) MATERIALIZED ;

RECURSION рдСрдкрд░реЗрдЯрд░ рдХрд┐рд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ , рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╕реНрддрд░ рдХреА рд╕рдВрдкрддреНрддрд┐ 2 "рд╕рдВрдмрдВрдзрд┐рдд рдмрдЪреНрдЪреЗ рдХреЗ рдкреЗрдбрд╝ рдореЗрдВ рдмрдЪреНрдЪреЗ рдФрд░ рдорд╛рддрд╛ - рдкрд┐рддрд╛ рдХреЗ рдмреАрдЪ рдкрде рдХреА рд▓рдВрдмрд╛рдИ" рдХреА рдбрд┐рдЧреНрд░реА рддрдХ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред MATERIALIZED рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдЬреБрдбрд╝реЗ рдиреЛрдбреНрд╕ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓рдо рдореЗрдВ рд╕реНрддрд░ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрдЧрд╛ред рдкреЗрдбрд╝ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде, рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рдЬреБрдбрд╝ рдЬрд╛рдПрдЧреАред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП:

рдЫрд╡рд┐

рддрд╛рд▓рд┐рдХрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

рдЫрд╡рд┐

рдЗрд╕рдореЗрдВ, Key0 рд╡рдВрд╢рдЬ рдХреЛрдб рд╣реИ, рдФрд░ Key1 рдкреЗрд░реЗрдВрдЯ рдХреЛрдб рд╣реИред рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреЗрдбрд╝ рдХреА рдФрд╕рдд рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рдореВрд╣реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рдЧрднрдЧ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреАред рдЗрд╕ рддрд░рд╣ рдХреА рднрдВрдбрд╛рд░рдг рдпреЛрдЬрдирд╛ рдЗрд╕рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА, рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдореВрд╣ рдХреЗ рд╕рднреА рд╡рдВрд╢рдЬреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реАрдЯреАрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рдирд╣реАрдВ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЬреЙрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рд░реНрдорд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рдореВрд╣ рдХреЗ рд╡рд┐рд╣рд┐рдд рдирд╛рдо рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
canonicalName ' ' (Group group) =
GROUP CONCAT name(Group parent), ' / ' ORDER DESC level(group, parent) CHARWIDTH 50 ;

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдЪрд┐рддреНрд░ рдореЗрдВ рдорд┐рд▓реНрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╣рд┐рдд рдирд╛рдо рдСрд▓ / рдХрд┐рд░рд╛рдиреЗ рдХрд╛ рд╕рд╛рдорд╛рди / рдбреЗрдпрд░реА / рджреВрдз рд╣реЛрдЧрд╛ ред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдЧреБрдг (рд╡рд░реНрдгреЛрдВ рдореЗрдВ) рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдЪреМрдбрд╝рд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП CHARWIDTH рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдм рд╣рдо рдирдП рдмрдирд╛рдП рдЧрдП рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдореВрд╣реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░реНрдо рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ:
EXTEND FORM group
PROPERTIES (g) nameParent, canonicalName
;

EXTEND FORM groups
PROPERTIES (g) READONLY nameParent, canonicalName
;

рдПрдХ рдлреНрд▓реИрдЯ рд░реВрдк рдореЗрдВ рд╕рдореВрд╣реЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдлреЙрд░реНрдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

рдЫрд╡рд┐

рд╕рдореВрд╣реЛрдВ рдХрд╛ рддрд░реНрдХ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрдХрд╛рдИ рдЬреЛрдбрд╝реЗрдВ:
CLASS Product '' ;
name '' = DATA ISTRING [ 50 ] (Product);

рдЙрддреНрдкрд╛рдж рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдкрд╛рдж рд▓рд┐рдВрдХ рдмрдирд╛рдПрдБ рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рд╣реИ:
group '' = DATA Group (Product);
canonicalNameGroup ' ' (Product p) = canonicalName(group(p));

рдЕрдВрдд рдореЗрдВ, рд╣рдо рдорд╛рд▓ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреЙрд░реНрдо рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рддрддреНрд╡ рд╣реЛрдВрдЧреЗ: рд╕рдореВрд╣реЛрдВ рдХрд╛ рдПрдХ рдкреЗрдбрд╝ рдФрд░ рдорд╛рд▓ рдХреА рдПрдХ рд╕реВрдЪреАред рдЪрдпрдирд┐рдд рдЯреНрд░реА рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд╡реЗ рдЙрддреНрдкрд╛рдж рдЬреЛ рдЪрдпрдирд┐рдд рдиреЛрдб рдХреЗ рдХрд┐рд╕реА рднреА рд╡рдВрд╢рдЬ рдХреЗ рд╣реИрдВ, рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдлреЙрд░реНрдо рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕рдореВрд╣реЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдЗрд╕рдореЗрдВ рдПрдХ рдкреЗрдбрд╝ рдЬреЛрдбрд╝реЗрдВ:
FORM products ''
TREE groups g = Group PARENT parent
PROPERTIES READONLY name(g)
;

TREE рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдкреЗрдбрд╝ рдХреЛ рд╕рдореВрд╣ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рдкрд╣рд▓реЗ рдХреА рдореВрд▓ рд╕рдВрдкрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред

рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдореЗрдВ рдлрд╝реЙрд░реНрдо рдЬреЛрдбрд╝реЗрдВ:
NAVIGATOR {
NEW products;
}

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдорд╛рд▓ рдХрд╛ рдЗрдирдкреБрдЯ рдФрд░ рд╕рдВрдкрд╛рджрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╡рд╛рджреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕реАрдзреЗ рдлреЙрд░реНрдо рдореЗрдВ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрдпрдирд┐рдд рд╕рдореВрд╣ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрддреНрдкрд╛рдж рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдПрдВ:
newProduct '' (Group g) {
NEW p = Product {
group(p) <- g;
}
}

рдЕрдм, рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдлреЙрд░реНрдо рдкрд░, рд╕рдВрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЙрд▓рдо рд╡рд╛рд▓реЗ рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕реВрдЪреА рдЬреЛрдбрд╝реЗрдВ:
EXTEND FORM products
OBJECTS p = Product
PROPERTIES (p) name, canonicalNameGroup
FILTERS level(group(p), g)
;

рдорд╛рд▓ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо рдмрдЯрди рдкрд░ рдлреЗрдВрдХреЗрдВ:
EXTEND FORM products
PROPERTIES newProduct(g) DRAW p TOOLBAR , DELETE (p)
;

рдЪреВрдВрдХрд┐ рдПрдХреНрд╢рди рдиреНрдпреВрдкреНрд░реЛрдб рдХреЛ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕реЗ рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕реВрдЪреА (рдкреА) рдХреЗ рд╕рд╛рде рдЯреВрд▓рдмрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреЗрдбрд╝ рдмрд╛рдИрдВ рдУрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛ, рдФрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕реВрдЪреА рджрд╛рдИрдВ рдУрд░ рд╣реЛ, рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдПрдХ рд╡рд┐рднрд╛рдЬрдХ рд╣реЛ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
DESIGN products {
OBJECTS {
NEW pane {
type = SPLITH ;
fill = 1 ;
MOVE BOX ( TREE groups);
MOVE BOX (p);
}
}
}

рдЕрдВрддрд┐рдо рд░реВрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

рдЫрд╡рд┐

рдЙрддреНрдкрд╛рджреЛрдВ рдФрд░ рд╕рдореВрд╣реЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж, рдЕрдХреНрд╕рд░ рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдкрд░ рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдореНрди рдкрджрд╛рдиреБрдХреНрд░рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рдЙрдЪреНрдЪ рдЗрд╕рдХрд╛ рдореВрд▓реНрдпред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдбреЗрдпрд░реА рд╕рдореВрд╣ 30 рдкрд░ рд╕реЗрдЯ рд╣реИ, рдФрд░ рдорд┐рд▓реНрдХ рд╕рдореВрд╣ 20 рдкрд░ рд╕реЗрдЯ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рдХреЛ рдЪреБрдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдорд╛рди рд▓реАрдЬрд┐рдП рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░реАрдорд┐рдпрдо рд╡рд┐рдХрд▓реНрдк рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдПрдБ:
markup ', %' = DATA NUMERIC [ 10 , 2 ] (Group);

рд╡рд╛рдВрдЫрд┐рдд рдореВрд▓реНрдп рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╕рдореВрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
parentMarkup ' ( ), %' (Group child) =
GROUP LAST markup(Group parent) ORDER DESC level(child, parent) WHERE markup(parent);

рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд, рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╢реАрд░реНрд╖ рд╕рдореВрд╣ ( рд╕рдореВрд╣ рдорд╛рддрд╛-рдкрд┐рддрд╛ ) рдкрд░ рдЕрдВрддрд┐рдо ( LAST ) рдорд╛рд░реНрдХрдЕрдк рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреА рд╣реИ , рдЬрд┐рд╕рд╕реЗ рдпрд╣ рджреВрд░реА ( ORDER DESC рд╕реНрддрд░ (рдмрдЪреНрдЪреЗ, рдорд╛рддрд╛-рдкрд┐рддрд╛) ) рдХреЗ рд▓рд┐рдП рдХрдо рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╛рд░реНрдХрдЕрдк рд╣реИ рджрд┐рдпрд╛ ( WHERE рдорд╛рд░реНрдХрдЕрдк (рдореВрд▓) )ред рдпрд╣рд╛рдВ рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ lsFusion рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

рд╕рдореВрд╣ рдЯреНрд░реА рдореЗрдВ рдЙрддреНрдкрд╛рдж рд░реВрдк рдореЗрдВ рдКрдкрд░ рдирд┐рд░реНрдорд┐рдд рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ:
EXTEND FORM products
PROPERTIES (g) markup, parentMarkup READONLY
;

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдХрд┐рд╕реА рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдкреНрд░реАрдорд┐рдпрдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдорд┐рдпрдо рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдПрдВ:
dataMarkup ' , %' = DATA NUMERIC [ 10 , 2 ] (Product);

рдлрд┐рд░ рд╣рдо рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрддреНрдкрд╛рдж рд╕реЗ рдкреНрд░реАрдорд┐рдпрдо рд▓реМрдЯрд╛рдПрдЧрд╛, рдпрджрд┐ рдХреЛрдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рдпрд╛ рд╕рдореВрд╣ рд╕реЗ рдкреНрд░реАрдорд┐рдпрдо рд╣реИ:
markup ', %' (Product p) = OVERRIDE dataMarkup(p), parentMarkup(group(p));

рдЙрд╕рдХреЗ рдмрд╛рдж, рджреЛрдиреЛрдВ рдЧреБрдгреЛрдВ рдХреЛ рдлрд╝реЙрд░реНрдо рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
EXTEND FORM products
PROPERTIES (p) dataMarkup, markup READONLY
;

рд╕рдореВрд╣реЛрдВ рдФрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдорд┐рдпрдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рддрдВрддреНрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

рдЫрд╡рд┐

рдирд┐рд╖реНрдХрд░реНрд╖


рдЙрдкрд░реЛрдХреНрдд рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рддрд░реНрдХ рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ, рдЙрдиреНрд╣реЗрдВ рдЧрддрд┐рд╢реАрд▓ рдЧрд╣рд░рд╛рдИ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдорд┐рд▓рд╛рдПрдВ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдкрд░ рдкреНрд░реАрдорд┐рдпрдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдпрд╣ рд╕рдм рдХреЛрдб рдХреА рд▓рдЧрднрдЧ 70 рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓реЗ рдЧрдпрд╛ред рдЖрдк рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдСрдирд▓рд╛рдЗрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рдЗрдЯ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрднрд╛рдЧ (рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЯреИрдм) рдореЗрдВ рдХреЛрдб рдореЗрдВ рдЕрдкрдиреЗ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рд╕рдВрдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЙрдкрдпреБрдХреНрдд рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рд╣реИ:

рд╕реНрд░реЛрдд рдХреЛрдб
CLASS Group '' ;
name '' = DATA ISTRING [ 50 ] (Group);

FORM group ''
OBJECTS g = Group PANEL
PROPERTIES (g) name

EDIT Group OBJECT g
;

FORM groups ''
OBJECTS g = Group
PROPERTIES (g) READONLY name
PROPERTIES (g) NEWSESSION NEW , EDIT , DELETE

LIST Group OBJECT g
;

NAVIGATOR {
NEW groups;
}

parent = DATA Group (Group);
nameParent ' ' (Group g) = name(parent(g));

level '' (Group child, Group parent) =
RECURSION 1l IF child IS Group AND parent = child
STEP 2l IF parent = parent($parent) MATERIALIZED ;

canonicalName ' ' (Group group) =
GROUP CONCAT name(Group parent), ' / ' ORDER DESC level(group, parent) CHARWIDTH 50 ;

EXTEND FORM group
PROPERTIES (g) nameParent, canonicalName
;

EXTEND FORM groups
PROPERTIES (g) READONLY nameParent, canonicalName
;

CLASS Product '' ;
name '' = DATA ISTRING [ 50 ] (Product);

group '' = DATA Group (Product);
canonicalNameGroup ' ' (Product p) = canonicalName(group(p));

FORM products ''
TREE groups g = Group PARENT parent
PROPERTIES READONLY name(g)
;

NAVIGATOR {
NEW products;
}

newProduct '' (Group g) {
NEW p = Product {
group(p) <- g;
}
}
EXTEND FORM products
OBJECTS p = Product
PROPERTIES (p) name, canonicalNameGroup
FILTERS level(group(p), g)
;

EXTEND FORM products
PROPERTIES newProduct(g) DRAW p TOOLBAR , DELETE (p)
;

DESIGN products {
OBJECTS {
NEW pane {
type = SPLITH ;
fill = 1 ;
MOVE BOX ( TREE groups);
MOVE BOX (p);
}
}
}

markup ', %' = DATA NUMERIC [ 10 , 2 ] (Group);

parentMarkup ' ( ), %' (Group child) =
GROUP LAST markup(Group parent) ORDER DESC level(child, parent) WHERE markup(parent);

EXTEND FORM products
PROPERTIES (g) markup, parentMarkup READONLY
;

dataMarkup ' , %' = DATA NUMERIC [ 10 , 2 ] (Product);
markup ', %' (Product p) = OVERRIDE dataMarkup(p), parentMarkup(group(p));

EXTEND FORM products
PROPERTIES (p) dataMarkup, markup READONLY
;

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЧреБрдгреЛрдВ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдИрдЖрд░рдкреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ , рд╕рдореВрд╣реЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдорд┐рдпрдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрддрд░ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХреАрдордд рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдЯрд┐рд▓рддрд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред

Source: https://habr.com/ru/post/hi468047/


All Articles