private static void SendSalesOrderDetail(ADOM9Dataset.SalesOrderDetailRow Row) { int send_rows = 0; //Calculamos porque una vez lancemos update perdemos visibilidad del cambio bool deletion = Row.RowState == DataRowState.Deleted; //Ambito de using grande por si debemos usar adaptador en concurrency exception using (SalesOrderDetailTableAdapter OrderDetailTabAdpt = new SalesOrderDetailTableAdapter()) { try { send_rows = OrderDetailTabAdpt.Update(Row); Console.WriteLine("Registros OrderDetail enviados: {0}", send_rows); ReSyncLocalData(OrderDetailTabAdpt, Row.SalesOrderID, deletion); } catch (DBConcurrencyException e) { Console.WriteLine("ERROR de concurrencia. Detalle: {0}", e.Message); Console.WriteLine("Marque X si desea resincronizar con BD: "); if (Console.ReadLine().ToLower() == "x") { ReSyncLocalData(OrderDetailTabAdpt, Row.SalesOrderID, deletion); } ; } catch (Exception e) { Console.WriteLine("ERROR desconocido. Detalle: {0}", e.Message); } } }
private static void ReSyncLocalData(SalesOrderDetailTableAdapter MainAdapter, int HeaderID, bool deletion) { int DetailReceived_rows = 0; int HeaderReceived_rows = 0; HeaderReceived_rows = MainAdapter.FillBySalesOrderID(DataADO.SalesOrderDetail, HeaderID); Console.WriteLine("Registros OrderHeader recibidos (resync): {0}", HeaderReceived_rows); using (SalesOrderHeaderTableAdapter SecondaryAdapter = new SalesOrderHeaderTableAdapter()) { DetailReceived_rows = deletion ? SecondaryAdapter.Fill(DataADO.SalesOrderHeader) : SecondaryAdapter.FillBySalesOrderID(DataADO.SalesOrderHeader, HeaderID); } Console.WriteLine("Registros OrderHeader recibidos (resync): {0}", DetailReceived_rows); }
private static void ADOShowAndManageQuoteDetails(int OrdHeaderID) { bool next_opt = true; ADOM9Dataset.SalesOrderDetailRow [] RelatedOrderDetails; ADOM9Dataset.SalesOrderHeaderRow HeaderRow; //Optimización, no hace falta traer todo. Lo integramos al preguntar //if(DataADO.SalesOrderDetail.Rows.Count == 0) //{ // using (SalesOrderDetailTableAdapter OrderDetailTabAdpt = new SalesOrderDetailTableAdapter()) // { // OrderDetailTabAdpt.Fill(DataADO.SalesOrderDetail); // } //} do { //Recuperamos cabecera y mostramos información de sus detalles HeaderRow = DataADO.SalesOrderHeader.FindBySalesOrderID(OrdHeaderID); Console.WriteLine("Información de detalle asociado a la cabecera escogida (ID {0} - Total acumulado {1})", OrdHeaderID, HeaderRow.TotalDue); //Recuperamos de BD los Order Details asociados y los buscamos a partir del Header para mostrar y seleccionar en métodos posteriores //Siempre encontraremos, aunque un no esta de mas controlar excepción por fallo de conexión //IMPORTANTE: Recalculamos a cada iteración puesto que se reinstancian los objetos al pasar por FILL... try { using (SalesOrderDetailTableAdapter OrderDetailTblAdpt = new SalesOrderDetailTableAdapter()) { OrderDetailTblAdpt.FillBySalesOrderID(DataADO.SalesOrderDetail, OrdHeaderID); } } catch (Exception e) { Console.WriteLine("ERROR recuperando OrderDetails del Header seleccionado. Detalles {0}", e.Message); return; } RelatedOrderDetails = HeaderRow.GetSalesOrderDetailRows(); foreach (ADOM9Dataset.SalesOrderDetailRow OrderDetailRow in RelatedOrderDetails) { Console.WriteLine("ID: {0}" + "\n\t- Producto: {1} " + "\n\t- Cantidad: {2} " + "\n\t- Importe unitario: {3} ", OrderDetailRow.SalesOrderDetailID, OrderDetailRow.ProductID, OrderDetailRow.OrderQty, OrderDetailRow.UnitPrice); } switch (ManageOrderDetailMenu()) { case 0: next_opt = false; break; case 1: ADOEditQuantityQuoteDetail(RelatedOrderDetails); break; case 2: ADOEditUnitCostQuoteDetail(RelatedOrderDetails); break; case 3: ADODeleteQuoteDetail(RelatedOrderDetails); break; case 4: ADOAddQuoteDetail(OrdHeaderID); break; default: Console.WriteLine("\n--- ERROR: Opción incorrecta. Reintentelo --\n"); break; } }while (next_opt); }