Avatar billede frosty-dk Nybegynder
19. september 2007 - 10:46 Der er 46 kommentarer og
1 løsning

ikke allow overbooking

Hej eksperter,

Jeg har en calendar og en RadioButtomList.

calendar henter dato og radio har tidspunkter..

database tabellen henter, bookingDate, timeID(fra time tabellen) og customerID(fra customer tabellen).

Det skal være sådan at man ikke kan booke en dato og tid som allerede er booket, så jeg skal hente information fra booking date/time, som kan gøre datoen(hvis alle tider er optaget) eller radiobutton'en "død" hvis den er optaget, det skal laves i DayRender som jeg har oprettet, men hvad skal der stå der inde i for det kommer til at virke? eller hvordan skal jeg gribe det an?

har en stored procedure som henter info fra tabellen via SELECT.. (ReadBooking) 

...håber i forstår og kan hjælpe :D
Avatar billede frosty-dk Nybegynder
19. september 2007 - 11:38 #1
Ser sådan ud indtil videre:

protected void CalendarDate_DayRender(object sender, DayRenderEventArgs e)
    {
        DAL dal = new DAL();

        SqlDataReader dr = dal.GetReader("ReadBooking");

        if (dr.HasRows)
        {
            dr["Booking"].ToString();
        }
    }

men hvad skal der mere ind for at lave funktionen og inde i [""] skal der da godtnok stå navnet på tabellen ikke?

DAL er DataAccesLayer og readbooking er en DataReader
Avatar billede neoman Novice
19. september 2007 - 14:42 #2
At vise en kalender man kan bladre i er illustreret her:
http://msdn2.microsoft.com/en-us/library/ms228044(VS.80).aspx

At disable en given dato er illustreret her:
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.calendarday.isselectable(VS.80).aspx
Avatar billede frosty-dk Nybegynder
19. september 2007 - 17:13 #3
hvis jeg har denne:

if (e.Day.IsToday)
        {
            e.Day.IsSelectable = false;
        }

hvordan siger jeg så det skal være alle dage før den pågældende dag istedet for selve dagen? så folk ikke kan booke igår fx
Avatar billede nielle Nybegynder
19. september 2007 - 19:02 #4
Sådan:

        if (e.Day.Date <= DateTime.Today)
            e.Day.IsSelectable = false;
Avatar billede frosty-dk Nybegynder
19. september 2007 - 19:07 #5
det der .Today er forkert eller noget, hmm der må vel stå IsToday et sted?

evt. nogle med forslag til det med udtræk fra database og læse dato og tid?
Avatar billede nielle Nybegynder
19. september 2007 - 19:24 #6
Ahh, er det det her du mener i stedet?

        if (e.Day.Date < DateTime.Today)
            e.Day.IsSelectable = false;
Avatar billede frosty-dk Nybegynder
19. september 2007 - 19:32 #7
DateTime.Today er ikke rigtigt åbenbart, min VWD sætter fejl under det der Today.
Avatar billede neoman Novice
19. september 2007 - 19:33 #8
havd med Now().Date ?
Avatar billede nielle Nybegynder
19. september 2007 - 19:35 #9
Underligt. Det både compiler og køre korrekt hos mig.
Avatar billede nielle Nybegynder
19. september 2007 - 19:36 #10
Det kræver selvfølgelig at du har:

using System;
Avatar billede frosty-dk Nybegynder
19. september 2007 - 19:39 #11
hmm det skal godtnok ind i DayRender ikke?  og jo har using system  prøver lige now().Date
Avatar billede nielle Nybegynder
19. september 2007 - 19:42 #12
DateTime.Today burde kompilere uanset hvor du har den... Men ja den skal i din CalendarDate_DayRender() for at have den ønskede effekt på din kalender.
Avatar billede frosty-dk Nybegynder
19. september 2007 - 19:44 #13
okay,

