Create a DeviceHub PrintJob
Thu Mar 13 2025 14:22:06 GMT+0000 (Coordinated Universal Time)
public PXAction<SOShipment> printShipmentWithDialog;
[PXButton]
[PXUIField(DisplayName = "Print Shipment (Select Printer)", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
protected void PrintShipmentWithDialog()
{
var tmsg = new TraceMessageCollector();
tmsg.Start();
try
{
var shipment = Base.Document.Current;
if (shipment == null)
throw new PXException("No Shipment Selected.");
tmsg.Add($"Processing shipment: {shipment.ShipmentNbr}");
// Get available printers
List<SMPrinter> printers = GetAvailablePrinters();
if (printers == null || printers.Count == 0)
throw new PXException("No printers are available in DeviceHub.");
tmsg.Add($"Found {printers.Count} available printers.");
// Get the user's default printer
SMPrinter defPrinter = GetDefaultPrinterForUser();
if (defPrinter != null)
tmsg.Add($"User default printer: {defPrinter.Description}");
// Show selection dialog for the printer
SMPrinter selectedPrinter = ShowPrinterSelectionDialog(printers, defPrinter);
if (selectedPrinter == null)
throw new PXException("No printer selected.");
tmsg.Add($"Selected printer: {selectedPrinter.Description}");
// Define report parameters
var parameters = new Dictionary<string, string>
{
["ShipmentNbr"] = shipment.ShipmentNbr
};
string description = $"Shipment Print Job for {shipment.ShipmentNbr}";
// Send the print job to DeviceHub
CreateDeviceHubPrintJob("SO642000", parameters, selectedPrinter, description, tmsg);
tmsg.Add($"Print job sent successfully for shipment: {shipment.ShipmentNbr}");
}
catch (Exception ex)
{
tmsg.Add($"Error in PrintShipmentWithDialog: {ex.Message}", MsgLevel.Error);
throw;
}
finally
{
tmsg.Send();
}
}
private List<SMPrinter> GetAvailablePrinters()
{
return SelectFrom<SMPrinter>
.View.Select(Base)
.RowCast<SMPrinter>()
.ToList();
}
private SMPrinter GetDefaultPrinterForUser()
{
var userPref = SelectFrom<UserPreferences>
.Where<UserPreferences.userID.IsEqual<@P.AsGuid>>
.View.Select(Base, PXAccess.GetUserID())
.TopFirst;
if (userPref?.DefaultPrinterID == null)
return null;
return SelectFrom<SMPrinter>
.Where<SMPrinter.printerID.IsEqual<@P.AsGuid>>
.View.Select(Base, userPref.DefaultPrinterID)
.TopFirst;
}
private SMPrinter ShowPrinterSelectionDialog(List<SMPrinter> printers, SMPrinter defaultPrinter)
{
if (printers == null || printers.Count == 0)
return null;
// Default to user printer or first available
return defaultPrinter ?? printers.FirstOrDefault();
}
private void CreateDeviceHubPrintJob(string reportID, Dictionary<string, string> parameters, SMPrinter printer, string description, TraceMessageCollector tmsg)
{
tmsg.Start();
tmsg.Add($"Creating print job for {reportID} using printer: {printer.Description}");
string safeDescription = description.Length > 50 ? description.Substring(0, 50) : description;
PrintSettings printSettings = new PrintSettings
{
PrinterID = printer.PrinterID,
NumberOfCopies = 1,
PrintWithDeviceHub = true,
DefinePrinterManually = false
};
SMPrintJobMaint graph = PXGraph.CreateInstance<SMPrintJobMaint>();
graph.LongOperationManager.StartAsyncOperation(ct =>
graph.CreatePrintJob(printSettings, reportID, parameters, safeDescription, ct)
);
tmsg.Add("Print job successfully queued.");
}



Comments