Just nu i M3-nätverket
Gå till innehåll

Ta fram ett alternativ från varje månad


Stefan - nybörjaren

Rekommendera Poster

Stefan - nybörjaren

Hej! jag har ett problem, Jag vill ta lista ett alternativ från varje månad i min lista men när jag skriver denna kod får jag fram allt som är inlagt i databasen.

 

Så här vill jag ha det

 

Visa och skriv ut tidrapport

Välj period: År 2008 | Månad 01

Välj period: År 2008 | Månad 02

 

Så här är det nu med nedanstående kod.

 

Visa och skriv ut tidrapport

Välj period: År 2008 | Månad 01

Välj period: År 2008 | Månad 01

Välj period: År 2008 | Månad 01

Välj period: År 2008 | Månad 01

Välj period: År 2008 | Månad 01

Välj period: År 2008 | Månad 02

Välj period: År 2008 | Månad 02

 

 

<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & server.mappath("db/bisab.mdb") 
Set RecSet = Server.CreateObject("ADODB.Recordset")
  	sqltext = ("SELECT * FROM data Where nr LIKE '" & Request.QueryString("nr")& "' ORDER BY manad asc, vecka; ")
  	RecSet.Open sqltext, Connect, adOpenStatic, adLockOptimistic 
%>

<% Do Until RecSet.EOF %>

<li><a href="presentera.asp?nr=<% =RecSet("nr") %>&manad=<% =RecSet("manad") %>" target="_blank">Välj period: &Aring;r <% =RecSet("artal") %> | Månad <% =RecSet("manad") %></a><br />
</li>


<% RecSet.MoveNext
Loop %>

<% RecSet.Close
Connect.Close
set Connect = Nothing %>

 

Kan någon hjälpa mig? Försök förklara enkelt...

 

 

 

Länk till kommentar
Dela på andra webbplatser

Du kan antingen prova med DISTINCT:

"SELECT DISTINCT nr, artal, manad, vecka FROM data Where nr LIKE '" & Request.QueryString("nr")& "' ORDER BY manad asc, vecka"

http://www.w3schools.com/sql/func_count_distinct.asp

 

...eller GROUP BY:

"SELECT nr, artal, manad, vecka FROM data Where nr LIKE '" & Request.QueryString("nr")& "' GROUP BY nr, artal, manad, vecka ORDER BY manad asc, vecka"

http://www.w3schools.com/sql/sql_groupby.asp

 

Två andra tips jag vill komma med är att:

1) Alltid parametisera dina frågor som byggar på indata från användare/besökare istället för att konkatenera ihop SQL-frågan!

http://www.sitic.se/publikationer/namnvart/skydd-mot-sql-injektion

 

2) Använda Microsoft.Jet.OLEDB.4.0 istället för Microsoft Access Driver.

 

Typ:

<%
strNr = Trim(Request.QueryString("nr"))

SET objConn = Server.CreateObject("ADODB.Connection")
objConn.open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("db/bisab.mdb") 

SET cmd = server.createobject("ADODB.command")
cmd.activeConnection = objConn
SQLStmt = "SELECT DISTINCT nr, artal, manad FROM data WHERE (nr LIKE '%" & strNr & "%') ORDER BY manad ASC"
cmd.CommandText = SQLStmt
SET objRS = cmd.Execute (, array(strNr))
IF NOT objRS.EOF THEN
DO Until objRS.EOF
tmpNr = objRS("nr")
tmpMan = objRS("manad")
tmpAr = objRS("artal")
%>
<li>
<a href="presentera.asp?nr=<% =tmpNr %>&manad=<% =tmpMan %>" target="_blank">Välj period: År <% =tmpAr %> | Månad <% =tmpMan %></a>
</li>
<%
objRS.MoveNext
Loop
END IF
SET objRS = Nothing
objRS.close
SET cmd = Nothing

objConn.Close
SET objConn = Nothing
%>

 

/Cluster

------------------------------------------------------

I do not fear computers. I fear the lack of them

--------> http://eforum.kicks-ass.net <---------

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Hej! Tack så jättemycket för ditt svar. Ditt förslag till kod funkade utmärkt när jag flyttade om och la objRS.close före SET objRS = Nothing och SET cmd = Nothing

 

