Avatar billede simsen Mester
02. maj 2007 - 21:35 Der er 8 kommentarer og
2 løsninger

Indsætte 3 forskellige select tabeller i repeater

Hejsa,

Jeg har en debat tabel, hvor jeg gerne vil have følgende ud i en repeater:
Overskrift AntalSvar og SenesteIndlæg

Overskrift på alle debatindlæg. Antal Svar på det konkrete debatindlæg. Seneste indlæg/svar på det konkrete indlæg/svar - hvis der ikke er nogle svar, skal det være dato på indlæg.

Først vil jeg databinde til select af alle debatindlæg (Den går fint) - så vil jeg hente antal svar ud. Selve sql statement er der ikke problemer (har testet med en alm. label og et int tal) - men hvordan får jeg det for hver række i den første tabel og hvordan får jeg det skrevet ud i repeateren?

Min kode indtil nu:
<asp:Repeater ID="repDebatIndlaeg" runat="server">
            <HeaderTemplate>
                <table border="0" cellpadding="0" cellspacing="0" width="100%">
                    <tr>
                        <td>
                            <table border="0" cellpadding="0" cellspacing="0" width="100%">
                                <tr style="background-color: #25933c; color: #ffffff">
                                    <td style="vertical-align: top; text-align: right;">
                                        Antal indlæg ialt:
                                        <asp:Label ID="lblIndlaegIalt" runat="server" Text="Label"></asp:Label>                                       
                                    </td>
                                    <td style="width: 10px"></td>
                                </tr>
                            </table>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <table border="0" cellpadding="0" cellspacing="0">
                                <tr>
                                    <td style="height: 10px"></td>
                                </tr>
                                <tr>
                                    <td style="width: 20px;"></td>
                                    <td style="width: 400px">
                                        <b>Emne</b>
                                    </td>
                                    <td style="width: 10px"></td>
                                    <td style="width: 100px">
                                        <b>Antal indlæg</b>
                                    </td>
                                    <td style="width: 10px"></td>
                                    <td style="width: 200px">
                                        <b>Seneste indlæg</b>
                                    </td>
                                </tr>
                                <tr>
                                    <td colspan="6">
                                        <hr />
                                    </td>
                                </tr>
            </HeaderTemplate>
            <ItemTemplate>
                                <tr >
                                    <td style="width: 20px;"></td>
                                    <td>
                                        <asp:HyperLink ID="lnkEmne" runat="server" Text='<%# Eval("Overskrift") %>' NavigateUrl='<%# "~/Debat.aspx?id=" + Eval("DebatId") %>'></asp:HyperLink>
                                    </td>
                                    <td style="width: 10px"></td>                                       
                                    <td style="text-align: left;">
                                        <asp:Label ID="lblAntalIndlaeg" runat="server" Text='<%# Eval("DebatNr") %>'></asp:Label>
                                    </td>
                                    <td style="width: 10px"></td>
                                    <td>
                                        <asp:Label ID="lblSenesteIndlaeg" runat="server" Text='<%# Eval("Dato") %>'></asp:Label>
                                    </td>
                                </tr>
                                <tr>
                                    <td colspan="6">
                                        <hr />
                                    </td>
                                </tr>                                                             
            </ItemTemplate>                                                           
            <FooterTemplate>
                            </table>
                        </td>
                    </tr>
                </table>
            </FooterTemplate>
        </asp:Repeater>

Codebehind:

if (!IsPostBack)
        {
            try
            {
                DataTable Debat = null;
                if (debatapi.GetDebat(ref Debat) == Status.Success)
                {
                    int tael = 0;

                    for (int i = 0; i < Debat.Rows.Count; i++)
                    {
                        tael = Convert.ToInt32(Debat.Rows[i]["DebatId"]);
                        DataTable DebatCount = null;

                        if (debatapi.GetCountAnswers(tael, ref DebatCount) == Status.Success)
                        {
                            DebatCount.Rows[i]["DebatNr"] = tael;
                        }
                    }
                    repDebatIndlaeg.DataSource = Debat.DefaultView;
                    repDebatIndlaeg.DataBind();
                }
            }
            catch
            {
            }
        }

Når jeg kører fejlen, får jeg i "Run to Curser" mode følgende fejl:

IndexOutOfRangeException There is no row at position 1. - fejlen kommer ved:

if (debatapi.GetCountAnswers(tael, ref DebatCount) == Status.Success)
                        {
                            DebatCount.Rows[i]["DebatNr"] = tael;
                        }


Håber nogen kan hjælpe mig med at løse problemet.....jeg har arbejdet på det hele dagen og ikke kunnet finde ud af, hvad der går galt....

