Avatar billede krestionsen Nybegynder
19. august 2004 - 15:06 Der er 54 kommentarer og
1 løsning

Datagrid med flere data i et felt

Jeg har tre tabeller:

Moedetabel:
moedeid
dato

MedarbejderMoedetabel:
moedeid
medarbejderid

Medarbejdertabel:
medarbejderid
initialer

Jeg har et dataset, hvor jeg sætter initialer ind i en datgrid ud fra en dato og dataene vises også godt nok, men i hvert sit felt, og det jeg gerne ville have var, at medarbejderne med initialer med f.eks. moedeid 10 blev vist og der kan godt være flere med moedeid 10 og så ville jeg gerne have dem vist i et felt i datagriden som f.eks. jj, ek, ss i stedet for på flere linjer?

public System.Data.DataSet datoMetode(string dato)
    {
        string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=D:\\Fam\\db1.mdb";
        System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);

        string queryString = "SELECT Moede.MoedeID,  Medarbejder.Initialer FROM Medarbejder INNER JOIN (Moede INNER JOIN MedarbejderMoede ON Moede.MoedeID=MedarbejderMoede.MoedeID) ON Medarbejder.MedarbejderID=MedarbejderMoede.MedarbejderID WHERE Moede.Dato = @Dato";
        System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand();
        dbCommand.CommandText = queryString;
        dbCommand.Connection = dbConnection;

        System.Data.IDataParameter dbParam_dato = new System.Data.OleDb.OleDbParameter();
        dbParam_dato.ParameterName = "@Dato";
        dbParam_dato.Value = dato;
        dbParam_dato.DbType = System.Data.DbType.String;
        dbCommand.Parameters.Add(dbParam_dato);

        System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
        dataAdapter.SelectCommand = dbCommand;
        System.Data.DataSet dataSet = new System.Data.DataSet();
        dataAdapter.Fill(dataSet);

        return dataSet;
    }
Avatar billede snepnet Nybegynder
19. august 2004 - 18:39 #1
hej krestionsen :o)

du kan prøve at se om du kan få noget ud af den her : http://www.eksperten.dk/spm/526524

Der er mange måde du kan gøre det på - men der er ikke rigtig nogen smutvej...
F.eks. nedenstående :

Din source skal være så du kan lave en "autobinding (så skal du ud i en noget mere kompliceret sql).

Du laver et nyt objekt du kan binde til, og sørger for at fylde det op så det passer - er sådan set det samme som ovenstående... du laver det bare i din VB kode istedet.

Du laver din helt egen kontrol, og skriver databindingen selv (denne kan du så vælge at lave på mange forskellige måder).

Mvh
Avatar billede krestionsen Nybegynder
20. august 2004 - 10:57 #2
Jeg har kigget på dit link, men får ikke rigtig noget ud af det. Har du ikke et link til en side med et eksempel på asp.net side med en datagrid, der har noget lignende det jeg skal bruge, så jeg kan se på et færdigt eksempel? Du skriver at jeg skal lave noget autobinding med noget mere kompliceret sql, men hvad er det for noget sql jeg skal bruge til det?
Avatar billede snepnet Nybegynder
20. august 2004 - 11:18 #3
det jeg sendte et link til er sådan set et færdigt eksempel på at løse problemstillingen ved at generere en datakilde som du kan binde direkte til med det ønskede resulatat - altså at det der stod i rækker tidligere er lagt ind i én række som kommasepereret tekst.

det jeg mener med det mere komplicerede sql er, at du sådan set godt kan hente data op på en måde så det ser ud som du fordrer, men jeg er ikke speciel superhelt til at lave den slags sql, og synes egentlig også at en "formattering" som den du beskriver hører til lidt højere oppe i programmet - men det kan der jo være delte meninger om :o)
(princippet er det samme... hvad enten du bruger sql-modellen eller C# modellen til det).

Jeg skal ikke afvise at der ligger mere færdige eksempler rundt omkring, men det er ikke noget generel kode du skal skrive... Du skal jo ændre på nogle forhold så de passer præcis til din præsentation under alle omstændigheder.

jeg vil meget gerne hjælpe dig yderligere, men så skal du lægge lidt mere af din kode herud - ellers kan jeg ikke fortælle dig hvor du skal proppe de ekstra ting ind.

mvh
Avatar billede krestionsen Nybegynder
20. august 2004 - 13:07 #4
Her er hele koden, hvor jeg har en datagrid og en kalender og når man trykker på en dato på kalender, bliver dataene vist i datagriden:

<%@ Page Language="C#" %>
<script runat="server">

    string dato = "";
   
        public System.Data.DataSet datoMetode(string dato)
        {
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=D:\\Fam\\db1.mdb";
            System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);
   
            string queryString = "SELECT Moede.MoedeID,  Medarbejder.Initialer FROM Medarbejder INNER JOIN (Moede INNER JOIN MedarbejderMoede ON Moede.MoedeID=MedarbejderMoede.MoedeID) ON Medarbejder.MedarbejderID=MedarbejderMoede.MedarbejderID WHERE Moede.Dato = @Dato";
            System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand();
            dbCommand.CommandText = queryString;
            dbCommand.Connection = dbConnection;
   
            System.Data.IDataParameter dbParam_dato = new System.Data.OleDb.OleDbParameter();
            dbParam_dato.ParameterName = "@Dato";
            dbParam_dato.Value = dato;
            dbParam_dato.DbType = System.Data.DbType.String;
            dbCommand.Parameters.Add(dbParam_dato);
   
            System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
            dataAdapter.SelectCommand = dbCommand;
            System.Data.DataSet dataSet = new System.Data.DataSet();
            dataAdapter.Fill(dataSet);
   
            return dataSet;
        }
   
   
        private void BindGrid()
        {
            dato = Calendar1.SelectedDate.ToShortDateString();
            DataGrid1.DataSource = datoMetode(dato);
            DataGrid1.DataBind();
        }
   
    void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
        dato = Calendar1.SelectedDate.ToShortDateString();
        BindGrid();
    }

