-1

クラスの配列プロパティを解決するためにインデクサーを使用しようとしています。以下のサンプルコードを基に対処方法を教えてください。インデックス ベースのプロパティは、別のプロパティを内部的に更新できる必要があります。

レガシー構造:

Record LegacyRec type basicRecord  
    3 TOTALPAID num(13,2) ;
    3 TABLEOC2 char(85) ; // ONE OCCUR OF DATA - Below items are part of TABELOC2   
        4 DUEDATEX char(10) ;     
        4 ACCTX char(6) ;     
        4 TAXX num(9,2) ;     
        4 PENALTYX num(9,2) ;    
        4 INTERESTX num(9,2) ;
        4 FEESX num(9,2) ; 
        4 TOTALPAIDX num(13,2) ; 
        4 SEQNUMX smallint ; 
        4 BILLNUMX char(8) ; 
        4 FILEDDATEX char(10) ;
    3 TABLEKEY char(12) ; // TABLEKEY    
        4 TABLEID char(8) ;     
        4 TABLECODE char(4) ; 
    3 TABLEALL char(29750) ; // UP TO 400 OCCURS    
        4 TABLEOC1 char(85) [350] ; // INDEXED REDEFINE OF ABOVE  
    3 TABLESCREEN char(1275) ; // UP TO 15 OCCURS - It holds the data below array 
        4 TABLESCR char(61) [15] ; // INDEXED REDEFINE OF ABOVE      
            5 DUEDATES char(10) ;       
            5 ACCTS char(6) ;       
            5 TAXS num(9,2) ; 
            5 SEQNUMS smallint ;       
            5 CNT int ;
            5 BILLNUMS char(10) ;       
            5 FILEDDATES char(20) ;
end

フロントコード: (変更はできませんが、必要に応じて追加の関数呼び出しを行うことができます)

decimal x; 
string y;

LegacyRec XYZ1 = new LegacyRec();
XYZ1.TABLEOC2 = "ABCDEFGHIJXYZPQR  1234.78   67    4567.89  755553.55  56  63744.6 1RTY     ZXCVBNMIOP";

x = XYZ1.PENALTYX;
y = XYZ1.DUEDATEX;
y = XYZ1.FILEDDATEX;
XYZ1.PENALTYX = 111.11M;
XYZ1.SEQNUMX = 34;
XYZ1.FILEDDATEX = "1234567890";

XYZ1.TABLEOC1[2]= "RRRR";
XYZ1.bdate = 10;
XYZ1.iitem[1] = 123;
XYZ1.il6[2] = "RTRRRTY";
for (int i = 1; i < XYZ1.TABLESCR.Count(); i++)
    XYZ1.TABLESCR[i] = "";

XYZ1.TABLESCR[6] = "10/10/2010A5670056.89    231000AAA          20200202";
y = XYZ1.TAXS[6] ; //should show 56.89

.NET クラス //現在の Structure Missing Indexer. インデクサーを使用して配列プロパティの配列を設定する際に問題があります。

public class LegacyRec: basicRecord
{
    public decimal TOTALPAID { get; set; }