Rådet att använda DISTINCT fick jag inte att fungera men du har gett mig nya kunskaper och det tackar jag för!

 

Mvh

Stefan

 

Länk till kommentar
Dela på andra webbplatser

Ah, lite slarvfel av mig där :)

 

Så bra att det fungerade!

tack för poäng :thumbsup:

 

/Cluster

------------------------------------------------------

I do not fear computers. I fear the lack of them

--------> http://eforum.kicks-ass.net <---------

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Hej igen!

 

Nu har jag ett annat problem, har suttit länge och försökt hitta en lösning men jag tänker antagligen fel. Nåväl så här är det.

 

Jag vill lägga in en kontroll på veckonumret då det gäller att mata in en ny tidrapport. Med andra ord om man klickar på skicka tidrapport så skall koden kontrollera att inmatningsveckan ligger senast en vecka efter aktuell vecka innan all data skickas iväg. Användaren tar fram inmatningsveckan via en dropdownlist.

 

             <select name="vecka" id="vecka">
               <option value="<% =RecSet("vecka") %>"><% =RecSet("vecka") %></option>
               <option value="01">01</option>
               <option value="02">02</option>
               <option value="03">03</option>
               <option value="04">04</option>
               <option value="05">05</option>
               <option value="06">06</option>
               <option value="07">07</option>
               <option value="08">08</option>
               <option value="09">09</option>
               <option value="10">10</option>
               <option value="11">11</option>
               <option value="12">12</option>
               <option value="13">13</option>
               <option value="14">14</option>
               <option value="15">15</option>
               <option value="16">16</option>
               <option value="17">17</option>
               <option value="18">18</option>
               <option value="19">19</option>
               <option value="20">20</option>
               <option value="21">21</option>
               <option value="22">22</option>
               <option value="23">23</option>
               <option value="24">24</option>
               <option value="25">25</option>
               <option value="26">26</option>
               <option value="27">27</option>
               <option value="28">28</option>
               <option value="29">29</option>
               <option value="30">30</option>
               <option value="31">31</option>
               <option value="32">32</option>
               <option value="33">33</option>
               <option value="34">34</option>
               <option value="35">35</option>
               <option value="36">36</option>
               <option value="37">37</option>
               <option value="38">38</option>
               <option value="39">39</option>
               <option value="40">40</option>
               <option value="41">41</option>
               <option value="42">42</option>
               <option value="43">43</option>
               <option value="44">44</option>
               <option value="45">45</option>
               <option value="46">46</option>
               <option value="47">47</option>
               <option value="48">48</option>
               <option value="49">49</option>
               <option value="50">50</option>
               <option value="51">51</option>
               <option value="52">52</option>
               <option value="53">53</option>
             </select>

 

 

Detsamma gäller om man vill ändra något i sin inmatade tidrapport. Intervallet är det samma, en vecka efter inmatningsveckan.

 

Så har satt jag och försökte men utan att lyckas, nedanstående kod funkar således inte.

 

<%          
Dim inmatat_veckonummer, aktuellt_veckonummer, kontrollsiffra
    inmatat_veckonummer = RecSet("manad")
    aktuellt_veckonummer = DatePart("ww", Now())
    kontrollsiffra = aktuellt_veckonummer - inmatat_veckonummer

IF kontrollsiffra <> "2" THEN %>
           <center>
           <b>Du kan endast redigera din tidrapport<br>
en vecka efter den aktuella veckan.<br>
Vänligen kontakta kontoret för hjälp!</b>
          </center>

<% ELSE %>

<p><strong>Sätt kryss i rutan innan du skickar tidrapporten</strong><br />
         <br />
         <input name="kryss" type="checkbox" id="kryss" /><input type="submit" name="skicka" id="skicka" value="Skicka tidrapport" />
         <br />
         <br />
         <strong>OBS!</strong> Klicka <u>ENDAST</u> en gång

<% END IF %>

 

Kort förklarat, om användaren skall göra en tidrapportering för vecka 30 måste det ske före vecka 32, detsamma om man vill redigera vecka 30.

 

Usch vad svårt det var att få fram min fråga, förlåt om det är mycket text. Hoppas att du eller någon annan kan hjälpa mig (igen).

 

Mvh

Stefan

 

Länk till kommentar
Dela på andra webbplatser

Innan jag kollar närmare på koden så måste jag bara fråga om det verkligen skall vara inmatat_veckonummer = RecSet("manad")

 

/Cluster

------------------------------------------------------

I do not fear computers. I fear the lack of them

--------> http://eforum.kicks-ass.net <---------

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Hej igen! Absolut inte, den koden som jag skickade med var från min sida endast ett försök att förklara hur jag tänkt (eller inte tänk).

 

I RecSet("manad") ligger aktuell månad som användaren matar in så den antar jag måste tas fram på något sätt.

 

Kom att tänka på att man även kanske måste ta hänsyn till årtalet för att få det till att fungera RecSet("artal")

 

Tack för att du tar dig tid att hjälpa mig!

 

Mvh

Stefan

 

 

Länk till kommentar
Dela på andra webbplatser

Hur kommer det sig att du valt att dela upp datum i flera olika kolumner/fält i databasen?

Jag föredrar att spara datum/tid så precist som möjligt OCH med datum som datatyp. Sedan i skripten så får jag använda datepart() o.dyl. för att jobba med årtal,månad,vecka, dag osv.

 

För övrigt så undrar jag lite över logiken. Visst måste man väl få skapa en tidrapport framåt i tiden?

 

De tidrapporteringssytem som jag stött på tillåter i princip att man registrerar tid när man vill (framåt och bakåt i tiden hur som helst - enda till dess att en administratör låst veckan/månaden (beroende lite på hur man valt att lägga upp det).

 

/Cluster

------------------------------------------------------

I do not fear computers. I fear the lack of them

--------> http://eforum.kicks-ass.net <---------

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Hej igen. Först vill jag säga att jag är en novis på det här så min logik kan verka uppåt väggarna men jag skall försöka förklara hur jag ursprungligen tänkte.

 

Vi har på jobbet idag ett excel-formulär där vi matar in allt som vi gör. Chefen vill att vi skall göra det via dator istället, så min tanke har varit att efterlikna excel-formuläret.

 

Jag har gjort ett 7-dagars förmulär där man överst först väljer Årtal, månad och vecka.

Sedan är det rutor för alla dagar måndag - söndag med en massa tillval för dag, typ av tjänst, övertid, komp, OB, mm samt en massa rutor för olika typer av frånvaro. Antagligen har jag överarbetat det hela men min kunskapsnivå är som sagt inte av den högre klassen precis.

 

Visst får man tidsrapportera framåt i tiden, men chefen vill att man skall tidsrapportera efter varje vecka då vissa kollegor sitter i slutet av månaden och har ett helsike att komma ihåg vad de gjort. För att få bort detta vill han tvinga fram att man endast har en vecka på sig efter arbetad vecka att tidsrapportera. Kan hålla med om att det verkar märkligt men så vill han tyvärr ha det.

 

Hoppas att du får ut något av vad jag tänkt och menar...

 

Mvh

Stefan

 

Länk till kommentar
Dela på andra webbplatser

ok, men då borde det vara tillåtet att tidrapportera (för en period) där kontrollsiffran är mindre än 2?

<%
Dim inmatat_veckonummer, aktuellt_veckonummer, kontrollsiffra
'inmatat_veckonummer = RecSet("manad")
inmatat_veckonummer = 33
aktuellt_veckonummer = cInt(DatePart("ww", Now()))
kontrollsiffra = aktuellt_veckonummer - inmatat_veckonummer

IF kontrollsiffra < 2 THEN
%>
<p><strong>Sätt kryss i rutan innan du skickar tidrapporten</strong></p>
<p><input name="kryss" type="checkbox" id="kryss" /><input type="submit" name="skicka" id="skicka" value="Skicka tidrapport" /></p>
<p><strong>OBS!</strong> Klicka <u>ENDAST</u> en gång</p>

<% ELSE %>
<p style="text-align:center;">
<b>Du kan endast redigera din tidrapport<br>
en vecka efter den aktuella veckan.<br>
Vänligen kontakta kontoret för hjälp!</b>
</p>
<% END IF %>

 

Observera dock, precis som du själv påpekat, att ditt upplägg blir klurigt med tanke på årtal...

 

/Cluster

------------------------------------------------------

I do not fear computers. I fear the lack of them

--------> http://eforum.kicks-ass.net <---------

 

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Helt rätt, så måste det vara.

 

Tänkte på en sak angående årtal mm. Kan man lägga in ett gömt fält i formuläret där inmatningsdatum läggs i databasen så att man på något sätt kan jämföra med detta?

 

Mvh

Stefan

 

Länk till kommentar
Dela på andra webbplatser

<input type="hidden" name="artal" value="<%=RecSet("artal")%>">

 

/Cluster

------------------------------------------------------

I do not fear computers. I fear the lack of them

--------> http://eforum.kicks-ass.net <---------

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Skall det stå inmatat_veckonummer = 33 i koden som du skickade till mig?

 

Länk till kommentar
Dela på andra webbplatser

Hehe, nej det var bara ett test (eftersom jag inte har tillgång till din databas) där skall naturligtvis det veckonummer som användaren har valt användas istället.

 

/Cluster

------------------------------------------------------

I do not fear computers. I fear the lack of them

--------> http://eforum.kicks-ass.net <---------

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Tänkte väl det, jag flyttade fnutten ' en rad ner. Tyvärr vill det inte funka, alla veckor är "låsta".

 

Länk till kommentar
Dela på andra webbplatser

Vad har dina variabler för värden då?

Testa att skriva ut dem innan jämförelsen:

<%
Dim inmatat_veckonummer, aktuellt_veckonummer, kontrollsiffra
'inmatat_veckonummer = RecSet("manad")
inmatat_veckonummer = 31
aktuellt_veckonummer = cInt(DatePart("ww", Now()))
kontrollsiffra = aktuellt_veckonummer - inmatat_veckonummer

Response.Write "inmatat_veckonummer: "& inmatat_veckonummer &"<br>"&_
"aktuellt_veckonummer: "& aktuellt_veckonummer &"<br>"&_
"kontrollsiffra: "& kontrollsiffra &"<hr>"

IF kontrollsiffra < 2 THEN
%>
<p><strong>Sätt kryss i rutan innan du skickar tidrapporten</strong></p>
<p><input name="kryss" type="checkbox" id="kryss" /><input type="submit" name="skicka" id="skicka" value="Skicka tidrapport" /></p>
<p><strong>OBS!</strong> Klicka <u>ENDAST</u> en gång</p>

<% ELSE %>
<p style="text-align:center;">
<b>Du kan endast redigera din tidrapport<br>
en vecka efter den aktuella veckan.<br>
Vänligen kontakta kontoret för hjälp!</b>
</p>
<% END IF %>

 

/Cluster

------------------------------------------------------

I do not fear computers. I fear the lack of them

--------> http://eforum.kicks-ass.net <---------

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Oavsett vilken vecka jag väljer för att redigera får jag följande text.

 

inmatat_veckonummer: 31

aktuellt_veckonummer: 31

kontrollsiffra: 0

 

Fick en ide tror jag när det gäller redigering.

Skulle det funka om man la in ursprungligt inmatningsdatum i databasen och vid ev ändring så kollar koden ändringsdagens datum mot ursprungligt inmatningsdatum och om det skiljer låt oss säga 10 dagar tillbaka i tiden så går det inte att ändra.

 

Då borde man väl även kunna mata in tider i förväg eller?

 

Länk till kommentar
Dela på andra webbplatser

Oavsett vilken vecka jag väljer för att redigera får jag följande text.
Hur tilldelar du dessa variabler värden? (posta kod)

 

/Cluster

------------------------------------------------------

I do not fear computers. I fear the lack of them

--------> http://eforum.kicks-ass.net <---------

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Sorry, jag glömde flytta fnutten och sedan justerade koden lite...

inmatat_veckonummer = RecSet("manad")

skall naturligtvis vara

'inmatat_veckonummer = RecSet("vecka")

 

får jag fram rätt värden när jag testar t.ex vecka 4

inmatat_veckonummer: 04

aktuellt_veckonummer: 31

kontrollsiffra: 27

 

 

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Nu funkar det utmärkt! :thumbsup:

Det ända problemet nu är årtalet... suck.

 

Mvh

Stefan

 

Länk till kommentar
Dela på andra webbplatser

Stefan - nybörjaren

Tack för all din hjälp, nu stänger jag datorn så att jag fixar att jobba i morgon, chefen blir glad om jag är något så när pigg...

 

Med vänliga hälsningar

Stefan

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...