</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundColumn DataField="Initialer" HeaderText="Initialer"></asp:BoundColumn>
            </Columns>
        </asp:DataGrid>
        <asp:Calendar id="Calendar1" runat="server" OnSelectionChanged="Calendar1_SelectionChanged"></asp:Calendar>
        <!-- Insert content here -->
    </form>
</body>
</html>
Avatar billede snepnet Nybegynder
21. august 2004 - 14:11 #5
Hej krestionsen - undskyld ventetiden.

Hvis du laver en metode :

private DataTable CreateModifiedTable(DataSet ds)
{
    ...
}

Kan du i datoMetode(string dato)

udskifte return dataSet;
med return CreateModifiedTable(dataSet);

Og du kan så i CreateModifiedTable lave den transformation du fordrer... Den kunne f.eks. se sådan her ud :

private DataTable CreateModifiedTable(DataSet ds)
{
    // original tabel :
    DataTable dt = ds.Tables[0];
   
    // en klon
    DataTable ndt = dt.Clone();
   
    // find alle unikke medarbejdere i den originale tabel og læg dem i collection
    StringCollection moeder = new StringCollection();
   
    foreach(DataRow dr in dt.Rows)
    {
        if(moeder.IndexOf(dr["moedeid"].ToString()) == -1)
            moeder.Add(dr["moedeid"].ToString());
    }           
   
    // lidt nips til brug en løkken
    DataRow[] medarbejderraekker = null;
    DataRow newRow = null;
    string resultingString;
   
    // for hver unikt møde
    foreach(String moede in moeder)
    {
        resultingString = null;
       
        // hentes alle rækker af medarbejdere
        medarbejderraekker = dt.Select(string.Format("moedeid={0}",moede));
       
        // som lægges sammen til en kommasepareret string
        foreach(DataRow dr in medarbejderraekker)
        {
            resultingString += dr["initialer"].ToString() + ",";
        }
   
        // fjern det sidste komma
        if(resultingString.Length>1)
            resultingString = resultingString.Remove(resultingString.Length-1,1);
       
        // opret ny række til den nye tabel
        newRow = ndt.NewRow();
   
        // sæt mødet ind
        newRow["moedeid"] = int.Parse(moede); // jeg går ud fra at dit id er en int
   
        // og den resulterende streng
        newRow["initialer"] = resultingString;   
       
        // og rækken sættes ind i tabellen
        ntd.Rows.Add(newRow);           
    }
    // og retur med tabellen
    return ndt;
}

Jeg har taget det fra det spørgsmål jeg henviste til og rettet det lidt til i forholdt til det du har skrevet... jeg håber ikke jeg har misforstået alt for meget.

det er bare skrevet herude, så jeg ved ikke om det kan kompilere.

Mvh
Avatar billede krestionsen Nybegynder
22. august 2004 - 18:13 #6
Jeg får følgende fejl, når jeg kører koden:

Compiler Error Message: CS0029: Cannot implicitly convert type 'System.Data.DataTable' to 'System.Data.DataSet'

Source Error:



Line 286:            dataAdapter.Fill(dataSet);
Line 287:
Line 288:            return CreateModifiedTable(dataSet);
Line 289:        }
Line 290:
Avatar billede snepnet Nybegynder
22. august 2004 - 21:43 #7
har du ændret signature på metoden ?
public System.Data.DataSet datoMetode(string dato)
til
public System.Data.DataTable datoMetode(string dato)
Avatar billede krestionsen Nybegynder
23. august 2004 - 00:01 #8
Nu er det kommet til at virke, men hvis der f.eks. skal stå "as, jj", så bliver det skrevet ud dobbelt som "as, as, jj, jj"? Hvordan tilføjer jeg ekstra data til datagriden, hvis f.eks. jeg gerne vil have vist datoen fra moede tabellen i datagriden sammen med initialer?
Avatar billede snepnet Nybegynder
23. august 2004 - 08:29 #9
Hej krestionsen....
Jeg har som nævnt bare skrevet det herude, så der kan jo godt være en smutter, men jeg kan nu ikke lige få øje på den nu.
Prøv at smid hele den kode du har nu ud - så tager jeg lige en kigger (databinder du måske 2 gange ?).

Nu har du jo valgt i basen udfra datoen, så hvis du vil nemt over det, kan du bare overføre datoen som parameter til CreateModifiedTable, så du laver dette kald
return CreateModifiedTable(dataSet);
om til
return CreateModifiedTable(dataSet, dato);

og ændrer
private DataTable CreateModifiedTable(DataSet ds)
til
private DataTable CreateModifiedTable(DataSet ds, string dato)

Så kan du tilføje den til den nye tabel i disse linier :

// opret ny række til den nye tabel
newRow = ndt.NewRow();
   
// sæt mødet ind
newRow["moedeid"] = int.Parse(moede);

// sæt datoen (parameter til metoden) ind
newRow["dato"] = dato;
   
// og den resulterende streng
newRow["initialer"] = resultingString;   
       
// og rækken sættes ind i tabellen
ntd.Rows.Add(newRow);           

mvh
Avatar billede krestionsen Nybegynder
23. august 2004 - 15:33 #10
Hej snepnet, jeg vil lige sige, at jeg er meget taknemmelig for hjælpen og hvis du vil have nogle flere point, så er det bare iorden:)

