Hvala na odgovoru Milane,
Prvo da odgovorim- koristim VS.NET 2003, a aplikaciju pisem u C#. Dosao sam do kraja aplikacije i ne mogu da uradim storno u bazi.
U bazi Northwind, u tabeli "Products", u koloni 'UnitsInStock' koja je smallint upisan je broj komada tog proizvoda, a u "Order_Details" tabeli, u koloni 'Quantity' upisano je koliko je kog proizvoda naruceno.
Kada zelim da storniram narudzbinu, tj. da broj narucenih proizvoda vratim na stanje u tabelu "Products", tu stanem i ne znam sta treba da radim, tj. kako da vratim te proizvode na stanje. Potreban mi je savet kako da to uradim, odnosno preko kojih kontrola mogu da uradim storniranje...
Pozdrav,
Vlada
DataRelation detailsProducts;
detailsProducts = custDS1.Relations.Add("detProd",
custDS1.Tables["Products"].Columns["ProductID"],
custDS1.Tables["Order Details"].Columns["ProductID"]);
foreach (DataRow prodRow in custDS1.Tables["Products"].Rows)
{
foreach (DataRow orderRow in prodRow.GetChildRows(detailsProducts))
{
object a = prodRow["ProductID"];
object b = prodRow["UnitsInStock"];
object c = orderRow["Quantity"];
Response.Write(a + " " + b + " " + c + "<br>");
}
}
E vidim da si uznapredovao i to je super a kod koji si naveo radi posao, ali obzirom da imas citanje iz order details i vracanje stanja, predlazem ti da to uradis na sledeci nacin: naime order details moze imati vise stavki za koje treba da uradis storno a ako jedna ne uspe onda nisi stornirao ceo order znaci otprilike mala modifikacija tvog koda: (e da ja ovo pisem u VB... ali mislim da ce ti dati ideju, kako da to C#-jes :-D)
znaci ovu proceduru pozivas tako sto joj prosledjujes id narudzbine koju zelis da storniras
Private Sub Storniraj(sifranarudzbine as datatype sifre robe)
Imporst.system.data.sqlclient
Try
Dim Cn As SqlConnection
Cn = New SqlConnection("user id=username;password=passwor;data source=ip adresa sql servera;initial catalog=ime baze;")
Cn.Open()
Transaction = Cn.BeginTransaction(IsolationLevel.ReadCommitted)
Dim cmdOsnovno As SqlCommand = New SqlCommand("sp_CitajOrderDetails", Cn)
cmdOsnovno.CommandType = CommandType.StoredProcedure
cmdOsnovno.Parameters.Add("@sifra", sfr)
Dim rdr As SqlDataReader = cmdOsnovno.ExecuteReader()
Do While rdr.Read
Dim cmdStorno As SqlCommand = New SqlCommand("sp_Storniraj", Cn)
cmdStorno.CommandType = CommandType.StoredProcedure
cmdStorno.Parameters.Add("@roba", rdr("sifra artikla"))
cmdStanje.Parameters.Add("@kolicina", rdr("komada artikla"))
cmdStanje.Transaction = Transaction
cmdStanje.ExecuteNonQuery()
Loop
Transaction.Commit()
Catch ex As Exception
'rollback transaction
Transaction.Rollback()
MsgBox("Doslo je do greske:" & ex.Message)
Throw
Finally
cn.close
cn.dispose
End Try
End Sub
E ovo ce ti dati ideju kako dalje, izvini ako se neka greska potkrala ali sam radio copy paste nekih delova tako da da ti stvorim sliku.
E sta je poenta:
1. recimo iz neke liste uzimas sifru narudzbine koju zelis da storniras, ubacujes je ovoj proceduri
2. otvaras konekciju i vezujes je za transakciju
3. citas podatke o toj narudzbini znaci koji su artikli u njoj i koje su kolicine
4. za svaki taj podatak vezujes novu komandu koja menja kolicinu na stanju tog artikla tj radi + za taj broj
5. tu komandu vezujes za transakciju
6. kada je sve proslo ok izvrsavas transakciju i radis upis, ako je bilo sta lose proslo u upisu nema transakcije i nije uradjeno storno to hvatas kod trans rollback
7. ja koristim stored procedure, tako da u prvoj sp_citaj order details moras da napravis citanje detalja narudzbine a u drugoj sp_storno radis update tabele gde ti je kolicina
eto nadam se da pomaze, svakako bi trebalo da ides u ovom pravcu, tj da uneses u svoj kod transakciju za pocetak, a kasnije da krenes da razmisljas o daljem unapredjenju arhitekture.
poz
P.S.
ovaj problem oko racunanja + - ulaza ili ok ozapisa kolicine posebno je stvarno problem, ja koristim oba nacina, imam polje za kolicinu i njega menjam i to je dobro jer mi je manje opterecenje aplikacije, ali naravno cuvam sve + - i onda mi to sluzi za proveru.
***If there is a will, there is a way***