Mvh
simsen :-)
Avatar billede jens_klinting Nybegynder
03. maj 2007 - 00:01 #1
Hej,
Mit umiddelbare bud er, at din tællervariabel (i) går fra 0 til antallet af debatter. Når du henter antallet af svar ud for en given debat, så benytter du den samme variabel (i) til at indexere ind i DebatCount. Jeg går ikke ud fra, at antallet af rækker i Debat og DebatCount altid følges ad? Hvis du får 1 række ud med antallet af svar i den pågældende debat, så skal der vel stå:

DebatCount.Rows[0]["DebatNr"] = tael;

Men når det så er sagt (og forhåbentlig løser problemet :o)), så synes jeg, at det virker som en dyr måde at få hentet antallet af svar pr. debat ud på. Det kan helt sikkert laves i et hug i sql'en, så du for hver debat udtrækker debattens felter (det du har liggende i Debat) og antallet af svar i én og samme DataRow.

Mvh.
Jens
Avatar billede jens_klinting Nybegynder
03. maj 2007 - 00:05 #2
Hov, jeg glemte noget.

Hvis du får antallet af svar i debatten trukket ud i et hug sammen med data'ene for debatterne, så kan du nøjes med én DataTable. Dermed kan du jo bare databinde og få vist debattens data + antallet af svar.

Mvh.
Jens
Avatar billede simsen Mester
03. maj 2007 - 06:29 #3
Hejsa Jens,

Jeg tror du har fat i noget......... For nej, jeg får jo ikke samme antal ud....(tror jeg). Der vil jo ikke altid være nogle svar for et indlæg....

Jeg giver dig lige min tabel og de to selects:

Tabel DebatIndlaeg:
DebatId    DebatSvar    DebatNr    Overskrift    BrugerId    Dato    VistAntalGange    Tekst
1    0    0    Overskrift1    1    10-10-2007 14:14:14    0    Tekst 1
2    0    0    Overskrift2    1    11-10-2007 14:14:14    0    Tekst 2
3    0    0    Overskrift3    1    11-10-2007 15:14:14    0    Tekst 3
4    1    1    Svar: Overskrift 1    1    11-10-2007 15:14:14    0    Svar 1
5    1    1    Svar: Overskrift 1    1    11-10-2007 15:14:14    0    Svar 2
6    1    1    Svar: Overskrift 1    3    11-10-2007 15:14:14    0    Svar 3
7    1    3    Svar: Overskrift 3    3    12-10-2007 15:14:14    0    Svar 4
8    1    2    Svar: Overskrift 2    2    13-10-2007 15:14:14    0    Svar 5
9    1    3    Svar: Overskrift 3    1    13-10-2007 15:15:14    0    Svar 6
10    1    1    Svar: Overskrift 1    4    13-10-2007 15:16:14    0    Svar 7
11    1    2    Svar: Overskrift 2    1    14-10-2007 15:14:14    0    Svar 8
12    1    2    Svar: Overskrift 2    1    15-10-2007 15:14:14    0    Svar 9
13    1    3    Svar: Overskrift 3    2    15-10-2007 15:15:14    0    Svar 10
14    0    0    Overskrift4    1    11-10-2007 15:14:14    0    Tekst 3
15    1    14    Svar: Overskrift 14    2    15-10-2007 15:15:14    0    Svar 10