Her er den kode, som jeg har lavet indtil nu og jeg synes ikke rigtig jeg kan se, at jeg databinder 2 gange, men det er du nok bedre til at se? Hvordan får jeg starttiden med, jeg har prøvet det du sagde, men har ikke rigtig kunne få det til at virke?

    public System.Data.DataTable selectKalender(string dato)
    {
        string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db1.mdb");
        System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);

        string queryString = "SELECT  Moede.MoedeID, Moede.StartTid, Moede.SlutTid, Emne.Navn AS EmneNavn, Status.Navn AS StatusNavn, Part.Navn AS PartNavn, Medarbejder.Initialer, Ekstern.Navn AS EksternNavn FROM Ekstern INNER JOIN ((Status INNER JOIN (Part INNER JOIN (((Emne INNER JOIN Moede ON Emne.EmneID = Moede.EmneID) INNER JOIN (Medarbejder INNER JOIN MedarbejderMoede ON Medarbejder.MedarbejderID = MedarbejderMoede.MedarbejderID) ON Moede.MoedeID = MedarbejderMoede.MoedeID) INNER JOIN PartMoede ON Moede.MoedeID = PartMoede.MoedeID) ON Part.PartID = PartMoede.PartID) ON Status.StatusID = Moede.StatusID) INNER JOIN EksternMoede ON Moede.MoedeID = EksternMoede.MoedeID) ON Ekstern.EksternID = EksternMoede.EksternID WHERE (((Moede.Dato)=[@Dato])) ORDER BY Moede.StartTid;";
        System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand();
        dbCommand.CommandText = queryString;
        dbCommand.Connection = dbConnection;

        System.Data.IDataParameter dbParam_dato = new System.Data.OleDb.OleDbParameter();
        dbParam_dato.ParameterName = "@Dato";
        dbParam_dato.Value = dato;
        dbParam_dato.DbType = System.Data.DbType.String;
        dbCommand.Parameters.Add(dbParam_dato);

        System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
        dataAdapter.SelectCommand = dbCommand;
        System.Data.DataSet dataSet = new System.Data.DataSet();
        dataAdapter.Fill(dataSet);

        return CreateModifiedTable(dataSet);
    }


private System.Data.DataTable CreateModifiedTable(System.Data.DataSet ds)
{
    // original tabel :
    System.Data.DataTable dt = ds.Tables[0];


    // en klon
    System.Data.DataTable ndt = dt.Clone();

    // find alle unikke medarbejdere i den originale tabel og læg dem i collection
    StringCollection moeder = new StringCollection();

    foreach(System.Data.DataRow dr in dt.Rows)
    {
        if(moeder.IndexOf(dr["moedeid"].ToString()) == -1)
            moeder.Add(dr["moedeid"].ToString());
    }

    // lidt nips til brug en løkken
    System.Data.DataRow[] medarbejderraekker = null;
    System.Data.DataRow newRow = null;
    string resultingString;

    // for hver unikt møde
    foreach(String moede in moeder)
    {
        resultingString = null;

        // hentes alle rækker af medarbejdere
        medarbejderraekker = dt.Select(string.Format("moedeid={0}",moede));

        // som lægges sammen til en kommasepareret string
        foreach(System.Data.DataRow dr in medarbejderraekker)
        {
            resultingString += dr["initialer"].ToString() + ",";
        }

        // fjern det sidste komma
        if(resultingString.Length>1)
            resultingString = resultingString.Remove(resultingString.Length-1,1);

        // opret ny række til den nye tabel
        newRow = ndt.NewRow();

        // sæt mødet ind
        newRow["moedeid"] = int.Parse(moede); // jeg går ud fra at dit id er en int


        // og den resulterende streng
        newRow["initialer"] = resultingString;

        // og rækken sættes ind i tabellen
        ndt.Rows.Add(newRow);
    }
    // og retur med tabellen
    return ndt;
}
Avatar billede snepnet Nybegynder
23. august 2004 - 16:55 #11
hej igen :o) - det var såmænd så lidt.

Jeg kigger lige på det lidt senere.... men det kunne være fint hvis du sendte den kode hvor der databindes + din page_load, og hvad du ellers har der styrer "arbejdsgangen" i din kode.
(der er ikke noget i det du har sendt der viser hvornår du databinder).

Mvh
Avatar billede krestionsen Nybegynder
23. august 2004 - 22:59 #12
Her er så hele koden og jeg har været hende og se om jeg kunne finde fejlen og jeg er kommet så langt, at hvis jeg kører en metoden med denne sql forespørgsel, så virker det:

string queryString = "SELECT Moede.MoedeID, Medarbejder.Initialer FROM Medarbejder INNER JOIN (Moede INNER JOIN MedarbejderMoede ON Moede.MoedeID = MedarbejderMoede.MoedeID) ON Medarbejder.MedarbejderID = MedarbejderMoede.MedarbejderID WHERE Moede.Dato = @Dato;";

Men hvis jeg kører metoden med den sql forespørgsel, som jeg skal bruge, så skriver den navnene ud dobbelt og jeg har testet sql forespørgslen inde i access og det kommer den med de rigtige data og ikke dobbelt, så jeg tror ikke det er datbindingen den er gal med.

string dato = "";

    private void Page_Load(object sender, System.EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            BindGrid();
        }
    }

    public System.Data.DataTable selectKalender(string dato)
    {
        string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db1.mdb");
        System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);

        string queryString = "SELECT  Moede.MoedeID, Moede.StartTid, Moede.SlutTid, Emne.Navn AS EmneNavn, Status.Navn AS StatusNavn, Part.Navn AS PartNavn, Medarbejder.Initialer, Ekstern.Navn AS EksternNavn FROM Ekstern INNER JOIN ((Status INNER JOIN (Part INNER JOIN (((Emne INNER JOIN Moede ON Emne.EmneID = Moede.EmneID) INNER JOIN (Medarbejder INNER JOIN MedarbejderMoede ON Medarbejder.MedarbejderID = MedarbejderMoede.MedarbejderID) ON Moede.MoedeID = MedarbejderMoede.MoedeID) INNER JOIN PartMoede ON Moede.MoedeID = PartMoede.MoedeID) ON Part.PartID = PartMoede.PartID) ON Status.StatusID = Moede.StatusID) INNER JOIN EksternMoede ON Moede.MoedeID = EksternMoede.MoedeID) ON Ekstern.EksternID = EksternMoede.EksternID WHERE (((Moede.Dato)=[@Dato])) ORDER BY Moede.StartTid;";
        System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand();
        dbCommand.CommandText = queryString;
        dbCommand.Connection = dbConnection;

        System.Data.IDataParameter dbParam_dato = new System.Data.OleDb.OleDbParameter();
        dbParam_dato.ParameterName = "@Dato";
        dbParam_dato.Value = dato;
        dbParam_dato.DbType = System.Data.DbType.String;
        dbCommand.Parameters.Add(dbParam_dato);

        System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
        dataAdapter.SelectCommand = dbCommand;
        System.Data.DataSet dataSet = new System.Data.DataSet();
        dataAdapter.Fill(dataSet);

        return CreateModifiedTable(dataSet);
    }


    private void BindGrid()
    {
        dato = Calendar1.SelectedDate.ToShortDateString();
        DataGrid1.DataSource = selectKalender(dato);
        DataGrid1.DataBind();
    }