    public string TABLEOC2 { get; set; } //Main field
    public string DUEDATEX { 
        get { return getPartialData(TABLEOC2, 1, 10).ToString(); } 
        set { TABLEOC2 = setPartialData(TABLEOC2, 1, 10, value).ToString(); } } //Sub Fields
    public string ACCTX { 
        get { return getPartialData(TABLEOC2, 11, 6).ToString(); } 
        set { TABLEOC2 = setPartialData(TABLEOC2, 11, 6, value).ToString(); } } //Sub Fields
    public decimal TAXX { 
        get { try { return decimal.Parse(getPartialData(TABLEOC2, 17, 9).ToString()); } catch { return 0; } }  
        set { TABLEOC2 = setPartialData(TABLEOC2, 11, 6, value).ToString(); } } //Sub Fields
    public decimal PENALTYX { 
        get { try { return decimal.Parse(getPartialData(TABLEOC2, 26, 9).ToString()); } catch { return 0; } } 
        set { TABLEOC2 = setPartialData(TABLEOC2, 26, 9, value).ToString(); } } //Sub Fields
    public decimal INTERESTX { 
        get { try { return decimal.Parse(getPartialData(TABLEOC2, 35, 9).ToString()); } catch { return 0; } }  
        set { TABLEOC2 = setPartialData(TABLEOC2, 35, 9, value).ToString(); } } //Sub Fields
    public decimal FEESX { 
        get { try { return decimal.Parse(getPartialData(TABLEOC2, 44, 9).ToString()); } catch { return 0; } } 
        set { TABLEOC2 = setPartialData(TABLEOC2, 44, 9, value).ToString(); } } //Sub Fields
    public decimal TOTALPAIDX { 
        get { try { return decimal.Parse(getPartialData(TABLEOC2, 53, 13).ToString()); } catch { return 0; } } 
        set { TABLEOC2 = setPartialData(TABLEOC2, 53, 13, value).ToString(); } } //Sub Fields
    public int SEQNUMX {
        get { try { return int.Parse(getPartialData(TABLEOC2, 66, 2).ToString()); } catch { return 0; } } 
        set { TABLEOC2 = setPartialData(TABLEOC2, 66, 2, value).ToString(); } } //Sub Fields
    public string BILLNUMX { 
        get { return getPartialData(TABLEOC2, 68, 8).ToString(); } 
        set { TABLEOC2 = setPartialData(TABLEOC2, 68, 8, value).ToString(); } } //Sub Fields
    public string FILEDDATEX {            
        get { return getPartialData(TABLEOC2, 76, 10).ToString(); }             
        set { TABLEOC2 = setPartialData(TABLEOC2, 76, 10, value).ToString(); } } //Sub Fields 

    public string TABLEALL { get; set; } // UP TO 400 OCCURS
    private string[] _TABLEOC1;

    public string this[int index]  //not working
    {
    get { return _TABLEOC1[index]; }
    set { _TABLEOC1[index] = value; TABLEALL = setPartialData(_TABLEOC1[index], index*10, 10, value).ToString(); //not working at this time}
    }

    public string[] TABLEOC1 {
        get { return _TABLEOC1; } 
        set { TABLEALL = setPartialData(TABLEOC1[index], index*, 85, value).ToString(); } } // INDEXED REDEFINE OF ABOVE [350]

    private string[] _TABLESCR;
    public string[] TABLESCR { get { return _TABLESCR; } set { string s = "123"; } } //Main array with TableScreen                
    public string[] DUEDATES { 
        get from TABLESCR[index]; 
        set TABLESCR particular Index; }
    public string[] ACCTS { 
        get from TABLESCR[index]; 
        set TABLESCR particular Index; }
    public decimal[] TAXS {
        get from TABLESCR[index]; 
        set TABLESCR particular Index;}
    public int[] SEQNUMS {
        get from TABLESCR[index]; 
        set TABLESCR particular Index;}
    public int[] CNT {
        get from TABLESCR[index]; 
        set TABLESCR particular Index;}
    public string[] BILLNUMS {
        get from TABLESCR[index]; 
        set TABLESCR particular Index;}
    public string[] FILEDDATES {
        get from TABLESCR[index]; 
        set TABLESCR particular Index;}
}    
4

2 に答える 2

1

あなたの質問に対する簡単な答えは、それを行うには配列を作成する必要があるということです。

C# がうまくサポートしていない方法でデータ オーバーレイを実行しようとしているため、複雑です。たとえば、次のようなものがあります。

XYZ1.TABLEOC2 = "ABCDEFGHIJXYZPQR  1234.78   67    4567.89  755553.55  56  63744.6 1RTY     ZXCVBNMIOP";
x = XYZ1.PENALTYX;

AndXYZ1.PENALTYXは、その文字列の数値フィールドの 1 つです。のように単一のレコードに対しては問題なく動作させることができTABLEOC2ますが、配列になるとかなり難しくなります。C# には、文字列の上に数字を重ねるという概念がありません。それを行うにはTABLESCR、文字列から暗黙的に割り当て可能でACCTS、 、 などのプロパティを持つクラスを定義する必要があります。その後、それらのインスタンスTAXSの配列とそれにインデックスを付けることができます。TABLESCR

クラスTABLESCRは次のようになります。

public class TABLESCR
{
    private string _data;
    public TABLESCR(string data)
    {
        _data = data;
    }

