Debbie Erickson 0 Posted March 8, 2022 Hi. I'm getting a strange (to me) error when debugging a project. The project contains an application and a dll. I have both subprojects open in a project group. I have set some breakpoints in a function within the dll. The functions are initially called from the application. In the dll's function, I have a local variable that's being assigned to. Immediately after the assign statement, I tried to inspect what was in the local variable. The local variable is of a custom-defined class type. When I hit the breakpoint to see what is in that variable called "vo", I get an error message of "error inspecting vo - expression error" Is this related to my debugger settings? In the project, I turned off optimization. Can somebody maybe help me understand and fix this? The first loop checks for a count on a list. The debugger is showing that the count is 1. So the assignment of position 0 should have retrieved the data to the local variable of "vo". Below the code are my project settings for the debugging. function UpdateVendOrdCarrier(Order: TsqlOrderRecord; aVendorCode: string = ''; showWarning: boolean = false): boolean; var i: integer; j: integer; k: integer; CurrCarrierType: char; CurrCarrier: string; CurrShipCode: string; CurrShipMinWk: byte; CurrShipMaxWk: byte; cst: TsqlCustomerRecord; vo: TsqlVendOrdRecord; ShipToState: string; ShipToZip: string; //ManualCarrier: boolean; vsp: TVendorShippingPointRecord; NonStandardWarehouseUsed: boolean; nonDefaultWareHouseCarrId: Integer; carriers: TCarrierList; dcId: string; changed: boolean; lastUsedDc: string; warnings: string; begin changed := FALSE; // for all vendors, recheck the Carriers, this could be because of ShipTo Changes // or we added an Item that changes the Carrier for this Vendor Order result := false; for i := 0 to Order.VendOrdList.count - 1 do begin vo := Order.VendOrdList[i]; if ((aVendorCode = '') or ((aVendorCode <> '') and (vo.VendorCode.data = aVendorCode))) and ((not (vo.RecordState in [rsDelete, rsDeleted]))) // No Changes to invoiced Vendor Orders and ((vo.Status.data = ' ') or (Order.OrderType.data = 'Q')) then begin // Use the Ship To Customer State ShipToState := Order.ShipToCustRec.State.data; ShipToZip := Order.ShipToCustRec.ZipCode.data; // If there is an Installer then use the Installers State for k := 0 to Order.CustomerList.count - 1 do begin if (not (Order.CustomerList[k].RecordState in [rsDelete, rsDeleted])) and (Order.CustomerList[k].TypeCode.data = 'I') then begin cst := TsqlCustomerRecord.CreateAndLoadCustomer(Order.CustomerList[k].CustomerOID.data); ShipToState := cst.State.data; ShipToZip := cst.ZipCode.Data; FreeAndNil(cst); break; end; end; CurrCarrierType := ' '; CurrCarrier := vo.ActlCarrier.data; //ManualCarrier := (vo.Carrier.data <> '') and (vo.ActlCarrier.data <> '') and // (vo.ActlCarrier.data <> vo.Carrier.data); // if uOrderCarrierService.TOrderCarrierService.Instance.ManuallyCarrierChangesOnly(vo, NonStandardWarehouseUsed) then // CurrCarrierType := vo.CarrierType.data; CurrShipCode := vo.ShipCode.data; CurrShipMinWk := vo.ShipMinWk.data; CurrShipMaxWk := vo.ShipMaxWk.data; NonStandardWarehouseUsed := false; vsp := vo.VendorRecord.ShippingPointList.GetShippingPoint(ShipToState); lastUsedDc := ''; if not assigned(vsp) then begin // ShipToState := CurrentLocation.CoAddr.State.data; vsp := vo.VendorRecord.ShippingPointList.GetShippingPoint(CurrentLocation.CoAddr.State.data); end; for j := 0 to vo.VendDtlList.Count - 1 do begin if assigned(vsp) and (vo.VendorCode.data = 'TDQ') and (vsp.DCIdentifier.data <> vo.VendDtlList[j].DCIdentifier.data) then begin if WarehouseManagementSystem.DCCanShip(vsp.DCIdentifier.Data) and WarehouseManagementSystem.DCCanShip(vo.VendDtlList[j].DCIdentifier.data) then begin if (not TCarrierList.IsCollectCarrier(vo.ActlCarrier.Data)) then NonStandardWarehouseUsed := true; // <> 'CLCT'; dcId := vo.VendDtlList[j].DCIdentifier.data; end else if WarehouseManagementSystem.DCCanShip(vo.VendDtlList[j].DCIdentifier.data) then begin if (length(lastUsedDc) > 0) and (lastUsedDc <> vo.VendDtlList[j].DCIdentifier.data) then NonStandardWarehouseUsed := True else if not WarehouseManagementSystem.DCUsesCarrier(vo.VendDtlList[j].DCIdentifier.data, vo.ActlCarrier.data) then NonStandardWarehouseUsed := True; lastUsedDc := vo.VendDtlList[j].DCIdentifier.data; end; end; end; if (assigned(vo.VendOrdLastMileCarrierRecord) and (not string.IsNullOrWhiteSpace(vo.VendOrdLastMileCarrierRecord.ProviderName.Data))) then begin AdjustLeadTimesForLMC(vo); CurrShipMinWk := vo.ShipMinWk.data; CurrShipMaxWk := vo.ShipMaxWk.data; end; if uOrderCarrierService.TOrderCarrierService.Instance.ManuallyCarrierChangesOnly(vo, not NonStandardWarehouseUsed, function(venddtlLine: TsqlVendDtlRecord): boolean var tmsContext: TTmsContext; begin tmsContext := TTmsContext.CreateNew(vo); try SystemSetVendDtlCarrierLine(tmsContext, venddtlLine, result); finally FreeAndNil(tmsContext); end; end ) then begin CurrCarrierType := vo.CarrierType.data; end; for j := 0 to vo.VendDtlList.Count - 1 do begin // After and Item is added, this function gets called and we may have a // combination of N, T or I on the Items. // After F4 Carrier selection, this functioon is also called, // but the Carrier For will set the CarrierType on all of the existing Items // to match the carrier type of the selected carrier. if (not (vo.VendDtlList[j].RecordState in [rsDelete, rsDeleted])) and (vo.VendDtlList[j].Status.data <> 'X') and (vo.VendDtlList[j].VendorCode.data = vo.VendorCode.data) then begin case vo.VendDtlList[j].carrierType.Data of 'N': if CurrCarrierType = ' ' then CurrCarrierType := 'N'; 'T': if CurrCarrierType in [' ', 'N'] then CurrCarrierType := 'T'; 'I': if CurrCarrierType in [' ', 'N', 'T'] then CurrCarrierType := 'I'; end; if vo.VendDtlList[j].ShipMaxWk.data > CurrShipMaxWk then begin CurrShipMinWk := vo.VendDtlList[j].ShipMinWk.data; CurrShipMaxWk := vo.VendDtlList[j].ShipMaxWk.data; end; if pos(vo.VendDtlList[j].ShipCode.Data, 'ISO') > pos(CurrShipCode, 'ISO') then CurrShipCode := vo.VendDtlList[j].ShipCode.Data; end; end; if (not vo.ManLeadTime.data) or (trim(vo.ShipCode.AsString) = '') then begin changed := changed or (vo.ShipCode.AsString <> currShipCode) or (vo.ShipMinWk.Data <> currShipMinWk) or (vo.ShipMaxWk.data <> currShipMaxWk); vo.ShipCode.AsString := CurrShipCode; vo.ShipMinWk.data := CurrShipMinWk; vo.ShipMaxWk.data := CurrShipMaxWk; end; HandleNonDefaultWarehouseMoves(changed, vo, CurrCarrierType, NonStandardWarehouseUsed); HandleDefaultCarrierChanges(changed, Result, Order, vo, ShipToState, ShipToZip, CurrCarrierType, NonStandardWarehouseUsed, j); DcDeliveryProgramService.TDCDeliveryProgramService.Instance.UpdateCarriersForDcDeliveryProgram(vo.OrderRecord, ((CurrCarrier <> vo.ActlCarrier.data) and not (TDCDeliveryProgramService.Instance.CarrierManaullySet(vo)) ) ); ExpectedArrivalDateService.TExpectedArrivalDateService.Instance.UpdateArrivalDateIfNeeded(vo); UpdateTmsCarrierSettings(vo, true); TOrderSystemLibrary.Instance.EnsureCurrentFeightValues(vo); if aVendorCode <> '' then break; end; end; // only display the carrier options changed if something really changed. changed := changed and ( (vo.ShipCode.AsString <> currShipCode) or (vo.ShipMinWk.Data <> currShipMinWk) or (vo.ShipMaxWk.data <> currShipMaxWk) or (vo.Carrier.Data <> CurrCarrier) or (vo.CarrierType.Data <> CurrCarrierType) ) ; if changed and showWarning then begin NBFDialogs.NBFMessageDlg(format('%s: Carrier options carrier has been changed, Please confirm delivery options.', [vo.VendorCode.Data]), mtWarning, [mbok], mrok, 0, false, 'Verify Carrier Options'); end; end; Share this post Link to post