void Calendar1_SelectionChanged(object sender, EventArgs e)
{
    dato = Calendar1.SelectedDate.ToShortDateString();
    BindGrid();
}

private System.Data.DataTable CreateModifiedTable(System.Data.DataSet ds)
{
    // original tabel :
    System.Data.DataTable dt = ds.Tables[0];


    // en klon
    System.Data.DataTable ndt = dt.Clone();

    // find alle unikke medarbejdere i den originale tabel og læg dem i collection
    StringCollection moeder = new StringCollection();

    foreach(System.Data.DataRow dr in dt.Rows)
    {
        if(moeder.IndexOf(dr["moedeid"].ToString()) == -1)
            moeder.Add(dr["moedeid"].ToString());
    }

    // lidt nips til brug en løkken
    System.Data.DataRow[] medarbejderraekker = null;
    System.Data.DataRow newRow = null;
    string resultingString;

    // for hver unikt møde
    foreach(String moede in moeder)
    {
        resultingString = null;

        // hentes alle rækker af medarbejdere
        medarbejderraekker = dt.Select(string.Format("moedeid={0}",moede));

        // som lægges sammen til en kommasepareret string
        foreach(System.Data.DataRow dr in medarbejderraekker)
        {
            resultingString += dr["initialer"].ToString() + ",";
        }

        // fjern det sidste komma
        if(resultingString.Length>1)
            resultingString = resultingString.Remove(resultingString.Length-1,1);

        // opret ny række til den nye tabel
        newRow = ndt.NewRow();

        // sæt mødet ind
        newRow["moedeid"] = int.Parse(moede); // jeg går ud fra at dit id er en int


        // og den resulterende streng
        newRow["initialer"] = resultingString;

        // og rækken sættes ind i tabellen
        ndt.Rows.Add(newRow);
    }
    // og retur med tabellen
    return ndt;
}
Avatar billede snepnet Nybegynder
23. august 2004 - 23:05 #13
kan du ikke prøve at dumpe resultatet fra den sql der virker, og den der ikke virker herude ?
Avatar billede snepnet Nybegynder
23. august 2004 - 23:05 #14
Jeg er gået ud fra det du skrev oprindeligt :
Moedetabel:
moedeid
dato

MedarbejderMoedetabel:
moedeid
medarbejderid

Medarbejdertabel:
medarbejderid
initialer
Avatar billede snepnet Nybegynder
23. august 2004 - 23:07 #15
hvis du får det samme møde ud med den samme medarbejder flere gange, så vil det også komme ind i dit grid.
Avatar billede krestionsen Nybegynder
24. august 2004 - 09:50 #16
Resultatet fra den sql der virker er "as, jj"
Resultatet fra den sql der ikke virker er "as, as, jj, jj"

Det er rigtig nok, med de tabeller du er gået ud fra, de har ikke ændret sig.
Avatar billede krestionsen Nybegynder
24. august 2004 - 09:57 #17
Ja, det er rigtig nok, at det kommer ind i min grid flere gange.
Avatar billede krestionsen Nybegynder
24. august 2004 - 10:06 #18
Der er flere data i moedetabel, end dem jeg har skrevet og det var for ikke at forvire alt for meget, med at vise data der ikke skulle bruges til det der skulle laves, men jeg kan godt skrive hele tabellens indhold, hvis du vil have det.
Avatar billede snepnet Nybegynder
24. august 2004 - 10:52 #19
Men hvis det her er hvad du får tilbage når du bare fyrer sql-en af mod databasen, så skal det jo også se sådan ud i griddet...

Resultatet fra den sql der virker er "as, jj"
Resultatet fra den sql der ikke virker er "as, as, jj, jj"

Det ser da bare ud til at den ene sql ikke er helt ok.
Avatar billede krestionsen Nybegynder
24. august 2004 - 11:45 #20
Det mærkelige er, at hvis jeg tester den sql som returnere dobbelt i access, så returnere den rigtigt nok og hvis jeg kobler den metode fra, som du har lavet og laver metoden selectKalender om til et dataset, så returnere den også rigtigt nok "as, jj".
Avatar billede snepnet Nybegynder
24. august 2004 - 12:03 #21
Forstod ikke lige :
"Det mærkelige er, at hvis jeg tester den sql som returnere dobbelt i access, så returnere den rigtigt nok "
hvor returnerer den rigtigt nok så ?
Avatar billede krestionsen Nybegynder
24. august 2004 - 12:27 #22
Ja, sorry, det er skrevet lidt uforståeligt, men det jeg mente, var at hvis jeg tester sql'en i access, så returnere den ikke dobbelt, som den gør, når jeg bruge sql'en i min selectKalender metode.

