Avatar billede bsr0809 Nybegynder
01. januar 2008 - 22:08 Der er 14 kommentarer

Opdaterer flere poster på engang.

Hej alle, dette er jo nok et newbie spørgsmål så det vil noget. Jeg har lavet en kalender i ASP der henter/skriver oplysninger i en MS Acess database.
Jeg har fundet ud af at lave så jeg kan opdaterer én dag (post) adgangen. Men er det f.eks. muligt at opdaterer alle poster i en måned?
Hvis det er muligt, nogen der kan fortælle mig hvordan? Eller evt. blot smide et link til en god tutorial der kan forklare mig det.

Glædeligt nytår til alle :-)
Avatar billede thesurfer Nybegynder
01. januar 2008 - 22:31 #1
Beskriv det du vil, med et eksempel.. det plejer at hjælpe.. :-)
Avatar billede keysersoze Ekspert
01. januar 2008 - 23:07 #2
når du laver en SQL så påvirker du samtlige poster der matcher - laver du fx en SQL der ser således ud;

UPDATE tabel SET kolonne = 'noget' WHERE id = 5

påvirkes kun den ene række hvor id er 5

UPDATE tabel SET kolonne = 'noget'

påvirker samtlige rækker i tabellen

UPDATE tabel SET kolonne = 'noget' WHERE kolonne BETWEEN #01-01-2008# AND #01-02-2008#

påvirker alle rækker der der matcher overens med betingelsen i datokolonnen.

Så om du opdaterer én eller flere rækker i din tabel afhænger ene og alene af dine betingelser i SQLen.
Avatar billede bsr0809 Nybegynder
02. januar 2008 - 07:29 #3
Hej til thesurfer og keyseroze.
Jeg forstår udemærket dit eksempel keysersoze, men tror dog alligevel jeg vil følge thesurfers råd og give et eksempel :-)

Dette er de filer jeg har til at opdaterer en enkelt post:

update_entry.asp

<%
'Dimension variables
Dim adoCon             'Holds the Database Connection Object
Dim rsUpdateEntry        'Holds the recordset for the record to be updated
Dim strSQL            'Holds the SQL query for the database
Dim lngRecordNo            'Holds the record number to be updated

'Read in the record number to be updated
lngRecordNo = CLng(Request.Form("id_no"))

'Create an ADO connection odject
Set adoCon = Server.CreateObject("ADODB.Connection")

'Set an active connection to the Connection object using a DSN-less connection
adoCon.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("Kalender.mdb")

'Set an active connection to the Connection object using DSN connection
'adoCon.Open "DSN=Kalender"

'Create an ADO recordset object
Set rsUpdateEntry = Server.CreateObject("ADODB.Recordset")

'Initialise the strSQL variable with an SQL statement to query the database
strSQL = "SELECT tblData.* FROM tblData WHERE ID_no=" & lngRecordNo

'Set the cursor type we are using so we can navigate through the recordset
rsUpdateEntry.CursorType = 2

'Set the lock type so that the record is locked by ADO when it is updated
rsUpdateEntry.LockType = 3

'Open the tblComments table using the SQL query held in the strSQL varaiable
rsUpdateEntry.Open strSQL, adoCon

'Update the record in the recordset
rsUpdateEntry.Fields("bianca_priv") = Request.Form("bianca_priv")
rsUpdateEntry.Fields("bianca_arb") = Request.Form("bianca_arb")
rsUpdateEntry.Fields("bjoern_priv") = Request.Form("bjoern_priv")
rsUpdateEntry.Fields("bjoern_arb") = Request.Form("bjoern_arb")


'Write the updated recordset to the database
rsUpdateEntry.Update

'Reset server objects
rsUpdateEntry.Close
Set rsUpdateEntry = Nothing
Set adoCon = Nothing

'Return to the update select page incase another record needs deleting
Response.Redirect "update_select.asp"
%>

************************************************************************

Update_form.asp
<%
'Dimension variables
Dim adoCon                     'Holds the Database Connection Object
Dim rsKalender            'Holds the recordset for the record to be updated
Dim strSQL                    'Holds the SQL query for the database
Dim lngRecordNo            'Holds the record number to be updated

'Read in the record number to be updated
lngRecordNo = CLng(Request.QueryString("ID"))

'Create an ADO connection odject
Set adoCon = Server.CreateObject("ADODB.Connection")

'Set an active connection to the Connection object using a DSN-less connection
adoCon.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("Kalender.mdb")

'Set an active connection to the Connection object using DSN connection
'adoCon.Open "DSN=Kalender"

'Create an ADO recordset object
Set rsKalender = Server.CreateObject("ADODB.Recordset")

'Initialise the strSQL variable with an SQL statement to query the database
strSQL = "SELECT tblData.* FROM tblData WHERE ID_no=" & lngRecordNo

'Open the recordset with the SQL query
rsKalender.Open strSQL, adoCon
%>
<html>
<head>
<title>Kalender 2008 * Opdater</title>
<meta name="Generator" content="Stone's WebWriter 4">
</head>
<body bgcolor="#000000" text="#FF0000" link="#FF0000" vlink="#FF0000" alink="#FF0000">
<!-- Begin form code -->

<h1><p align="center">Opdater kalender</h1><br><br>

<p align="left"><b>Dato: </b>
<%
Response.Write (rsKalender("ugedag")) & ", d. "
Response.Write (rsKalender("dato")) & "-"
Response.Write (rsKalender("maaned")) & "-"
Response.Write (rsKalender("aar")) & "."
%><br><br>



<table border="0" width="90%">
<tr>
<td>
<p align="center">
<form name="form" method="post" action="update_entry.asp">
  <p align="Center">Bianca Arbejde:<br>
<textarea wrap="physical" rows="5" cols="40" name="bianca_arb"><% Response.Write (rsKalender("bianca_arb")) %> </textarea>

</td>
<td>

<p align="Center">Bianca Privat:<br>
<textarea wrap="physical" rows="5" cols="40" name="bianca_priv"><% Response.Write (rsKalender("bianca_priv")) %> </textarea>

</td>
</tr>
<tr>
<td>
<br>
</td>
</tr>
<tr>
<td>

<p align="Center">Bjørn Arbejde: <br>
<textarea wrap="physical" rows="5" cols="40" name="bjoern_arb"><% Response.Write (rsKalender("bjoern_arb")) %> </textarea>

</td>
<td>

<p align="Center">Bjørn Privat: <br>
<textarea wrap="physical" rows="5" cols="40" name="bjoern_priv"><% Response.Write (rsKalender("bjoern_priv")) %> </textarea>

</td>
</tr>
<tr>
<td colspan="2">
<p align="center">
  <input type="hidden" name="id_no" value="<% = rsKalender("id_no") %>">
  <input type="submit" name="Submit" value="Opdater">
</form>
</td>
</tr>
</table>

<!-- End form code -->
</body>
</html>
<%
'Reset server objects
rsKalender.Close
Set rsKalender = Nothing
Set adoCon = Nothing
%>
Avatar billede thesurfer Nybegynder
02. januar 2008 - 21:07 #4
Lad mig lige se om jeg har forstået det her..

Lige nu printer den 1 dag ud, hvilket betyder 4 felter, som er:

Bianca Privat
Bianca Arbejde
Bjørn Privat
Bjørn Arbejde

Det er for 1 dag.

Nu vil du gerne have at den printer du for alle månedens dage, hvilket betyder 4 gange (ca) 30 dage, hvilket betyder 120 felter?

Og når du har tilføjet/redigeret teksten, klikker du på "Opdater"-knappen, og så skal den opdatere samtligt dage i måneden, med de data du har når du klikker på "Opdater"-knappen?

Er det sådan det skal forståes?
Avatar billede bsr0809 Nybegynder
03. januar 2008 - 13:02 #5
Jeps - det er helt sandt.
Avatar billede thesurfer Nybegynder
03. januar 2008 - 19:08 #6
Jeg skal lige have dig til at beskrive din database.. altså hvad alle kolonnerne hedder, og hvilke typer de er..

Eksempel:

bianca_priv, tekst
bianca_arb, tekst
bjoern_priv, tekst
bjoern_arb, tekst

Bare med alle kolonnerne i tabellen "tblData"..
Avatar billede bsr0809 Nybegynder
03. januar 2008 - 19:36 #7
Jeps - no probs...
DB Navn: Kalender.mdb
Tabel: tblData

kolonner:
id_no (Id nummer)
uge (heltal)
ugedag (tekst)
dato (heltal)
maaned (heltal)
aar (heltal
bianca_priv (Notat)
bianca_arb (Notat)
bjoern_priv (Notat)
bjoern_arb (Notat)
Avatar billede thesurfer Nybegynder
03. januar 2008 - 20:18 #8
Er der nogen speciel grund til at du har delt datoerne op i følgende kolonner?:

uge (heltal)
ugedag (tekst)
dato (heltal)
maaned (heltal)
aar (heltal)
Avatar billede bsr0809 Nybegynder
03. januar 2008 - 20:56 #9
Nej egentlig ikke - syntes blot det virkede nemmest at arbejde med dem på den måde... måske lidt fjollet.
Avatar billede bsr0809 Nybegynder
07. januar 2008 - 16:09 #10
thesurfer - er du med endnu???
Avatar billede thesurfer Nybegynder
07. januar 2008 - 22:07 #11
Sorry, mate.. Jeg havde travlt med et projekt på arbejde, og glemte alt om dette spørgsmål..

Jeg ser lige om jeg kan få lavet et eksempel.. muligvis i morgen, men kan ikke love noget..

Andre er må naturligvis også gerne komme med løsninger.. :-)
Avatar billede bsr0809 Nybegynder
08. januar 2008 - 08:50 #12
Smiler - det er bare helt i orden, kender det alt for godt selv. Du svarer bare når du får tid. Evt. så bare lav et eks. med et enkelt felt, så kan jeg nok lurer meningen med galskaben :-)
Avatar billede thesurfer Nybegynder
08. januar 2008 - 21:24 #13
Hejsa..

Jeg bliver nødt til at udskyde det til weekenden, da jeg har en pressende opgave foran mig.. muligvis længere end weekenden, hvis jeg har meget travlt..

Læs venligst hele indlægget igennem, inden du smider dig over koden.. :-)

Jeg vil lige skynde mig at nævne, at jeg ikke har testet koden, og at det bare er en ide.. det kan godt være at der er fejl, hvilket nemt burde kunne rettes med sådan et simpelt eksempel..


Det korte af det lange, med hensyn til dit kalender-projekt, må være at udskrive alle dagene i den pågældende måned, og tilføje "bianca" (plus arb/priv) eller "bjarne" (plus arb/priv) til navnet på textarea'en..

Eksempel (opsætningen/layoutet overlader jeg til dig):
<%
...opret forbindelse til databasen og start loop...
%>
<textarea wrap="physical" rows="5" cols="40" name="bianca_arb_<%=rs("dato")%>"><% Response.Write (rsKalender("bianca_arb")) %> </textarea>
<%
... slut loop...
%>
<input type="submit" name="Submit" value="Opdater">

Hvordan du udskrive dem, er op til dig..

Læg mærke til at jeg IKKE længere bruger denne, da den er overflødig:
<input type="hidden" name="id_no" value="<% = rsKalender("id_no") %>">


Formatet er sådan: NavnPåPersonen_PrivatEllerArbejde_Dato
Eksempel: bjoern_priv_5 (dag 5 i måneden)

I mit eksempel har jeg valgt at oprette 3 skjulte felter, med navnene: dato, maaned, aar
De indeholder det som er navnene.. :-)


Når du skal opdatere dataene, kan du f.eks. gøre sådan her:

<%
Function udregn_antal_dage(maaned,aar)
' Denne funktion returnere antallet af dage i den givne måned-år kombination:

Select Case maaned

Case 1,3,5,7,8,10,12 ' måneder hvor der er 31 dage i
    udregn_antal_dage = 31

Case 2
    ' Måneden "februar" er speciel, da den har skudår engang i mellem :-)
    ' (man kunne også bruge modulus til udregningen)

    ' Vi skal derfor teste om d. "29 februar" eksisterer i den pågældende februar-måned:

    If IsDate("29-02-" & aar) Then
        ' d. 29 februar eksisterer, hvilket betyder at der er 29 dage i denne februar-måned
        udregn_antal_dage = 29
    Else
        ' d. 29 februar eksisterer IKKE, hvilket betyder at der er 28 dage i denne februar-måned
        udregn_antal_dage = 28
    End if

Case 4,6,9,11 ' måneder hvor der er 30 dage i
    udregn_antal_dage = 30

End Select

End function



Dim dato, maaned, aar
dato = Request.Form("dato")
maaned = Request.Form("maaned")
aar = Request.Form("aar")

Dim antal_dage
antal_dage = udregn_antal_dage(maaned,aar)


Dim sql, i
For i = 1 To antal_dage

sql = "" ' Læg mærke til at følgende SQL-linier starter med et mellemrum (" ")!
sql = sql & " update tblData"
sql = sql & " set bianca_arb = '" & request.Form("bianca_arb_" & i) & "'"
sql = sql & " set bianca_priv = '" & request.Form("bianca_priv_" & i) & "'"
sql = sql & " set bjorn_arb = '" & request.Form("bjoern_arb_" & i) & "'"
sql = sql & " set bjorn_priv = '" & request.Form("bjoern_priv_" & i) & "'"
sql = sql & " where"
sql = sql & " dato = " & dato
sql = sql & " and maaned = " & maaned
sql = sql & " and aar = " & aar

' Så skal SQL sætningen afvikles..
' Da denne sætning er en UPDATE sætning, skal vi ikke have noget tilbage..

' OPRET forbindelse-OBJEKTER til databasen og execute:
Conn.Execute(sql)

' HUSK AT NEDLÆGGE ALLE DINE OBJEKTER!


sql = sql & " "

Next

%>

UPDATE-sætningen bliver afviklet samme antal gange, som der er dage i den pågældende måned..
Det kan godt være at nogen synes at det er en dårligt ide.. så må de bare komme med en bedre ide, hvilket jeg overhovedet ikke har noget imod.

Alternativt kunne man bruge "id_no" i stedet for "dato", og ændre koden lidt (bl.a. FOR-NEXT løkken)..

Jeg håber at det giver dig et indblik i hvordan man kan gøre det.. og måske en ide eller to.. :-)


Med hensyn til denne måde at opdatere på, og database-brug generelt, kan jeg anbefale:

Lektionerne 17 - 22 (begge inkl.) på http://www.html.dk/tutorials/asp/

Disse lektioner omhandler oprettelse af forbindelse til databasen, hentning af data, indsættelse af data, sletning af data og opdatering af data.

Det er et godt sted at starte.
Avatar billede thesurfer Nybegynder
28. februar 2008 - 19:43 #14
bsr0809> Hmm.. Hallo? Er du der? :-)
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
Kurser inden for grundlæggende programmering

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