Array in DB schreiben(any-pointer)

Limette

Level-2
Beiträge
282
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Also:
FB1
IN-Schnittstelle:
Datenherein (ANY)
dem FB1 ist in OB1 ein DB mit einem Char Array[0..50] zugwiesen. da soll nachher das array drinstehen.

Quellzeiger:
Code:
      L     P##Datenherein             
      LAR1                              
      TAR2                              // offset 
      +AR1                              // multi
 
      L     B [AR1,P#0.0]              
      T     #syntID               
 
      L     B [AR1,P#1.0]               
      T     #DatenTyp              
 
      L     W [AR1,P#2.0]               
      T     #RepFact               
 
      L     W [AR1,P#4.0]               
      T     #DBNummer               
 
      L     D [AR1,P#6.0]               
      T     #Offset

Code:
      LAR1  P##ArraymitDatendrin 
 
      L     #syntID 
      T     LB [AR1,P#0.0] 
 
      L     #DatenTyp
      T     LB [AR1,P#1.0]  
 
      L     #RepFact
      T     LW [AR1,P#2.0] 
 
      L     #DBNummer
      T     LW [AR1,P#4.0] 
 
      L     #Offset
      T     LD [AR1,P#6.0]

habe mir im forum den aufbau zusammengeklaubt. leider funktioniert es nicht, also es stehen keine daten im array des DBs. sieht jemand ein fehler?
 
Versuch mal beim 1. Any B, W,D durch DIB,DIW und DID zu ersetzen.

Ohne jetzt deinen Code genau durchzusehen mal ein funktionierendes Beispiel:


Code:
//NW1
      TAR2  #AR2BACKUP
      L     P##anySchreibstring
      LAR2  
      L     #AR2BACKUP
      +AR2  
      L     P##anyTemp
      LAR1  
      L     DIW [AR2,P#0.0]
      T     LW [AR1,P#0.0]
      L     DIW [AR2,P#2.0]
      T     LW [AR1,P#2.0]
      L     DIW [AR2,P#4.0]
      T     LW [AR1,P#4.0]
//      T     #wDB
      L     DID [AR2,P#6.0]
//      T     #dwAdr
      T     LD [AR1,P#6.0]
      LAR2  #AR2BACKUP

//NW2
      CALL  "BLKMOV"
       SRCBLK :=#Schreibstring_intern
       RET_VAL:=#RetVal
       DSTBLK :=#anyTemp

Ist der umgekehrte Weg auf eine INOUT. Bei dir müßte SRCBLK und DSTBLK vertauscht werden.

#AR2BACKUP DWord
#anySchreibstring Any INOUT
#Schreibstring_intern String Temp <-- Das kann auch ein Any auf dein Array oder evtl. das Chararray selbst sein (mal testen)

anyTemp enthält nach NW1 die "tatsächliche" Adresse des als INOUT am FB angelegten Any. Dorthin wird dann #anySchreibstring umkopiert.
 
Also:
FB1
IN-Schnittstelle:
Datenherein (ANY)
dem FB1 ist in OB1 ein DB mit einem Char Array[0..50] zugwiesen. da soll nachher das array drinstehen.

Quellzeiger:
Code:
      L     P##Datenherein             
      LAR1                              
      TAR2                              // offset 
      +AR1                              // multi

Ohne die Applikation zu kennen bin ich etwas verwundert.

Im Fb wird doch über das AR2 die Adresse des Instanz-DBs verwaltet, d.h. es wird nur ein Offset auf den InstanzDB addiert.

Liegen die Daten in der Instanz oder denke ich am frühen morgen falsch ?
 
Zuletzt bearbeitet:
Ohne die Applikation zu kennen bin ich etwas verwundert.

Im Fb wird doch über das AR2 die Adresse des Instanz-DBs verwaltet, d.h. es wird nur ein Offset auf den InstanzDB addiert.

Liegen die Daten in der Instanz oder denke ich am frühen morgen falsch ?

die richtigkeit meines codes kann gerne bezweifelt werden, darum auch der post, es funktioniert ja nicht. :)

das Array
Code:
ArraymitDatendrin
liegt in einem IDB. ich hoffe sowas hast du gefragt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also:
FB1
IN-Schnittstelle:
Datenherein (ANY)
dem FB1 ist in OB1 ein DB mit einem Char Array[0..50] zugwiesen. da soll nachher das array drinstehen.

Quellzeiger:
Code:
      L     P##Datenherein             
      LAR1                              
      TAR2                              // offset 
      +AR1                              // multi
 
      L     B [AR1,P#0.0]              
      T     #syntID               
 
      L     B [AR1,P#1.0]               
      T     #DatenTyp              
 
      L     W [AR1,P#2.0]               
      T     #RepFact               
 
      L     W [AR1,P#4.0]               
      T     #DBNummer               
 
      L     D [AR1,P#6.0]               
      T     #Offset      
 
      LAR1  P##ArraymitDatendrin 
 
      L     #syntID 
      T     LB [AR1,P#0.0] 
 
      L     #DatenTyp
      T     LB [AR1,P#1.0]  
 
      L     #RepFact
      T     LW [AR1,P#2.0] 
 
      L     #DBNummer
      T     LW [AR1,P#4.0] 
 
      L     #Offset
      T     LD [AR1,P#6.0]

Im moment überschreibst Du den ZielPointer mit den Daten die Du für den Quellzeiger generiert hast.
 
Versuch mal beim 1. Any B, W,D durch DIB,DIW und DID zu ersetzen.

Ohne jetzt deinen Code genau durchzusehen mal ein funktionierendes Beispiel:


Code:
//NW1
      TAR2  #AR2BACKUP
      L     P##anySchreibstring
      LAR2  
      L     #AR2BACKUP
      +AR2  
      L     P##anyTemp
      LAR1  
      L     DIW [AR2,P#0.0]
      T     LW [AR1,P#0.0]
      L     DIW [AR2,P#2.0]
      T     LW [AR1,P#2.0]
      L     DIW [AR2,P#4.0]
      T     LW [AR1,P#4.0]
//      T     #wDB
      L     DID [AR2,P#6.0]
//      T     #dwAdr
      T     LD [AR1,P#6.0]
      LAR2  #AR2BACKUP
 
//NW2
      CALL  "BLKMOV"
       SRCBLK :=#Schreibstring_intern
       RET_VAL:=#RetVal
       DSTBLK :=#anyTemp

Ist der umgekehrte Weg auf eine INOUT. Bei dir müßte SRCBLK und DSTBLK vertauscht werden.

#AR2BACKUP DWord
#anySchreibstring Any INOUT
#Schreibstring_intern String Temp <-- Das kann auch ein Any auf dein Array oder evtl. das Chararray selbst sein (mal testen)

anyTemp enthält nach NW1 die "tatsächliche" Adresse des als INOUT am FB angelegten Any. Dorthin wird dann #anySchreibstring umkopiert.

hab es mal probiert aber es klappt noch nicht so recht. mir fehlt glaub einfach die erfahrung(=skill) um sowas zu händeln.
Code:
L     DIW [AR2,P#2.0]

Code:
      L     DID [AR2,P#6.0]

bei mir stehen nach dem speichern: indierekt adressierte Variabeln aus der IN-Schnittstelle...das kann ja eigentlich nicht richtig sein. mit denen habe ich da ja nichts zu tun...
zudem lässt sich bei mir der any-pointer nicht auf das blockmove legen..warum auch immer...tipp?
 
Anbei mal eine Quelle, die bildet das Array aus dem DB302, welches als Any außen an den FB 1 angelegt ist in den Instanzdaten-DB (DB301) des F301 ab. Die Daten liegen dann dort somit im statischen Datenbereich.
 

Anhänge

  • AWL-Quelle_Limette.AWL.txt
    4,6 KB · Aufrufe: 12
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
P##anyTemp
ist bei mir ein Array(static) des FB1. FB1 ist der IDB2 zugewiesen. in IDB2 liegt das Array welches kopiert werden soll.

Code:
P##anySchreibstring

ist bei mir ein Any(INOUT) welcher ich beim FB1 aufruf in OB1 DB3 zugewiesen habe. in DB3 soll nach dem kopieren die daten drin stehen.


sonst hat der FB1 natürlich noch andere IN und OUTs, die aber hier keine rolle spielen, falls du das gemeint hast.
 
Anbei mal eine Quelle, die bildet das Array aus dem DB302, welches als Any außen an den FB 1 angelegt ist in den Instanzdaten-DB (DB301) des F301 ab. Die Daten liegen dann dort somit im statischen Datenbereich.

glaub bei mir ist es genau andersherum.
von IDB array --> DB

und bei dir
DB arry --> IDB

habe ich es richtig verstanden ?
 
Code:
P##anyTemp
ist bei mir ein Array(static) des FB1. FB1 ist der IDB2 zugewiesen. in IDB2 liegt das Array welches kopiert werden soll.

Code:
P##anySchreibstring

ist bei mir ein Any(INOUT) welcher ich beim FB1 aufruf in OB1 DB3 zugewiesen habe. in DB3 soll nach dem kopieren die daten drin stehen.


sonst hat der FB1 natürlich noch andere IN und OUTs, die aber hier keine rolle spielen, falls du das gemeint hast.

OK, in diesem Fall nimmst du meinen Code und schreibst


Code:
      CALL  "BLKMOV"
       SRCBLK :=#statArray
       RET_VAL:=#retval
       DSTBLK :=#anyTemp


Dann kommen die Daten aus dem Stat-Bereich in den DB302
 
Zurück
Oben