Det vil sige at den returnere rigtigt nok i access.
Avatar billede snepnet Nybegynder
24. august 2004 - 12:29 #23
jeg har sikkert nosset i det så :o)
- jeg kigger på det lidt senere.
Avatar billede snepnet Nybegynder
24. august 2004 - 19:35 #24
det lyder lidt sjovt... for du det helt samme antal rækker ud med begge sql-er ?
Avatar billede krestionsen Nybegynder
24. august 2004 - 19:55 #25
Ja, hvis jeg tester sql'erne i access og hvis jeg laver metoden om til et dataset og ikke bruger din metode, så får jeg det rigtige antal rækker. Men hvis jeg så laver metoden om til en datatable og bruger din metode, så kikser den ene sql og udskriver navnene dobbelt og med den anden udskriver den navnene rigtigt. Jeg tror ikke det er din metode den er gal med og jeg tror heller ikke det er min sql, men der et eller andet der går helt galt af hinanden.
Avatar billede snepnet Nybegynder
24. august 2004 - 20:04 #26
Kan du ikke debugge, og se hvad der sker på denne linie :
medarbejderraekker = dt.Select(string.Format("moedeid={0}",moede));
med hhv den ene og den anden sql.
Avatar billede krestionsen Nybegynder
25. august 2004 - 21:48 #27
Jeg bruger Web Matrix og tror ikke man kan debugge i web matrix, men jeg låner lige visual studio med hjem i morgen og skriver lige, hvad der sker med den ene og den anden sql, når man debugger dem.
Avatar billede snepnet Nybegynder
25. august 2004 - 22:28 #28
du kan sagtens debugge uden visual studion :
http://samples.gotdotnet.com/quickstart/aspplus/doc/debugcomsdk.aspx
Avatar billede krestionsen Nybegynder
30. august 2004 - 21:08 #29
Ved den første sql, som er den jeg skal bruge, som ikke virker, der får jeg resultatetet 172172172172 og den anden får jeg resultatet 172172 og det passer også meget godt, da 172 er moedeid.
Avatar billede snepnet Nybegynder
30. august 2004 - 22:29 #30
hvad sker der hvis du gør sådan her :
medarbejderraekker = dt.Select(string.Format("distinct moedeid={0}",moede));

hvis du sætter et breakpoint så du kan komme til evaluere medarbejderraekker ville det også være fedt.
Avatar billede krestionsen Nybegynder
31. august 2004 - 00:01 #31
Jeg har prøvet med distinct, men der kommer følgende fejl:

Exception Details: System.Data.SyntaxErrorException: Syntax error: Missing operand after 'moedeid' operator.

Source Error:

Line 292:   
Line 293:            // hentes alle rækker af medarbejdere
Line 294:            medarbejderraekker = dt.Select(string.Format("Distinct moedeid={0}",moede));
Line 295:   
Line 296:
Avatar billede snepnet Nybegynder
31. august 2004 - 08:11 #32
jeg synes det er lidt svært at se hvad problemet er ....
du har mulighed for at skrive datasættet ud. du kan gøre det lige efter

dataAdapter.Fill(dataSet);

du kan skrive det som xml til disken

dataSet.WriteXml(<sti>);

Så kan du kigge på de forskellige outputs, og se hvad forskellen er.
Avatar billede krestionsen Nybegynder
03. september 2004 - 11:19 #33
Jeg har fundet fejlen, den lå i sql'en, hvor jeg har en ekstern medarbejder, som der også kan være flere af lige som medarbejder initialer og hvis der er flere af de eksterne medarbejdere, så skriver den medarbejder initialer dobbelt ud, men hvordan laver får jeg det til at virke så eksterne medarbejdere bliver skrevet ud lige som medarbejder initialer ud fra moedeid fra moede, så der også er komma mellem eksterne medarbejdere(navn) i den metode du har lavet?

Mine tabeller ser således ud:

Moede:
moedeid
dato

EksternMoede:
moedeid
eksternid

Ekstern:
eksternid
navn
Avatar billede snepnet Nybegynder
03. september 2004 - 13:28 #34
hvis fejlen ligger i sql-en vil det nok være det bedste at rette det der... men måske har jeg misforstået dig.

der er rigtig mange der er bedre til at lave sql-er end jeg er, og hvis det er der det resterende problem ligger tror jeg næsten du er bedre hjulpet med at oprette den del af det som et nyt spørgsmål i en "sql-kategori".

det er bestemt ikke fordi jeg ikke vil kigge på det, men så ville jeg nok foretrække at du sendte creates og inserts til at lave en kopi af din base her - med indhold... skal jeg nok prøve at kigge på det. men - jeg tror at det andet vil være hurtigere for dig.

