Mass updating sales lines

markcle
Member Posts: 65
Hi All
Written a few small extensions and need to write one that updates all sales lines with no shipments. We frequently have to swap out items for replacements (but need to keep the old ones as we may sell later)
So I need to create a codeunit to swap the item on sales lines. I've got it working except for when the sales order is released.
How do I check if it's open, reopen and re-release after update?
Here's where I got to with the code unit
Written a few small extensions and need to write one that updates all sales lines with no shipments. We frequently have to swap out items for replacements (but need to keep the old ones as we may sell later)
So I need to create a codeunit to swap the item on sales lines. I've got it working except for when the sales order is released.
How do I check if it's open, reopen and re-release after update?
Here's where I got to with the code unit
var // Local var SalesLine: record "Sales Line"; SalesHeader: record "Sales Header"; ReleasesSalesLine: record "Sales Line"; LineCount: Integer; SalesOrderList: Text; begin LineCount := 0; // Find all sales lines with the item on SalesLine.SETRANGE("Document Type", 1); SalesLine.SETRANGE(Type, SalesLine.Type::Item); SalesLine.SetFilter("No.", '= %1', SourceItemNo); IF SalesLine.FINDSET(TRUE) THEN REPEAT SalesHeader.Get(SalesLine."Document Type", SalesLine."Document No."); SalesLine.Validate("No.", NewItemNo); // Change item no and validate SalesOrderList += SalesLine."Document No." + ' Line: ' + Format(SalesLine."Line No.") + '\'; SalesLine.MODIFY(TRUE); LineCount := LineCount + 1; // Update line count var UNTIL SalesLine.NEXT = 0; Message('Done ' + '\' + SalesOrderList); end;
0
Answers
-
Hello!
Try this one
IF SalesLine.FINDSET(TRUE) THEN
REPEAT
SalesHeader.Get(SalesLine."Document Type", SalesLine."Document No.");
LastState := SalesHeader.Status; //LastState - integer
SalesHeader.Status := SalesHeader.Status::Open ; //Don't use VALIDATE
SalesHeader.MODIFY; //Don't run MODIFY trigger
SalesLine.Validate("No.", NewItemNo); // Change item no and validate
SalesOrderList += SalesLine."Document No." + ' Line: ' + Format(SalesLine."Line No.") + '\';
SalesLine.MODIFY(TRUE);
SalesHeader.Status := LastState;
SalesHeader.MODIFY;
LineCount := LineCount + 1; // Update line count var
UNTIL SalesLine.NEXT = 0;
But best way:
1. reopen Sales Order using CU 414 "Release Sales Document" function Reopen
2. Release Sales Order after Line modification using same CU1 -
Thanks a lot. That seems to work, but did get this:
An implicit conversion is being performed from a value of type 'Enum "Sales Document Status"' to a value of type 'Integer'. This conversion can lead to unexpected runtime issues. This warning will become an error in a future release.
Fixed by using this:
LastState: Enum "Sales Comment Document Type";0
Categories
- All Categories
- 73 General
- 73 Announcements
- 66.6K Microsoft Dynamics NAV
- 18.7K NAV Three Tier
- 38.4K NAV/Navision Classic Client
- 3.6K Navision Attain
- 2.4K Navision Financials
- 116 Navision DOS
- 851 Navision e-Commerce
- 1K NAV Tips & Tricks
- 772 NAV Dutch speaking only
- 617 NAV Courses, Exams & Certification
- 2K Microsoft Dynamics-Other
- 1.5K Dynamics AX
- 320 Dynamics CRM
- 111 Dynamics GP
- 10 Dynamics SL
- 1.5K Other
- 990 SQL General
- 383 SQL Performance
- 34 SQL Tips & Tricks
- 35 Design Patterns (General & Best Practices)
- 1 Architectural Patterns
- 10 Design Patterns
- 5 Implementation Patterns
- 53 3rd Party Products, Services & Events
- 1.6K General
- 1.1K General Chat
- 1.6K Website
- 83 Testing
- 1.2K Download section
- 23 How Tos section
- 252 Feedback
- 12 NAV TechDays 2013 Sessions
- 13 NAV TechDays 2012 Sessions