Avatar billede 00-behave Nybegynder
08. juni 2000 - 11:50 Der er 9 kommentarer og
2 løsninger

Hurtig hjælp

Prøv at se spørgsmål:
http://www.eksperten.dk/spm.asp?id=18708

Læs hvad "sa" skriver,

Hvis der er én der kan hjælpe mig med dette i dag, er der 100 point her + de 60 under ASP.
Avatar billede stoffer Nybegynder
08. juni 2000 - 12:42 #1
Kunne du ikke splitte feltet op, så du har et felt til navn, og et til efternavn

Hvis du har mange records i databasen i forvejen. Kunne du evt lige skrive alle record ud i en txt fil, og derefter indsætte dem igen, når tabellen er korrekt.

Lyder det som en acceptabel løsning.

Det kan også ordnet med en array metod, men det gør det langsom, da du skal køre arrayet igennem flere gange for at sortere det. Det bliver langsomt. Så den mest fremtidssikrede metod er helt sikkert at lave tabellen om.....

Avatar billede 00-behave Nybegynder
08. juni 2000 - 12:48 #2
Problemet er at det er vigtigt for hele systemet at den normale navneform bruges. Det vil kræve en masse besvær at splitte det hele op...
Avatar billede stoffer Nybegynder
08. juni 2000 - 12:56 #3
Det er faktisk ret nemt at lave det om:

Function changeName(strStreng,First_last)

strStreng  = RTrim(strStreng)
strStreng  = LTrim(strStreng)
strStreng = split(strStreng," ")

Lastname = strStreng(ubound(strStreng))

for i = 0 to ubound(strStreng) - 1
    Name = Name & " " & strStreng(i)
   
next

if First_last = true then
  changeName =  name
else
  changeName = lastname
end if


end function


' din db, SQL connection osv. her (husk dog at du ikke må siger ORDER BY)

Do until rs.eof