mvh
Avatar billede krestionsen Nybegynder
03. september 2004 - 15:24 #35
Ja, det er lidt dårligt forklaret, men problemet er at når der er flere ekstern medarbejdere, så går der ged i det, men jeg tror at problemet er løst hvis jeg komma separere ekstern medarbejder, da det er fordi jeg kun komma separere medarbejder initialer, fordi det virker fint nok, hvis jeg ikke komma separere medarbejder initialer, så derfor ville jeg høre, hvordan jeg både komma separere medarbejder initialer og ekstern navn på en gang?
Avatar billede krestionsen Nybegynder
03. september 2004 - 15:35 #36
Det er sådan set ikke sql'en, der er problemet(tror jeg), men at jeg kun komma separere medarbejder initialer, fordi det virker fint nok, hvis jeg kun har en medarbejder ekstern(navn) med på mødet, men hvis jeg har flere medarbejder ekstern(navn), så går det galt og den skriver medarbejder initialer dobbelt ud, så jeg tror det er fordi, at medarbejder ekstern(navn) skal komma separeres for at det virker, så derfor ville jeg høre, hvordan jeg både komma separere både medarbejder initialer og ekstern navn på en gang?
Avatar billede snepnet Nybegynder
03. september 2004 - 16:55 #37
nåh.... du kan jo bare bruge den samme kode som den til medarbejdere... det er så bare ikke ét, men to kolonner du vil lave det samme trick på.
var det det du mente ?
Avatar billede krestionsen Nybegynder
03. september 2004 - 22:22 #38
Ja, den skal være i en ny kolonne, men jeg kan ikke få det til at virke med begge to, så hvordan bruger jeg din kode og ligger over i hver sin kolonne?
Avatar billede snepnet Nybegynder
03. september 2004 - 22:28 #39
kan du ikke poste et xml-dump fra et dataset der indeholder de data der giver dig dublerede lininer - så skal jeg nok kigge på det.
(du kan se lidt højere op hvordan).
mvh
Avatar billede krestionsen Nybegynder
03. september 2004 - 22:50 #40
Ja, jeg kan godt se hvordan jeg skal gøre i koden lidt højere oppe med en kollonne, men hvordan gør jeg når det er med 2 kolonner?
Avatar billede snepnet Nybegynder
03. september 2004 - 23:03 #41
Jeg kan ikke fortælle dig det med mindre jeg ved hvordan dit datasæt ser ud... Det var derfor jeg gerne ville have xml-en, men hvis du kan udvælge de rækker det drejer sig om på samme måde som med den interne medarbejder ville det vel være sådan noget her :

    // lidt nips til brug en løkken
    System.Data.DataRow[] medarbejderraekker = null;
    System.Data.DataRow newRow = null;
    string resultingString;
    string newResultingString;

    // for hver unikt møde
    foreach(String moede in moeder)
    {
        resultingString = null;

        // hentes alle rækker af medarbejdere
        medarbejderraekker = dt.Select(string.Format("moedeid={0}",moede));

        // som lægges sammen til en kommasepareret string
        foreach(System.Data.DataRow dr in medarbejderraekker)
        {
            resultingString += dr["initialer"].ToString() + ",";
            newResultingString += dr["andre_initialer"].ToString() + ",";
        }

        // fjern det sidste komma
        if(resultingString.Length>1)
            resultingString = resultingString.Remove(resultingString.Length-1,1);
        if(newResultingString .Length>1)
            newResultingString = newResultingString .Remove(newResultingString .Length-1,1);

        // opret ny række til den nye tabel
        newRow = ndt.NewRow();

        // sæt mødet ind
        newRow["moedeid"] = int.Parse(moede); // jeg går ud fra at dit id er en int


        // og den resulterende streng
        newRow["initialer"] = resultingString;
        newRow["andre_initialer"] = resultingString;

        // og rækken sættes ind i tabellen
        ndt.Rows.Add(newRow);
    }

jeg har dog meget svært ved at forestille mig at ovenstående kan bruges til noget, da jeg ikke kan forestille mig at dine data
Avatar billede snepnet Nybegynder
03. september 2004 - 23:05 #42
crap... det var en kikser at jeg fik postet :o)

Der skulle have stået :
jeg har dog meget svært ved at forestille mig at ovenstående kan bruges til noget, da det på det nærmeste vil kræve at din tabel ikke giver nogen mening overhovedet :o)
(den interne og den eksterne skulle i givet fald stå side om side i tabellen, hvilket jeg har svært ved at tro at de gør).

Såh... igen... jeg bliver nødt til at se dit xml-dump, hvis jeg skal kunne hjælpe dig videre.
mvh
Avatar billede krestionsen Nybegynder
03. september 2004 - 23:40 #43
Ja, så kom der endelig et xml-dump, som jeg har haft svært ved i visual studio, hvor den siger noget med noget sikkerhed, hvor jeg har prøvet en hel masse, men har ikke fået det til at lykkes og nu har jeg så prøvet med web matrix, hvor det endelig lykkedes:)

PS: tabellerne til ekstern medarbejder står under kl. 11:19

Her er et xml-dump, hvor den laver dobbelt data fordi der er flere eksterne medarbejdere og hvis du vil have et xml-dumb, hvor den gør det rigtigt med kun en ekstern medarbejder, så må du lige sige til.

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Table>
    <MoedeID>172</MoedeID>
    <StartTid>09:00</StartTid>
    <SlutTid>11:00</SlutTid>
    <EmneNavn>Tværfagligt Møde</EmneNavn>
    <StatusNavn>Opstart</StatusNavn>
    <PartNavn>Test1</PartNavn>
    <Initialer>JJ</Initialer>
    <EksternNavn>Test3</EksternNavn>
  </Table>
  <Table>
    <MoedeID>172</MoedeID>
    <StartTid>09:00</StartTid>
    <SlutTid>11:00</SlutTid>
    <EmneNavn>Tværfagligt Møde</EmneNavn>
    <StatusNavn>Opstart</StatusNavn>
    <PartNavn>Test1</PartNavn>
    <Initialer>JJ</Initialer>
    <EksternNavn>Test2</EksternNavn>
  </Table>
  <Table>
    <MoedeID>172</MoedeID>
    <StartTid>09:00</StartTid>
    <SlutTid>11:00</SlutTid>
    <EmneNavn>Tværfagligt Møde</EmneNavn>
    <StatusNavn>Opstart</StatusNavn>
    <PartNavn>Test1</PartNavn>
    <Initialer>as</Initialer>
    <EksternNavn>Test3</EksternNavn>
  </Table>
  <Table>
    <MoedeID>172</MoedeID>
    <StartTid>09:00</StartTid>
    <SlutTid>11:00</SlutTid>
    <EmneNavn>Tværfagligt Møde</EmneNavn>
    <StatusNavn>Opstart</StatusNavn>
    <PartNavn>Test1</PartNavn>
    <Initialer>as</Initialer>
    <EksternNavn>Test2</EksternNavn>
  </Table>
</NewDataSet>
Avatar billede krestionsen Nybegynder
04. september 2004 - 00:01 #44
Jeg har lige prøvet med en ekstern medarbejder og som du kan se under EksternNavn, så kommer de samme data, men ved initialer er det som det skal være:

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Table>
    <MoedeID>172</MoedeID>
    <StartTid>09:00</StartTid>
    <SlutTid>11:00</SlutTid>
    <EmneNavn>Tværfagligt Møde</EmneNavn>
    <StatusNavn>Opstart</StatusNavn>
    <PartNavn>Test1</PartNavn>
    <Initialer>JJ</Initialer>
    <EksternNavn>Test2</EksternNavn>
  </Table>
  <Table>
    <MoedeID>172</MoedeID>
    <StartTid>09:00</StartTid>
    <SlutTid>11:00</SlutTid>
    <EmneNavn>Tværfagligt Møde</EmneNavn>
    <StatusNavn>Opstart</StatusNavn>
    <PartNavn>Test1</PartNavn>
    <Initialer>as</Initialer>
    <EksternNavn>Test2</EksternNavn>
  </Table>
