2016-04-18 7 views
0

Ich habe eine Klasse, deren Hauptzweck es ist, sich um eine temporäre Tabelle zu drehen. Ich möchte einen Konstruktor erstellen, der eine identische temporäre Tabelle als Eingabe akzeptiert.Konstruktor, der eine statische temporäre Tabelle als Eingabe verwendet (Progress ABL)

Bisher erstickt der Compiler bei jedem Versuch, eine temporäre Tabelle als Eingabeparameter zu übergeben. Wenn ich stattdessen ein Tabellenhandle verwende, funktioniert es. Aber ich würde lieber nicht von einer dynamischen in eine statische Tabelle kopieren.

Progress möchte, dass die Tabellen zur Kompilierungszeit übereinstimmen, aber ich weiß, dass sie identisch sind - sie sind in einer .i-Datei definiert.

Gibt es einen einfachen Weg, um die Tabellen auszurichten, oder bin ich stecken ein Feld zu einem Zeitpunkt geparst?

+0

Wahrscheinlich haben Sie die .i geändert, und der Cache des Compilers verwendet zwei verschiedene Versionen dieser .i für die Klasse vs. das aufrufende Programm, und deshalb erhalten Sie Compilerfehler. –

+0

Können Sie etwas Code posten? Ihre Idee scheint ziemlich machbar. Was meinst du, du weißt, dass sie gleich sein werden? Wenn sie statisch sind, sind sie immer gleich. Oder verstehe ich irgendetwas falsch? – bupereira

Antwort

0

Funktioniert wie ein Charme für mich.

CLASS Test.TTOO.TempTableWrapper: 

    {Test/TTOO/ttCustomer.i} 

    CONSTRUCTOR PUBLIC TempTableWrapper (TABLE ttCustomer): 

     FOR EACH ttCustomer: 
      DISPLAY ttCustomer.CustNum ttCustomer.Name . 
     END. 

    END CONSTRUCTOR. 
END CLASS. 

und der Anrufer:

oWrapper = NEW TempTableWrapper(TABLE ttCustomer BY-REFERENCE) . 

jedoch dann die temp-Tabelle Daten sind nur availalbe während der:

ROUTINE-LEVEL ON ERROR UNDO, THROW. 

USING Test.TTOO.* FROM PROPATH. 

DEFINE VARIABLE oWrapper AS TempTableWrapper NO-UNDO . 

{Test/TTOO/ttCustomer.i} 

/* *************************** Main Block *************************** */ 

CREATE ttCustomer. 
ASSIGN ttCustomer.CustNum = 42 
     ttCustomer.Name = "It works" . 

oWrapper = NEW TempTableWrapper(TABLE ttCustomer) . 

Sie auch die temp-Tabelle von-ref passieren kann Konstruktor als BY-REFERENCE-Aufrufe "überlappen" die temporäre Tabelle innerhalb des Aufrufers nur für die Dauer dieses Aufrufs.

Für permanente "BY-REFERENCE", verwenden Sie das Schlüsselwort BIND für den Aufruf und den Parameter - in diesem Fall muss der Angerufene die temporäre Tabelle als REFERENCE-ONLY definieren.

Hinweis, es ist nicht erforderlich (obwohl zumindest von mir empfohlen), die Temp-Tabellen in Include-Dateien zu definieren. Zur Laufzeit und zur Kompilierzeit müssen die Schemas nur übereinstimmen.

Wenn der Compiler Ihren Aufruf nicht mag, löschen Sie die Klassen r-code und rekompilieren.

+0

Der Trick hier ist, dass ich die Eingabetabelle in eine interne temporäre Tabelle kopieren muss. Ich bekomme immer einen Fehler "unbekannte oder zweideutige Tabelle" –

+0

Also das wäre BY-VALUE (das Gegenteil von BY-REFERENCE). Die ersten beiden Blöcke von Code-Samples von oben tun genau das gleiche. Die Prozedur erstellt eine neue Instanz von ttCustomer und die Klasse behält eine private Kopie davon. Teilen Sie etwas Code? –

+0

Warte, es ist wirklich so einfach? Ich muss nicht von diesem kopieren: Tabelle zu dem: Tabelle? Es passiert einfach automatisch? Ich habe diese Tatsache nirgendwo in der Dokumentation gefunden. –