Response. write "INSERT INTO tabelnavn (navn,efternavn, etc...) VALUES (" & changeName(RS("navnefelt",true), changeName(RS("navnefelt",false), etc...);" & "<br>"


Nu har du så skrevet den rigtige SQL ud til at opdatere til den nye tabel

Når du har dræbt den gamle table, cut'n'paster du simpelhen duskriften og indsætter den i SQL vinduet i Access, og vupti så kommer de gamle record ind i den nye tabel.

HUSK dog at tage backup af den gamle DB inden............




Avatar billede stoffer Nybegynder
08. juni 2000 - 12:57 #4
hmmm så ikke din sidste kommentar --> vender tilbage efter frokost. Men jog holder stadig på at du bør lave tabellen om...Selv om det kræver en masse besvær....
Avatar billede sjensen Nybegynder
08. juni 2000 - 15:59 #5
Før i tiden løste man paradoxer som dette problem er (blæse og have mel i munden samtidig) ved at indføre et ekstra felt i DB'en til brug som en "sorteringsnøgle". I nogle tilfælde havde vi endda mere end et af sådanne felter i db'en.

Ved at udfylde dette felt med f.eks. efternavn kunne man sagtens udtrække navnene (der som hos dig var indsat med "fornavn mellemnavn(e) efternavn") efter efternavnet ved at bruge:

select navn from tabel order by sorterfelt

Det fylder selvfølgeligt lidt i databasen, men med den pris harddiske har i dag betyder det jo ikke noget !

Avatar billede privaten Nybegynder
08. juni 2000 - 19:19 #6
Det nemmeste du kan gøre (og formentlig også det bedste) er at lade Access gøre atbejdet for dig...

Opret et modul i Access-databasen og paste flg. kode ind i modulet....

Function HentEfternavn(FuldeNavn As String) As String
    While InStr(FuldeNavn, " ") > 0
        FuldeNavn = Mid$(FuldeNavn, InStr(FuldeNavn, " ") + 1)
    Wend
    HentEfternavn = FuldeNavn
End Function

Nu tilføjer du bare en sorteringsorden i den query der skal aflevere data til din asp-side...

fx.

SELECT MinTabel.Navn, HentEfternavn([NytNavn]) AS x
FROM MinTabel
ORDER BY HentEfternavn([Navn]);

Så er du i hus, functionen HentEfternavn afleverer det sidste Ord i navn:
Ved "Peter Anders Hansen", afleveres "Hansen"
Ved "Mogens Jensen", afleveres "Jensen"
Avatar billede philiph Nybegynder
08. juni 2000 - 19:19 #7
Her er et par genbrugelige rutiner der løser problemet. Vi starter der hvor du har åbnet dit recordset:

Const NAMECOLUMN=2 '<--- Ret til dit navnefelts kolonne nummer (1=første felt)
Dim fld
Dim gArray
Dim gRow

'*** Load data into array ***
gArray = MakeArrayFromRS(rs)

'*** Transform name column ***
For gRow = 1 to UBound(gArray,2)
  gArray(NAMECOLUMN,gRow) = revNavn(gArray(NAMECOLUMN,gRow))
Next

'*** Sort it ***
BubbleSortArray gArray, NAMECOLUMN

'*** Display it ***
DisplayArray gArray

Function MakeArrayFromRS(rs)
  Dim Arr()
  Dim ArrRow
  Dim ArrColumn

  '*** Make room for data ***
  ReDim Arr(rs.Fields.Count,rs.RecordCount)

  '*** Insert data into array ***
  ArrRow = 1
  Do Until rs.EOF
    ArrColumn = 1
    For each fld in rs.Fields
      Arr(ArrColumn,ArrRow) = fld
      ArrColumn = ArrColumn + 1
    Next
    ArrRow = ArrRow + 1
    rs.MoveNext 
  Loop
 
  MakeArrayFromRS = Arr
End Function

Sub BubbleSortArray(Arr,SortColumn)
  Dim Column
  Dim Row
  Dim Sorted
  Dim Temp
 
  Do
    Sorted = True
    For Row = 1 to UBound(Arr,2)-1
      If StrComp(Arr(SortColumn,Row),Arr(SortColumn,Row+1),vbTextCompare) > 0 Then
        For Column = 1 to UBound(Arr,1)
          Temp = Arr(Column,Row+1)
          Arr(Column,Row+1) = Arr(Column,Row)
          Arr(Column,Row) = Temp
        Next
        Sorted = False
      End If
    Next 
  Loop Until Sorted = True
End Sub

Sub DisplayArray(Arr)
  Dim Column
  Dim Row

  Response.Write "<table border=1>" & vbLf
  For Row = 1 to UBound(Arr,2)
    Response.Write " <tr>"
    For Column = 1 to UBound(Arr,1)
      Response.Write "<td>" & Arr(Column,Row) & "</td>"
    Next
    Response.Write "</tr>" & vbLf
  Next
  Response.Write "</table>" & vbLf
End Sub

Kan det gøre det?
Philip
Avatar billede philiph Nybegynder
08. juni 2000 - 19:23 #8
>> Privaten

Det var også min første indskydelse, men resultatet skal vist bruges fra ASP, og ADO tillader ikke kald til brugerdefinerede rutiner. Jeg kan i hvert fald ikke få det til at virke.

Philip
Avatar billede privaten Nybegynder
08. juni 2000 - 21:12 #9
>> philiph

Du skal heller ikke kalde rutinen fra ASP, den skal ligge i databasen hvor den eksekveres via normalt sql fx.

1: Via en almindelig query
eller
2: Via et almindeligt sql

det er der ingen ben i, som de siger i reklamerne...
Avatar billede philiph Nybegynder
09. juni 2000 - 00:35 #10
>> Privaten

Tror du jeg er født igår. Det var jo netop det jeg sagde jeg havde testet. Og bare for at være helt sikker lagde jeg en funktion BÅDE i Access & på ASP siden, i håb om at den ville finde den bare en af stederne. Men nej... Jeg får under alle omstændigheder fejlen: Unknown function <funktionsnavn>. Og jeg skal lige indskyde at det virker inde fra Access. Jeg ved fra tidligere at man ikke kunne kalde forespørgsler via ODBC hvis de indeholdt brugerdefinerede funktioner, men at det virkede igennem automation.

Nu vil jeg ikke sige at det er umuligt at det kan komme til at virke. Jeg har testet det med Access 97, så det er muligt at det virker imod en 2000 database (har jeg pt. ikke installeret).

Men jeg er da bestemt ikke uinteresseret hvis der er nogen der kan få det til at virke, for det er VIRKELIG noget jeg har savnet i min ASP udvkling.

Philip



Avatar billede privaten Nybegynder
15. juni 2000 - 13:25 #11
>> Philip,

Nej jeg tror ikke du er født igår..., men jeg misforstod din "ADO tillader ikke kald til brugerdefinerede rutiner" besked, hvilket jeg selvfølgelig undskylder :-)

Jeg er heller ikke  sikker på at det virker, jeg har nemlig p.t. ingen mulighed for at teste det, så hvis du siger det...

Jeg vil når tiden tillader det forske lidt i spørgsmålet!
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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