</NewDataSet>
Avatar billede snepnet Nybegynder
04. september 2004 - 00:15 #45
hvad er betydningen af ekternnavn ?
(drejer det sig om, at en medarbejder kan have så mange "gæster" med til mødet som han har lyst til)
Avatar billede krestionsen Nybegynder
04. september 2004 - 00:28 #46
Ja, det kan man godt sige og alle de "gæster" skal stå i en kolonne for sig lige som medarbejder initialer, hvor der skal være komma mellem dem hver.
Avatar billede snepnet Nybegynder
04. september 2004 - 00:41 #47
hvis du vil fikse det i koden - skal du lave en ekstra løkke inde i løkken... lidt som det her :

    // lidt nips til brug en løkken
    System.Data.DataRow[] medarbejderraekker = null;
    System.Data.DataRow newRow = null;
    string resultingString;
    string gæster;

    // for hver unikt møde
    foreach(String moede in moeder)
    {
        resultingString = null;

        // hentes alle rækker af medarbejdere
        medarbejderraekker = dt.Select(string.Format("moedeid={0}",moede));

        // som lægges sammen til en kommasepareret string
        foreach(DataRow dr in medarbejderraekker)
        {
                string medarbejder = dr["initialer"].ToString() + ",";
                if(resultingString.IndexOf(medarbejder) != -1)
                    continue;
                   
                resultingString += medarbejder;
                               
                // og så lidt gæster
                DataRow[] gæsteRækker = dt.Select(string.Format("(moedeid={0} AND initialer={1})",moede, medarbejder));
                foreach(DataRow gæst in gæsteRækker)
                {
                    gæster += gæst["EksternNavn"].ToString() + ",";
                }

                // fjern det sidste komma fra gæstelisten
                if(gæster.Length>1)
                    gæster = gæster.Remove(gæster.Length-1,1);
               
        }
       
        // fjern det sidste komma
        if(resultingString.Length>1)
            resultingString = resultingString.Remove(resultingString.Length-1,1);

        // opret ny række til den nye tabel
        newRow = ndt.NewRow();

        // sæt mødet ind
        newRow["moedeid"] = int.Parse(moede); // jeg går ud fra at dit id er en int


        // og den resulterende streng
        newRow["initialer"] = resultingString;

        // og gæsterne
        newRow["EksternNavn"] = gæster;

        // og rækken sættes ind i tabellen
        ndt.Rows.Add(newRow);
    }