og så mine to selects:
//Henter debatindlæg
    //Bruges til at liste alle debatindlæg
    public Status GetDebat(ref DataTable Debat)
    {
        Status status = Status.Failure;

        DataRow r = null;
        DataTable AItems = new DataTable();

        try
        {
            AItems.Columns.Add(new DataColumn("DebatId", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("DebatSvar", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("DebatNr", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Overskrift", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("BrugerId", Type.GetType("System.String")));
            AItems.Columns.Add(new DataColumn("Dato", Type.GetType("System.String")));

            command.CommandText = "SELECT DebatId, DebatSvar, DebatNr, Overskrift, BrugerId, Dato FROM DebatIndlaeg WHERE DebatNr = 0 ORDER BY Dato DESC";

            //command.Parameters.Clear();
            //command.Parameters.Add(new OleDbParameter("@SessionUserId", SessionUserId));

            OleDbDataReader myReader = command.ExecuteReader();

            //går gennem tabellen og lægger ind i rækker
            while (myReader.Read())
            {
                r = AItems.NewRow();

                try
                {
                    r["DebatId"] = (myReader["DebatId"]);
                    r["DebatSvar"] = (myReader["DebatSvar"]);
                    r["DebatNr"] = (myReader["DebatNr"]);
                    r["Overskrift"] = (myReader["Overskrift"]);
                    r["BrugerId"] = (myReader["BrugerId"]);
                    r["Dato"] = (myReader["Dato"]);
                }
                catch
                { }

                //Tilføjer rækken til datatable
                AItems.Rows.Add(r);
            }

            myReader.Close();
            Debat = AItems;
            status = Status.Success;
        }
        catch
        { }

        return status;
    }

    //Tæller hvor mange svar, der er til et specifik indlæg
    public Status GetCountAnswers(int DebatId, ref DataTable CountAnswers)
    {
        Status status = Status.Failure;

        DataRow r = null;
        DataTable AItems = new DataTable();

        try
        {
            AItems.Columns.Add(new DataColumn("DebatNr", Type.GetType("System.String")));

            command.CommandText = "SELECT COUNT(DebatNr) AS DebatNrSum FROM DebatIndlaeg WHERE DebatNr = @DebatId";

            command.Parameters.Clear();
            command.Parameters.Add(new OleDbParameter("@DebatId", DebatId));

            OleDbDataReader myReader = command.ExecuteReader();

            //går gennem tabellen og lægger ind i rækker
            while (myReader.Read())
            {
                r = AItems.NewRow();

                try
                {
                    r["DebatNr"] = (myReader["DebatNrSum"]);
                }
                catch
                { }

                //Tilføjer rækken til datatable
                AItems.Rows.Add(r);
            }

            myReader.Close();
            CountAnswers = AItems;
            status = Status.Success;
        }
        catch
        { }

        return status;
    }


Hvordan får jeg det i én select. Jeg synes ellers jeg et eller andet sted herinde, har lært, at man kun må have ét select når det drejer sig om count?

mvh
simsen :-)
Avatar billede dr_chaos Nybegynder
03. maj 2007 - 07:57 #4
Prøv med noget i denne stil:
SELECT DebatId, DebatSvar, DebatNr, Overskrift, BrugerId, Dato, COUNT(CASE WHEN DebatId = DebatNr THEN 1 ELSE NULL END) as antalsvar FROM DebatIndlaeg WHERE DebatNr = 0
GROUP BY DebatId, DebatSvar, DebatNr, Overskrift, BrugerId, Dato
ORDER BY Dato DESC
Avatar billede simsen Mester
03. maj 2007 - 08:08 #5
hejsa dr_chaos

Jeg har lige forsøgt at tage select kommandoen i en sql forespørgsel i access - og den skriver at der er en fejl;

Syntax error (missing operator) in query expression COUNT(CASE WHEN DebatId = DebatNr THEN 1 ELSE NULL END)
Avatar billede dr_chaos Nybegynder
03. maj 2007 - 08:44 #6
ah du bruger access.
Hmm er ikke god til access :(
Muligvis:
SELECT di.DebatId, di.DebatSvar, di.DebatNr, di.Overskrift, di.BrugerId, di.Dato, ( SELECT COUNT(di1.DebatNr)FROM DebatIndlaeg di1 WHERE di1.DebatNr =di.DebatId) as antalsvar FROM DebatIndlaeg di WHERE di.DebatNr = 0
ORDER BY di.Dato DESC
Selv om subselects ikke er nogen god ide i sql server, så kan de være at det er din eneste mulighed eller lave en ekstra join.
Avatar billede simsen Mester
03. maj 2007 - 11:39 #7
dr_chaos

Den fremkommer ikke med fejl....men bestemt heller ikke med det den skal.

Jeg opgiver og laver istedet to ekstra felter i tabellen, med AntalSvar og SidsteSvarDato, som jeg opdaterer hver gang, der er et svar.

Smid et svar - du får halvdelen af pointsene for at forsøge at hjælpe mig

mvh
simsen :-)
Avatar billede dr_chaos Nybegynder
03. maj 2007 - 11:54 #8
hvad var det som den kom med ?
Avatar billede simsen Mester
03. maj 2007 - 12:51 #9
Den kom med
DebatId    DebatSvar    DebatNr    Overskrift    BrugerId    Dato    antalsvar
16        0    Overskrift5    1    17-10-2007 15:14:14    0
14        0    Overskrift4    1    11-10-2007 15:14:14    0
3        0    Overskrift3    1    11-10-2007 15:14:14    0
2        0    Overskrift2    1    11-10-2007 14:14:14    0
1        0    Overskrift1    1    10-10-2007 14:14:14    0

Men ligegyldigt.....har lavet det på den anden måde.....og har så spildt en dag på at få min databasekald optimeret......uden held desværre :-)

Tak for din tid alligevel

mvh
simsen :-)
Avatar billede dr_chaos Nybegynder
03. maj 2007 - 14:29 #10
np
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