tirsdag den 2. februar 2010

Infopath date range search with multiple selections

I forbindelse med et Infopath projekt, havde kunden brug for at kunne udvælge specifikke produkter i et datointerval fra en database. Så vidt jeg kunne læse mig frem til, er det ikke noget Infopath understøtter "out-of-the-box", derfor blev løsningen at kode en knap som havde den funktionalitet.

Min søgefunktion var tilknyttet en gentaget tabel og så sådan ud:


En simple opstilling, hvor der er mulighed for at kombinere 3 produkter med et datointerval.







Søg-funktionen:

            //Hent værdien af felterne som du vil have med i søgningen
            XPathNavigator queryField1 = MainDataSource.CreateNavigator().SelectSingleNode("/dfs:myFields/my:produkt1", NamespaceManager);
            string querySeed1 = queryField1.Value;
            XPathNavigator queryField2 = MainDataSource.CreateNavigator().SelectSingleNode("/dfs:myFields/my:produkt2", NamespaceManager);
            string querySeed2 = queryField2.Value;
            XPathNavigator queryField3 = MainDataSource.CreateNavigator().SelectSingleNode("/dfs:myFields/my:produkt3", NamespaceManager);
            string querySeed3 = queryField3.Value;
            XPathNavigator queryField4 = MainDataSource.CreateNavigator().SelectSingleNode("/dfs:myFields/my:date1", NamespaceManager);
            string querySeed4 = queryField4.Value;
            XPathNavigator queryField5 = MainDataSource.CreateNavigator().SelectSingleNode("/dfs:myFields/my:date2", NamespaceManager);
            string querySeed5 = queryField5.Value;
       
        //Sæt værdien for datoen hvis den er tom.
            if (querySeed4.Equals(""))
            {
                querySeed4 = "01-01-2000";   
            }

            if (querySeed5.Equals(""))
            {
                querySeed5 = "01-01-2050";
            }
          
            //Ryd værdien af felterne så de ikke kommer med i søgningen
            queryField1.SetValue("");
            queryField2.SetValue("");
            queryField3.SetValue("");
            queryField4.SetValue("");
            queryField5.SetValue("");
       
           

            //Søgestrengen med de felter fra infopath formularen
            string customQuery = " where [impl] BETWEEN #" +  querySeed4 + "# AND #" + querySeed5 + "# AND ([solution] = '" + querySeed1 + "' OR [solution] = '" + querySeed2 + "' OR [solution] = '" + querySeed3 + "')";
           

           

            //Databaseforbindelsen
            AdoQueryConnection newQuery = (AdoQueryConnection)MainDataSource.QueryConnection;
            string origCommand = newQuery.Command.ToString();

            //Forspørgelsen med vores søgestreng
            newQuery.Command = origCommand + customQuery;

            //Eksekver kommandoen          
            newQuery.Execute();

            //Reset strengen
            newQuery.Command = origCommand;

            //set felterne til det som brugeren har tastet ind!
            queryField1.SetValue(querySeed1);
            queryField2.SetValue(querySeed2);
            queryField3.SetValue(querySeed3);
           
        //Hvis der ikke er tastet dato sættes den til tom ellers værdien af feltet
            if (querySeed4.Equals("01-01-2000"))
            {
                queryField4.SetValue("");
            }
            else
            {
                queryField4.SetValue(querySeed4);
            }

            if (querySeed5.Equals("01-01-2050"))
            {
                queryField5.SetValue("");
            }
            else
            {
                queryField5.SetValue(querySeed5);
            }

Det er lavet med en Access database som ligger i et Sharepoint dok. Men det kunne ligeså vel ligge i en SQL database.

Ingen kommentarer:

Send en kommentar