[ mayana @ 05.02.2009. 07:55 ] @
evo ovako, trazila sam ovde po forumu, ali kod mene to ne radi. imam tabelu uplateisplate i u njoj datum racuna i rok placanja. kod pregleda u datagridview treba da mi se redovi kod kojih je rokplacanja manji od 5 dana u odnosu na danasnji datum zacrvene, tj da program javi kad je nesto blizu krajnjeg roka, gde je blizu 5 dana. koristim c# 2008 i ms sql 2005. treba mi neki between 'danasnji datum' and 'danasnji - 5', videla sam ovde neke odgovore: "danas - interval 5 day", "sysdate-5 and sysdate" i sl. al to kod mene ne radi.probala sam ovako nesto "select * from uplateisplate where rokplacanja between " + (Convert.ToInt32(DateTime.Now) - 5) + "and DateTime.Now" ali ni to ne radi, zbog convertovanja. molim za pomoc, hvala
[ mayana @ 05.02.2009. 09:13 ] @
nasla sam!

SELECT *
FROM UPLATEISPLATE
WHERE (RokPlacanja BETWEEN GETDATE() - 5 AND GETDATE())
[ Fedya @ 05.02.2009. 09:52 ] @
SELECT datediff(dd, dateadd(dd, -5, getutcdate()), getutcdate())

Za operacije sa datumom koristi datediff, to ti je najbolja varijanta za sve operacije posto mozes da specificiras da li ces raditi sa danima/godinama/sekundama bilo sta.
Tako sam za danas minus 5 dana korisio dateadd(dd, -5, getutcdate())

Za razliku izmedju dana koristi datediff iz istog razloga.
[ mayana @ 05.02.2009. 09:59 ] @
mislis da ovo moje resenje nije dobro?
[ .:Marvin:. @ 05.02.2009. 10:35 ] @
datediff je super f-ja, posto, kao sto Fedya rece, mozes da biras da li ces da oduzimas / sabiras dane, mesece i godine.
Pre ili kasnije ce ti opet zatrebati, pa je bolje da pocnes sto pre da je koristis.
[ mayana @ 05.02.2009. 11:04 ] @
ok, ok, ali to bi mi bilo resenje da on u datagrid stavi SAMO te koji ispunjavaju uslov. a meni trebaju u pregledu svi podaci ali da su samo oni koji odgovaraju uslovi oznaceni crveno. malo sam se glupirala pa probala sa "foreach (DataRow d in ds.Tables["uplateisplate"].Rows)
if (DateTime.Now.ToLongDateString() - d["rokplacanja"].ToString() <= "00/05/0000")
//oboj crveno"

i naravno ne radi. ne mogu u okviru dataseta i datagrida da ubacim taj select sto ste mi dali da mi ne bi dao samo te podatke.
[ mmix @ 05.02.2009. 11:42 ] @
Ovo je .NET pitanje ili SQL pitanje?
[ Fedya @ 05.02.2009. 11:43 ] @
To je vec pitanje za .NET forum.
Ono sto vidim je da ti pokusavas da obijs red u dataset-u a ne u datagridu. Ako se dobro secam (nisam radio sa datasetovima/gridom vec par godina ;) ) grid ima event OnBind ili tako nesto, koji dobija jedan po jedan red, u tom eventu treba da proveris da li odgovora uslovu i obojis ga. No, ponavljam, sigurno ces dobiti bolji odgovor na .NET forumu.
[ mayana @ 05.02.2009. 11:58 ] @
u pravu ste, ovo sad kad se ovako postavi pitanje nije vise sql vec .net. probacu taj onbind mada meni nije bitno kada se izvrsava nego kako s obzirom da sad moram raditi sa datetime.now il sta vec. sve sto meni treba je kako oduzeti dva datuma tako da se dobije broj dana izmedju njih. hvala

[Ovu poruku je menjao mayana dana 05.02.2009. u 13:10 GMT+1]
[ dusty @ 05.02.2009. 13:21 ] @
Koristi event datagridview-a CellFormatting gde ces da proveris da li je to kolona sa datumom, i onda preko indeksa reda menjaj backColor.
Za datum pogledaj ovo:
Code:
DateTime nekiDatum;
TimeSpan ts;
nekiDatum = DateTime.Now;
nekiDatum = nekiDatum.AddDays(-10);

