Step 7 Dateninhalte im DB prüfen

Dataworld-EDV

Level-2
Beiträge
81
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
ich habe einen DB, der eine Struktur hat von ARRAY[1..51].
Ich möchte den Inhalt von jedem ersten Wort dieser 50 Blöcke auf den Inhalt "1" prüfen.
Hat mir da jemand eine gute Idee?
Irgendwie eine Schleife, damit ich nicht 50x
L ...
L....
Vergleich
= ......

schreiben muss.
Danke.
 
Wie sieht denn dein Array aus?

Hier mal ein SCL Beispiel
Code:
VAR
i : INT;
ungleich : BOOL;
END VAR

FOR i := 1 TO 51 BY 1 DO
    IF DeinDB.DeinWert[i] <> 1 THEN
        ungleich := TRUE;
    END_IF;
END_FOR;
 
Moin,
in SCL ist das ein Dreizeiler:
Code:
For i:=1 To 51 Do
    If MyDB.MyArray[i] == 1 Then
        ; // Treffer -> mache irgendwas 
    End_If;
End_For;
Wenn die Schleife bei einem Treffer verlassen werden soll dann kannst du in das IF auch noch ein Exit einbauen.
 
Hab das an einem SCL Rechner mal getestet.
Ist das so ok von der Deklaration?

FUNCTION FC70 : INT

VAR_TEMP
i : INT;
END_VAR


VAR_OUTPUT
Ergebnis: BOOL;

END_VAR


FOR i := 1 TO 51 BY 1 DO
IF DB101.DBD100 <> 0 THEN
Ergebnis := TRUE;
END_IF;
END_FOR;

END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das kann so nicht funktionieren:

Das funktioniert so nicht.
Der Wert muss symolisch angegeben sein. Das setzt natürlich voraus, das dein DB auch eine vernünftige Struktur hat
Also z.B.
DeinDB.Wert[1]
DeinDB.Wert[2]
....

und nicht
DeinDB.Wert_vorne
DeinDB.Wert_mitte
DeinDB.Wert_hinten
...

Ansonsten kannst du doch auch eine AWL Schleife mit Grundoffset und dann noch ein Offset zwischen den Werten berechnen, wenn dir AWL lieber ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was hat Dein Bild in Beitrag #5 mit Deiner Problembeschreibung aus Beitrag #1 zu tun? ??
Musst Du REAL-Werte vergleichen oder wirklich "jedes erste Word"?

Wenn Du SCL nicht verwenden kannst/willst, dann bleibt nur indirekte Adressierung in AWL übrig. Da müsste man die Struktur und Größe und Anfangsadresse Deines "ARRAY[1..51] of irgendwas" kennen, weil man die Werte absolut ins Programm einsetzen muß.

Angenommen das "Array [1..51] of Struct" liegt in DB123 ab DBX20.0 und der Struct ist 160 Byte lang, dann könntest Du so durchsuchen (ungetestet):
Code:
[COLOR="#008000"]//ein Dummy-Zugriff für die Referenzdaten[/COLOR]
[COLOR="#008000"]//und für Kontrolle der Adresse des ersten zu vergleichenden Words[/COLOR]
      L     DB123.DBW20            [COLOR="#008000"]//Adresse des ersten Word[/COLOR]

[COLOR="#008000"]//Pointer auf erstes zu vergleichendes Word initialisieren[/COLOR]
      L     P#DBX20.0              [COLOR="#008000"]//Adresse des ersten Word[/COLOR]
      T     #dwPointer             [COLOR="#008000"]//(DWORD in TEMP)[/COLOR]
      AUF   DB123                  [COLOR="#008000"]//der DB mit dem zu durchsuchenden Array[/COLOR]

      L     50                     [COLOR="#008000"]//max Anzahl Schleifendurchläufe[/COLOR]
LOP1: T     #iLoopCounter

      L     DBW [#dwPointer]
      L     1
      <>I
      SPB   RSLT                   [COLOR="#008000"]//ein Wert ungleich 1 gefunden --> Suche abbrechen[/COLOR]

      L     #dwPointer
      L     P#160.0                [COLOR="#008000"]//Länge der Struktur ist 160 Byte[/COLOR]
      +D
      T     #dwPointer             [COLOR="#008000"]//Pointer auf nächstes Word weiterstellen[/COLOR]

      L     #iLoopCounter
      LOOP  LOP1

      CLR                          [COLOR="#008000"]//kein Word ungleich 1 gefunden[/COLOR]
RSLT: = "enthaelt_Wert_ungleich_1"

Harald
 
SO sollte das gehen, oder?
Habe nur ne Fehlermeldung bei END_FUNCTION: Der Rückgabewert der Funktion ist nicht gesetzt.

FUNCTION FC70 : INT

VAR_TEMP
i : INT;
END_VAR


VAR_OUTPUT
Ergebnis: BOOL;

END_VAR


FOR i := 1 TO 51 BY 1 DO
IF DB_Batch_data.Rezeptdaten.B_SpraySolvents <> 0.0 THEN
Ergebnis := TRUE;
END_IF;
END_FOR;

END_FUNCTION
 
Wenn du deine Funktion so deklarierst:
Code:
[COLOR=#333333]FUNCTION FC70 : INT[/COLOR]
.
.
.
[COLOR=#333333]END_FUNCTION[/COLOR]
dann soll sie einen Return Wert vom Typ Int zurück geben. Und diesen Return-Wert müsstest du auch irgendwo schreiben. Oder du änderst den Return-Wert auf Void (=keine Rückgabe)
 
FUNCTION FC71 : Void

VAR_TEMP
i : INT;
END_VAR


VAR_OUTPUT
Ergebnis: BOOL;

END_VAR


FOR i := 1 TO 51 BY 1 DO
IF DB_Batch_data.Rezeptdaten.B_SpraySolvents <> 0.0 THEN
Ergebnis := TRUE;
END_IF;
END_FOR;

END_FUNCTION
 
Zurück
Oben