Meeeenn.... det er ved ved at være en lidt speget affære synes jeg.
(jeg ved ikke om det bygger... jeg har bare skrevet det i notepad)
Avatar billede snepnet Nybegynder
02. oktober 2004 - 03:11 #48
hej igen krestionsen :o)
jeg prøver at rydde lidt op i gamle sager, så du får et svar her hvis du er frisk på at lukke, men spørg endelig løs :o)
mvh
Avatar billede krestionsen Nybegynder
19. oktober 2004 - 21:18 #49
Ja, du må undskylde jeg ikke har været herinde i lang tid, men har lige fået nyt arbejde og sådan, men nu er jeg tilbage. Du har ret i, at det er ved, at være en speget affære og det sidste eksempel du gav mig, kan jeg ikke få til at virke og ville høre om jeg på en eller anden måde kunne sende dig min database og .aspx fil og få dig til at se på det og ligge løsningen herind og så får du 500 point?
Avatar billede snepnet Nybegynder
19. oktober 2004 - 21:21 #50
hej krestionsen
det kan vi godt sige (men man kan nu ikke give mere end 200 point på ét spørgsmål :o)
hvis du skriver din email her, skal jeg nok skrive til dig - så kan du bare sende det tilbage.
mvh
Avatar billede krestionsen Nybegynder
20. oktober 2004 - 10:31 #51
Min email er krestionsen@ofir.dk, men det skal lige siges, at databasen fylder rimelig meget.
Avatar billede snepnet Nybegynder
22. oktober 2004 - 01:55 #52
private System.Data.DataTable CreateModifiedTable(System.Data.DataSet ds)
    {
        // original tabel:
        System.Data.DataTable dt = ds.Tables[0];

        // en klon
        System.Data.DataTable ndt = dt.Clone();

        // find alle unikke medarbejdere i den originale tabel og læg dem i collection
        StringCollection moeder = new StringCollection();

        foreach(System.Data.DataRow dr in dt.Rows)
        {
            if(moeder.IndexOf(dr["moedeid"].ToString()) == -1)
                moeder.Add(dr["moedeid"].ToString());
        }

        // lidt nips til brug en løkken
        System.Data.DataRow[] medarbejderraekker = null;
        System.Data.DataRow newRow = null;
        string resultingString = String.Empty;
        string gaester = String.Empty;
        string medarbejder = String.Empty;

        // for hver unikt møde
        foreach(String moede in moeder)
        {
            resultingString = null;

            // hentes alle rækker af medarbejdere
            medarbejderraekker = dt.Select(string.Format("moedeid={0}",moede));

            // som lægges sammen til en kommasepareret string
            foreach(System.Data.DataRow dr in medarbejderraekker)
            {   
                medarbejder = dr["initialer"].ToString();
               
                if(resultingString != null && resultingString.IndexOf(dr["initialer"].ToString()) != -1)
                    continue;
                else
                    resultingString += medarbejder + ",";
               
                //og så lidt gaester
                string filter = string.Format("moedeid={0} AND Initialer='{1}'",moede,medarbejder);
                System.Data.DataRow[] gaesteRaekker = dt.Select(filter);

                foreach(System.Data.DataRow gaest in gaesteRaekker)
                {
                    string exname = gaest["EksternNavn"].ToString();
                    if(gaester.IndexOf(exname) == -1)
                        gaester += gaest["EksternNavn"].ToString() + ",";
                    else
                        continue;
                }

                if(gaester.Length>1)
                    gaester = gaester.Remove(gaester.Length-1,1);
            }

            Label1.Text = resultingString;

            // fjern det sidste komma
            if(resultingString.Length>1)
                resultingString = resultingString.Remove(resultingString.Length-1,1);

            // opret ny række til den nye tabel
            newRow = ndt.NewRow();

            // sæt mødet ind
            newRow["moedeid"] = int.Parse(moede); // jeg går ud fra at dit id er en int


            // og den resulterende streng
            newRow["initialer"] = resultingString;
            newRow["EksternNavn"] = gaester;

            // og rækken sættes ind i tabellen
            ndt.Rows.Add(newRow);
        }
        // og retur med tabellen
        return ndt;
    }
}
Avatar billede krestionsen Nybegynder
27. oktober 2004 - 20:20 #53
public System.Data.DataTable selectKalender(string dato)
    {
        string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +      Server.MapPath("db1.mdb");
        System.Data.IDbConnection dbConnection = new    System.Data.OleDb.OleDbConnection(connectionString);

        string queryString = "SELECT Moede.MoedeID, Moede.StartTid, Moede.SlutTid, Emne.Navn AS EmneNavn, Status.Navn AS StatusNavn, Part.Navn AS PartNavn, Medarbejder.Initialer FROM Medarbejder INNER JOIN ((Status INNER JOIN (Part INNER JOIN ((Emne INNER JOIN Moede ON Emne.EmneID=Moede.EmneID) INNER JOIN PartMoede ON Moede.MoedeID=PartMoede.MoedeID) ON Part.PartID=PartMoede.PartID) ON Status.StatusID=Moede.StatusID) INNER JOIN MedarbejderMoede ON Moede.MoedeID=MedarbejderMoede.MoedeID) ON Medarbejder.MedarbejderID=MedarbejderMoede.MedarbejderID WHERE Moede.Dato=[@Dato];";

        System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand();
        dbCommand.CommandText = queryString;
        dbCommand.Connection = dbConnection;

        System.Data.IDataParameter dbParam_dato = new System.Data.OleDb.OleDbParameter();
        dbParam_dato.ParameterName = "@Dato";
        dbParam_dato.Value = dato;
        dbParam_dato.DbType = System.Data.DbType.String;
        dbCommand.Parameters.Add(dbParam_dato);

        System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
        dataAdapter.SelectCommand = dbCommand;
        System.Data.DataSet dataSet = new System.Data.DataSet();
        dataAdapter.Fill(dataSet);

        dataSet.WriteXml("myXmlDoc.xml");

        //return dataSet;
        return CreateModifiedTable(dataSet);
    }

private System.Data.DataTable CreateModifiedTable(System.Data.DataSet ds)
{
    // original tabel :
    System.Data.DataTable dt = ds.Tables[0];

    // en klon
    System.Data.DataTable ndt = dt.Clone();

    // find alle unikke medarbejdere i den originale tabel og læg dem i collection
    StringCollection moeder = new StringCollection();

    foreach(System.Data.DataRow dr in dt.Rows)
    {
        if(moeder.IndexOf(dr["moedeid"].ToString()) == -1)
            moeder.Add(dr["moedeid"].ToString());
    }

    // lidt nips til brug en løkken
    System.Data.DataRow[] medarbejderraekker = null;
    System.Data.DataRow newRow = null;
    string resultingString;

    // for hver unikt møde
    foreach(String moede in moeder)
    {
        resultingString = null;

        // hentes alle rækker af medarbejdere
        medarbejderraekker = dt.Select(string.Format("moedeid={0}",moede));

        // som lægges sammen til en kommasepareret string
        foreach(System.Data.DataRow dr in medarbejderraekker)
        {
            resultingString += dr["initialer"].ToString() + ",";
        }

        // fjern det sidste komma
        if(resultingString.Length>1)
            resultingString = resultingString.Remove(resultingString.Length-1,1);

        // opret ny række til den nye tabel
        newRow = ndt.NewRow();

        // sæt mødet ind
        newRow["moedeid"] = int.Parse(moede); // jeg går ud fra at dit id er en int

        // og den resulterende streng
        newRow["initialer"] = resultingString;

        // og rækken sættes ind i tabellen
        ndt.Rows.Add(newRow);
    }
    // og retur med tabellen
    return ndt;
}
Avatar billede krestionsen Nybegynder
27. oktober 2004 - 20:33 #54
Det virker godt med, at der er komma mellem medarbejderne. Problemet er at jeg ikke kan få vist de andre data(starttid, sluttid, emne, status og klient navn).
Avatar billede snepnet Nybegynder
27. oktober 2004 - 22:38 #55
hej igen :o)

jeg synes du skal tage din sql og smide den ud i sql-kategorien, så får du nok et bud på en mere hensigtsmæssig måde at hente det op på.
...
men... jeg synes du skal definere dig et dataset der er repræsentativt for de data du er interesseret i at vise frem.

det kunne f.eks. være
              MoedeDataSet
Moeder    InterneDeltagere    EksterneDeltagere

og der skulle så være en relation mellem Moeder og InterneDeltagere, og Moeder og EksterneDeltagere.
Så ville du i koden også kunne operere med en unik række med dine mødedata (istedet for at du får de samme oplysninger i mange rækker som nu), og du kunne så udfra moedeid'et hente de interne og eksterne deltagere via relationerner.

mvh
du kan lige se et eksempel på et dataset med relation, og en måde at snuppe childrows via relationen.
http://www.eksperten.dk/spm/554689
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