ts = DateTime.Now.Subtract(nekiDatum);
if(ts.Days > 5) System.Diagnostics.Debug.WriteLine("Trt");
[ mayana @ 06.02.2009. 07:05 ] @
ok, uradila sam ovo: foreach (DataRow r in ds.Tables["uplateisplate"].Rows)
{
DateTime nekiDatum=Convert.ToDateTime(r["rokplacanja"].ToString());

TimeSpan ts;


ts = DateTime.Now.Subtract(nekiDatum);
if (ts.Days < 5 && ts.Days > 0)
{
MessageBox.Show(ts.Days.ToString());

}

to mi sad nadje te datume i svaki put kad nadje ispise koliko dana je ostalo, tako sam samo proverila da li radi. i radi, samo ne znam sad kako da uzmem taj red i da ga obojim.
[ mayana @ 06.02.2009. 11:23 ] @
resila!!!
foreach (DataRow r in ds.Tables["uplateisplate"].Rows)
{
DateTime nekiDatum = Convert.ToDateTime(r["rokplacanja"].ToString());
TimeSpan ts;
ts = DateTime.Now.Subtract(nekiDatum);
if (ts.Days < 5 && ts.Days > 0)
{
int Index = ds.Tables["uplateisplate"].Rows.IndexOf(r);
this.dgvPregledUI.Rows[Index].DefaultCellStyle.BackColor = Color.Red;

}
}
[ mayana @ 06.02.2009. 11:37 ] @
nije bilo dobro. radilo je da pokaze koji su vec trebali da se plate u zadnjih 5 dana. a koji ce trebati u narednih 5 dana radi ovako:
foreach (DataRow r in ds.Tables["uplateisplate"].Rows)
{
DateTime nekiDatum = Convert.ToDateTime(r["rokplacanja"].ToString());
TimeSpan ts;
DateTime novi;
novi = DateTime.Now.AddDays(5);
ts = novi.Subtract(nekiDatum);
if (ts.Days < 5 && ts.Days > 0)
{
int Index = ds.Tables["uplateisplate"].Rows.IndexOf(r);
this.dgvPregledUI.Rows[Index].DefaultCellStyle.BackColor = Color.Red;

}
}
[ mmix @ 06.02.2009. 11:50 ] @
Ovo tvoje resenje mi se cini mnogo "prljavim" jer zavisi od sinhronizacije bindinga izmedju dataseta i grid-a. Sto nisi poslusala dusty-ev predlog sa eventom na gridu?
[ mayana @ 06.02.2009. 12:26 ] @
zato sto ne znam kako. nisam bas toliko strucna kao vi... uostalom, ovo je mala aplikacijica i bitno mi je da radi ono sto sam htela. nece biti 300.000 podataka. verovatno i nece izaci odavde (ja sam pripravnik i to mi je bilo dato kao zadatak da se vidi koliko se razumem u c#).

[Ovu poruku je menjao mayana dana 06.02.2009. u 13:37 GMT+1]
[ mmix @ 06.02.2009. 12:48 ] @
Pa ako ti senior kolega radi code review ovako nesto ne moze da mu promakne i moze samo lose da se odrazi po razumevanje C#-a; sto se strucnosti tice, ko pita ne skita, bolje da si pitala dusty-a za obrazlozenje (siguran sam da bi ti pomogao, nije mu prvi put), niko od nas se nije naucen rodio i nije sramota pitati kad nesto nije jasno.
U svakom slucaju sad nisam pri radnom okruzenju-u ali ako ti niko ne odgovori do veceras okacicu ti konkretan primer kako se ovo radi u grid events.


[ dusty @ 06.02.2009. 13:40 ] @
U pravu je mmix, ako ovo vidi neki senior programer, ne samo da neces dobiti posao, nego je vrlo moguce da ces i batine da dobijes

Shalu na stranu, zaboravljas da je vrlo moguce da ce neko da uradi sortiranje, i onda nije mapiranje 1 prema 1 (grid prema tabeli).
Ima vise nacina da to uradis, jedan nacin je 'manuelno', da nakon bindovana pozoves ovaj kod:
Code:

DataRow row;
DateTime date;
TimeSpan ts;

foreach (DataGridViewRow gridRow in dgvPregledUI.Rows)
{
        row = (DataRow)gridRow.DataBoundItem;
        date = (DateTime)row["rokPlacanja"];
        ts = DateTime.Now.Subtract(date);

         if(ts.Days >= 0 && ts.Days <= 5)
               gridRow.DefaultCellStyle.BackColor = Color.Red;

}

sto u principu nije mnogo lose. Ali ako dodajes podatke u tu tabelu, onda ces morati nako svakog dodavanja novog reda da pozivas tu metodu.

Drugi nacin, po meni bolji, je preko eventa CellFormatting (znaci, ides na properties DataGridView, pa na munjicu , nadjes ovaj event i dupli klik), jer imas vecu kontrolu nad celijom sa datumom (npr. da umesto datuma ispise "Kasni 3 dana !"), a i nema greske od gore.
Code:
void dgvPregledUI_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
     DateTime date;
     TimeSpan ts;

     if (dgvPregledUI.Columns[e.ColumnIndex].DataPropertyName == "rokPlacanja")
     {
          date = (DateTime)e.Value;
          ts = DateTime.Now.Subtract(date);
          if (ts.Days >= 0 && ts.Days <= 5){
              dgvPregledUI.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
              e.Value = "Kasni " + ts.Days.ToString() + " dana !";
          }
      }
}

[ DarkMan @ 06.02.2009. 14:35 ] @
Citat:
dusty
Code:
void dgvPregledUI_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
     DateTime date;
     TimeSpan ts;

     if (dgvPregledUI.Columns[e.ColumnIndex].DataPropertyName == "rokPlacanja")
     {
          date = (DateTime)e.Value;
          ts = DateTime.Now.Subtract(date);
          if (ts.Days >= 0 && ts.Days <= 5){
              dgvPregledUI.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
              e.Value = "Kasni " + ts.Days.ToString() + " dana !";
          }
      }
}


Umesto:
Code:

dgvPregledUI.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;


preporucio bih:
Code:

e.CellStyle.BackColor = Color.Red;

[ dusty @ 06.02.2009. 15:18 ] @
Citat:

preporucio bih:
Code:

e.CellStyle.BackColor = Color.Red;


Da, definitivno ! Moja greska pri kopiranju. Takodje, sada vidim, uslovi za proveru perioda su takodje pogresni, no dobro, pojenta je tu
[ mayana @ 09.02.2009. 07:05 ] @
e, dragi moji, ovde niko od "senior programera" nema pojma o c#, svi jos drljaju onaj stari fox... samo otaljavam pripravnicki jer u mom divnom Zrenjaninu nema teorije da te neko primi kao programera normalnim putem. no, hvala u svakom slucaju, divni ste!