Informační tok Funkční structura Datová struktura ER model Modulová struktura Typová struktura Relační model Dokumentace


[Celkový datový model] [Funkce] [Externí rohraní] [Stavové diagramy] [Datové elementy] [Entity] [Relace]
[Databáze] [Události] [Materiály] [Generovací funkce] [Vyhodnocovací funkce] [Konfigurace] [Uživatelé] [Projekt] [Home]



Vyhodnocovací funkce
Generate_State_Transition_Table
(State Transition Diagram)


Vytvořeno: 12-11-1995 13:06:50
Poslední změna: 12-10-2002 12:14:24

Displays the state transitions shown in the diagram in the form of a table.

Modul

Module: State Transition Diagram

Zdrojový kód:

PROCEDURE Generate_State_Transition_Table FOR STATEAREA
BEGIN
/*
  show state transition diagram as state transition table
*/

  FOR FUNCTION WHERE Name=Statearea.Function DO

    PRINT {BOLD,"ARIAL",12} "Stavová tabulka funkce ";
    PRINT {BOLD,"ARIAL",ITALIC,12} CONV$(Function.Boxname),NL(2);
    column%=0;
    count%=0;
    max%=0;

    FOREACH Transitionlink WHERE Transitionlink.Function=Function.Name
                           AND Transitionlink.Sourcestate<>""
                           AND Transitionlink.Statearea=Statearea.Name ORDER BY Transition DO
      c%=COUNT();
      FOR Transition WHERE Transition.Name=Transitionlink.Transition
                       AND Transition.Sourcestate=Transitionlink.Sourcestate
                       AND Transition.Targetstate=Transitionlink.Targetstate
                       AND Transition.Function=Function.Name DO
        // check if logically identical event has already been treated
        exists%=0;
        innerc%=0;
        FOREACH Combinationpart AS Cbm WHERE Cbm.Function=Function.Name
                                AND Cbm.Transition=Transition.Name
                                AND Cbm.Sourcestate=Transition.Sourcestate DO
          cbm1%=COUNT();
        END
        FOREACH Transitionlink AS TL WHERE TL.Function=Function.Name
                                     AND TL.Sourcestate<>""
                                     AND TL.Statearea=Statearea.Name ORDER BY Transition DO
          FOR Transition AS TS WHERE TS.Name=TL.Transition
                         AND TS.Sourcestate=TL.Sourcestate
                         AND TS.Targetstate=TL.Targetstate
                         AND TS.Function=Function.Name DO
            IF innerc%<count% AND exists%=0 THEN
              // count elements
              FOREACH Combinationpart AS Cbm WHERE Cbm.Function=Function.Name
                                      AND Cbm.Transition=TS.Name
                                      AND Cbm.Sourcestate=TS.Sourcestate DO
                cbm2%=COUNT();
              END
              // compare elements in pairs
              IF cbm1%=cbm2% THEN
                cnt%=0;
                eq%=0;
                FOREACH Combinationpart AS C1 WHERE C1.Function=Function.Name
                                        AND C1.Transition=Transition.Name
                                        AND C1.Sourcestate=Transition.Sourcestate DO
                  cnt%=COUNT();
                  FOR Combinationpart AS C2 WHERE C2.Function=Function.Name
                                          AND C2.Transition=TS.Name
                                          AND C2.Sourcestate=TS.Sourcestate
                                          AND C2.Event=C1.Event
                                          AND C2.Negated=C1.Negated DO
                    eq%=eq%+1;
                  END
                END
                IF eq%=cnt% THEN
                  exists%=1;
                END
              END
            END
            innerc%=innerc%+1;
          END
        END

        count%=count%+1;
         
        IF exists%=0 THEN

          FOREACH Combinationpart AS Cbm WHERE Cbm.Function=Function.Name
                                         AND Cbm.Transition=Transition.Name
                                         AND Cbm.Sourcestate=Transition.Sourcestate DO
            IF COUNT()>max% THEN
              max%=COUNT();
            END
          END
          
          column%=column%+1;
          IF column%=1 THEN
              Id1$=Transition.Name;
              So1$=Transition.Sourcestate;
          ELSIF column%=2 THEN
              Id2$=Transition.Name;
              So2$=Transition.Sourcestate;
          ELSIF column%=3 THEN
              Id3$=Transition.Name;
              So3$=Transition.Sourcestate;
          ELSIF column%=4 THEN
              Id4$=Transition.Name;
              So4$=Transition.Sourcestate;
          END
        END
    
        IF exists%=0 OR count%=c% THEN
          IF count%=c% OR column%=4 THEN
            i%=0;
            x%=4*max%-1;
            WHILE i%<x%+1 DO
            
              PRINT NL;
              CALL STD_Header(Id1$,So1$,Function.Name,i%,1,x%);
              IF column%>1 THEN
                CALL STD_Header(Id2$,So2$,Function.Name,i%,2,x%);
              END
              IF column%>2 THEN
                CALL STD_Header(Id3$,So3$,Function.Name,i%,3,x%);
              END
              IF column%>3 THEN
                CALL STD_Header(Id4$,So4$,Function.Name,i%,4,x%);
              END

              i%=i%+1;
              IF i%<x%+1 THEN
                PRINT {"ARIAL",8} TAB(16*column%+13),"|";
              ELSE
                PRINT {"ARIAL",UNDERLINE,8} TAB(16*column%+13),"|";
              END

            END

            FOREACH Statenode WHERE Statenode.Function=Function.Name
                              AND Statenode.Statearea=Statearea.Name DO
              FOREACH State WHERE State.Name=Statenode.State DO
                i%=0;
                WHILE i%<4 DO
                  IF i%=3 THEN
                    PRINT {BOLD,"ARIAL",UNDERLINE,8} NL,MID$(State.Boxname,i%*12+1,12);
                  ELSE
                    PRINT {BOLD,"ARIAL",8} NL,MID$(State.Boxname,i%*12+1,12);
                  END
                  CALL STD_Line(Id1$,So1$,Function.Name,State.Name,i%,1);
                  IF column%>1 THEN
                    CALL STD_Line(Id2$,So2$,Function.Name,State.Name,i%,2);
                  END
                  IF column%>2 THEN
                    CALL STD_Line(Id3$,So3$,Function.Name,State.Name,i%,3);
                  END
                  IF column%>3 THEN
                    CALL STD_Line(Id4$,So4$,Function.Name,State.Name,i%,4);
                  END
                  i%=i%+1;
                  IF i%<4 THEN
                    PRINT {"ARIAL",8} TAB(16*column%+13),"|";
                  ELSE
                    PRINT {"ARIAL",UNDERLINE,8} TAB(16*column%+13),"|";
                  END
                END
              END
            END
            PRINT NL(2);
            column%=0;
            max%=0;
            Id1$=""; So1$="";
            Id2$=""; So2$="";
            Id3$=""; So3$="";
            Id4$=""; So4$="";
          END
        END
      END
    END
  END

END


Generováno: 16.10.2003 7:41 Systém: C:\Documents and Settings\hajsman\Dokumenty\Vyuka\Irs2\Projekt case40\Projekt03.csf Generováno systémem case/4/0
Vygeneroval: Administrator Soubor: C:\Documents and Settings\hajsman\Dokumenty\Vyuka\Irs2\Projekt case40\html\22827.htm (C) microTOOL GmbH 2002