    public static implicit operator TABLESCR(string s)
    {
        return new TABLESCR(s);
    }

    public string DUEDATES
    {
        get { return ... }
        set { // set the value in the _data string }
    }
}

そこに構造体が必要なのかクラスが必要なのかを言うのは難しいです。それぞれに欠点がありますが、クラスをお勧めします。あなたのコンストラクターは、basicRecordおそらく空の TABLESCR インスタンスの束で配列を初期化したいと思うでしょう。

あなたのには、次のbasicRecordものがあります。

public TABLESCR[] TABLESCREEN = new TABLESCR[15];

TABLEALL は非常に簡単で、文字列の配列だけです。

public string[] TABLEALL = new string[350];

TABLESCREEN[1]その後、 やTABLEALL[1]などを参照できます。

理解してください、それはあなたが持っていたメモリレイアウトを正確に複製するわけではありませんが、機能を複製します. カスタムのインポートおよびエクスポート ロジックを使用して、使用しているデータ ストレージ形式との間で変換できます。

于 2013-08-30T14:28:48.120 に答える
0

レコード VTDMW01-NEW タイプの basicRecord 3 TABLEALL char(29750) ; // 最大 400 の OCCURS 4 TABLEOC1 char(85) [350] ; // INDEXED REDEFINE OF ABOVE 3 TABLESCREEN char(1275) ; // 最大 400 の OCCURS 4 TABLESCR char(85) [15] ; // INDEXED REDEFINE OF ABOVE 5 DUEDATES char(10) ; 5 ACCTS char(6) ; 5 TAXS num(9,2) ; 5 ペナルティ num(9,2) ; 5 利子 num(9,2) ; 5 FEESS num(9,2) ; 5 TOTALPAIDS num(13,2) ; 5 SEQNUMS smallint ; 5 BILLNUMS char(8) ; 5 FILEDDATES char(10) ; 3 TABLEOC2 char(85) ; // 1 回のデータ 4 DUEDATEX char(10) ; 4 ACCTX char(6) ; 4 タックス num(9,2) ; 4 PENALTYX num(9,2) ; 4 INTERESTX num(9,2) ; 4 FEESX num(9,2) ; 4 TOTALPAIDX num(13,2) ; 4 SEQNUMX smallint ; 4 BILLNUMX char(8) ; 4 FILEDDATEX char(10) ; 終わり

public class Vtdmw01New : basicRecord { public String tableall // 最大 400 の OCCURS { get { return getString(0, 29750); } セット { setString(0, 29750, 値); } } public StringArray tableoc1 // INDEXED REDEFINE OF ABOVE { get { return getStringArray(0, 85, 350, 85); } セット { setStringArray(0, 85, 350, 85, 値); } } public String tablescreen // 最大 400 OCCURS { get { return getString(29750, 1275); } セット { setString(29750, 1275, 値); } } public StringArray tablescr // INDEXED REDEFINE OF ABOVE { get { return getStringArray(29750, 85, 15, 85); } セット { setStringArray(29750, 85, 15, 85, 値); } } public StringArray duedates { get { return getStringArray(29750, 10, 15, 85); } セット { setStringArray(29750, 10, 15, 85, 値); } } public StringArray accts { get { return getStringArray(29760, 6, 15, 85); } セット { setStringArray(29760, 6, 15, 85, 値); } } public DecimalArray taxs { get { return getDecimalArray(29766, 9, 2, 15, 85); } セット { setDecimalArray(29766, 9, 2, 15, 85, 値); } } public DecimalArray ペナルティ { get { return getDecimalArray(29775, 9, 2, 15, 85); } セット { setDecimalArray(29775, 9, 2, 15, 85, 値); } } public DecimalArray の関心 { get { return getDecimalArray(29784, 9, 2, 15, 85); } セット { setDecimalArray(29784, 9, 2, 15, 85, 値); } } public DecimalArray 手数料 { get { return getDecimalArray(29793, 9, 2, 15, 85); } セット { setDecimalArray(29793, 9, 2, 15, 85, 値); } } public DecimalArray totalpaids { get { return getDecimalArray(29802, 13, 2, 15, 85); } セット { setDecimalArray(29802, 13, 2, 15, 85, 値); } } public BinaryArray seqnums { get { return getBinaryArray(29815, 2, 15, 85); } セット { setBinaryArray(29815, 2, 15, 85, 値); } } public StringArray billnums { get { return getStringArray(29817, 8, 15, 85); } セット { setStringArray(29817, 8, 15, 85, 値); } } パブリック StringArray フィールド日付 { get { return getStringArray(29825, 10, 15, 85); } セット { setStringArray(29825, 10, 15, 85, 値); } } public String tableoc2 // データの 1 つの OCCUR { get { return getString(31025, 85); } セット { setString(31025, 85, 値); } } public String duedatex { get { return getString(31025, 10); } セット { setString(31025, 10, 値); } } public String acctx { get { return getString(31035, 6); } セット { setString(31035, 6, 値); } } public Decimal taxx { get { return getDecimal(31041, 9, 2); } セット { setDecimal(31041, 9, 2, 値); } } パブリック 10 進ペナルティ x { get { return getDecimal(31050, 9, 2); } セット { setDecimal(31050, 9, 2, 値); } } public Decimal interestx { get { return getDecimal(31059, 9, 2); } セット { setDecimal(31059, 9, 2, 値); } } public Decimal Feesx { get { return getDecimal(31068, 9, 2); } セット { setDecimal(31068, 9, 2, 値); } } public Decimal totalpaidx { get { return getDecimal(31077, 13, 2); } セット { setDecimal(31077, 13, 2, 値); } } public int seqnumx { get { return getBinary(31090, 2); } セット { setBinary(31090, 2, 値); } } public String billnumx { get { return getString(31092, 8); } セット { setString(31092, 8, 値); } } public String fielddatex { get { return getString(31100, 10); } セット { setString(31100, 10, 値); } } }

public StringArray getStringArray(int i)
    {
        return getStringArray(getOffSet(i, ColumnSize[i]), ColumnSize[i], ArrayLength, 0, i);
    }

public class StringArray : AnyArray
    {
        public String this[int i]
        {
            get { return rec.getString(offset + disp * (i - 1), len); }
            set { rec.setString(offset + disp * (i - 1), len, value); }
        }

        public StringArray(basicRecord rec, int offset, int len, int ArrayLen, int Disp = 0, int ColumnNo = 0)
            : base(rec, offset, len, ArrayLen, Disp, ColumnNo)
        {
            //do nothing. Basclass constructor handles this
        }

        public bool Find(string compare)
        {
            for (int i = 1; i <= arrayLen + 1; i++)
            {
                if (this[i].Trim() == compare.Trim())
                    return true;
            }
            return false;
        }
    }

    public class AnyArray
    {
        protected int offset;
        protected int len;
        protected int arrayLen;
        protected int disp;
        protected basicRecord rec;
        public int columnNo;

        public AnyArray()
        {
        }

        public AnyArray(basicRecord rec, int offset, int len, int ArrayLen, int Disp = 0, int ColumnNo = 0)
        {
            this.rec = rec;
            this.offset = offset;
            this.len = len;
            this.arrayLen = ArrayLen;
            this.disp = (Disp == 0) ? len : Disp;
            this.columnNo = ColumnNo;
        }
    }
于 2013-12-11T15:14:06.227 に答える