Create Delivery Order from Sales Order browser

I have a button in SalesOrder browser screen by which I open DeliveryOrder Editor screen to create delivery order based on selected sales order.

Everything is working except the DeliveryOrderLine data is not showing.

here is by code in sales order browser


public void createDoFromSo() {
    SalesOrder salesOrder = salesOrdersTable.getSingleSelected();
    if (salesOrder != null) {
        DeliveryOrder deliveryOrder = metadata.create(DeliveryOrder.class);
        deliveryOrder.setSalesOrder(salesOrder);
        deliveryOrder.setCustomerProfile(salesOrder.getCustomerProfile());
        deliveryOrder.setCompany(salesOrder.getCompany());
        deliveryOrder.setPlant(salesOrder.getPlant());
        deliveryOrder.setCurrency(salesOrder.getCurrency());
        deliveryOrder.setSalesperson(salesOrder.getSalesperson());
        deliveryOrder.setShippingPoint(salesOrder.getShippingPoint());
        deliveryOrder.setDocDate(timeSource.currentTimestamp());
        int lastNum = 0;
        for (SalesOrderLine soLine : salesOrder.getSalesOrderLine()) {
            DeliveryOrderLine doLine = metadata.create(DeliveryOrderLine.class);
            doLine.setSalesOrderLine(soLine);
            doLine.setMaterial(soLine.getMaterial());
            doLine.setPlanShipDate(soLine.getPromisedShipDate());
            doLine.setTransportMode(soLine.getTransportMode());
            doLine.setUnitOfMeasure(soLine.getUnitOfMeasure());
            doLine.setBalanceQuantity(soLine.getQuantityBase().subtract(soLine.getDoQuantity()));
            doLine.setQuantity(doLine.getBalanceQuantity());
            doLine.setDeliveryOrder(deliveryOrder);
            doLine.setQuantityUsed(BigDecimal.ZERO); //creating lineNumber 
            doLine.setLineNumber(lastNum + 1);
            doLine.setDeliveryOrder(deliveryOrder);
        }
        openEditor(deliveryOrder, WindowManager.OpenType.NEW_TAB).addCloseWithCommitListener(() -> salesOrdersDs.refresh());
    } else {
        showNotification("Please select a row to copy", NotificationType.HUMANIZED);
    }
}

I also tried to load order line and used this additional code in above as alternative try


//Load Order lines since the current view doesnt include it 
LoadContext<SalesOrderLine> loadContext = new LoadContext<>(SalesOrderLine.class);
loadContext.setView("salesOrderLineH-view");
loadContext.setQueryString("select e from erp$SalesOrderLine e " + " where e.salesOrder.id = :so").setParameter("so", salesOrder.getId());
List<SalesOrderLine> orderLines = dataManager.loadList(loadContext);

and here is by Delivery Order editor


@Override
protected void postInit() {
    super.postInit();
    salesOrderField.addValueChangeListener(e -> loadSalesOrder());
    if (PersistenceHelper.isNew(getItem())) {
        salesOrderField.setEditable(true);
        customerProfileField.setEditable(true);
    }
}

loadSalesOrder() in postInit is used when the user selects the sales order manually to create a Delivery Order. This works ok

There should be a collection attribute in DeliveryOrder. So depending on the type of the collection do:


    deliveryOrder.setDeliveryOrderLines(new ArrayList());
    deliveryOrder.getDeliveryOrderLines().add(doLine);

Worked wonderfully. Thank you Konstantin

Hi Konstantin
please find attached the error message.

Hi Konstantin
I wanted to try this way (follows) but didn’t find an option

deliveryOrder.setDeliveryOrderLine(doLine)

Am I doing something not correct?

Hi Mortoza,

Probably you should also add each newly created DeliveryOrderLine to the corresponding collection of the new DeliveryOrder instance.