Auf DB mit Pointer zugreifen

Holger Levetzow

Level-1
Beiträge
69
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich möchte Werte eines DB in einen anderen DB schreiben. Ich habe das wie folgt realisiert (Beispiel)

L P#DBX 0.0
LAR1
LAR2
AUF "Werte"
L W [AR1,P#0.0]
AUF "Werte2"
T W [AR2,P#0.0]

Kann man den Pointer so angeben, dass sie den DB mitenthalten, also die DB-Nummer ebenfalls im AR1/AR2 steht?
Ich will das über eine Schleife realisieren, in der ich mit +AR1 die Adressen erhöhen.

mfg und Danke im Voraus

Holger
 
Hallo Holger,

so wie Du Dir das vorstellst geht es leider nicht. Du kannst den DB mit in einen Pointer schreiben,
aber das kopieren musst Du dann mit dem SFC 20 machen.

Grüße
Gebs
 
ich möchte Werte eines DB in einen anderen DB schreiben. Ich habe das wie folgt realisiert (Beispiel)

L P#DBX 0.0
LAR1
LAR2
AUF "Werte"
L W [AR1,P#0.0]
AUF "Werte2"
T W [AR2,P#0.0]

kann ich da aber auch mit Schleifen arbeiten (möchte jeden 3. Wert des umfangreichen DB in einen anderen schreiben)

Das folgende Programmbeispiel kopiert jeden dritten Wert aus dem DB-Quelle in den DB-Ziel.

Es werden insgesamt 4 Werte (Anzahl Werte) aus dem DB-Quelle in den DB-Ziel kopiert.

Code:
FUNCTION FC 100 : VOID
TITLE =Werte aus DB-Quelle nach DB-Ziel kopieren
AUTHOR : Kai
FAMILY : SPSForum
NAME : '40156'
VERSION : 1.0
 
VAR_INPUT
  DB_Quelle : BLOCK_DB ; 
  DB_Ziel : BLOCK_DB ; 
  Anzahl_Werte : INT ; 
END_VAR
VAR_TEMP
  DB_Register : WORD ; 
  AR1_Register : DWORD ; 
  AR2_Register : DWORD ; 
  Schleife : INT ; 
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
 
      L     DBNO; // DB-Register
      T     #DB_Register; 
 
      TAR1  ; // AR1-Register
      T     #AR1_Register; 
 
      TAR2  ; // AR2-Register
      T     #AR2_Register; 
 
NETWORK
TITLE =Werte aus DB-Quelle nach DB-Ziel kopieren
//Jeden dritten Wert aus DB-Quelle nach DB-Ziel kopieren
//   
      L     P#0.0; 
      LAR1  ; 
      LAR2  ; 
 
      L     #Anzahl_Werte; // Anzahl Werte
M01:  T     #Schleife; // Schleife
 
      AUF   #DB_Quelle; // DB-Quelle
      L     DBW [AR1,P#0.0]; // DB-Quelle Wert
      AUF   #DB_Ziel; // DB-Ziel
      T     DBW [AR2,P#0.0]; // DB-Ziel Wert
 
      L     P#6.0; 
      +AR1  ; 
 
      L     P#2.0; 
      +AR2  ; 
 
      L     #Schleife; // Schleife
      LOOP  M01; 
 
NETWORK
TITLE =Register wiederherstellen
 
      AUF   DB [#DB_Register]; // DB-Register
 
      L     #AR1_Register; // AR1-Register
      LAR1  ; 
 
      L     #AR2_Register; // AR2-Register
      LAR2  ; 
 
END_FUNCTION

Gruß Kai
 

Anhänge

  • OB1.pdf
    5,7 KB · Aufrufe: 34
  • FC100.pdf
    6,6 KB · Aufrufe: 28
  • DB100.pdf
    4,4 KB · Aufrufe: 24
  • DB110.pdf
    4,4 KB · Aufrufe: 17
  • 40156.zip
    31,7 KB · Aufrufe: 30
Zuviel Werbung?
-> Hier kostenlos registrieren
Es geht auf noch ein bisschen anders

FC mit Parametertyp BLOCK_DB
Code:
//****************************************************************************
//*** AR1 sichern
//****************************************************************************
      TAR1  #TEMP_AR1
      SET   
      SAVE  

//****************************************************************************
//*** Daten kopieren (Parametertyp BLOCK_DB) 
//****************************************************************************
//*** QUELL-DB als DB öffnen
      L     P##QUELLE                   // BLOCK_DB
      SRD   16
      T     #TEMP_INT
      AUF   DB [#TEMP_INT]

//*** ZIEL-DB als DI öffnen
      L     P##ZIEL                     // BLOCK_DB
      SRD   16
      T     #TEMP_INT
      AUF   DI [#TEMP_INT]

//*** Adressregister auf P#0.0
      L     P#0.0
      LAR1  
      LAR2  

//*** Daten kopieren
      L     #N                          // INTEGER
LOO2: T     #TEMP_INT
      L     DBW [AR2,P#0.0]
      T     DIW [AR1,P#0.0]
      +AR1  P#2.0
      +AR2  P#6.0
      L     #TEMP_INT
      LOOP  LOO2


//****************************************************************************
//*** AR1-Register wiederherstellen
//****************************************************************************
      LAR1  #TEMP_AR1
oder FC mit Parametertyp POINTER
Code:
//****************************************************************************
//*** AR1 sichern
//****************************************************************************
      TAR1  #TEMP_AR1
      SET   
      SAVE  

//****************************************************************************
//*** Daten kopieren (Parametertyp POINTER)
//****************************************************************************
//*** DB öffnen und AR2 auf QUELLE
      L     P##ZIEL                     // POINTER
      LAR2  
      L     W [AR2,P#0.0]
      T     #TEMP_INT
      AUF   DB [#TEMP_INT]
      L     D [AR2,P#2.0]
      LAR2  

//*** DI öffnen und AR1 auf ZIEL
      L     P##ZIEL                     // POINTER
      LAR1  
      L     W [AR1,P#0.0]
      T     #TEMP_INT
      AUF   DI [#TEMP_INT]
      L     D [AR1,P#2.0]
      LAR1  

//*** kopieren
      L     #N                          // INTEGER
LOO3: T     #TEMP_INT
      L     DBW [AR2,P#0.0]
      T     DIW [AR1,P#0.0]
      +AR1  P#2.0
      +AR2  P#6.0
      L     #TEMP_INT
      LOOP  LOO3

      NOP   0


//****************************************************************************
//*** AR1-Register wiederherstellen
//****************************************************************************

      LAR1  #TEMP_AR1
 
Zurück
Oben