Compose causing problems in .NET application

SOLVED

The following code is a translation of a VB macro to create a new time card. The issue that I am having is that the Compose statement on line #37 set the view's parent to null. This causes the SetValue on line #49 to fail with a NullReferenceException. Everything works if I set the field variable after the compose statement (move line #10 to be after line #37). As I said, this is a straight translation of the VB script generated by the macro recorder.

Any ideas?

  1. ACCPAC.Advantage.DBLink mDBLinkCmpRW;
  2. mDBLinkCmpRW = _session.OpenDBLink(DBLinkType.Company, DBLinkFlags.ReadWrite);
  3. DBLink mDBLinkSysRW;
  4. mDBLinkSysRW = _session.OpenDBLink(DBLinkType.System, DBLinkFlags.ReadWrite);
  5. View UPTIMECARD2header;
  6. ViewFields UPTIMECARD2headerFields;
  7. UPTIMECARD2header = mDBLinkCmpRW.OpenView("UP0031");
  8. UPTIMECARD2headerFields = UPTIMECARD2header.Fields;
  9. View UPTIMECARD2detail1;
  10. ViewFields UPTIMECARD2detail1Fields;
  11. UPTIMECARD2detail1 = mDBLinkCmpRW.OpenView("UP0032");
  12. UPTIMECARD2detail1Fields = UPTIMECARD2detail1.Fields;
  13. View UPTIMECARD2detail2;
  14. ViewFields UPTIMECARD2detail2Fields;
  15. UPTIMECARD2detail2 = mDBLinkCmpRW.OpenView("UP0127");
  16. UPTIMECARD2detail2Fields = UPTIMECARD2detail2.Fields;
  17. View UPTIMECARD2detail3;
  18. ViewFields UPTIMECARD2detail3Fields;
  19. UPTIMECARD2detail3 = mDBLinkCmpRW.OpenView("UP0128");
  20. UPTIMECARD2detail3Fields = UPTIMECARD2detail3.Fields;
  21. View UPTIMECARD2detail4;
  22. ViewFields UPTIMECARD2detail4Fields;
  23. UPTIMECARD2detail4 = mDBLinkCmpRW.OpenView("UP0042");
  24. UPTIMECARD2detail4Fields = UPTIMECARD2detail4.Fields;
  25. View UPTIMECARD2detail5;
  26. ViewFields UPTIMECARD2detail5Fields;
  27. UPTIMECARD2detail5 = mDBLinkCmpRW.OpenView("UP0141");
  28. UPTIMECARD2detail5Fields = UPTIMECARD2detail5.Fields;
  29. UPTIMECARD2header.Compose(new[] {UPTIMECARD2detail1, UPTIMECARD2detail2});
  30. UPTIMECARD2detail1.Compose(new[] {UPTIMECARD2header, UPTIMECARD2detail3, UPTIMECARD2detail4});
  31. UPTIMECARD2detail2.Compose(new[] {UPTIMECARD2header});
  32. UPTIMECARD2detail3.Compose(new[] {UPTIMECARD2detail1});
  33. UPTIMECARD2detail4.Compose(new[] {UPTIMECARD2detail1, UPTIMECARD2detail5});
  34. UPTIMECARD2detail5.Compose(new[] {UPTIMECARD2detail4});
  35. UPTIMECARD2headerFields.FieldByName("EMPLOYEE").SetValue("095547264", true); //' Employee
  36. UPTIMECARD2headerFields.FieldByName("TIMECARD").SetValue("1", false); //' Timecard
  37. UPTIMECARD2headerFields.FieldByName("PEREND").SetValue(new DateTime(2017, 10, 27).ToOADate(), false); //' Period End Date
  38. temp = UPTIMECARD2header.Exists;
  39. UPTIMECARD2headerFields.FieldByName("PROCESSCMD").SetValue("1", false); //' Process Command Code

  • +1
    verified answer

    You're missing code to actually initialize the timecard. Primarily the first two lines:

        UPTIMECARD1header.Init
        UPTIMECARD1header.RecordCreate VIEW_RECORD_CREATE_NOINSERT

        UPTIMECARD1header.Fields("EMPLOYEE").Value = aEmpNo                    ' Employee
        UPTIMECARD1header.Fields("TIMECARD").Value = aTCCode                   ' Timecard
        UPTIMECARD1header.Fields("PEREND").Value = aPeriodEnd                  ' Period End Date

        UPTIMECARD1header.Fields("PROCESSCMD").PutWithoutVerification ("1")    ' Process Command Code
        UPTIMECARD1header.Process

        UPTIMECARD1header.Fields("TCARDDESC").PutWithoutVerification (aDesc)   ' Description
        If aSourceApp <> "" Then
            UPTIMECARD1header.Fields("SRCEAPPL").PutWithoutVerification (aSourceApp)     ' Source Application
        End If
        UPTIMECARD1header.Fields("SEPARATECK").PutWithoutVerification (aSeparateCheck)      ' Print on Separate Check

  • 0 in reply to Django

    Thank you. I thought that it might be something like this but those statements are not in the VB macro that I recorded.