skriver if(e.Day.Date < DateTime.Today)  ..fejl i Today som lyder:
"Syster.Web.UI.WebControls.Panel" indeholder ikke en definition af "Today"
Avatar billede nielle Nybegynder
19. september 2007 - 19:46 #14
Underligt at tror at den ligger der, men så udskriv den da i sin fulde længde:

        if (e.Day.Date < System.DateTime.Today)
            e.Day.IsSelectable = false;
Avatar billede frosty-dk Nybegynder
19. september 2007 - 19:50 #15
Mange tak! nu er halvdelen af spørgsmålet lavet, 

men har jo også det sidste hvor den skal tjekke i databasen om der er optaget eller ej efter den der calendar og bulletList:

protected void CalendarDate_DayRender(object sender, DayRenderEventArgs e)
    {
        DAL dal = new DAL();

        SqlDataReader dr = dal.GetReader("ReadBooking");

        if (dr.HasRows)
        {
            dr["BookingID].ToString();
            dr["BookingDate].ToString();
            dr["TimeID].ToString();
            dr["CustomerID].ToString();
        }
    }

Skal på en eller anden måde bruge den overstående information, så den kan se om der er booked på den pågældende dag på den pågældende tidspunkt, hat kigget på msdn2 men hjælper ikke..
Avatar billede nielle Nybegynder
19. september 2007 - 19:57 #16
I hvilken data-type er dit BookingDate gemt i din base?

Hvis det er et datetime felt burde dette virke:

protected void CalendarDate_DayRender(object sender, DayRenderEventArgs e)
    {
        DAL dal = new DAL();

        SqlDataReader dr = dal.GetReader("ReadBooking");

        if (dr.HasRows)
        {
            // dr["BookingID].ToString();
            // dr["BookingDate].ToString();
            // dr["TimeID].ToString();
            // dr["CustomerID].ToString();

            System.DateTime bookingDate = (System,DateTime) dr["BookingDate]
            if (e.Day.Date < bookingDate)
              e.Day.IsSelectable = false;
        }
    }


Selv om det ikke ligefrem kan siges at det er specielt godt performende at kalde basen en gang for hver dato.
Avatar billede frosty-dk Nybegynder
19. september 2007 - 20:06 #17
den er gemt som varchar(50) men er de tikke stadig muligt at lave på den måde næsten?  ..og den der metode går da ikke ind og læser på hvert af tidspunkterne?

kan jeg bare lave komma mellem dem istedet?
Avatar billede nielle Nybegynder
19. september 2007 - 20:09 #18
Gem datoer i dato-feler i basen - det giver nu engang de mest simple løsninger i det lange løb.
Avatar billede frosty-dk Nybegynder
19. september 2007 - 20:17 #19
Har lavet BookingDate til datetime.

Sådan ser den ud, men kommer med fejl:

            dr["BookingID"].ToString();
            dr["BookingDate"].ToString();
            dr["TimeID"].ToString();
            dr["CustomerID"].ToString();

            System.DateTime BookingDate = (System.DateTime) dr["BookingDate"];
            if(e.Day.Date < BookingDate)
                e.Day.IsSelected = false;

under det sidste e.Day kommer der fejl under E'et:
"kan ikke tildeles værdi System.Web.UI.WebControls.CalendarDay.IsSelected, da egenskaben er skrivebeskyttet"
Avatar billede nielle Nybegynder
19. september 2007 - 20:23 #20
1) Dine 4 linjer:

            dr["BookingID"].ToString();
            dr["BookingDate"].ToString();
            dr["TimeID"].ToString();
            dr["CustomerID"].ToString();

har ingen funktion. Dem kan du udelade.

2) En lille trykfejl:

e.Day.IsSelected = false;

skal være:

e.Day.IsSelectable = false;
Avatar billede frosty-dk Nybegynder
19. september 2007 - 20:39 #21
Når jeg prøver at oprette en booking kommer den med følgende fejl:
"The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
The statement has been terminated."

og når jeg indsætter det kode du sagde siger den dette:
"Procedure or function 'ReadBooking' expects parameter '@BookingID', which was not supplied. "

Er der ikke noget helt galt i min database eller noget nu?
Avatar billede nielle Nybegynder
19. september 2007 - 20:41 #22
Hvor er vi henne i din kode - det lyder bestemt ikke som at det er i CalendarDate_DayRender() mere.
Avatar billede frosty-dk Nybegynder
19. september 2007 - 20:43 #23
Altså ReadBooking er en Stored Procedure jeg har lavet som gør dette:
"SELECT * FROM Booking"

og bookingID er jo navnet på parameteret inde i databasen.
Avatar billede nielle Nybegynder
19. september 2007 - 20:46 #24
Der er i hvert fald et eller andet i stykker - din stored procedure referere ikke til BookingID, og så skal den da ikke brokke sig på den måde.
Avatar billede nielle Nybegynder
19. september 2007 - 20:48 #25
I øvrigt skrev du noget om at du fik en fejl når du forsøger at oprrette en booking - og det er da ikke i CalendarDate_DayRender() at det sker.
Avatar billede frosty-dk Nybegynder
19. september 2007 - 20:50 #26
//Sådan ser stored procedueren ud

ALTER PROCEDURE dbo.ReadBooking

    @BookingID int,
    @BookingDate datetime,
    @TimeID int,
    @CustomerID int
AS
    SELECT * FROM Booking
   
    RETURN

//Her er databasen

[Booking]
BookingID - Int
BookingDate - datetime
TimeID - Int
CustomerID - Int

Burde jo ikke være noget galt der?
Avatar billede frosty-dk Nybegynder
19. september 2007 - 20:53 #27
Nej det er en fejl i:

dal.AddParameter("@BookingDate", CalendarDate.SelectedDate.ToString(), DbType.DateTime);

regner jeg med, men heller ikke det vigtigste nu, bare underligt der kom fejl efter jeg ændrede den til datetime, som om calendar ikke laver det rigtigt
Avatar billede nielle Nybegynder
19. september 2007 - 20:54 #28
dal.AddParameter("@BookingDate", CalendarDate.SelectedDate, DbType.DateTime);
Avatar billede frosty-dk Nybegynder
19. september 2007 - 21:00 #29
Jo nu kan den indsætte igen, synes bare den der fejl med det Stord procedure er underlig for databasen og procedueren er jo lavet rigtig? og i DataAccesLayer er det jo bare en standart DataReader.
Avatar billede nielle Nybegynder
19. september 2007 - 21:01 #30
Med det første 4 linjer i din SP fortæller du at du har i sinde at kalde den med 4 parametre: BookingID, BookingDate, TimeID og CustomerID. Det gør du bare ikke, og det brokker den sig over.
Avatar billede frosty-dk Nybegynder
19. september 2007 - 21:03 #31
men hvordan skal den så se ud hvis den skal virke? skal den så bare kalde bookingDate?
Avatar billede nielle Nybegynder
19. september 2007 - 21:04 #32
Vel sådan:

ALTER PROCEDURE dbo.ReadBooking
AS
    SELECT * FROM Booking
   
    RETURN
Avatar billede frosty-dk Nybegynder
19. september 2007 - 21:06 #33
så siger den bare:
"Der blev gjort et ugyldigt forsøg på at læse, mens der ingen data var."

så der skal da de parametre med, men kan man så ikke bare kalde dem for skal jo også bruge timeID til at definere hvilke datoer der er booket eller ej
Avatar billede nielle Nybegynder
19. september 2007 - 21:09 #34
Det lyder da mere som om at der ikke er data i booking-tabellen?

...

Så skal din SP vel se nogenlunde sådan ud, og du skal levere en værdi for @TimeId.

ALTER PROCEDURE dbo.ReadBooking
    @TimeID int,
AS
    SELECT * FROM Booking WHERE TimeId = @TimeId
   
    RETURN
Avatar billede frosty-dk Nybegynder
19. september 2007 - 21:13 #35
der er data i Booking tabellen.

hvorfor skal der where på time?
det er jo for hver dag den skal se hvor mange TimeID der er booket?
og så derfra sige om radioButton skal være selected = false; eller true;
og så hvis alle er false skal den lave selected = false; på calendar datoen?
Avatar billede nielle Nybegynder
19. september 2007 - 21:17 #36
Hvis du ikke har en WHERE del, så:

1) Giver din SELECT dig samtlige data hver gang du kalder den, og:
2) Så skal du slet ikke bruge dine parametre til noget - de kan undværes.

Parametre er argumenter til din SP - altså inddata; de er ikke nødvendige for at du kan trække noget ud. '*' burde sørge for at du fil samtlige cokonner ud.
Avatar billede frosty-dk Nybegynder
19. september 2007 - 21:23 #37
Forstår dig godt, men kan bare ikke få den til det, men bookingen er vel delvistløst nu, så vil ikke tage mere af din tid, smid et svar og du får dine point,

og selvfølgelig mange tak for hjælpen!! smider også lige karma
Avatar billede nielle Nybegynder
19. september 2007 - 21:24 #38
Svar :^)
Avatar billede nielle Nybegynder
19. september 2007 - 21:27 #39
Umiddelbart ville jeg mene at det var BookingDate som du skulle bruge som input parameter til din SP:

ALTER PROCEDURE dbo.ReadBooking
    @BookingDate datetime
AS
    SELECT * FROM Booking WHERE BookingDate = @BookingDate
   
    RETURN


Denne parameter skulle så sættes til e.Day.Date i kaldet.
Avatar billede frosty-dk Nybegynder
19. september 2007 - 21:34 #40
det lyder mere rigtigt synes jeg også, men hvordan er det man kalder den i e.Day.Date?
Avatar billede nielle Nybegynder
19. september 2007 - 22:00 #41
Du skal assigne den med værdien e.Day.Date fordi at du jo har brug for at vide om der er en booknink på netop den dato.
Avatar billede frosty-dk Nybegynder
19. september 2007 - 22:10 #42
ja, men hvordan assigner man den?  ...meget ny i c# :/
Avatar billede nielle Nybegynder
20. september 2007 - 06:52 #43
Det skal gøres via din DAL klasse - prøv at vise koden til den.
Avatar billede frosty-dk Nybegynder
20. september 2007 - 08:53 #44
altså den er lidt stor men den med DataReader er:

    public SqlDataReader GetReader(string SprocName)
    {
        SqlCommand comm = _conn.CreateCommand();
        comm.CommandText = SprocName;
        comm.CommandType = CommandType.StoredProcedure;

        if (_parameters.Count > 0)
        {
            comm.Parameters.AddRange(_parameters.ToArray());
        }

        _conn.Open();
        SqlDataReader dr = comm.ExecuteReader(CommandBehavior.CloseConnection);
        return dr;
    }

men skal SP ikke også have @TimeID fordi den skal læse dem også via where i bookingDate?
Avatar billede nielle Nybegynder
22. september 2007 - 09:45 #45
Du har nogle parametre i din _parameters men de bliver jo aldrig assignet nogen værdi i den viste kode. En af dem - den der svare til BookingDate - skal have sat sin .Value til værdien af e.Day.Date. Hus også at denne parameter skal være defineret til at være af typen SqlDbType.DateTime.
Avatar billede frosty-dk Nybegynder
23. september 2007 - 20:25 #46
jeg har lavet det på en lidt anden måde, men lidt hjælp fra en, som sagde det skulle gøres sådan og sådan, så nu virker det næsten, men mange tak for rådene, de har været uundværlige!
Avatar billede nielle Nybegynder
23. september 2007 - 22:49 #47
Tak for tilbagemeldingen ... det ser man desværre ikke så til her på E.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester