Avatar billede vagn16 Nybegynder
01. november 2005 - 16:41 Der er 8 kommentarer

Sæt nemt ind i DB fra form - evt. via loop?

Hej,

Jeg har en side med en form med mere end 30 felter. Disse skal indsættes i database (Access), men jeg gider (ja... jeg er en doven hund!) ikke at skrive den lange SQl... kan man ikke, evt. via et loop, få den til at fange lægge alle felterne og deres værdier ind i en SQl streng?

Vh

vagn / 16
Avatar billede softspot Forsker
01. november 2005 - 16:45 #1
Hvis du har en forholdsvis stringent navngivningsstandard for dine felter i formularen og i databasen, så burde det være en smal sag... :)

Vis hvad det er du arbejder med (form og database).
Avatar billede vagn16 Nybegynder
01. november 2005 - 16:49 #2
Her er min form:

                                <div>
                                    <form id="Fleet" action="" method="POST" name="default.asp">
                                        <table width="100%" border="0" cellspacing="2" cellpadding="0" height="100%">
                                            <tr>
                                                <td>Name: <input type="text" name="Name" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Ex. Name: <input type="text" name="Exname" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>D.W.A.T.: <input type="text" name="Dwat" size="10" class="formfield"> Draft: <input type="text" name="Draft" size="10" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Type: <input type="text" name="Type" size="10" class="formfield"> Flag: <input type="text" name="Flag" size="10" class="formfield"> Built: <input type="text" name="Built" size="10" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Callsign: <input type="text" name="Callsign" size="10" class="formfield"> Class: <input type="text" name="Class" size="10" class="formfield"> Speed: <input type="text" name="Speed" size="10" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Telex: <input type="text" name="Telex" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Gear: <input type="text" name="Gear" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Consumption:<br>
                                                    <textarea name="Consumption" rows="4" cols="40"></textarea></td>
                                            </tr>
                                            <tr>
                                                <td>LOA: <input type="text" name="Loa" size="10" class="formfield"> BEAM: <input type="text" name="Beam" size="10" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>GRT: <input type="text" name="Grt" size="10" class="formfield"> NRT: <input type="text" name="Nrt" size="10" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Vessel is: <input type="text" name="Vessel" size="50" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Holds: <input type="text" name="Holds" size="10" class="formfield"> Hatches: <input type="text" name="Hatches" size="10" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Hatch covers: <input type="text" name="Hatchcovers" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Hold dim 1:<input type="text" name="Holddim1" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Hatch dim 1:<input type="text" name="hatchdim1" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Bale 1: <input type="text" name="Bale1" size="10" class="formfield"> Grain 1: <input type="text" name="Grain1" size="10" class="formfield"></td>
                                            </tr>
                                                                                    <tr>
                                                <td>Hold dim 2:<input type="text" name="Holddim2" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Hatch dim 2:<input type="text" name="hatchdim2" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Bale 2: <input type="text" name="Bale2" size="10" class="formfield"> Grain 2: <input type="text" name="Grain2" size="10" class="formfield"></td>
                                            </tr>
                                                                                    <tr>
                                                <td>Hold dim 3:<input type="text" name="Holddim3" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Hatch dim 3:<input type="text" name="hatchdim3" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Bale 3: <input type="text" name="Bale3" size="10" class="formfield"> Grain 3: <input type="text" name="Grain1" size="10" class="formfield"></td>
                                            </tr>
                                                                                        <tr>
                                                <td>Hold dim 4:<input type="text" name="Holddim4" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Hatch dim 4:<input type="text" name="hatchdim4" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Bale 4: <input type="text" name="Bale4" size="10" class="formfield"> Grain 4: <input type="text" name="Grain4" size="10" class="formfield"></td>
                                            </tr>
                                                                                        <tr>
                                                <td>Hold dim 5:<input type="text" name="Holddim5" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Hatch dim 5:<input type="text" name="hatchdim5" size="30" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td>Bale 5: <input type="text" name="Bale5" size="10" class="formfield"> Grain 5: <input type="text" name="Grain5" size="10" class="formfield"></td>
                                            </tr>
                                            <tr>
                                                <td><input type="submit" name="Submit" class="formfield" value="  Opret  "></td>
                                            </tr>
                                            <tr>
                                                <td></td>
                                            </tr>
                                            <tr>
                                                <td></td>
                                            </tr>
                                            <tr>
                                                <td></td>
                                            </tr>
                                            <tr>
                                                <td></td>
                                            </tr>
                                            <tr>
                                                <td></td>
                                            </tr>
                                            <tr>
                                                <td></td>
                                            </tr>
                                            <tr>
                                                <td></td>
                                            </tr>
                                        </table>
                                    </form>
                                </div>

Som du kan se er det kun alm. tekst felter... og jeg kan sagtens lave SQL'en... men tænkte bare at det var nemmere at lave et loop der kunne kunne lave den... og som er uafhængig af om der er 10 eller 100 felter...

Var det det du ville have?
Avatar billede vagn16 Nybegynder
01. november 2005 - 16:54 #3
Normalt ville jeg lave en SQL der så sådan ud:

    SQL = "INSERT INTO reklame ( navn, link, pic, alttxt ) " & "VALUES ('" & txtTilDb(Request.Form("navn")) & "' , '" & txtTilDb(Request.Form("link")) & "' , '" & txtTilDb(Request.Form("pic")) & "' , '" & txtTilDb(Request.Form("alttxt")) & "');"

...
Avatar billede softspot Forsker
01. november 2005 - 17:17 #4
Hmm... jeg kan se forskellige løsninger på denne her (for du kan jo nok ikke bruge feltnavnene i formularen til at skrive i databasen, for der er vel ikke nogen sammenfald mellem feltnavne i formular og databasen... eller hvad?

Anyway! Du kan gøre det at du definerer en streng med feltnavnne i asp-filen (serverside scriptet) som du benytter til at agere feltliste ifht. databasen og hvis du skal være helt sikker, laver du en parring med hvert feltnavn til et formularfelt, så der ikke er nogen tvivl om hvordan data hører sammen.

Eksempel:
strDBFields = "felt1,felt2,felt3,felt4,felt5"
strDBFieldTypes = "s,s,n,s,s"
strDBIDField = "felt0"
strFrmFields = "navn,adresse,postnr,bynavn,telefonnr"
strFrmIDField = "id"

function getUpdateSQL()
  arrDBFields = Split(strFields,",")
  arrDBFieldTypes = Split(strDBFieldTypes,",")
  arrFrmFields = Split(strFrmFields,",")

  strSQL = "UPDATE reklame SET "
  for idx = 0 to ubound(arrDBFields)
    strSQL = strSQL & arrDBFields(idx) & " = "
    if arrDBFieldTypes(idx) = "s" then
      strSQL = strSQL & "'"
    end if
    strSQL = strSQL & Request.Form(arrFrmFields(idx))
    if arrDBFieldTypes(idx) = "s" then
      strSQL = strSQL & "'"
    end if
    if idx < ubound(arrDBFields) then
      strSQL = strSQL & ","
    else
      strSQL = strSQL & " "
    end if
  next
  strSQL = strSQL & "WHERE " & strDBIDField & " = " & Request.Form(strFrmIDField)
  getUpdateSQL = strSQL
end function

function getInsertSQL()
  strSQL = "INSERT INTO reklame (" & strDBFields & ") "
  arrDBFieldTypes = Split(strDBFieldTypes,",")
  arrFrmFields = Split(strFrmFields,",")
  for idx = 0 to ubound(arrFrmFields)
    if arrDBFieldTypes(idx) = "s" then
      strSQL = strSQL & "'"
    end if
    strSQL = strSQL & Request.Form(arrFrmFields(idx))
    if arrDBFieldTypes(idx) = "s" then
      strSQL = strSQL & "'"
    end if
    if idx < ubound(arrFrmFields) then
      strSQL = strSQL & ","
    else
      strSQL = strSQL & ")"
    end if
  next
  getInsertSQL = strSQL
end function

Nu siger du nok: "Jamen det der er jo mere besværligt end bare at skrive SQL-sætningen!?", hvortil jeg så kan svare, "Ja, hvis du skal skrive dette hver gang", men det skal du jo ikke, for næste gang skal du bare angive feltlisterne og så kalde funktionerne med de nye feltlister og så har du (med lidt mere arbejde) nogle generiske funktioner til at generere INSERT- og UPDATE-sætninger mod din database... :)

NB: Funkionerne er ikke "perfekte" endnu, men de skitserer da en mulig løsningsstrategi...
Avatar billede vagn16 Nybegynder
01. november 2005 - 17:29 #5
hej Softspot,

Nu er jeg måske dum... og burde have fortalt dig at navnene matcher. Jeg benytter de samme navne i min database som jeg benytter i min form.

Gider du at forsøge at knække den igen? Jeg kigger lige på det du har lavet imens... men vi er vel enige om at det bliver nemmere hvis forudsætningen om samme navn holder?

vagn / 16
Avatar billede softspot Forsker
01. november 2005 - 17:34 #6
Klart! :)
Avatar billede softspot Forsker
01. november 2005 - 17:44 #7
Well, faktisk tror jeg du får nogle udfordringer med knapper og andre kontroller som ikke skal med i databasen eller som har sammensatte værdier, f.eks. checkbox eller multiselects. For at håndtere dette er du næsten nød til at lave en ekskluderingsliste (i stedet for den inkluderingsliste jeg benyttede mig af før).

Du skal under alle omstændigheder definere datatypen af de enkelte felter, med mindre alle felter er af en teksttype (tekst eller memo i Access).

Jeg er tilbøjelig til bare at generere strDBFields og strFrmFields og så bare bruge de samme funktioner som før...

for each fld in request.form
  strDBFields = strDBFields & fld & ","
next
strDBFields = left(strDBFields, len(strDBFields) - 1)
strFrmFields = strDBFields

men du skal som sagt have fundet en metode til at definere feltttypene til de enkelte felter...
Avatar billede vagn16 Nybegynder
01. november 2005 - 18:06 #8
Jeg forsøger det her...
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